From e11caf1a10ed2905a5fe0fbdd08a816fe3b1f3f2 Mon Sep 17 00:00:00 2001 From: stephendeoca Date: Fri, 12 Sep 2025 11:44:06 -0700 Subject: [PATCH] added 1.15.0 beta files --- ...u.extensions.1.15.0-pre.15.beta.min.js.map | 1 + lib/beta/tableau.extensions.1.15.0.beta.js | 13130 ++++++++++++++++ .../tableau.extensions.1.15.0.beta.min.js | 2 + lib/beta/tableau.extensions.1.latest.beta.js | 13130 ++++++++++++++++ .../tableau.extensions.1.latest.beta.min.js | 2 + package-lock.json | 21 +- 6 files changed, 26277 insertions(+), 9 deletions(-) create mode 100644 lib/beta/tableau.extensions.1.15.0-pre.15.beta.min.js.map create mode 100644 lib/beta/tableau.extensions.1.15.0.beta.js create mode 100644 lib/beta/tableau.extensions.1.15.0.beta.min.js create mode 100644 lib/beta/tableau.extensions.1.latest.beta.js create mode 100644 lib/beta/tableau.extensions.1.latest.beta.min.js diff --git a/lib/beta/tableau.extensions.1.15.0-pre.15.beta.min.js.map b/lib/beta/tableau.extensions.1.15.0-pre.15.beta.min.js.map new file mode 100644 index 00000000..02a8b089 --- /dev/null +++ b/lib/beta/tableau.extensions.1.15.0-pre.15.beta.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"tableau.extensions.1.15.0-pre.15.beta.min.js","mappings":"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","sources":["webpack://tableau/../../node_modules/guid/guid.js","webpack://tableau/./lib/src/ExtensionsApi/Events/DashboardLayoutChangedEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/FilterChangedEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/MarksSelectedEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/ParameterChangedEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/SummaryDataChangedEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/TableauEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/TableauSheetEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/WorksheetFormattingChangedEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/ConnectedServer.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/ExtensionsImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/SettingsImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/UIImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Models/Dashboard.js","webpack://tableau/./lib/src/ExtensionsApi/Models/DashboardObject.js","webpack://tableau/./lib/src/ExtensionsApi/Models/Parameter.js","webpack://tableau/./lib/src/ExtensionsApi/Models/Sheet.js","webpack://tableau/./lib/src/ExtensionsApi/Models/Workbook.js","webpack://tableau/./lib/src/ExtensionsApi/Models/Worksheet.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/DashboardContent.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/Environment.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/Extensions.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/Settings.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/UI.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js","webpack://tableau/./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js","webpack://tableau/./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js","webpack://tableau/../api-external-contract-js/lib/src/EmbeddingApiExternalContract.js","webpack://tableau/../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/AskDataInterfaces.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/PulseInterfaces.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/WebComponentInterfaces.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Shared/Enums.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js","webpack://tableau/../api-external-contract-js/lib/src/SharedApiExternalContract.js","webpack://tableau/../api-internal-contract-js/lib/src/JsApiInternalContract.js","webpack://tableau/../api-internal-contract-js/lib/src/contract/DataTypeConverter.js","webpack://tableau/../api-internal-contract-js/lib/src/contract/Enums.js","webpack://tableau/../api-internal-contract-js/lib/src/contract/Notifications.js","webpack://tableau/../api-internal-contract-js/lib/src/contract/Parameters.js","webpack://tableau/../api-internal-contract-js/lib/src/contract/Verbs.js","webpack://tableau/../api-internal-contract-js/lib/src/interface/AskDataInterface.js","webpack://tableau/../api-internal-contract-js/lib/src/interface/PulseInterface.js","webpack://tableau/../api-internal-contract-js/lib/src/interface/VqlInterface.js","webpack://tableau/../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js","webpack://tableau/../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js","webpack://tableau/../api-internal-contract-js/lib/src/messaging/MessageTypeChecks.js","webpack://tableau/../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/VersionTranslations.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js","webpack://tableau/../api-shared-js/lib/src/ApiShared.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/ApiVersion.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/ConnectionSummary.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/DataSource.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/EventListenerManager.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Field.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/StoryImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/WorkbookImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/LogicalTable.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Models/AccessibilityModels.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Models/FilterModels.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Models/GetDataTableReaderModels.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Point.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/GetDataService.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/AccessibilityServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ExportServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/StoryActivationServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/TableSummary.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/TableauError.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/Deferred.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/Param.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/ShortLivedDeferred.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/VersionNumber.js","webpack://tableau/../api-shared-js/lib/src/VersionedExternalApiDispatcher.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/regex.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/v1.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/md5.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/v3.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/v4.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/sha1.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/v5.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/nil.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/version.js","webpack://tableau/webpack/bootstrap","webpack://tableau/webpack/runtime/define property getters","webpack://tableau/webpack/runtime/hasOwnProperty shorthand","webpack://tableau/webpack/runtime/make namespace object","webpack://tableau/./lib/src/ExtensionsApi.js"],"sourcesContent":["(function () {\n var validator = new RegExp(\"^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$\", \"i\");\n\n function gen(count) {\n var out = \"\";\n for (var i=0; i {\n // TODO: Filtering of the filters should eventually be done platform side.\n const eventedFilter = this.fieldId\n ? filters.find((filter) => filter.fieldId === this.fieldId, this)\n : filters.find((filter) => filter.fieldName === this.fieldName, this);\n if (!eventedFilter) {\n // We shouldn't hit this unless the filter was removed from the worksheet\n // after the event was raised.\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.MissingFilter, `cannot find filter: ${this._fieldName}`);\n }\n return eventedFilter;\n });\n }\n}\nexports.FilterChangedEvent = FilterChangedEvent;\n//# sourceMappingURL=FilterChangedEvent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst TableauWorksheetEvent_1 = require(\"./TableauWorksheetEvent\");\nclass MarksSelectedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent {\n constructor(worksheet) {\n super(api_external_contract_js_1.TableauEventType.MarkSelectionChanged, worksheet);\n }\n getMarksAsync() {\n return this.worksheet.getSelectedMarksAsync();\n }\n}\nexports.MarksSelectedEvent = MarksSelectedEvent;\n//# sourceMappingURL=MarksSelectedEvent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst Parameter_1 = require(\"../Models/Parameter\");\nconst ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nconst TableauSheetEvent_1 = require(\"./TableauSheetEvent\");\nclass ParameterChangedEvent extends TableauSheetEvent_1.TableauSheetEvent {\n constructor(_globalFieldName, sheet) {\n super(api_external_contract_js_1.TableauEventType.ParameterChanged, sheet);\n this._globalFieldName = _globalFieldName;\n }\n getParameterAsync() {\n // Call down to our service to get the parameter back via its field name\n const service = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"parameters-service\" /* Parameters */);\n return service.findParameterByGlobalFieldNameAsync(this._globalFieldName).then((parameterImpl) => {\n if (parameterImpl === undefined) {\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.MissingParameter, `Cannot find parameter: ${this._globalFieldName}`);\n }\n return new Parameter_1.Parameter(parameterImpl, this.sheet);\n });\n }\n}\nexports.ParameterChangedEvent = ParameterChangedEvent;\n//# sourceMappingURL=ParameterChangedEvent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst TableauWorksheetEvent_1 = require(\"./TableauWorksheetEvent\");\nclass SummaryDataChangedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent {\n constructor(worksheet) {\n super(api_external_contract_js_1.TableauEventType.SummaryDataChanged, worksheet);\n }\n}\nexports.SummaryDataChangedEvent = SummaryDataChangedEvent;\n//# sourceMappingURL=SummaryDataChangedEvent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nclass TableauEvent {\n constructor(type) {\n this._type = type;\n }\n get type() {\n return this._type;\n }\n}\nexports.TableauEvent = TableauEvent;\n//# sourceMappingURL=TableauEvent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst TableauEvent_1 = require(\"./TableauEvent\");\nclass TableauSheetEvent extends TableauEvent_1.TableauEvent {\n constructor(type, sheet) {\n super(type);\n this._sheet = sheet;\n }\n get sheet() {\n return this._sheet;\n }\n}\nexports.TableauSheetEvent = TableauSheetEvent;\n//# sourceMappingURL=TableauSheetEvent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst TableauSheetEvent_1 = require(\"./TableauSheetEvent\");\nclass TableauWorksheetEvent extends TableauSheetEvent_1.TableauSheetEvent {\n constructor(type, _worksheet) {\n super(type, _worksheet);\n this._worksheet = _worksheet;\n }\n get worksheet() {\n return this._worksheet;\n }\n}\nexports.TableauWorksheetEvent = TableauWorksheetEvent;\n//# sourceMappingURL=TableauWorksheetEvent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst TableauEvent_1 = require(\"./TableauEvent\");\nclass WorkbookFormattingChangedEvent extends TableauEvent_1.TableauEvent {\n constructor(_formatting) {\n super(Contract.TableauEventType.WorkbookFormattingChanged);\n this._formatting = _formatting;\n }\n get formatting() {\n return this._formatting;\n }\n}\nexports.WorkbookFormattingChangedEvent = WorkbookFormattingChangedEvent;\n//# sourceMappingURL=WorkbookFormattingChangedEvent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst TableauWorksheetEvent_1 = require(\"./TableauWorksheetEvent\");\nclass WorksheetFormattingChangedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent {\n constructor(worksheet, _formatting) {\n super(Contract.TableauEventType.WorksheetFormattingChanged, worksheet);\n this._formatting = _formatting;\n }\n get formatting() {\n return this._formatting;\n }\n}\nexports.WorksheetFormattingChangedEvent = WorksheetFormattingChangedEvent;\n//# sourceMappingURL=WorksheetFormattingChangedEvent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BentonSansFontFamilyName = 'Benton Sans';\nexports.BentonSansLowDPIFontFamilyName = 'Benton Sans Low-DPI';\nexports.BentonSansBookFontFaceName = 'Benton Sans Book';\nexports.BentonSansBookItalicFontFaceName = 'Benton Sans Book Italic';\nexports.BentonSansSemiDemiFontFaceName = 'Benton Sans SemiDemi';\nexports.BentonSansSemiDemiItalicFontFaceName = 'Benton Sans SemiDemi Italic';\nexports.BentonSansLightFontFaceName = 'Benton Sans Light';\nexports.BentonSansMediumFontFaceName = 'Benton Sans Medium';\nexports.SupportedBentonSansFontFaces = [\n exports.BentonSansBookFontFaceName,\n exports.BentonSansBookItalicFontFaceName,\n exports.BentonSansSemiDemiFontFaceName,\n exports.BentonSansSemiDemiItalicFontFaceName,\n exports.BentonSansLightFontFaceName,\n exports.BentonSansMediumFontFaceName,\n];\n//# sourceMappingURL=BentonSansFontNameConstants.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nclass ConnectedServer {\n constructor(_userId, _siteId, _siteNamespace, _workbookId) {\n this._userId = _userId;\n this._siteId = _siteId;\n this._siteNamespace = _siteNamespace;\n this._workbookId = _workbookId;\n }\n get userId() {\n return this._userId;\n }\n get siteId() {\n return this._siteId;\n }\n get siteNamespace() {\n return this._siteNamespace;\n }\n get workbookId() {\n return this._workbookId;\n }\n}\nexports.ConnectedServer = ConnectedServer;\n//# sourceMappingURL=ConnectedServer.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nclass ExtensionWorkbookImpl extends api_shared_js_1.WorkbookImpl {\n getAllDataSourcesAsync() {\n const service = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"data-source-service\" /* DataSourceService */);\n return service.getAllDataSourcesAsync().then((result) => {\n const dataSchema = result;\n const dataSources = [];\n // Loop through all data sources and add them.\n Object.values(dataSchema.dataSources).forEach((ds) => {\n dataSources.push(this.createDataSourceFromInfo(ds));\n });\n return dataSources;\n });\n }\n createDataSourceFromInfo(dataSourceInfo) {\n const dataSourceImpl = new api_shared_js_1.DataSourceImpl(dataSourceInfo, ServiceRegistryUtil_1.ExtensionsRegistryId);\n const dataSource = new api_shared_js_1.DataSource(dataSourceImpl);\n dataSourceImpl.initializeWithPublicInterfaces(dataSource);\n return dataSource;\n }\n}\nexports.ExtensionWorkbookImpl = ExtensionWorkbookImpl;\n//# sourceMappingURL=ExtensionWorkbookImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst Dashboard_1 = require(\"../Models/Dashboard\");\nconst Workbook_1 = require(\"../Models/Workbook\");\nconst Worksheet_1 = require(\"../Models/Worksheet\");\nconst DashboardContent_1 = require(\"../Namespaces/DashboardContent\");\nconst Environment_1 = require(\"../Namespaces/Environment\");\nconst Settings_1 = require(\"../Namespaces/Settings\");\nconst UI_1 = require(\"../Namespaces/UI\");\nconst WorkbookFormattingEnvUtil_1 = require(\"../Namespaces/WorkbookFormattingEnvUtil\");\nconst WorksheetContent_1 = require(\"../Namespaces/WorksheetContent\");\nconst RegisterAllExtensionsServices_1 = require(\"../Services/RegisterAllExtensionsServices\");\nconst ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nconst BentonSansFontNameConstants_1 = require(\"./BentonSansFontNameConstants\");\nconst ExtensionWorkbookImpl_1 = require(\"./ExtensionWorkbookImpl\");\nconst LegacyInternalApiDispatcherHolder_1 = require(\"./LegacyInternalApiDispatcherHolder\");\nconst SettingsImpl_1 = require(\"./SettingsImpl\");\nconst TableauBookFontNameConstants_1 = require(\"./TableauBookFontNameConstants\");\nconst UIImpl_1 = require(\"./UIImpl\");\nclass ExtensionsImpl {\n initializeAsync(isExtensionDialog, contextMenuCallbacks) {\n if (!this._initializationPromise) {\n this._initializationPromise = new Promise((resolve, reject) => {\n var _a;\n const initOptions = { isAlpha: api_shared_js_1.ApiVersion.Instance.isAlpha };\n // First thing we want to do is check to see if there is a desktop dispatcher already registered for us\n if (LegacyInternalApiDispatcherHolder_1.LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise(initOptions)) {\n // Running in a pre-2019.3 desktop, use our legacy dispatcher promise\n const desktopDispatcherPromise = LegacyInternalApiDispatcherHolder_1.LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise(initOptions);\n (_a = desktopDispatcherPromise) === null || _a === void 0 ? void 0 : _a.then((dispatcherFactory) => this.onDispatcherReceived(dispatcherFactory, isExtensionDialog, contextMenuCallbacks)).then((openPayload) => {\n resolve(openPayload);\n }).catch((error) => {\n reject(error);\n });\n }\n else {\n // We must be running in server, so we should try to kick of the server dispatcher bootstrapping\n const onDispatcherReceivedCallback = this.onDispatcherReceived.bind(this);\n api_shared_js_1.doCrossFrameBootstrap(window, api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION, initOptions)\n .then((factory) => {\n return onDispatcherReceivedCallback(factory, isExtensionDialog, contextMenuCallbacks);\n })\n .then((openPayload) => {\n resolve(openPayload);\n })\n .catch((error) => {\n reject(error);\n });\n }\n });\n }\n return this._initializationPromise;\n }\n createVizImageAsync(inputSpec) {\n const vizService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"viz-service\" /* Viz */);\n return vizService.createVizImageAsync(inputSpec);\n }\n setClickThroughAsync(clickThroughEnabled) {\n const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"UIService\" /* UIService */);\n return uiService.setClickThroughAsync(clickThroughEnabled, this.extensionZoneId);\n }\n isDashboardExtensionLocator(locator) {\n const dashboardExtensionLocator = locator;\n if (!dashboardExtensionLocator.dashboardPath) {\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Unexpected error during initialization.');\n }\n return true;\n }\n onDispatcherReceived(dispatcherFactory, isExtensionDialog, contextMenuFunctions) {\n let dispatcher = dispatcherFactory(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION);\n // Call to register all the services which will use the newly initialized dispatcher\n RegisterAllExtensionsServices_1.registerInitializationExtensionsServices(dispatcher);\n // Get the initialization service and initialize this extension\n const initializationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"InitializationService\" /* InitializationService */);\n const callbackMapKeys = contextMenuFunctions ? Object.keys(contextMenuFunctions) : [];\n return initializationService.initializeDashboardExtensionsAsync(isExtensionDialog, callbackMapKeys).then((result) => {\n // If we receive an invalid plaform version, this means that platform is runnning 1.4 or 2.1 and\n // doesn't pass the platform version to external. In this case we assume the platform version to be 1.9\n const platformVersion = result.extensionEnvironment.platformVersion\n ? result.extensionEnvironment.platformVersion\n : { major: 1, minor: 9, fix: 0 };\n // Wrap our existing dispatcher in a dispatcher that can downgrade/upgrade for an older platform.\n if (api_shared_js_1.VersionedExternalApiDispatcher.needsVersionConverter(platformVersion)) {\n dispatcher = new api_shared_js_1.VersionedExternalApiDispatcher(dispatcher, platformVersion);\n }\n // Registration of services must happen before initializing content and environment\n // Extensions doesn't need to pass in a registryId. By default, the service registry instance is associated with registryId=0.\n api_shared_js_1.registerAllSharedServices(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId);\n RegisterAllExtensionsServices_1.registerAllExtensionsServices(dispatcher);\n if (result.extensionDashboardInfo && this.isDashboardExtensionLocator(result.extensionInstance.locator)) {\n this.dashboardContent = this.initializeDashboardContent(result.extensionDashboardInfo, result.extensionInstance.locator.dashboardPath);\n this.extensionZoneId = result.extensionDashboardInfo.extensionZoneId;\n }\n if (result.extensionWorksheetInfo) {\n this.worksheetContent = this.initializeWorksheetContent(result.extensionWorksheetInfo);\n }\n this.environment = new Environment_1.Environment(result.extensionEnvironment);\n this.settings = this.initializeSettings(result.extensionSettingsInfo);\n this.ui = new UI_1.UI(new UIImpl_1.UIImpl());\n this.workbook = new Workbook_1.Workbook(new ExtensionWorkbookImpl_1.ExtensionWorkbookImpl());\n if (result.extensionEnvironment.workbookFormatting) {\n this.initializeTableauFonts(dispatcher, result.extensionEnvironment.workbookFormatting);\n this.applyAllFormatting(result.extensionEnvironment.workbookFormatting);\n }\n // After initialization has completed, setup listeners for the callback functions that\n // are meant to be triggered whenever a context menu item is clicked.\n this.initializeContextMenuCallbacks(contextMenuFunctions);\n // Also set up listeners for ExtensionStylesChangedEvent\n this.initializeWorkbookFormattingChangedEventCallback(dispatcher);\n // In the normal initialization case, this will be an empty string. When returning from initializeAsync to the\n // developer, we just ingore that string. In the case of initializing from an extension dialog, this string\n // is an optional payload sent from the parent extension.\n return result.extensionDialogPayload;\n });\n }\n applyAllFormatting(formattingModel) {\n if (!this._styleElement) {\n this._styleElement = document.createElement('style');\n this._styleElement.id = 'Tableau-Extension-Formatting';\n document.head.appendChild(this._styleElement);\n }\n if (!this._styleElement.sheet || !formattingModel) {\n return;\n }\n const stylesheet = this._styleElement.sheet;\n while (stylesheet.cssRules.length > 0) {\n stylesheet.deleteRule(stylesheet.cssRules.length - 1);\n }\n formattingModel.formattingSheets.map((currentFormattingSheet) => {\n this.applyFormattingSheetToStyleSheet(currentFormattingSheet, stylesheet);\n });\n }\n applyFormattingSheetToStyleSheet(currentFormattingSheet, stylesheet) {\n let styleInfo = '';\n const cssProperties = currentFormattingSheet.cssProperties;\n if (cssProperties.fontFamily) {\n styleInfo += 'font-family: ' + cssProperties.fontFamily.toString() + '; ';\n }\n if (cssProperties.fontSize) {\n styleInfo += 'font-size: ' + cssProperties.fontSize.toString() + '; ';\n }\n if (cssProperties.fontWeight) {\n styleInfo += 'font-weight: ' + cssProperties.fontWeight.toString() + '; ';\n }\n if (cssProperties.fontStyle) {\n styleInfo += 'font-style: ' + cssProperties.fontStyle.toString() + '; ';\n }\n if (cssProperties.textDecoration) {\n styleInfo += 'text-decoration: ' + cssProperties.textDecoration.toString() + '; ';\n }\n if (cssProperties.color) {\n styleInfo += 'color: ' + cssProperties.color + '; ';\n }\n const selector = '.' + currentFormattingSheet.classNameKey;\n const rule = selector + ' { ' + styleInfo + ' }';\n stylesheet.insertRule(rule, stylesheet.cssRules.length);\n }\n initializeWorkbookFormattingChangedEventCallback(dispatcher) {\n const notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* Notification */);\n // Unregister function not used since these notifications should be\n // observed for the full lifetime of the extension.\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorkbookFormattingChanged, () => true, (eventFormatting) => {\n if (eventFormatting) {\n this.initializeTableauFonts(dispatcher, eventFormatting);\n this.applyAllFormatting(eventFormatting);\n }\n });\n }\n initializeTableauFonts(dispatcher, workbookFormatting) {\n const fontNames = [...BentonSansFontNameConstants_1.SupportedBentonSansFontFaces, ...TableauBookFontNameConstants_1.SupportedTableauFontFaces];\n workbookFormatting.formattingSheets.forEach((formattingSheet) => {\n if (formattingSheet.cssProperties.fontFamily) {\n fontNames.push(formattingSheet.cssProperties.fontFamily);\n }\n });\n if (fontNames.length > 0) {\n const parameters = { [api_internal_contract_js_1.ParameterId.FontNameListItems]: fontNames };\n dispatcher\n .execute(api_internal_contract_js_1.VerbId.GetFonts, parameters)\n .then((response) => {\n this.loadFonts(response.result);\n })\n .catch();\n }\n }\n loadFonts(fonts) {\n fonts.forEach((fontNameAndInfo) => {\n if (TableauBookFontNameConstants_1.SupportedTableauFontFaces.includes(fontNameAndInfo.fontName)) {\n this.loadTableauFonts(fontNameAndInfo);\n }\n else if (BentonSansFontNameConstants_1.SupportedBentonSansFontFaces.includes(fontNameAndInfo.fontName)) {\n this.loadBentonSansFonts(fontNameAndInfo);\n }\n else {\n document.fonts.add(new FontFace(fontNameAndInfo.fontName, fontNameAndInfo.fontBinaryInfo));\n }\n });\n }\n initializeDashboardContent(info, sheetPath) {\n // sheets are always active for Extensions\n const sheetInfoImpl = new api_shared_js_1.SheetInfoImpl(info.name, api_external_contract_js_1.SheetType.Dashboard, { width: info.size.w, height: info.size.h }, undefined, true);\n const dashboardImpl = new api_shared_js_1.DashboardImpl(sheetInfoImpl, info.zones, sheetPath, ServiceRegistryUtil_1.ExtensionsRegistryId, null, info.activeDashboardObjectId);\n const dashboard = new Dashboard_1.Dashboard(dashboardImpl);\n return new DashboardContent_1.DashboardContent(dashboard);\n }\n initializeWorksheetContent(info) {\n const sheetInfoImpl = new api_shared_js_1.SheetInfoImpl(info.visualId.worksheet, api_external_contract_js_1.SheetType.Worksheet, { width: info.size.w, height: info.size.h }, undefined, // index property is embedding specific\n true);\n const worksheetImpl = new api_shared_js_1.WorksheetImpl(sheetInfoImpl, ServiceRegistryUtil_1.ExtensionsRegistryId, info.visualId, null, // parentDashboard is always null for worksheet in WorksheetContent\n null, // parentStoryPoint is only used for embedding\n info.backgroundColor, WorkbookFormattingEnvUtil_1.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(info.formatting));\n const worksheet = new Worksheet_1.Worksheet(worksheetImpl);\n return new WorksheetContent_1.WorksheetContent(worksheet);\n }\n initializeSettings(settingsInfo) {\n const settingsImpl = new SettingsImpl_1.SettingsImpl(settingsInfo);\n return new Settings_1.Settings(settingsImpl);\n }\n initializeContextMenuCallbacks(contextMenuFunctions) {\n const notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* Notification */);\n // Unregister function not used since these notifications should be\n // observed for the full lifetime of the extension.\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ContextMenuClick, () => {\n // Let through any context menu event, these are already filtered on api-core\n // based on the extension locator.\n return true;\n }, (event) => {\n // Execute the function associated with this context menu ID\n if (contextMenuFunctions) {\n if (!contextMenuFunctions[event.id]) {\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Received unexpected context menu Id from event: ${event.id}`);\n }\n contextMenuFunctions[event.id]();\n }\n });\n }\n loadTableauFonts(fontNameAndInfo) {\n switch (fontNameAndInfo.fontName) {\n case TableauBookFontNameConstants_1.TableauBookFontFaceName:\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBookFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' }));\n break;\n case TableauBookFontNameConstants_1.TableauLightFontFaceName:\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauLightFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' }));\n break;\n case TableauBookFontNameConstants_1.TableauRegularFontFaceName:\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauRegularFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' }));\n break;\n case TableauBookFontNameConstants_1.TableauSemiBoldFontFaceName:\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauSemiboldFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' }));\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauRegularFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' }));\n break;\n case TableauBookFontNameConstants_1.TableauBoldFontFaceName:\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBoldFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' }));\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBoldFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' }));\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauMediumFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' }));\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauSemiboldFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' }));\n break;\n case TableauBookFontNameConstants_1.TableauMediumFontFaceName:\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauMediumFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' }));\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauLightFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' }));\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBookFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' }));\n break;\n default:\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `'attempted to load unsupported font: ${fontNameAndInfo.fontName}.'`);\n }\n }\n loadBentonSansFonts(fontNameAndInfo) {\n switch (fontNameAndInfo.fontName) {\n case BentonSansFontNameConstants_1.BentonSansBookFontFaceName:\n document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' }));\n document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansLowDPIFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: '100', style: 'normal' }));\n break;\n case BentonSansFontNameConstants_1.BentonSansLightFontFaceName:\n document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: '100', style: 'normal' }));\n break;\n case BentonSansFontNameConstants_1.BentonSansMediumFontFaceName:\n document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' }));\n document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansLowDPIFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' }));\n break;\n case BentonSansFontNameConstants_1.BentonSansSemiDemiFontFaceName:\n document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansLowDPIFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' }));\n break;\n case BentonSansFontNameConstants_1.BentonSansBookItalicFontFaceName:\n document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansFontFamilyName, fontNameAndInfo.fontBinaryInfo, { style: 'italic' }));\n break;\n case BentonSansFontNameConstants_1.BentonSansSemiDemiItalicFontFaceName:\n document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansLowDPIFontFamilyName, fontNameAndInfo.fontBinaryInfo, { style: 'italic' }));\n break;\n default:\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `'attempted to load unsupported font: ${fontNameAndInfo.fontName}.'`);\n }\n }\n}\nexports.ExtensionsImpl = ExtensionsImpl;\n//# sourceMappingURL=ExtensionsImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\n/**\n * LegacyInternalApiDispatcherHolder has been moved (and renamed) from api-internal-contract.\n * It supports running a newer external library against a pre 2019.3 desktop.\n * Starting in 2019.3, we have a merged bootstrap style for both desktop and server.\n * In addition, the alpha checking that is happening here is not necessary in external-api-js\n * after 2019.3 because that checking happens in api-platform-js (ApiDispatcherTest.ts)\n * TFSID: 1091561 tracks an improvement to this system to make it less complex and tie it directly to\n * tableau beta release versions.\n * @deprecated\n */\n// eslint-disable-next-line @typescript-eslint/no-namespace\nvar LegacyInternalApiDispatcherHolder;\n(function (LegacyInternalApiDispatcherHolder) {\n /**\n * @param options\n */\n function getDesktopDispatcherPromise(options) {\n var _a;\n if ((!options || typeof options.isAlpha === 'undefined') && !window.__warningIssued) {\n // tslint:disable-next-line:no-console\n console.warn('This is a beta version of the Extensions API. Please upgrade to an official release.');\n window.__warningIssued = true;\n }\n else if (((_a = options) === null || _a === void 0 ? void 0 : _a.isAlpha) && window.__platformIsOfficialRelease) {\n window.__tableauDesktopDispatcher\n .then((dispatcherFactory) => {\n const dispatcher = dispatcherFactory(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION);\n dispatcher.execute(api_internal_contract_js_1.VerbId.BlockExtension, {}).catch();\n })\n .catch();\n }\n // this will be undefined if promise is rejected or throws\n return window.__tableauDesktopDispatcher;\n }\n LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise = getDesktopDispatcherPromise;\n /**\n * @param options\n */\n function hasDesktopApiDispatcherPromise(options) {\n return !!getDesktopDispatcherPromise(options);\n }\n LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise = hasDesktopApiDispatcherPromise;\n})(LegacyInternalApiDispatcherHolder = exports.LegacyInternalApiDispatcherHolder || (exports.LegacyInternalApiDispatcherHolder = {}));\n//# sourceMappingURL=LegacyInternalApiDispatcherHolder.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst TableauEvent_1 = require(\"../Events/TableauEvent\");\nconst ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nclass SettingsChangedEvent extends TableauEvent_1.TableauEvent {\n constructor(_newSettings) {\n super(Contract.TableauEventType.SettingsChanged);\n this._newSettings = _newSettings;\n }\n get newSettings() {\n return this._newSettings;\n }\n}\nclass SettingsImpl {\n constructor(settingsInfo) {\n // Since promises can't be introspected for state, keep a variable that\n // indicates a save is in progress, so that set/erase can't be called during a save.\n this._saveInProgress = false;\n this.initializeSettings(settingsInfo);\n }\n erase(key) {\n api_shared_js_1.ErrorHelpers.verifyParameter(key, 'key');\n // Only make a modification if we have the key already\n if (this._currentSettings[key]) {\n this.verifySettingsAreUnlocked();\n delete this._currentSettings[key];\n this._isModified = true;\n }\n }\n get(key) {\n api_shared_js_1.ErrorHelpers.verifyParameter(key, 'key');\n return this._currentSettings[key];\n }\n getAll() {\n // Returns a mutable copy of the settings\n return Object.assign({}, this._currentSettings);\n }\n get isModified() {\n return this._isModified;\n }\n saveAsync() {\n this.verifySettingsAreUnlocked();\n // Just resolve immediately if settings are unchanged\n if (!this._isModified) {\n return Promise.resolve(this._currentSettings);\n }\n this._saveInProgress = true;\n // Use the settings service to save settings to twb\n const settingsService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"SettingsService\" /* SettingsService */);\n return settingsService.saveSettingsAsync(this._currentSettings).then((newSettings) => {\n this._saveInProgress = false;\n this._isModified = false;\n if (this._currentSettings === undefined) {\n this._currentSettings = newSettings;\n }\n else {\n Object.assign(this._currentSettings, newSettings);\n }\n return newSettings;\n }, (reason) => {\n this._saveInProgress = false;\n return Promise.reject(reason);\n });\n }\n set(key, value) {\n api_shared_js_1.ErrorHelpers.verifyStringParameter(key, 'key'); // Key shouldn't be an empty string.\n api_shared_js_1.ErrorHelpers.verifyParameter(value, 'value'); // Empty string value is allowed.\n this.verifySettingsAreUnlocked();\n this._currentSettings[key] = value;\n this._isModified = true;\n }\n /**\n * Initializes all events relevant to settings object. This is only a settingsUpdate event currently.\n *\n * @returns {Array} Collection of event managers to pass to an EventListenerManager.\n */\n initializeEvents() {\n const results = new Array();\n let notificationService;\n try {\n notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* Notification */);\n }\n catch (e) {\n // If we don't have this service registered, just return\n return results;\n }\n const settingsChangedEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.SettingsChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SettingsChanged, () => true, (event) => {\n this._currentSettings = event.newSettings;\n settingsChangedEvent.triggerEvent(() => new SettingsChangedEvent(event.newSettings));\n });\n results.push(settingsChangedEvent);\n return results;\n }\n initializeSettings(settingsInfo) {\n api_shared_js_1.ErrorHelpers.verifyParameter(settingsInfo, 'settingsInfo');\n api_shared_js_1.ErrorHelpers.verifyParameter(settingsInfo.settingsValues, 'settingsInfo.SettingsValues');\n this._currentSettings = settingsInfo.settingsValues;\n // Reset the isModified flag\n this._isModified = false;\n }\n /**\n * This helper should be called before any local update to this.currentSettings.\n * Checks if a current save call is still in progress and throws an error if so.\n */\n verifySettingsAreUnlocked() {\n if (this._saveInProgress) {\n throw new api_shared_js_1.TableauError(Contract.ErrorCodes.SettingSaveInProgress, SettingsImpl.ASYNC_SAVE_IN_PROGRESS);\n }\n }\n}\nexports.SettingsImpl = SettingsImpl;\nSettingsImpl.ASYNC_SAVE_IN_PROGRESS = 'Async Save is in progress, updating settings is not allowed.';\n//# sourceMappingURL=SettingsImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TableauBookFontFamilyName = 'Tableau Book';\nexports.TableauLightFontFamilyName = 'Tableau Light';\nexports.TableauRegularFontFamilyName = 'Tableau Regular';\nexports.TableauMediumFontFamilyName = 'Tableau Medium';\nexports.TableauSemiboldFontFamilyName = 'Tableau Semibold';\nexports.TableauBoldFontFamilyName = 'Tableau Bold';\nexports.TableauBookFontFaceName = 'Tableau Book';\nexports.TableauBoldFontFaceName = 'Tableau Bold';\nexports.TableauLightFontFaceName = 'Tableau Light';\nexports.TableauMediumFontFaceName = 'Tableau Medium';\nexports.TableauRegularFontFaceName = 'Tableau Regular';\nexports.TableauSemiBoldFontFaceName = 'Tableau Semi Bold';\nexports.SupportedTableauFontFaces = [\n exports.TableauBookFontFaceName,\n exports.TableauBoldFontFaceName,\n exports.TableauLightFontFaceName,\n exports.TableauMediumFontFaceName,\n exports.TableauRegularFontFaceName,\n exports.TableauSemiBoldFontFaceName,\n];\n//# sourceMappingURL=TableauBookFontNameConstants.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst TableauEvent_1 = require(\"../Events/TableauEvent\");\nconst ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nclass DialogMessageEvent extends TableauEvent_1.TableauEvent {\n constructor(message) {\n super(Contract.TableauEventType.DialogMessageReceived);\n this.message = message;\n }\n}\nexports.DialogMessageEvent = DialogMessageEvent;\nclass UIImpl {\n constructor() { }\n displayDialogAsync(url, payload, options) {\n const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"UIService\" /* UIService */);\n const notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* Notification */);\n return new Promise((resolve, reject) => {\n uiService\n .displayDialogAsync(url, payload || '', options)\n .then(() => {\n const unregisterFn = notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ExtensionDialogUpdate, () => {\n // Let through any dialog update event\n return true;\n }, (event) => {\n if (event.isCloseEvent) {\n if (event.closePayload === undefined) {\n throw new api_shared_js_1.TableauError(Contract.ErrorCodes.InternalError, 'closePayload is undefined');\n }\n resolve(event.closePayload);\n }\n else {\n reject(new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.DialogClosedByUser, 'Extension dialog closed by user.'));\n }\n unregisterFn();\n });\n })\n .catch((error) => {\n reject(error);\n });\n });\n }\n sendDialogMessageAsync(message, targetDialogUrl) {\n const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"UIService\" /* UIService */);\n uiService.sendDialogMessageAsync(message, targetDialogUrl);\n }\n closeDialog(payload) {\n const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"UIService\" /* UIService */);\n uiService.closeDialog(payload);\n }\n /**\n * Initializes all events relevant to UI object.\n *\n * @returns {Array} Collection of event managers to pass to an EventListenerManager.\n */\n initializeEvents() {\n const results = new Array();\n let notificationService;\n try {\n notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* Notification */);\n }\n catch (e) {\n // If we don't have this service registered, just return\n return results;\n }\n const dialogMessageEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.DialogMessageReceived);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ExtensionDialogMessage, () => true, (event) => {\n dialogMessageEvent.triggerEvent(() => new DialogMessageEvent(event.message));\n });\n results.push(dialogMessageEvent);\n return results;\n }\n}\nexports.UIImpl = UIImpl;\n//# sourceMappingURL=UIImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst DashboardLayoutChangedEvent_1 = require(\"../Events/DashboardLayoutChangedEvent\");\nconst WorkbookFormattingChangedEvent_1 = require(\"../Events/WorkbookFormattingChangedEvent\");\nconst ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nconst DashboardObject_1 = require(\"./DashboardObject\");\nconst Sheet_1 = require(\"./Sheet\");\nconst Worksheet_1 = require(\"./Worksheet\");\nclass Dashboard extends Sheet_1.Sheet {\n constructor(_dashboardImpl) {\n super(_dashboardImpl);\n this._dashboardImpl = _dashboardImpl;\n _dashboardImpl.initializeWithPublicInterfaces();\n this.initializeEvents().forEach((e) => this.addNewEventType(e));\n }\n get worksheets() {\n return this._dashboardImpl.worksheetsImpl.map((worksheetImpl) => {\n return new Worksheet_1.Worksheet(worksheetImpl);\n });\n }\n get objects() {\n return this._dashboardImpl.objects.map((dashboardObjectImpl) => {\n return new DashboardObject_1.DashboardObject(dashboardObjectImpl);\n });\n }\n get activeDashboardObjectId() {\n return this._dashboardImpl.activeDashboardObjectId;\n }\n get activeDashboardName() {\n return this._dashboardImpl.activeDashboardName;\n }\n setZoneVisibilityAsync(zoneVisibilityMap) {\n return this._dashboardImpl.setDashboardObjectVisibilityAsync(zoneVisibilityMap);\n }\n setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap) {\n return this._dashboardImpl.setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap);\n }\n getDashboardObjectById(dashboardObjectId) {\n const zone = this._dashboardImpl.getDashboardObjectById(dashboardObjectId);\n return zone && new DashboardObject_1.DashboardObject(zone);\n }\n initializeEvents() {\n const results = new Array();\n // Initializing events and registering notification service\n let notificationService;\n try {\n notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* Notification */);\n }\n catch (e) {\n // If we don't have this service registered, just return (allows unit testing without NotificationService mock)\n return results;\n }\n const dashboardLayoutChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.DashboardLayoutChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.DashboardLayoutChanged, () => true, (event) => {\n const dashboardObjectChanges = this._dashboardImpl.updateZones(event.zones, event.activeZoneId, event.activeDashboardName);\n dashboardLayoutChangedEvent.triggerEvent(() => new DashboardLayoutChangedEvent_1.DashboardLayoutChangedEvent(dashboardObjectChanges));\n });\n results.push(dashboardLayoutChangedEvent);\n const workbookFormattingChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.WorkbookFormattingChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorkbookFormattingChanged, () => true, (eventFormatting) => {\n workbookFormattingChangedEvent.triggerEvent(() => new WorkbookFormattingChangedEvent_1.WorkbookFormattingChangedEvent(eventFormatting));\n });\n results.push(workbookFormattingChangedEvent);\n return results;\n }\n moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray) {\n return this._dashboardImpl.moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray);\n }\n replayAnimationAsync(replaySpeed) {\n return this._dashboardImpl.replayAnimationAsync(replaySpeed);\n }\n getFiltersAsync() {\n return this._dashboardImpl.getFiltersAsync();\n }\n applyFilterAsync(fieldName, values, updateType, options) {\n return this._dashboardImpl.applyFilterAsync(fieldName, values, updateType, options);\n }\n}\nexports.Dashboard = Dashboard;\n//# sourceMappingURL=Dashboard.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Dashboard_1 = require(\"./Dashboard\");\nconst Worksheet_1 = require(\"./Worksheet\");\n/**\n * Implementation of the dashboard objects - the zones in a dashboard.\n */\nclass DashboardObject {\n constructor(_dashboardObjectImpl) {\n this._dashboardObjectImpl = _dashboardObjectImpl;\n }\n get dashboard() {\n return new Dashboard_1.Dashboard(this._dashboardObjectImpl.dashboardImpl);\n }\n get type() {\n return this._dashboardObjectImpl.type;\n }\n get position() {\n return this._dashboardObjectImpl.position;\n }\n get size() {\n return this._dashboardObjectImpl.size;\n }\n get worksheet() {\n if (this._dashboardObjectImpl.worksheetImpl) {\n return new Worksheet_1.Worksheet(this._dashboardObjectImpl.worksheetImpl);\n }\n return undefined;\n }\n get name() {\n return this._dashboardObjectImpl.name;\n }\n get isFloating() {\n return this._dashboardObjectImpl.isFloating;\n }\n get isVisible() {\n return this._dashboardObjectImpl.isVisible;\n }\n get id() {\n return this._dashboardObjectImpl.id;\n }\n get fieldId() {\n return this._dashboardObjectImpl.fieldId;\n }\n}\nexports.DashboardObject = DashboardObject;\n//# sourceMappingURL=DashboardObject.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst ParameterChangedEvent_1 = require(\"../Events/ParameterChangedEvent\");\nconst ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\n/**\n * Implementation of the Parameter contract. Calls down to the impl\n * class for almost all of the work it does.\n */\nclass Parameter extends api_shared_js_1.EventListenerManager {\n constructor(parameterImpl, sheet) {\n super();\n this.parameterImpl = parameterImpl;\n // Initialize our event handling for this class\n this.initializeEvents(sheet).forEach((e) => this.addNewEventType(e));\n }\n get name() {\n return this.parameterImpl.name;\n }\n get currentValue() {\n return this.parameterImpl.currentValue;\n }\n get dataType() {\n return this.parameterImpl.dataType;\n }\n get allowableValues() {\n return this.parameterImpl.allowableValues;\n }\n get id() {\n return this.parameterImpl.id;\n }\n changeValueAsync(newValue) {\n return this.parameterImpl.changeValueAsync(newValue);\n }\n /**\n * Helper method which goes through and registers each event type this impl knows about\n * with the NotificationService. It returns an array of SingleEventManager objects which\n * can then be passed to an EventListenerManager to handle user registration / unregistration.\n *\n * @param sheet The sheet object which will be included with the event notifications\n * @returns {Array} Collection of event managers to pass to an EventListenerManager\n */\n initializeEvents(sheet) {\n api_shared_js_1.ErrorHelpers.verifyInternalValue(sheet, 'sheet');\n const results = new Array();\n let notificationService;\n try {\n notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* Notification */);\n }\n catch (e) {\n // If we don't have this service registered, just return\n return results;\n }\n // Initialize all of the event managers we'll need (one for each event type)\n const parameterEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.ParameterChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ParameterChanged, (model) => {\n const fieldName = model;\n return fieldName === this.parameterImpl.id;\n }, (fieldName) => {\n parameterEvent.triggerEvent(() => new ParameterChangedEvent_1.ParameterChangedEvent(fieldName, sheet));\n });\n results.push(parameterEvent);\n return results;\n }\n}\nexports.Parameter = Parameter;\n//# sourceMappingURL=Parameter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst Parameter_1 = require(\"./Parameter\");\nclass Sheet extends api_shared_js_1.EventListenerManager {\n constructor(_sheetImpl) {\n super();\n this._sheetImpl = _sheetImpl;\n }\n get name() {\n return this._sheetImpl.name;\n }\n get sheetType() {\n return this._sheetImpl.sheetType;\n }\n get size() {\n if (this.isValidSize(this._sheetImpl.size)) {\n return this._sheetImpl.size;\n }\n throw new api_shared_js_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, 'Size not implemented');\n }\n isValidSize(size) {\n const testSize = size;\n if (testSize.width !== undefined && testSize.height !== undefined) {\n return true;\n }\n return false;\n }\n findParameterAsync(parameterName) {\n return this._sheetImpl.findParameterAsync(parameterName).then((parameterImpl) => {\n if (parameterImpl) {\n return new Promise((resolve) => resolve(new Parameter_1.Parameter(parameterImpl, this)));\n }\n else {\n return new Promise((resolve) => resolve(undefined));\n }\n });\n }\n getParametersAsync() {\n return this._sheetImpl.getParametersAsync().then((parametersImpl) => {\n return parametersImpl.map((parameterImpl) => {\n return new Parameter_1.Parameter(parameterImpl, this);\n });\n });\n }\n}\nexports.Sheet = Sheet;\n//# sourceMappingURL=Sheet.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nclass Workbook {\n constructor(_workbookImpl) {\n this._workbookImpl = _workbookImpl;\n }\n getAllDataSourcesAsync() {\n return this._workbookImpl.getAllDataSourcesAsync();\n }\n}\nexports.Workbook = Workbook;\n//# sourceMappingURL=Workbook.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst FilterChangedEvent_1 = require(\"../Events/FilterChangedEvent\");\nconst MarksSelectedEvent_1 = require(\"../Events/MarksSelectedEvent\");\nconst SummaryDataChangedEvent_1 = require(\"../Events/SummaryDataChangedEvent\");\nconst WorksheetFormattingChangedEvent_1 = require(\"../Events/WorksheetFormattingChangedEvent\");\nconst ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nconst Dashboard_1 = require(\"./Dashboard\");\nconst Sheet_1 = require(\"./Sheet\");\nclass Worksheet extends Sheet_1.Sheet {\n constructor(_worksheetImpl) {\n super(_worksheetImpl);\n this._worksheetImpl = _worksheetImpl;\n // Call to initialize events and then call down to the event listener manager to handle things\n this.initializeEvents().forEach((e) => this.addNewEventType(e));\n }\n get parentDashboard() {\n // This should never happen for Extensions if the DashboardImpls are created correctly\n if (this._worksheetImpl.parentDashboard == null) {\n throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `Parent dashboard not implemented`);\n }\n return new Dashboard_1.Dashboard(this._worksheetImpl.parentDashboard);\n }\n get backgroundColor() {\n if (this._worksheetImpl.backgroundColor == null) {\n throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `Worksheet background color is not available`);\n }\n return this._worksheetImpl.backgroundColor;\n }\n get formatting() {\n if (this._worksheetImpl.formatting == null) {\n throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `Worksheet formatting information is not available`);\n }\n return this._worksheetImpl.formatting;\n }\n /**\n * Helper method which goes through and registers each event type this impl knows about\n * with the NotificationService. It returns an array of SingleEventManager objects which\n * can then be passed to an EventListenerManager to handle user registration / unregistration.\n *\n * @param {Worksheet} worksheet The worksheet object which will be included with the event notifications\n * @returns {Array} Collection of event managers to pass to an EventListenerManager\n */\n initializeEvents() {\n const results = new Array();\n let notificationService;\n try {\n notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* Notification */);\n }\n catch (e) {\n // If we don't have this service registered, just return\n return results;\n }\n // Initialize all of the event managers we'll need (one for each event type)\n const marksEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.MarkSelectionChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SelectedMarksChanged, (model) => {\n const visualId = model;\n return this.visualIdsAreEqual(visualId, this._worksheetImpl.visualId);\n }, () => marksEvent.triggerEvent(() => new MarksSelectedEvent_1.MarksSelectedEvent(this)));\n const filterEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.FilterChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.FilterChanged, (model) => {\n const filterEventResponse = model;\n return this._worksheetImpl.visualId.worksheet === filterEventResponse.visualId.worksheet;\n }, (event) => {\n filterEvent.triggerEvent(() => new FilterChangedEvent_1.FilterChangedEvent(this, event.fieldName, event.fieldId));\n });\n const summaryDataEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.SummaryDataChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SummaryDataChanged, (model) => {\n const summaryDataEventResponse = model;\n return this._worksheetImpl.visualId.worksheet === summaryDataEventResponse.visualId.worksheet;\n }, (event) => {\n summaryDataEvent.triggerEvent(() => new SummaryDataChangedEvent_1.SummaryDataChangedEvent(this));\n });\n const worksheetFormattingChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.WorksheetFormattingChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorksheetFormattingChanged, (model) => {\n const worksheetFormattingChangedEvent = model;\n return this._worksheetImpl.visualId.worksheet === worksheetFormattingChangedEvent.visualId.worksheet;\n }, (eventFormatting) => {\n worksheetFormattingChangedEvent.triggerEvent(() => new WorksheetFormattingChangedEvent_1.WorksheetFormattingChangedEvent(this, eventFormatting));\n });\n results.push(marksEvent);\n results.push(filterEvent);\n results.push(summaryDataEvent);\n results.push(worksheetFormattingChangedEvent);\n return results;\n }\n applyFilterAsync(fieldName, values, updateType, options) {\n return this._worksheetImpl.applyFilterAsync(fieldName, values, updateType, options);\n }\n applyRangeFilterAsync(fieldName, filterOptions) {\n return this._worksheetImpl.applyRangeFilterAsync(fieldName, filterOptions);\n }\n applyHierarchicalFilterAsync(fieldName, values, updateType, options) {\n return this._worksheetImpl.applyHierarchicalFilterAsync(fieldName, values, updateType, options);\n }\n applyRelativeDateFilterAsync(fieldName, options) {\n return this._worksheetImpl.applyRelativeDateFilterAsync(fieldName, options);\n }\n clearFilterAsync(fieldName) {\n return this._worksheetImpl.clearFilterAsync(fieldName);\n }\n getDataSourcesAsync() {\n return this._worksheetImpl.getDataSourcesAsync();\n }\n getFiltersAsync() {\n return this._worksheetImpl.getFiltersAsync();\n }\n getSelectedMarksAsync() {\n return this._worksheetImpl.getSelectedMarksAsync();\n }\n getHighlightedMarksAsync() {\n return this._worksheetImpl.getHighlightedMarksAsync();\n }\n getSummaryDataAsync(options) {\n return this._worksheetImpl.getSummaryDataAsync(options);\n }\n getSummaryDataReaderAsync(pageRowCount, options) {\n return this._worksheetImpl.getSummaryDataReaderAsync(pageRowCount, options);\n }\n getSummaryColumnsInfoAsync() {\n return this._worksheetImpl.getSummaryColumnsInfoAsync();\n }\n getUnderlyingDataAsync(options) {\n console.warn('Worksheet.getUnderlyingDataAsync is deprecated. Please use ' +\n 'Worksheet.getUnderlyingTablesAsync and Worksheet.getUnderlyingTableDataAsync');\n return this._worksheetImpl.getUnderlyingDataAsync(options);\n }\n getUnderlyingTablesAsync() {\n return this._worksheetImpl.getUnderlyingTablesAsync();\n }\n getUnderlyingTableDataAsync(logicalTableId, options) {\n return this._worksheetImpl.getUnderlyingTableDataAsync(logicalTableId, options);\n }\n getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options) {\n return this._worksheetImpl.getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options);\n }\n getVisualSpecificationAsync() {\n return this._worksheetImpl.getVisualSpecificationAsync();\n }\n addMarksCardFieldsAsync(marksCardIndex, encodingType, columns, startIndex) {\n return this._worksheetImpl.addMarksCardFieldsAsync(marksCardIndex, encodingType, columns, startIndex);\n }\n moveMarksCardFieldAsync(marksCardIndex, fromIndex, toIndex, fieldCount = 1) {\n return this._worksheetImpl.moveMarksCardFieldAsync(marksCardIndex, fromIndex, toIndex, fieldCount);\n }\n spliceMarksCardFieldsAsync(marksCardIndex, encodingType, startIndex, deleteCount, columns) {\n return this._worksheetImpl.spliceMarksCardFieldsAsync(marksCardIndex, encodingType, startIndex, deleteCount, columns);\n }\n clearSelectedMarksAsync() {\n return this._worksheetImpl.clearSelectedMarksAsync();\n }\n selectMarksByIDAsync(marksInfo, updateType) {\n return this._worksheetImpl.selectMarksByIdAsync(marksInfo, updateType);\n }\n selectMarksByValueAsync(selections, selectionUpdateType) {\n return this._worksheetImpl.selectMarksByValueAsync(selections, selectionUpdateType);\n }\n selectMarksByIdAsync(selections, selectionUpdateType) {\n return this._worksheetImpl.selectMarksByIdAsync(selections, selectionUpdateType);\n }\n annotateMarkAsync(mark, annotationText) {\n return this._worksheetImpl.annotateMarkAsync(mark, annotationText);\n }\n getAnnotationsAsync() {\n return this._worksheetImpl.getAnnotationsAsync();\n }\n removeAnnotationAsync(annotation) {\n return this._worksheetImpl.removeAnnotationAsync(annotation);\n }\n hoverTupleAsync(hoveredTuple, tooltip, allowHoverActions = true) {\n return this._worksheetImpl.hoverTupleAsync(hoveredTuple, tooltip, allowHoverActions);\n }\n selectTuplesAsync(selectedTuples, selectOption, tooltip) {\n return this._worksheetImpl.selectTuplesAsync(selectedTuples, selectOption, tooltip);\n }\n getTooltipTextAsync(tupleId) {\n return this._worksheetImpl.getTooltipTextAsync(tupleId);\n }\n leaveMarkNavigationAsync() {\n return this._worksheetImpl.leaveMarkNavigationAsync();\n }\n editAliasesDialogAsync(fieldName) {\n return this._worksheetImpl.editAliasesDialogAsync(fieldName);\n }\n visualIdsAreEqual(a, b) {\n return (a &&\n b &&\n a.worksheet === b.worksheet &&\n a.dashboard === b.dashboard &&\n a.storyboard === b.storyboard &&\n a.storyPointID === b.storyPointID);\n }\n}\nexports.Worksheet = Worksheet;\n//# sourceMappingURL=Worksheet.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Implementation of the external DashboardContent namespace.\n * This does not follow the Impl pattern as DashboardContent is\n * currently just a (single) property bag.\n */\nclass DashboardContent {\n constructor(_dashboard) {\n this._dashboard = _dashboard;\n }\n get dashboard() {\n return this._dashboard;\n }\n}\nexports.DashboardContent = DashboardContent;\n//# sourceMappingURL=DashboardContent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst ConnectedServer_1 = require(\"../Impl/ConnectedServer\");\nconst WorkbookFormattingEnvUtil_1 = require(\"./WorkbookFormattingEnvUtil\");\n/**\n * Implementation of the external environment namespace.\n * Environment does not follow the Impl pattern as it is\n * just a property bag.\n * First class extensions can get to ConnectedServer with: environment['connectedServer']\n */\nclass Environment {\n constructor(extensionEnvironment) {\n this._apiVersion = api_shared_js_1.ApiVersion.Instance && api_shared_js_1.ApiVersion.Instance.formattedValue; // maj.min.fix (no build)\n this._context = api_shared_js_1.InternalToExternalEnumMappings.extensionContext.convert(extensionEnvironment.extensionContext);\n this._formatting = WorkbookFormattingEnvUtil_1.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(extensionEnvironment.workbookFormatting);\n this._language = extensionEnvironment.extensionLanguage;\n this._country = extensionEnvironment.extensionCountry;\n this._locale = extensionEnvironment.extensionLocale;\n this._mode = api_shared_js_1.InternalToExternalEnumMappings.extensionMode.convert(extensionEnvironment.extensionMode);\n this._operatingSystem = extensionEnvironment.operatingSystem;\n this._tableauVersion = extensionEnvironment.tableauVersion;\n this._uniqueUserId = extensionEnvironment.uniqueUserId;\n // If we have a userId, then we are a first class extension\n if (extensionEnvironment.userId) {\n this.connectedServer = new ConnectedServer_1.ConnectedServer(extensionEnvironment.userId, extensionEnvironment.siteId, extensionEnvironment.siteNamespace, extensionEnvironment.workbookId);\n this.featureFlags = extensionEnvironment.featureFlags;\n }\n }\n get apiVersion() {\n return this._apiVersion;\n }\n get context() {\n return this._context;\n }\n get workbookFormatting() {\n return this._formatting;\n }\n get language() {\n return this._language;\n }\n get country() {\n return this._country;\n }\n get locale() {\n return this._locale;\n }\n get mode() {\n return this._mode;\n }\n get operatingSystem() {\n return this._operatingSystem;\n }\n get tableauVersion() {\n return this._tableauVersion;\n }\n get uniqueUserId() {\n return this._uniqueUserId;\n }\n}\nexports.Environment = Environment;\n//# sourceMappingURL=Environment.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Implementation of the external Extensions namespace.\n */\nclass Extensions {\n constructor(extensionImpl) {\n this.extensionImpl = extensionImpl;\n this.extensionImpl = extensionImpl;\n }\n get dashboardContent() {\n return this.extensionImpl.dashboardContent;\n }\n get worksheetContent() {\n return this.extensionImpl.worksheetContent;\n }\n get environment() {\n return this.extensionImpl.environment;\n }\n get settings() {\n return this.extensionImpl.settings;\n }\n get ui() {\n return this.extensionImpl.ui;\n }\n get workbook() {\n return this.extensionImpl.workbook;\n }\n get dashboardObjectId() {\n return this.extensionImpl.extensionZoneId;\n }\n initializeAsync(contextMenuCallbacks) {\n return this.extensionImpl.initializeAsync(false, contextMenuCallbacks).then();\n }\n initializeDialogAsync() {\n return this.extensionImpl.initializeAsync(true);\n }\n createVizImageAsync(inputSpec) {\n return this.extensionImpl.createVizImageAsync(inputSpec);\n }\n setClickThroughAsync(clickThroughEnabled) {\n return this.extensionImpl.setClickThroughAsync(clickThroughEnabled);\n }\n}\nexports.Extensions = Extensions;\n//# sourceMappingURL=Extensions.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\n/**\n * Implementation of the external settings namespace.\n */\nclass Settings extends api_shared_js_1.EventListenerManager {\n constructor(_settingsImpl) {\n super();\n this._settingsImpl = _settingsImpl;\n // Initialize our event handling for this class\n this._settingsImpl.initializeEvents().forEach((e) => this.addNewEventType(e));\n }\n erase(key) {\n this._settingsImpl.erase(key);\n }\n get(key) {\n return this._settingsImpl.get(key);\n }\n getAll() {\n return this._settingsImpl.getAll();\n }\n get isModified() {\n return this._settingsImpl.isModified;\n }\n saveAsync() {\n return this._settingsImpl.saveAsync();\n }\n set(key, value) {\n this._settingsImpl.set(key, value);\n }\n}\nexports.Settings = Settings;\n//# sourceMappingURL=Settings.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\n/**\n * Implementation of the external UI namespace.\n */\nclass UI extends api_shared_js_1.EventListenerManager {\n constructor(_impl) {\n super();\n this._impl = _impl;\n // Initialize our event handling for this class\n this._impl.initializeEvents().forEach((e) => this.addNewEventType(e));\n }\n displayDialogAsync(url, payload, options) {\n return this._impl.displayDialogAsync(url, payload, options);\n }\n sendDialogMessageAsync(message, targetDialogUrl) {\n return this._impl.sendDialogMessageAsync(message, targetDialogUrl);\n }\n closeDialog(payload) {\n this._impl.closeDialog(payload);\n }\n}\nexports.UI = UI;\n//# sourceMappingURL=UI.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nclass WorkbookFormattingEnvUtil {\n static convertToWorkbookFormatting(workbookFormattingModel) {\n if (!workbookFormattingModel) {\n return undefined;\n }\n else {\n const formattingMap = workbookFormattingModel.formattingSheets.map((currentFormattingSheet) => {\n const formattingSheet = {\n classNameKey: api_shared_js_1.InternalToExternalEnumMappings.classNameKey.convert(currentFormattingSheet.classNameKey),\n cssProperties: getCssProperties(currentFormattingSheet.classNameKey, currentFormattingSheet.cssProperties),\n };\n return formattingSheet;\n });\n const result = {\n formattingSheets: formattingMap,\n };\n return result;\n }\n }\n}\nexports.WorkbookFormattingEnvUtil = WorkbookFormattingEnvUtil;\nfunction getCssProperties(classNameKey, cssProperties) {\n if (classNameKey === \"tableau-row-dividers\" /* RowDividers */ || classNameKey === \"tableau-column-dividers\" /* ColumnDividers */) {\n return {\n borderColor: cssProperties.borderColor,\n borderStyle: cssProperties.borderStyle,\n borderWidth: cssProperties.borderWidth,\n };\n }\n return {\n fontFamily: cssProperties.fontFamily,\n fontSize: cssProperties.fontSize,\n fontWeight: cssProperties.fontWeight,\n fontStyle: cssProperties.fontStyle,\n textDecoration: cssProperties.textDecoration,\n color: cssProperties.color,\n };\n}\n//# sourceMappingURL=WorkbookFormattingEnvUtil.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Implementation of the external WorksheetContent namespace.\n * This does not follow the Impl pattern as WorksheetContent is\n * currently just a (single) property bag.\n */\nclass WorksheetContent {\n constructor(_worksheet) {\n this._worksheet = _worksheet;\n }\n get worksheet() {\n return this._worksheet;\n }\n}\nexports.WorksheetContent = WorksheetContent;\n//# sourceMappingURL=WorksheetContent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nclass InitializationServiceImpl extends api_shared_js_1.ServiceImplBase {\n get serviceName() {\n return \"InitializationService\" /* InitializationService */;\n }\n initializeDashboardExtensionsAsync(isExtensionDialog, contextMenuIds) {\n const params = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'initializeDashboardExtensionsAsync',\n [api_internal_contract_js_1.ParameterId.ExtensionContextMenuIds]: contextMenuIds,\n [api_internal_contract_js_1.ParameterId.IsExtensionDialog]: isExtensionDialog,\n };\n return this.execute(api_internal_contract_js_1.VerbId.InitializeExtension, params).then((response) => {\n // TODO - Validate return value\n const result = response.result;\n return result;\n });\n }\n}\nexports.InitializationServiceImpl = InitializationServiceImpl;\n//# sourceMappingURL=InitializationServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nclass SettingsServiceImpl extends api_shared_js_1.ServiceImplBase {\n get serviceName() {\n return \"SettingsService\" /* SettingsService */;\n }\n saveSettingsAsync(settings) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'saveSettingsAsync',\n [api_internal_contract_js_1.ParameterId.SettingsValues]: settings,\n };\n return this.execute(api_internal_contract_js_1.VerbId.SaveExtensionSettings, parameters).then((value) => {\n const result = value.result;\n if (!result || !result.settingsValues) {\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Unexpected error savings settings.');\n }\n return result.settingsValues;\n });\n }\n}\nexports.SettingsServiceImpl = SettingsServiceImpl;\n//# sourceMappingURL=SettingsServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst DEFAULT_DIALOG_HEIGHT = 400; // in pixels\nconst DEFAULT_DIALOG_WIDTH = 600; // in pixels\nconst DEFAULT_DIALOG_STYLE = api_external_contract_js_1.DialogStyle.Window;\nclass UIServiceImpl extends api_shared_js_1.ServiceImplBase {\n get serviceName() {\n return \"UIService\" /* UIService */;\n }\n displayDialogAsync(url, payload, options) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'displayDialogAsync',\n [api_internal_contract_js_1.ParameterId.ExtensionDialogUrl]: url,\n [api_internal_contract_js_1.ParameterId.ExtensionDialogPayload]: payload,\n };\n const h = options && options.height ? options.height : DEFAULT_DIALOG_HEIGHT;\n const w = options && options.width ? options.width : DEFAULT_DIALOG_WIDTH;\n const dialogStyle = options && options.dialogStyle ? options.dialogStyle : DEFAULT_DIALOG_STYLE;\n // On the platform side, we do something reasonable regardess of whether the passed\n // height and width are too large or too small. But this likely indicates a developer error,\n // so we throw an error here to help with debugging.\n if (h <= 0 || w <= 0) {\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'Size parameters for displayDialogAsync must be positive');\n }\n parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogH] = h;\n parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogW] = w;\n api_shared_js_1.ErrorHelpers.verifyEnumValue(dialogStyle, api_external_contract_js_1.DialogStyle, 'DialogStyle');\n parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogStyle] = api_shared_js_1.ExternalToInternalEnumMappings.dialogStyles.convert(dialogStyle);\n return this.execute(api_internal_contract_js_1.VerbId.DisplayDialog, parameters).then((response) => {\n const dialogResult = response.result;\n switch (dialogResult) {\n case api_internal_contract_js_1.ExtensionDialogResult.DialogAlreadyOpen:\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.DialogAlreadyOpen, 'There already exists an open dialog for this extension.');\n case api_internal_contract_js_1.ExtensionDialogResult.InvalidDomain:\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidDomainDialog, 'The url of an extension dialog must match the domain of the parent extension.');\n default:\n // Success case\n return;\n }\n });\n }\n closeDialog(payload) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'closeDialog',\n };\n if (payload) {\n parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogPayload] = payload;\n }\n return this.execute(api_internal_contract_js_1.VerbId.CloseDialog, parameters).then(() => {\n return;\n });\n }\n sendDialogMessageAsync(message, targetDialogUrl) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'sendDialogMessage',\n [api_internal_contract_js_1.ParameterId.ExtensionDialogMessage]: message,\n };\n if (targetDialogUrl) {\n parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogUrl] = targetDialogUrl;\n }\n return this.execute(api_internal_contract_js_1.VerbId.SendDialogMessage, parameters).then(() => {\n return;\n });\n }\n setClickThroughAsync(clickThroughEnabled, extensionZoneId) {\n api_shared_js_1.ErrorHelpers.verifyParameterType(clickThroughEnabled, 'boolean', 'clickThroughEnabled');\n if (extensionZoneId === undefined || extensionZoneId <= 0) {\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Extension Id is invalid.');\n }\n const parameters = {\n [api_internal_contract_js_1.ParameterId.ExtensionZoneId]: extensionZoneId,\n [api_internal_contract_js_1.ParameterId.ClickThroughEnabled]: clickThroughEnabled,\n };\n return this.execute(api_internal_contract_js_1.VerbId.SetClickThrough, parameters).then(() => {\n return;\n });\n }\n}\nexports.UIServiceImpl = UIServiceImpl;\n//# sourceMappingURL=UIServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst InitializationServiceImpl_1 = require(\"./Impl/InitializationServiceImpl\");\nconst SettingsServiceImpl_1 = require(\"./Impl/SettingsServiceImpl\");\nconst UIServiceImpl_1 = require(\"./Impl/UIServiceImpl\");\nconst ServiceRegistryUtil_1 = require(\"./ServiceRegistryUtil\");\nfunction registerAllExtensionsServices(dispatcher) {\n api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).registerService(new SettingsServiceImpl_1.SettingsServiceImpl(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId));\n api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).registerService(new UIServiceImpl_1.UIServiceImpl(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId));\n}\nexports.registerAllExtensionsServices = registerAllExtensionsServices;\nfunction registerInitializationExtensionsServices(dispatcher) {\n api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).registerService(new InitializationServiceImpl_1.InitializationServiceImpl(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId));\n}\nexports.registerInitializationExtensionsServices = registerInitializationExtensionsServices;\n//# sourceMappingURL=RegisterAllExtensionsServices.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ExtensionsRegistryId = 0;\n//# sourceMappingURL=ServiceRegistryUtil.js.map","\"use strict\";\n// This file re-exports everything which is part of the extensions api public interface\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__export(require(\"./ExternalContract/Embedding/AskDataInterfaces\"));\nvar Enums_1 = require(\"./ExternalContract/Embedding/Enums\");\nexports.ApiMenuType = Enums_1.ApiMenuType;\nexports.CrosstabFileFormat = Enums_1.CrosstabFileFormat;\nexports.DeviceType = Enums_1.DeviceType;\nexports.EmbeddingErrorCodes = Enums_1.EmbeddingErrorCodes;\nexports.EmbeddingTableauEventType = Enums_1.TableauEventType;\nexports.FileFormats = Enums_1.FileFormats;\nexports.PrintOrientation = Enums_1.PrintOrientation;\nexports.PrintPageSize = Enums_1.PrintPageSize;\nexports.PrintScaling = Enums_1.PrintScaling;\nexports.PulseErrorMessageVisibility = Enums_1.PulseErrorMessageVisibility;\nexports.PulseLayout = Enums_1.PulseLayout;\nexports.PulseTimeDimension = Enums_1.PulseTimeDimension;\nexports.SheetSizeBehavior = Enums_1.SheetSizeBehavior;\nexports.TableauDialogType = Enums_1.TableauDialogType;\nexports.Toolbar = Enums_1.Toolbar;\n__export(require(\"./ExternalContract/Embedding/PulseInterfaces\"));\n__export(require(\"./ExternalContract/Embedding/VizInterfaces\"));\n__export(require(\"./ExternalContract/Embedding/WebComponentInterfaces\"));\n__export(require(\"./SharedApiExternalContract\"));\n//# sourceMappingURL=EmbeddingApiExternalContract.js.map","\"use strict\";\n// This file re-exports everything which is part of the extensions api public interface\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Tableau_1 = require(\"./ExternalContract/Extensions/Namespaces/Tableau\");\nexports.ErrorCodes = Tableau_1.ErrorCodes;\nexports.ExtensionContext = Tableau_1.ExtensionContext;\nexports.ExtensionMode = Tableau_1.ExtensionMode;\nexports.TableauEventType = Tableau_1.TableauEventType;\nexports.VizImageEncodingType = Tableau_1.VizImageEncodingType;\nexports.VizImagePaletteType = Tableau_1.VizImagePaletteType;\nexports.VizImageSizeSettingAlignmentType = Tableau_1.VizImageSizeSettingAlignmentType;\nexports.VizImageSizeSettingType = Tableau_1.VizImageSizeSettingType;\nexports.VizImageSortDirectionType = Tableau_1.VizImageSortDirectionType;\n__export(require(\"./SharedApiExternalContract\"));\n//# sourceMappingURL=ExtensionsApiExternalContract.js.map","\"use strict\";\n/**\n * This is your main. This is where you re-export everything you want to be publicly available.\n *\n * The build enforces that the file has the same name as the global variable that is exported.\n */\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__export(require(\"./EmbeddingApiExternalContract\"));\n__export(require(\"./ExtensionsApiExternalContract\"));\n//# sourceMappingURL=ExternalContract.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * The names of the string constants you can use as HTML attributes for the web component.\n * @ignore\n * @deprecated\n */\nvar AskDataAttributes;\n(function (AskDataAttributes) {\n AskDataAttributes[\"Origin\"] = \"origin\";\n AskDataAttributes[\"ShowEmbed\"] = \"show-embed\";\n AskDataAttributes[\"ShowPin\"] = \"show-pin\";\n AskDataAttributes[\"ShowSave\"] = \"show-save\";\n AskDataAttributes[\"ShowShare\"] = \"show-share\";\n})(AskDataAttributes = exports.AskDataAttributes || (exports.AskDataAttributes = {}));\n//# sourceMappingURL=AskDataInterfaces.js.map","\"use strict\";\n// All enum values made available to Embedding developers.\n// Enums should be kept in alphabetical order.\n// Most of them should match an enum on the server defined at\n// workgroup/vqlweb/scriptsharp/src/ApiShared/PublicEnums.cs#L398:17\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Crosstab file formats available to use with {@link Viz.exportCrosstabAsync}\n */\nvar CrosstabFileFormat;\n(function (CrosstabFileFormat) {\n CrosstabFileFormat[\"CSV\"] = \"csv\";\n CrosstabFileFormat[\"Excel\"] = \"xlsx\";\n})(CrosstabFileFormat = exports.CrosstabFileFormat || (exports.CrosstabFileFormat = {}));\n/**\n * Device types available to use with {@link Viz.device}\n */\nvar DeviceType;\n(function (DeviceType) {\n DeviceType[\"Default\"] = \"default\";\n DeviceType[\"Desktop\"] = \"desktop\";\n DeviceType[\"Tablet\"] = \"tablet\";\n DeviceType[\"Phone\"] = \"phone\";\n})(DeviceType = exports.DeviceType || (exports.DeviceType = {}));\n/**\n * All error codes used by the Embedding API.\n */\nvar EmbeddingErrorCodes;\n(function (EmbeddingErrorCodes) {\n /**\n * Raised when a request to the auth endpoint fails.\n */\n EmbeddingErrorCodes[\"AuthFailed\"] = \"auth-failed\";\n /**\n * The browser is not capable of supporting the Tableau Embedding API\n */\n EmbeddingErrorCodes[\"BrowserNotCapable\"] = \"browser-not-capable\";\n /**\n * The permissions on a workbook or a view do not allow downloading the workbook.\n */\n EmbeddingErrorCodes[\"DownloadWorkbookNotAllowed\"] = \"download-workbook-not-allowed\";\n /**\n * Thrown when an error occurs while attempting to perform a filter operation.\n */\n EmbeddingErrorCodes[\"FilterCannotBePerformed\"] = \"filter-cannot-be-performed\";\n /**\n * Thrown when attempting to switch to a sheet by index that does not exist in the workbook.\n */\n EmbeddingErrorCodes[\"IndexOutOfRange\"] = \"index-out-of-range\";\n /**\n * Thrown when an error occurs within the Tableau Embedding API. Contact Tableau Support.\n */\n EmbeddingErrorCodes[\"InternalError\"] = \"internal-error\";\n /**\n * An operation was attempted on a custom view that does not exist.\n */\n EmbeddingErrorCodes[\"InvalidCustomViewName\"] = \"invalid-custom-view-name\";\n /**\n * An invalid date was specified in a method that required a date parameter.\n */\n EmbeddingErrorCodes[\"InvalidDateParameter\"] = \"invalid-date-parameter\";\n /**\n * Either a filter operation was attempted on a field that does not exist in the data source, or the value supplied\n * in the filter operation is the wrong data type or format.\n */\n EmbeddingErrorCodes[\"invalidFilterFieldNameOrValue\"] = \"invalid-filter-field-name\";\n /**\n * A parameter is not the correct data type or format. The name of the parameter is specified in the Error.message\n * field.\n */\n EmbeddingErrorCodes[\"InvalidParameter\"] = \"invalid-parameter\";\n /**\n * The currently applied time dimension could not be determined or is invalid.\n */\n EmbeddingErrorCodes[\"InvalidTimeDimension\"] = \"invalid-time-dimension\";\n /**\n * A negative size was specified or the maxSize value is less than minSize in Sheet.changeSizeAsync().\n */\n EmbeddingErrorCodes[\"InvalidSize\"] = \"invalid-size\";\n /**\n * Attempted to get an authoring worksheet when the current sheet is not a worksheet.\n * @ignore\n */\n EmbeddingErrorCodes[\"InvalidSheetType\"] = \"invalid-sheet-type\";\n /**\n * A behavior value was found that is not included in the SheetSizeBehavior enum.\n */\n EmbeddingErrorCodes[\"InvalidSizeBehavior\"] = \"invalid-size-behavior\";\n /**\n * A behavior other than SheetSizeBehavior.Automatic was specified in Sheet.changeSizeAsync() when the sheet is a\n * Worksheet instance.\n */\n EmbeddingErrorCodes[\"InvalidSizeBehaviorOnWorksheet\"] = \"invalid-size-behavior-on-worksheet\";\n /**\n * The URL specified in the Viz class constructor is not valid.\n */\n EmbeddingErrorCodes[\"InvalidUrl\"] = \"invalid-url\";\n /**\n * The maxSize field is missing in Sheet.changeSizeAsync() when specifying SheetSizeBehavior.AtMost.\n */\n EmbeddingErrorCodes[\"MissingMaxSize\"] = \"missing-max-size\";\n /**\n * The minSize field is missing in Sheet.changeSizeAsync() when specifying SheetSizeBehavior.AtLeast.\n */\n EmbeddingErrorCodes[\"MissingMinSize\"] = \"missing-min-size\";\n /**\n * The minSize or maxSize field is missing in Sheet.changeSizeAsync() when specifying SheetSizeBehavior.Range.\n */\n EmbeddingErrorCodes[\"MissingMinMaxSize\"] = \"missing-min-max-size\";\n /**\n * Can occur if the embedding app interacts with a parameter that has been removed from the worksheet.\n */\n EmbeddingErrorCodes[\"MissingParameter\"] = \"missing-parameter\";\n /**\n * The rangeN field is missing for a relative date filter of type LASTN or NEXTN.\n */\n EmbeddingErrorCodes[\"MissingRangeNForRelativeDateFilters\"] = \"missing-range-n-for-relative-date-filters\";\n /**\n * An attempt was made to access Sheet.getUrl() on a hidden sheet. Hidden sheets do not have URLs.\n */\n EmbeddingErrorCodes[\"NoUrlForHiddenWorksheet\"] = \"no-url-for-hidden-worksheet\";\n /**\n * One or both of the parentElement or the URL parameters is not specified in the Viz constructor.\n */\n EmbeddingErrorCodes[\"NoUrlOrParentElementNotFound\"] = \"no-url-or-parent-element-not-found\";\n /**\n * An operation was attempted on a sheet that is not active or embedded within the active dashboard.\n */\n EmbeddingErrorCodes[\"NotActiveSheet\"] = \"not-active-sheet\";\n /**\n * A required parameter was not specified, null, or an empty string/array.\n */\n EmbeddingErrorCodes[\"NullOrEmptyParameter\"] = \"null-or-empty-parameter\";\n /**\n * An operation was attempted on a sheet that does not exist in the workbook.\n */\n EmbeddingErrorCodes[\"SheetNotInWorkbook\"] = \"sheet-not-in-workbook\";\n /**\n * An operation is performed on a CustomView object that is no longer valid (it has been removed).\n */\n EmbeddingErrorCodes[\"StaleDataReference\"] = \"stale-data-reference\";\n /**\n * Unknown error triggered during the auth flow.\n */\n EmbeddingErrorCodes[\"UnknownAuthError\"] = \"unknown-auth-error\";\n /**\n * An unknown event name was specified in the call to Viz.addEventListener or Viz.removeEventListener.\n */\n EmbeddingErrorCodes[\"UnsupportedEventName\"] = \"unsupported-event-name\";\n /**\n * A Viz object has already been created as a child of the parentElement specified in the Viz constructor.\n */\n EmbeddingErrorCodes[\"VizAlreadyInManager\"] = \"viz-already-in-manager\";\n /**\n * Function is not supported in the embedding api.\n */\n EmbeddingErrorCodes[\"ImplementationError\"] = \"wrong-implementation\";\n /**\n * @NotImplemented\n */\n EmbeddingErrorCodes[\"NotImplemented\"] = \"not-implemented\";\n /**\n * Unknown error during event initialization\n */\n EmbeddingErrorCodes[\"EventInitializationError\"] = \"event-initialization-error\";\n /**\n * Version of the embedding api not supported by the version of tableau\n */\n EmbeddingErrorCodes[\"IncompatibleVersionError\"] = \"incompatible-version-error\";\n /**\n * Unknown {@link TableauDialogType} passed in to Viz.displayDialogAsync.\n */\n EmbeddingErrorCodes[\"UnknownDialogType\"] = \"unknown-dialog-type\";\n /**\n * Can occur if the API interacts with a filter that has been removed from the worksheet.\n * Can also occurs if a {@link FilterType} has not been implemented.\n */\n EmbeddingErrorCodes[\"FilterMissingOrNotImplemented\"] = \"filter-missing-not-implemented\";\n /**\n * Can occur if story point ids no longer match.\n */\n EmbeddingErrorCodes[\"StoryPointIdMismatch\"] = \"storypoint-id-mismatch\";\n})(EmbeddingErrorCodes = exports.EmbeddingErrorCodes || (exports.EmbeddingErrorCodes = {}));\n/**\n * Formats available to use with displayStaticImage in @VizInterfaces\n */\nvar FileFormats;\n(function (FileFormats) {\n FileFormats[\"PDF\"] = \"pdf\";\n FileFormats[\"PNG\"] = \"png\";\n})(FileFormats = exports.FileFormats || (exports.FileFormats = {}));\nvar PrintOrientation;\n(function (PrintOrientation) {\n PrintOrientation[\"Portrait\"] = \"portrait\";\n PrintOrientation[\"Landscape\"] = \"landscape\";\n})(PrintOrientation = exports.PrintOrientation || (exports.PrintOrientation = {}));\nvar PrintPageSize;\n(function (PrintPageSize) {\n PrintPageSize[\"Letter\"] = \"letter\";\n PrintPageSize[\"Legal\"] = \"legal\";\n PrintPageSize[\"Note\"] = \"note\";\n PrintPageSize[\"Folio\"] = \"folio\";\n PrintPageSize[\"Tabloid\"] = \"tabloid\";\n PrintPageSize[\"Ledger\"] = \"ledger\";\n PrintPageSize[\"Statement\"] = \"statement\";\n PrintPageSize[\"Executive\"] = \"executive\";\n PrintPageSize[\"A3\"] = \"A3\";\n PrintPageSize[\"A4\"] = \"A4\";\n PrintPageSize[\"A5\"] = \"A5\";\n PrintPageSize[\"B4\"] = \"B4\";\n PrintPageSize[\"B5\"] = \"B5\";\n PrintPageSize[\"Quarto\"] = \"quarto\";\n PrintPageSize[\"Unspecified\"] = \"unspecified\";\n})(PrintPageSize = exports.PrintPageSize || (exports.PrintPageSize = {}));\nvar PrintScaling;\n(function (PrintScaling) {\n PrintScaling[\"Automatic\"] = \"automatic\";\n PrintScaling[\"Perc25\"] = \"25%\";\n PrintScaling[\"Perc50\"] = \"50%\";\n PrintScaling[\"Perc60\"] = \"60%\";\n PrintScaling[\"Perc75\"] = \"75%\";\n PrintScaling[\"Perc80\"] = \"80%\";\n PrintScaling[\"Perc90\"] = \"90%\";\n PrintScaling[\"Perc100\"] = \"100%\";\n PrintScaling[\"Perc200\"] = \"200%\";\n PrintScaling[\"Perc400\"] = \"400%\";\n PrintScaling[\"AtMost1PageHigh\"] = \"at-most-1-page-high\";\n PrintScaling[\"AtMost2PagesHigh\"] = \"at-most-2-pages-high\";\n PrintScaling[\"AtMost1PageWide\"] = \"at-most-1-page-wide\";\n PrintScaling[\"AtMost2PagesWide\"] = \"at-most-2-pages-wide\";\n})(PrintScaling = exports.PrintScaling || (exports.PrintScaling = {}));\nvar RevertVizSelection;\n(function (RevertVizSelection) {\n RevertVizSelection[\"All\"] = \"all\";\n RevertVizSelection[\"Axes\"] = \"axes\";\n RevertVizSelection[\"Filters\"] = \"filters\";\n RevertVizSelection[\"Sorts\"] = \"sorts\";\n RevertVizSelection[\"Shelves\"] = \"shelves\";\n})(RevertVizSelection = exports.RevertVizSelection || (exports.RevertVizSelection = {}));\nvar ToolbarButtons;\n(function (ToolbarButtons) {\n ToolbarButtons[\"Alerts\"] = \"alerts\";\n ToolbarButtons[\"AskData\"] = \"askData\";\n ToolbarButtons[\"CustomViews\"] = \"customViews\";\n ToolbarButtons[\"DataDetails\"] = \"dataDetails\";\n ToolbarButtons[\"Share\"] = \"share\";\n ToolbarButtons[\"Subscribe\"] = \"subscribe\";\n})(ToolbarButtons = exports.ToolbarButtons || (exports.ToolbarButtons = {}));\nvar Toolbar;\n(function (Toolbar) {\n Toolbar[\"Top\"] = \"top\";\n Toolbar[\"Bottom\"] = \"bottom\";\n Toolbar[\"Hidden\"] = \"hidden\";\n})(Toolbar = exports.Toolbar || (exports.Toolbar = {}));\nvar SheetSizeBehavior;\n(function (SheetSizeBehavior) {\n SheetSizeBehavior[\"Automatic\"] = \"automatic\";\n SheetSizeBehavior[\"Exactly\"] = \"exactly\";\n SheetSizeBehavior[\"Range\"] = \"range\";\n SheetSizeBehavior[\"AtLeast\"] = \"atleast\";\n SheetSizeBehavior[\"AtMost\"] = \"atmost\";\n})(SheetSizeBehavior = exports.SheetSizeBehavior || (exports.SheetSizeBehavior = {}));\nvar PulseLayout;\n(function (PulseLayout) {\n PulseLayout[\"Default\"] = \"default\";\n PulseLayout[\"Card\"] = \"card\";\n PulseLayout[\"Ban\"] = \"ban\";\n})(PulseLayout = exports.PulseLayout || (exports.PulseLayout = {}));\nvar PulseTimeDimension;\n(function (PulseTimeDimension) {\n PulseTimeDimension[\"Today\"] = \"Today\";\n PulseTimeDimension[\"Yesterday\"] = \"Yesterday\";\n PulseTimeDimension[\"WeekToDate\"] = \"WeekToDate\";\n PulseTimeDimension[\"LastWeek\"] = \"LastWeek\";\n PulseTimeDimension[\"MonthToDate\"] = \"MonthToDate\";\n PulseTimeDimension[\"LastMonth\"] = \"LastMonth\";\n PulseTimeDimension[\"QuarterToDate\"] = \"QuarterToDate\";\n PulseTimeDimension[\"LastQuarter\"] = \"LastQuarter\";\n PulseTimeDimension[\"YearToDate\"] = \"YearToDate\";\n PulseTimeDimension[\"LastYear\"] = \"LastYear\";\n})(PulseTimeDimension = exports.PulseTimeDimension || (exports.PulseTimeDimension = {}));\nvar PulseErrorMessageVisibility;\n(function (PulseErrorMessageVisibility) {\n PulseErrorMessageVisibility[\"Visible\"] = \"visible\";\n PulseErrorMessageVisibility[\"Hidden\"] = \"hidden\";\n PulseErrorMessageVisibility[\"Suppressed\"] = \"suppressed\";\n})(PulseErrorMessageVisibility = exports.PulseErrorMessageVisibility || (exports.PulseErrorMessageVisibility = {}));\n/**\n * Be careful when adding new event types. Extensions and embedding follow two different patterns on how events are named.\n * Events should be all lower case and without hyphens or underscores.\n */\n/**\n * Represents the type of tableau embedding event that can be listened for.\n */\nvar TableauEventType;\n(function (TableauEventType) {\n /**\n * Raised when a custom view has finished loading. This event is raised after the callback function for {@link FirstInteractive} (if any) has been called.\n *\n * @category Viewing\n */\n TableauEventType[\"CustomViewLoaded\"] = \"customviewloaded\";\n /**\n * Raised when a custom view has been removed.\n *\n * @category Viewing\n */\n TableauEventType[\"CustomViewRemoved\"] = \"customviewremoved\";\n /**\n * Raised when a custom view has been saved (newly created or updated).\n *\n * @category Viewing\n */\n TableauEventType[\"CustomViewSaved\"] = \"customviewsaved\";\n /**\n * Raised when a custom view has been set as the default view for a workbook.\n *\n * @category Viewing\n */\n TableauEventType[\"CustomViewSetDefault\"] = \"customviewsetdefault\";\n /** Raised when the user clicks on the Edit Button.\n *\n * @category Viewing\n */\n TableauEventType[\"EditButtonClicked\"] = \"editbuttonclicked\";\n /** Raised when the user clicks on the Edit In Desktop Button.\n *\n * @category Authoring, Viewing\n */\n TableauEventType[\"EditInDesktopButtonClicked\"] = \"editindesktopbuttonclicked\";\n /** Raised when any filter has changed state. You can use this event type with TableauViz objects.\n *\n * @category Viewing\n */\n TableauEventType[\"FilterChanged\"] = \"filterchanged\";\n /** Fired when viz size is known\n *\n * @category Authoring, Viewing\n */\n TableauEventType[\"FirstVizSizeKnown\"] = \"firstvizsizeknown\";\n /** Fired when a viz first becomes interactive\n *\n * @category Authoring, Viewing, Pulse\n */\n TableauEventType[\"FirstInteractive\"] = \"firstinteractive\";\n /** Raised when a custom mark context menu is clicked.\n *\n * @category Viewing\n */\n TableauEventType[\"CustomMarkContextMenuEvent\"] = \"custommarkcontextmenu\";\n /** The selected marks on a visualization have changed. You can use this event type with TableauViz objects.\n *\n * @category Viewing\n */\n TableauEventType[\"MarkSelectionChanged\"] = \"markselectionchanged\";\n /** A parameter has had its value modified. You can use this event type with [[Parameter]] objects.\n *\n * @category Viewing\n */\n TableauEventType[\"ParameterChanged\"] = \"parameterchanged\";\n /** Raised when a toolbar button or control becomes available or becomes unavailable.\n *\n * @category Viewing\n */\n TableauEventType[\"ToolbarStateChanged\"] = \"toolbarstatechanged\";\n /** Raised when the workbook is ready to close. This notification is sent when using embedded web authoring functionality.\n *\n * @category Authoring\n */\n TableauEventType[\"WorkbookReadyToClose\"] = \"workbookreadytoclose\";\n /** Raised when the workbook has been published. This notification is sent when using embedded web authoring functionality.\n *\n * @category Authoring\n */\n TableauEventType[\"WorkbookPublished\"] = \"workbookpublished\";\n /** Raised when \"publish as\" is successful. This notification is sent when using embedded web authoring functionality.\n *\n * @category Authoring\n */\n TableauEventType[\"WorkbookPublishedAs\"] = \"workbookpublishedas\";\n /**\n * Raised when a URL action occurs. See the {@link UrlActionEvent} class.\n *\n * @category Viewing\n */\n TableauEventType[\"UrlAction\"] = \"urlaction\";\n /**\n * Raised after a tab switch occurs (the active sheet has changed). Guarantees the viz object will be interactive after this.\n *\n * @category Viewing\n */\n TableauEventType[\"TabSwitched\"] = \"tabswitched\";\n /**\n *\n * Raised after a new story point becomes active.\n *\n * @category Viewing\n */\n TableauEventType[\"StoryPointSwitched\"] = \"storypointswitched\";\n /**\n *\n * Raised when an error occurs while loading the contents of the webcomponent.\n *\n * @category Authoring, Viewing, AskData\n */\n TableauEventType[\"VizLoadError\"] = \"vizloaderror\";\n /**\n * Raised after the iframe src attribute has been updated\n *\n * @category Authoring, Viewing, AskData\n */\n TableauEventType[\"IframeSrcUpdated\"] = \"iframesrcupdated\";\n /**\n * Raised when changes are made to summary data.\n *\n * @category Viewing\n */\n TableauEventType[\"SummaryDataChanged\"] = \"summarydatachanged\";\n /**\n * Raised when tableau (viz-client) is ready to receive an auth token.\n * Used for authentication in salesforce native mode.\n *\n * @hidden\n * @category Authoring, Viewing,\n */\n TableauEventType[\"ReadyToReceiveAuthToken\"] = \"readytoreceiveauthtoken\";\n /**\n * Fired when the Pulse metric size is known\n *\n * @category Pulse\n */\n TableauEventType[\"FirstPulseMetricSizeKnown\"] = \"firstpulsemetricsizeknown\";\n /**\n * Fired when an internal Pulse error is encountered.\n *\n * @category Pulse\n */\n TableauEventType[\"PulseError\"] = \"pulseerror\";\n /**\n * Fired when the Pulse filters change\n *\n * @category Pulse\n */\n TableauEventType[\"PulseFiltersChanged\"] = \"pulsefilterschanged\";\n /**\n * Fired when a Pulse insight is discovered\n *\n * @category Pulse\n */\n TableauEventType[\"PulseInsightDiscovered\"] = \"pulseinsightdiscovered\";\n /**\n * Fired when the Pulse metric size changes\n *\n * @category Pulse\n */\n TableauEventType[\"PulseMetricSizeChanged\"] = \"pulsemetricsizechanged\";\n /**\n * Fired when the Pulse metric time dimension changes\n *\n * @category Pulse\n */\n TableauEventType[\"PulseTimeDimensionChanged\"] = \"pulsetimedimensionchanged\";\n /**\n * Fired when the Pulse URL changes\n *\n * @category Pulse\n */\n TableauEventType[\"PulseUrlChanged\"] = \"pulseurlchanged\";\n})(TableauEventType = exports.TableauEventType || (exports.TableauEventType = {}));\n/**\n * Represents the location of a context menu where users can add external menu items.\n */\nvar ApiMenuType;\n(function (ApiMenuType) {\n /** External menu item will be injected in ubertip dialog */\n ApiMenuType[\"Ubertip\"] = \"ubertip\";\n})(ApiMenuType = exports.ApiMenuType || (exports.ApiMenuType = {}));\n/** You can use this type with a {@link Viz} object. */\nvar TableauDialogType;\n(function (TableauDialogType) {\n /**\n * Used to display the download PDF dialog.\n */\n TableauDialogType[\"ExportPDF\"] = \"export-pdf\";\n /**\n * Used to display the download PowerPoint dialog.\n */\n TableauDialogType[\"ExportPowerPoint\"] = \"export-powerpoint\";\n /**\n * Used to display the download Data dialog.\n */\n TableauDialogType[\"ExportData\"] = \"export-data\";\n /**\n * Used to display the download CrossTab dialog.\n */\n TableauDialogType[\"ExportCrossTab\"] = \"export-cross-tab\";\n /**\n * Used to display the download Workbook dialog.\n */\n TableauDialogType[\"ExportWorkbook\"] = \"export-workbook\";\n /**\n * Used to display the Share dialog.\n */\n TableauDialogType[\"Share\"] = \"share\";\n})(TableauDialogType = exports.TableauDialogType || (exports.TableauDialogType = {}));\n//# sourceMappingURL=Enums.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * The names of the string constants you can use as HTML attributes for the web component.\n * @ignore\n */\nvar PulseAttributes;\n(function (PulseAttributes) {\n PulseAttributes[\"DisableExploreFilter\"] = \"disable-explore-filter\";\n PulseAttributes[\"Layout\"] = \"layout\";\n PulseAttributes[\"OnFirstInteractive\"] = \"onFirstInteractive\";\n PulseAttributes[\"OnFirstPulseMetricSizeKnown\"] = \"onFirstPulseMetricSizeKnown\";\n PulseAttributes[\"OnPulseUrlError\"] = \"onPulseError\";\n PulseAttributes[\"OnPulseFiltersChanged\"] = \"onPulseFiltersChanged\";\n PulseAttributes[\"OnPulseInsightDiscovered\"] = \"onPulseInsightDiscovered\";\n PulseAttributes[\"OnPulseMetricSizeChanged\"] = \"onPulseMetricSizeChanged\";\n PulseAttributes[\"OnPulseTimeDimensionChanged\"] = \"onPulseTimeDimensionChanged\";\n PulseAttributes[\"OnPulseUrlChanged\"] = \"onPulseUrlChanged\";\n PulseAttributes[\"TimeDimension\"] = \"time-dimension\";\n PulseAttributes[\"TokenOptional\"] = \"token-optional\";\n})(PulseAttributes = exports.PulseAttributes || (exports.PulseAttributes = {}));\n/**\n * The names of the string constants you can use as child tags for TableauPulse custom element.\n */\nvar PulseChildElements;\n(function (PulseChildElements) {\n /**\n * Custom styles applicable to the embedded iframe element itself (not inside it).\n */\n PulseChildElements[\"IframeStyle\"] = \"iframe-style\";\n /**\n * A parameter to be used in the Pulse theme.\n */\n PulseChildElements[\"ThemeParameter\"] = \"theme-parameter\";\n /**\n * Contains a list of filter parameters.\n */\n PulseChildElements[\"PulseFilter\"] = \"pulse-filter\";\n})(PulseChildElements = exports.PulseChildElements || (exports.PulseChildElements = {}));\n/**\n * The attributes of the child elements of .\n */\nvar PulseChildElementAttributes;\n(function (PulseChildElementAttributes) {\n PulseChildElementAttributes[\"Name\"] = \"name\";\n PulseChildElementAttributes[\"Field\"] = \"field\";\n PulseChildElementAttributes[\"Value\"] = \"value\";\n PulseChildElementAttributes[\"Type\"] = \"type\";\n})(PulseChildElementAttributes = exports.PulseChildElementAttributes || (exports.PulseChildElementAttributes = {}));\n//# sourceMappingURL=PulseInterfaces.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * The shared string constants you can use as HTML attributes for the and web component.\n * @ignore\n */\nvar VizSharedAttributes;\n(function (VizSharedAttributes) {\n VizSharedAttributes[\"TouchOptimize\"] = \"touch-optimize\";\n VizSharedAttributes[\"HideEditInDesktopButton\"] = \"hide-edit-in-desktop-button\";\n VizSharedAttributes[\"SuppressDefaultEditBehavior\"] = \"suppress-default-edit-behavior\";\n VizSharedAttributes[\"DisableVersionCheck\"] = \"disable-version-check\";\n VizSharedAttributes[\"OnEditInDesktopButtonClicked\"] = \"onEditInDesktopButtonClicked\";\n VizSharedAttributes[\"OnFirstVizSizeKnown\"] = \"onFirstVizSizeKnown\";\n VizSharedAttributes[\"OnFirstInteractive\"] = \"onFirstInteractive\";\n})(VizSharedAttributes = exports.VizSharedAttributes || (exports.VizSharedAttributes = {}));\n/**\n * The names of the string constants you can use as HTML attributes for the web component.\n * @ignore\n */\nvar VizAttributes;\n(function (VizAttributes) {\n VizAttributes[\"DisableUrlActionsPopups\"] = \"disable-url-actions\";\n VizAttributes[\"HideTabs\"] = \"hide-tabs\";\n VizAttributes[\"Toolbar\"] = \"toolbar\";\n VizAttributes[\"InstanceIdToClone\"] = \"instance-id-to-clone\";\n VizAttributes[\"Device\"] = \"device\";\n VizAttributes[\"HideEditButton\"] = \"hide-edit-button\";\n VizAttributes[\"OnEditButtonClicked\"] = \"onEditButtonClicked\";\n VizAttributes[\"OnFilterChanged\"] = \"onFilterChanged\";\n VizAttributes[\"OnCustomMarkContextMenuEvent\"] = \"onCustomMarkContextMenuEvent\";\n VizAttributes[\"OnMarkSelectionChanged\"] = \"onMarkSelectionChanged\";\n VizAttributes[\"OnParameterChanged\"] = \"onParameterChanged\";\n VizAttributes[\"OnToolbarStateChanged\"] = \"onToolbarStateChanged\";\n VizAttributes[\"OnUrlAction\"] = \"onUrlAction\";\n VizAttributes[\"OnTabSwitched\"] = \"onTabSwitched\";\n VizAttributes[\"OnCustomViewLoaded\"] = \"onCustomViewLoaded\";\n VizAttributes[\"OnCustomViewRemoved\"] = \"onCustomViewRemoved\";\n VizAttributes[\"OnCustomViewSaved\"] = \"onCustomViewSaved\";\n VizAttributes[\"OnCustomViewSetDefault\"] = \"onCustomViewSetDefault\";\n VizAttributes[\"OnStoryPointSwitched\"] = \"onStoryPointSwitched\";\n VizAttributes[\"OnSummaryDataChanged\"] = \"onSummaryDataChanged\";\n VizAttributes[\"OnReadyToReceiveAuthToken\"] = \"onReadyToReceiveAuthToken\";\n})(VizAttributes = exports.VizAttributes || (exports.VizAttributes = {}));\n/**\n * The names of the string constants you can use as HTML attributes for the web component.\n * @ignore\n */\nvar VizAuthoringAttributes;\n(function (VizAuthoringAttributes) {\n VizAuthoringAttributes[\"OnWorkbookPublished\"] = \"onWorkbookPublished\";\n VizAuthoringAttributes[\"OnWorkbookPublishedAs\"] = \"onWorkbookPublishedAs\";\n VizAuthoringAttributes[\"OnWorkbookReadyToClose\"] = \"onWorkbookReadyToClose\";\n VizAuthoringAttributes[\"HideCloseButton\"] = \"hide-close-button\";\n})(VizAuthoringAttributes = exports.VizAuthoringAttributes || (exports.VizAuthoringAttributes = {}));\n/**\n * The names of the string constants you can use as child tags for TableauViz and TableauAuthoringViz custom elements.\n */\nvar VizChildElements;\n(function (VizChildElements) {\n /**\n * Contains a list of filter parameters. Available only in viewing mode.\n */\n VizChildElements[\"VizFilter\"] = \"viz-filter\";\n /**\n * Contains a name and value for a parameter. Available only in viewing mode.\n */\n VizChildElements[\"VizParameter\"] = \"viz-parameter\";\n /**\n * Contains a list of custom parameters. Available in both viewing and authoring modes.\n */\n VizChildElements[\"CustomParameter\"] = \"custom-parameter\";\n /**\n * Custom styles applicable to the embedded iframe element itself (not inside it). Available in both viewing and authoring modes.\n */\n VizChildElements[\"IframeStyle\"] = \"iframe-style\";\n})(VizChildElements = exports.VizChildElements || (exports.VizChildElements = {}));\nvar VizChildElementAttributes;\n(function (VizChildElementAttributes) {\n VizChildElementAttributes[\"Field\"] = \"field\";\n VizChildElementAttributes[\"Value\"] = \"value\";\n VizChildElementAttributes[\"Name\"] = \"name\";\n})(VizChildElementAttributes = exports.VizChildElementAttributes || (exports.VizChildElementAttributes = {}));\n//# sourceMappingURL=VizInterfaces.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * The names of the common string constants you can use as HTML attributes for the tableau web component.\n * @ignore\n */\nvar WebComponentAttributes;\n(function (WebComponentAttributes) {\n WebComponentAttributes[\"Src\"] = \"src\";\n WebComponentAttributes[\"Width\"] = \"width\";\n WebComponentAttributes[\"Height\"] = \"height\";\n WebComponentAttributes[\"Token\"] = \"token\";\n WebComponentAttributes[\"Debug\"] = \"debug\";\n WebComponentAttributes[\"IframeAuth\"] = \"iframe-auth\";\n WebComponentAttributes[\"OnVizLoadError\"] = \"onvizloaderror\";\n WebComponentAttributes[\"ForceTokenSync\"] = \"force-token-sync\";\n})(WebComponentAttributes = exports.WebComponentAttributes || (exports.WebComponentAttributes = {}));\n/**\n * The names of the embedded iframe attributes whose values can be controlled.\n * @ignore\n */\nvar EmbeddedIframeAttributes;\n(function (EmbeddedIframeAttributes) {\n EmbeddedIframeAttributes[\"Loading\"] = \"iframe-attr-loading\";\n EmbeddedIframeAttributes[\"Style\"] = \"iframe-attr-style\";\n EmbeddedIframeAttributes[\"Class\"] = \"iframe-attr-class\";\n})(EmbeddedIframeAttributes = exports.EmbeddedIframeAttributes || (exports.EmbeddedIframeAttributes = {}));\n/**\n * The names of the string constants you can use as child tags for TableauViz, TableauAuthoringViz and TableauAskData custom elements.\n * @ignore\n */\nvar WebComponentChildElements;\n(function (WebComponentChildElements) {\n /**\n * Contains a list of custom parameters. Available in viz viewing, viz authoring and askdata.\n */\n WebComponentChildElements[\"CustomParameter\"] = \"custom-parameter\";\n /**\n * Custom styles applicable to the embedded iframe element itself (not inside it).\n */\n WebComponentChildElements[\"IframeStyle\"] = \"iframe-style\";\n})(WebComponentChildElements = exports.WebComponentChildElements || (exports.WebComponentChildElements = {}));\nvar WebComponentChildElementAttributes;\n(function (WebComponentChildElementAttributes) {\n WebComponentChildElementAttributes[\"Field\"] = \"field\";\n WebComponentChildElementAttributes[\"Value\"] = \"value\";\n WebComponentChildElementAttributes[\"Name\"] = \"name\";\n})(WebComponentChildElementAttributes = exports.WebComponentChildElementAttributes || (exports.WebComponentChildElementAttributes = {}));\n//# sourceMappingURL=WebComponentInterfaces.js.map","\"use strict\";\n// All enum values made available to Extensions developers.\n// Enums should be kept in alphabetical order.\nvar Tableau;\n(function (Tableau) {\n /**\n * All error codes used by the Extensions API.\n */\n let ErrorCodes;\n (function (ErrorCodes) {\n /**\n * Thrown when caller attempts to execute command before initialization has completed.\n */\n ErrorCodes[\"APINotInitialized\"] = \"api-not-initialized\";\n /**\n * Thrown when caller attempts to execute command while extension is not visible.\n */\n ErrorCodes[\"VisibilityError\"] = \"visibility-error\";\n /**\n * Only one dialog can be opened at time with the UI namespace functionality.\n */\n ErrorCodes[\"DialogAlreadyOpen\"] = \"dialog-already-open\";\n /**\n * The open dialog was closed by the user.\n */\n ErrorCodes[\"DialogClosedByUser\"] = \"dialog-closed-by-user\";\n /**\n * An error occurred within the Tableau Extensions API. Contact Tableau Support.\n */\n ErrorCodes[\"InternalError\"] = \"internal-error\";\n /**\n * A dialog must start on the same domain as the parent extenion.\n */\n ErrorCodes[\"InvalidDomainDialog\"] = \"invalid-dialog-domain\";\n /**\n * A parameter is not the correct data type or format. The name of the parameter is specified in the Error.message field.\n */\n ErrorCodes[\"InvalidParameter\"] = \"invalid-parameter\";\n /**\n * Can occur if the extension interacts with a filter that has been removed from the worksheet.\n */\n ErrorCodes[\"MissingFilter\"] = \"missing-filter\";\n /**\n * Can occur if the extension interacts with a parameter that has been removed from the worksheet.\n */\n ErrorCodes[\"MissingParameter\"] = \"missing-parameter\";\n /**\n * Internal Server Error\n */\n ErrorCodes[\"ServerError\"] = \"server-error\";\n /**\n * Developer cannot save settings while another save is still in progress.\n */\n ErrorCodes[\"SettingSaveInProgress\"] = \"setting-save-in-progress\";\n /**\n * An unknown event name was specified in the call to `addEventListener` or `removeEventListener`.\n */\n ErrorCodes[\"UnsupportedEventName\"] = \"unsupported-event-name\";\n /**\n * A method was used for a type of data source that doesn't support that method (see getActiveTablesAsync for an example)\n */\n ErrorCodes[\"UnsupportedMethodForDataSourceType\"] = \"unsupported-method-for-data-source-type\";\n })(ErrorCodes = Tableau.ErrorCodes || (Tableau.ErrorCodes = {}));\n /**\n * The context in which the Extensions is currently running.\n */\n let ExtensionContext;\n (function (ExtensionContext) {\n ExtensionContext[\"Desktop\"] = \"desktop\";\n ExtensionContext[\"Server\"] = \"server\";\n ExtensionContext[\"Cloud\"] = \"cloud\";\n ExtensionContext[\"PublicWeb\"] = \"public-web\";\n ExtensionContext[\"PublicDesktop\"] = \"public-desktop\";\n })(ExtensionContext = Tableau.ExtensionContext || (Tableau.ExtensionContext = {}));\n /**\n * The mode in which the Extensions is currently running.\n */\n let ExtensionMode;\n (function (ExtensionMode) {\n ExtensionMode[\"Authoring\"] = \"authoring\";\n ExtensionMode[\"Viewing\"] = \"viewing\";\n })(ExtensionMode = Tableau.ExtensionMode || (Tableau.ExtensionMode = {}));\n /**\n * Represents the type of event that can be listened for.\n */\n let TableauEventType;\n (function (TableauEventType) {\n /**\n * @experimental\n * Raised when a message is received that was sent by a dialog or extension via `sendDialogMessageAsync`.*/\n TableauEventType[\"DialogMessageReceived\"] = \"dialog-message-received\";\n /** Raised when any filter has changed state. You can use this event type with [Worksheet](../interfaces/worksheet.html) objects.*/\n TableauEventType[\"FilterChanged\"] = \"filter-changed\";\n /** The selected marks on a visualization has changed.\n * You can use this event type with [Worksheet](../interfaces/worksheet.html) objects. */\n TableauEventType[\"MarkSelectionChanged\"] = \"mark-selection-changed\";\n /** The summary data backing a worksheet has changed\n * You can use this event type with [Worksheet](../interfaces/worksheet.html) objects.*/\n TableauEventType[\"SummaryDataChanged\"] = \"summary-data-changed\";\n /** A parameter has had its value modified. You can use this event type with [[Parameter]] objects. */\n TableauEventType[\"ParameterChanged\"] = \"parameter-changed\";\n /** Settings have been changed for this extension. You can use this event type with [[Settings]] objects. */\n TableauEventType[\"SettingsChanged\"] = \"settings-changed\";\n /** The dashboard layout has changed\n * @category Dashboard Extensions\n */\n TableauEventType[\"DashboardLayoutChanged\"] = \"dashboard-layout-changed\";\n /** The workbook formatting has changed\n * @category Dashboard Extensions\n */\n TableauEventType[\"WorkbookFormattingChanged\"] = \"workbook-formatting-changed\";\n /** The worksheet formatting has changed\n * @category Viz Extensions\n */\n TableauEventType[\"WorksheetFormattingChanged\"] = \"worksheet-formatting-changed\";\n })(TableauEventType = Tableau.TableauEventType || (Tableau.TableauEventType = {}));\n /**\n * Enum that represents the data type of encodings for createVizImageAsync.\n * @since 1.6.0\n */\n let VizImageEncodingType;\n (function (VizImageEncodingType) {\n VizImageEncodingType[\"Discrete\"] = \"discrete\";\n VizImageEncodingType[\"Continuous\"] = \"continuous\";\n })(VizImageEncodingType = Tableau.VizImageEncodingType || (Tableau.VizImageEncodingType = {}));\n /**\n * Enum that represents the sort direction for createVizImageAsync.\n * @since 1.8.0 and Tableau 2021.4\n */\n let VizImageSortDirectionType;\n (function (VizImageSortDirectionType) {\n VizImageSortDirectionType[\"Ascending\"] = \"ascending\";\n VizImageSortDirectionType[\"Descending\"] = \"descending\";\n })(VizImageSortDirectionType = Tableau.VizImageSortDirectionType || (Tableau.VizImageSortDirectionType = {}));\n /**\n * Enum that represents the palette type for createVizImageAsync.\n * @since 1.8.0 and Tableau 2021.4\n */\n let VizImagePaletteType;\n (function (VizImagePaletteType) {\n VizImagePaletteType[\"CustomDiverging\"] = \"custom-diverging\";\n VizImagePaletteType[\"CustomSequential\"] = \"custom-sequential\";\n })(VizImagePaletteType = Tableau.VizImagePaletteType || (Tableau.VizImagePaletteType = {}));\n /**\n * Enum that represents the Size Setting type for createVizImageAsync.\n * @since 1.8.0 and Tableau 2021.4\n */\n let VizImageSizeSettingType;\n (function (VizImageSizeSettingType) {\n VizImageSizeSettingType[\"Fixed\"] = \"fixed\";\n VizImageSizeSettingType[\"Manual\"] = \"manual\";\n })(VizImageSizeSettingType = Tableau.VizImageSizeSettingType || (Tableau.VizImageSizeSettingType = {}));\n /**\n * Enum that represents the Size Setting alignment type for createVizImageAsync.\n * @since 1.8.0 and Tableau 2021.4\n */\n let VizImageSizeSettingAlignmentType;\n (function (VizImageSizeSettingAlignmentType) {\n VizImageSizeSettingAlignmentType[\"Right\"] = \"right\";\n VizImageSizeSettingAlignmentType[\"Left\"] = \"left\";\n VizImageSizeSettingAlignmentType[\"Center\"] = \"center\";\n })(VizImageSizeSettingAlignmentType = Tableau.VizImageSizeSettingAlignmentType || (Tableau.VizImageSizeSettingAlignmentType = {}));\n})(Tableau || (Tableau = {}));\nmodule.exports = Tableau;\n//# sourceMappingURL=Tableau.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar SharedErrorCodes;\n(function (SharedErrorCodes) {\n /**\n * A CSV or Excel file failed to be created in Viz.exportCrosstabAsync().\n */\n SharedErrorCodes[\"CrosstabCreationError\"] = \"crosstab-creation-error\";\n /**\n * A CSV file failed to be created in Viz.exportDataAsync().\n */\n SharedErrorCodes[\"DataCreationError\"] = \"data-creation-error\";\n /**\n * An invalid aggregation was specified for the filter, such as setting a range filter to \"SUM(Sales)\" instead of\n * \"Sales\".\n */\n SharedErrorCodes[\"InvalidAggregationFieldName\"] = \"invalid-aggregation-field-name\";\n /**\n * A filter operation was attempted on a field that does not exist in the data source.\n */\n SharedErrorCodes[\"InvalidFilterFieldName\"] = \"invalid-filter-name\";\n /**\n * A filter operation was attempted using a value that is the wrong data type or format.\n */\n SharedErrorCodes[\"InvalidFilterFieldValue\"] = \"invalid-filter-fieldValue\";\n /**\n * An invalid date value was specified in a Sheet.selectMarksAsync() call for a date field.\n */\n SharedErrorCodes[\"InvalidSelectionDate\"] = \"invalid-selection-date\";\n /**\n * A field was specified in a Sheet.selectMarksAsync() call that does not exist in the data source.\n */\n SharedErrorCodes[\"InvalidSelectionFieldName\"] = \"invalid-selection-fieldName\";\n /**\n * An invalid value was specified in a Sheet.selectMarksAsync() call.\n */\n SharedErrorCodes[\"InvalidSelectionValue\"] = \"invalid-selection-value\";\n /**\n * A parameter did not include a valid sheet selection for exporting.\n */\n SharedErrorCodes[\"InvalidSelectionSheet\"] = \"invalid-selection-sheet\";\n /**\n * An error occurred within the Tableau API. Contact Tableau Support.\n */\n SharedErrorCodes[\"InternalError\"] = \"internal-error\";\n /**\n * A parameter is not the correct data type or format. The name of the parameter is specified in the Error.message field.\n */\n SharedErrorCodes[\"InvalidParameter\"] = \"invalid-parameter\";\n /**\n * A PDF file failed to be created in Viz.exportPDFAsync().\n */\n SharedErrorCodes[\"PDFCreationError\"] = \"pdf-creation-error\";\n /**\n * A PowerPoint file failed to be created in Viz.exportPowerPointAsync().\n */\n SharedErrorCodes[\"PowerPointCreationError\"] = \"powerpoint-creation-error\";\n /**\n * An operation was attempted on a sheet that is not active or embedded within the active dashboard.\n */\n SharedErrorCodes[\"NotActiveSheet\"] = \"not-active-sheet\";\n /**\n * Property or Function is not supported within the Tableau API.\n */\n SharedErrorCodes[\"ImplementationError\"] = \"wrong-implementation\";\n /**\n * Can occur when two incompatible calls are triggered together.\n */\n SharedErrorCodes[\"ApiExecutionError\"] = \"api-execution-error\";\n /**\n * A general-purpose server error occurred. Details are contained in the Error object.\n */\n SharedErrorCodes[\"ServerError\"] = \"server-error\";\n /**\n * Can occur when an api call times out.\n */\n SharedErrorCodes[\"Timeout\"] = \"timeout\";\n})(SharedErrorCodes = exports.SharedErrorCodes || (exports.SharedErrorCodes = {}));\n//# sourceMappingURL=Enums.js.map","\"use strict\";\n/**\n * The tableau namespace exists for organization and to avoid polluting\n * the global namespace. It contains no constructs other than sub-namespaces and the Tableau enumerations.\n */\nvar Tableau;\n(function (Tableau) {\n let AnalyticsObjectType;\n (function (AnalyticsObjectType) {\n AnalyticsObjectType[\"Cluster\"] = \"cluster\";\n AnalyticsObjectType[\"Forecast\"] = \"forecast\";\n AnalyticsObjectType[\"TrendLine\"] = \"trend-line\";\n })(AnalyticsObjectType = Tableau.AnalyticsObjectType || (Tableau.AnalyticsObjectType = {}));\n let AnnotationType;\n (function (AnnotationType) {\n AnnotationType[\"Mark\"] = \"mark\";\n AnnotationType[\"Point\"] = \"point\";\n AnnotationType[\"Area\"] = \"area\";\n })(AnnotationType = Tableau.AnnotationType || (Tableau.AnnotationType = {}));\n let ColumnType;\n (function (ColumnType) {\n ColumnType[\"Discrete\"] = \"discrete\";\n ColumnType[\"Continuous\"] = \"continuous\";\n ColumnType[\"Unknown\"] = \"unknown\";\n })(ColumnType = Tableau.ColumnType || (Tableau.ColumnType = {}));\n let ClassNameKey;\n (function (ClassNameKey) {\n ClassNameKey[\"WorksheetTitle\"] = \"tableau-worksheet-title\";\n ClassNameKey[\"Worksheet\"] = \"tableau-worksheet\";\n ClassNameKey[\"Tooltip\"] = \"tableau-tooltip\";\n ClassNameKey[\"StoryTitle\"] = \"tableau-story-title\";\n ClassNameKey[\"DashboardTitle\"] = \"tableau-dashboard-title\";\n ClassNameKey[\"Pane\"] = \"tableau-pane\";\n ClassNameKey[\"RowDividers\"] = \"tableau-row-dividers\";\n ClassNameKey[\"ColumnDividers\"] = \"tableau-column-dividers\";\n })(ClassNameKey = Tableau.ClassNameKey || (Tableau.ClassNameKey = {}));\n /**\n * What the object represents in a dashboard.\n */\n let DashboardObjectType;\n (function (DashboardObjectType) {\n DashboardObjectType[\"Blank\"] = \"blank\";\n DashboardObjectType[\"Worksheet\"] = \"worksheet\";\n DashboardObjectType[\"QuickFilter\"] = \"quick-filter\";\n DashboardObjectType[\"ParameterControl\"] = \"parameter-control\";\n DashboardObjectType[\"PageFilter\"] = \"page-filter\";\n DashboardObjectType[\"Legend\"] = \"legend\";\n DashboardObjectType[\"Title\"] = \"title\";\n DashboardObjectType[\"Text\"] = \"text\";\n DashboardObjectType[\"Image\"] = \"image\";\n DashboardObjectType[\"WebPage\"] = \"web-page\";\n DashboardObjectType[\"Extension\"] = \"extension\";\n })(DashboardObjectType = Tableau.DashboardObjectType || (Tableau.DashboardObjectType = {}));\n /**\n * Enum that represents the visibility state of a dashboard object.\n * @since 1.7.0\n */\n let DashboardObjectVisibilityType;\n (function (DashboardObjectVisibilityType) {\n /** Used for turning on the visibility of a dashboard object.*/\n DashboardObjectVisibilityType[\"Show\"] = \"show\";\n /** Used for turning off the visibility of a dashboard object.*/\n DashboardObjectVisibilityType[\"Hide\"] = \"hide\";\n })(DashboardObjectVisibilityType = Tableau.DashboardObjectVisibilityType || (Tableau.DashboardObjectVisibilityType = {}));\n /**\n * The different types of data a value can have\n */\n let DataType;\n (function (DataType) {\n DataType[\"String\"] = \"string\";\n DataType[\"Int\"] = \"int\";\n DataType[\"Float\"] = \"float\";\n DataType[\"Bool\"] = \"bool\";\n DataType[\"Date\"] = \"date\";\n DataType[\"DateTime\"] = \"date-time\";\n DataType[\"Spatial\"] = \"spatial\";\n DataType[\"Unknown\"] = \"unknown\";\n })(DataType = Tableau.DataType || (Tableau.DataType = {}));\n /**\n * Enum that represents the changes that occur to a dashboard object.\n */\n let DashboardLayoutChange;\n (function (DashboardLayoutChange) {\n /** A dashboard object was added */\n DashboardLayoutChange[\"Added\"] = \"added\";\n /** A dashboard object was removed */\n DashboardLayoutChange[\"Removed\"] = \"removed\";\n /** A dashboard object's floating state changed */\n DashboardLayoutChange[\"IsFloatingChanged\"] = \"is-floating-changed\";\n /** A dashboard object's visibility changed */\n DashboardLayoutChange[\"IsVisibleChanged\"] = \"is-visible-changed\";\n /** A dashboard object's position changed */\n DashboardLayoutChange[\"PositionChanged\"] = \"position-changed\";\n /** A dashboard object's size changed */\n DashboardLayoutChange[\"SizeChanged\"] = \"size-changed\";\n /** A dashboard object was renamed */\n DashboardLayoutChange[\"NameChanged\"] = \"name-changed\";\n /** A dashboard object is selected */\n DashboardLayoutChange[\"Selected\"] = \"selected\";\n /** A dashboard object is deselected */\n DashboardLayoutChange[\"Deselected\"] = \"deselected\";\n /** Navigate to another dashboard */\n DashboardLayoutChange[\"DashboardChanged\"] = \"dashboard-changed\";\n })(DashboardLayoutChange = Tableau.DashboardLayoutChange || (Tableau.DashboardLayoutChange = {}));\n /**\n * Valid date ranges for a relative date filter.\n */\n let DateRangeType;\n (function (DateRangeType) {\n DateRangeType[\"Last\"] = \"last\";\n DateRangeType[\"LastN\"] = \"last-n\";\n DateRangeType[\"Next\"] = \"next\";\n DateRangeType[\"NextN\"] = \"next-n\";\n DateRangeType[\"Current\"] = \"current\";\n DateRangeType[\"ToDate\"] = \"to-date\";\n })(DateRangeType = Tableau.DateRangeType || (Tableau.DateRangeType = {}));\n /**\n * Enum that represents the types of dialog popup styles.\n */\n let DialogStyle;\n (function (DialogStyle) {\n DialogStyle[\"Window\"] = \"window\";\n DialogStyle[\"Modal\"] = \"modal\";\n DialogStyle[\"Modeless\"] = \"modeless\";\n })(DialogStyle = Tableau.DialogStyle || (Tableau.DialogStyle = {}));\n let EncodingType;\n (function (EncodingType) {\n EncodingType[\"Column\"] = \"column\";\n EncodingType[\"Row\"] = \"row\";\n EncodingType[\"Page\"] = \"page\";\n EncodingType[\"Filter\"] = \"filter\";\n EncodingType[\"MarksType\"] = \"marks-type\";\n EncodingType[\"MeasureValues\"] = \"measure-values\";\n EncodingType[\"Color\"] = \"color\";\n EncodingType[\"Size\"] = \"size\";\n EncodingType[\"Label\"] = \"label\";\n EncodingType[\"Detail\"] = \"detail\";\n EncodingType[\"Tooltip\"] = \"tooltip\";\n EncodingType[\"Shape\"] = \"shape\";\n EncodingType[\"Path\"] = \"path\";\n EncodingType[\"Angle\"] = \"angle\";\n EncodingType[\"Geometry\"] = \"geometry\";\n EncodingType[\"Custom\"] = \"custom\";\n })(EncodingType = Tableau.EncodingType || (Tableau.EncodingType = {}));\n /**\n * Type of aggregation on a field.\n */\n let FieldAggregationType;\n (function (FieldAggregationType) {\n FieldAggregationType[\"Sum\"] = \"sum\";\n FieldAggregationType[\"Avg\"] = \"avg\";\n FieldAggregationType[\"Min\"] = \"min\";\n FieldAggregationType[\"Max\"] = \"max\";\n FieldAggregationType[\"Stdev\"] = \"stdev\";\n FieldAggregationType[\"Stdevp\"] = \"stdevp\";\n FieldAggregationType[\"Var\"] = \"var\";\n FieldAggregationType[\"Varp\"] = \"varp\";\n FieldAggregationType[\"Collect\"] = \"collect\";\n FieldAggregationType[\"Count\"] = \"count\";\n FieldAggregationType[\"Countd\"] = \"countd\";\n FieldAggregationType[\"Median\"] = \"median\";\n FieldAggregationType[\"Attr\"] = \"attr\";\n FieldAggregationType[\"None\"] = \"none\";\n FieldAggregationType[\"Year\"] = \"year\";\n FieldAggregationType[\"Qtr\"] = \"qtr\";\n FieldAggregationType[\"Month\"] = \"month\";\n FieldAggregationType[\"Day\"] = \"day\";\n FieldAggregationType[\"Hour\"] = \"hour\";\n FieldAggregationType[\"Minute\"] = \"minute\";\n FieldAggregationType[\"Second\"] = \"second\";\n FieldAggregationType[\"Week\"] = \"week\";\n FieldAggregationType[\"Weekday\"] = \"weekday\";\n FieldAggregationType[\"MonthYear\"] = \"month-year\";\n FieldAggregationType[\"Mdy\"] = \"mdy\";\n FieldAggregationType[\"End\"] = \"end\";\n FieldAggregationType[\"TruncYear\"] = \"trunc-year\";\n FieldAggregationType[\"TruncQtr\"] = \"trunc-qtr\";\n FieldAggregationType[\"TruncMonth\"] = \"trunc-month\";\n FieldAggregationType[\"TruncWeek\"] = \"trunc-week\";\n FieldAggregationType[\"TruncDay\"] = \"trunc-day\";\n FieldAggregationType[\"TruncHour\"] = \"trunc-hour\";\n FieldAggregationType[\"TruncMinute\"] = \"trunc-minute\";\n FieldAggregationType[\"TruncSecond\"] = \"trunc-second\";\n FieldAggregationType[\"Quart1\"] = \"quart1\";\n FieldAggregationType[\"Quart3\"] = \"quart3\";\n FieldAggregationType[\"Skewness\"] = \"skewness\";\n FieldAggregationType[\"Kurtosis\"] = \"kurtosis\";\n FieldAggregationType[\"InOut\"] = \"in-out\";\n FieldAggregationType[\"User\"] = \"user\";\n })(FieldAggregationType = Tableau.FieldAggregationType || (Tableau.FieldAggregationType = {}));\n /**\n * Role of a field.\n */\n let FieldRoleType;\n (function (FieldRoleType) {\n FieldRoleType[\"Dimension\"] = \"dimension\";\n FieldRoleType[\"Measure\"] = \"measure\";\n FieldRoleType[\"Unknown\"] = \"unknown\";\n })(FieldRoleType = Tableau.FieldRoleType || (Tableau.FieldRoleType = {}));\n /**\n * An enumeration of the valid types of filters that can be applied.\n */\n let FilterType;\n (function (FilterType) {\n FilterType[\"Categorical\"] = \"categorical\";\n FilterType[\"Range\"] = \"range\";\n FilterType[\"Hierarchical\"] = \"hierarchical\";\n FilterType[\"RelativeDate\"] = \"relative-date\";\n })(FilterType = Tableau.FilterType || (Tableau.FilterType = {}));\n /**\n * The different update types for applying filter\n */\n let FilterUpdateType;\n (function (FilterUpdateType) {\n FilterUpdateType[\"Add\"] = \"add\";\n FilterUpdateType[\"All\"] = \"all\";\n FilterUpdateType[\"Replace\"] = \"replace\";\n FilterUpdateType[\"Remove\"] = \"remove\";\n })(FilterUpdateType = Tableau.FilterUpdateType || (Tableau.FilterUpdateType = {}));\n /**\n * The domain type for a filter\n */\n let FilterDomainType;\n (function (FilterDomainType) {\n /**\n * The domain values that are relevant to the specified filter\n * i.e. the domain is restricted by a previous filter\n */\n FilterDomainType[\"Relevant\"] = \"relevant\";\n /**\n * list of all possible domain values from database\n */\n FilterDomainType[\"Database\"] = \"database\";\n })(FilterDomainType = Tableau.FilterDomainType || (Tableau.FilterDomainType = {}));\n /**\n * The option for specifying which values to include for filtering\n * Indicates what to do with null values for a given filter or mark selection call.\n */\n let FilterNullOption;\n (function (FilterNullOption) {\n FilterNullOption[\"NullValues\"] = \"null-values\";\n FilterNullOption[\"NonNullValues\"] = \"non-null-values\";\n FilterNullOption[\"AllValues\"] = \"all-values\";\n })(FilterNullOption = Tableau.FilterNullOption || (Tableau.FilterNullOption = {}));\n /**\n * Enum that serves as a filter on the DataValues returned from `getSummaryDataReaderAsync`,\n * `getUnderlyingTableDataReaderAsync` and `getLogicalTableDataReaderAsync`.\n * This is an optimization of returned data values only. Tableau versions prior to 2021.2\n * will pass the data across and populate the DataValue properties.\n * Please note that all properties not requested will be `undefined` in the DataValue results.\n * @since 1.5.0\n */\n let IncludeDataValuesOption;\n (function (IncludeDataValuesOption) {\n /** DataValues will include all properties.*/\n IncludeDataValuesOption[\"AllValues\"] = \"all-values\";\n /** DataValues will only include value and nativeValue properties.*/\n IncludeDataValuesOption[\"OnlyNativeValues\"] = \"only-native-values\";\n /** DataValues will only include formattedValue properties. */\n IncludeDataValuesOption[\"OnlyFormattedValues\"] = \"only-formatted-values\";\n })(IncludeDataValuesOption = Tableau.IncludeDataValuesOption || (Tableau.IncludeDataValuesOption = {}));\n /**\n * Type of mark for a given marks card in a viz.\n */\n let MarkType;\n (function (MarkType) {\n MarkType[\"Bar\"] = \"bar\";\n MarkType[\"Line\"] = \"line\";\n MarkType[\"Area\"] = \"area\";\n MarkType[\"Square\"] = \"square\";\n MarkType[\"Circle\"] = \"circle\";\n MarkType[\"Shape\"] = \"shape\";\n MarkType[\"Text\"] = \"text\";\n MarkType[\"Map\"] = \"map\";\n MarkType[\"Pie\"] = \"pie\";\n MarkType[\"GanttBar\"] = \"gantt-bar\";\n MarkType[\"Polygon\"] = \"polygon\";\n MarkType[\"Heatmap\"] = \"heatmap\";\n MarkType[\"VizExtension\"] = \"viz-extension\";\n })(MarkType = Tableau.MarkType || (Tableau.MarkType = {}));\n /**\n * An enumeration describing the different types of allowable values.\n * This is used for restricting the domain of a parameter\n */\n let ParameterValueType;\n (function (ParameterValueType) {\n ParameterValueType[\"All\"] = \"all\";\n ParameterValueType[\"List\"] = \"list\";\n ParameterValueType[\"Range\"] = \"range\";\n })(ParameterValueType = Tableau.ParameterValueType || (Tableau.ParameterValueType = {}));\n /**\n * Date period used in filters and in parameters.\n */\n let PeriodType;\n (function (PeriodType) {\n PeriodType[\"Years\"] = \"years\";\n PeriodType[\"Quarters\"] = \"quarters\";\n PeriodType[\"Months\"] = \"months\";\n PeriodType[\"Weeks\"] = \"weeks\";\n PeriodType[\"Days\"] = \"days\";\n PeriodType[\"Hours\"] = \"hours\";\n PeriodType[\"Minutes\"] = \"minutes\";\n PeriodType[\"Seconds\"] = \"seconds\";\n })(PeriodType = Tableau.PeriodType || (Tableau.PeriodType = {}));\n let QuickTableCalcType;\n (function (QuickTableCalcType) {\n QuickTableCalcType[\"RunningTotal\"] = \"running-total\";\n QuickTableCalcType[\"Difference\"] = \"difference\";\n QuickTableCalcType[\"PercentDifference\"] = \"percent-difference\";\n QuickTableCalcType[\"PercentOfTotal\"] = \"percent-of-total\";\n QuickTableCalcType[\"Rank\"] = \"rank\";\n QuickTableCalcType[\"Percentile\"] = \"percentile\";\n QuickTableCalcType[\"MovingAverage\"] = \"moving-average\";\n QuickTableCalcType[\"YTDTotal\"] = \"ytd-total\";\n QuickTableCalcType[\"CompoundGrowthRate\"] = \"compound-growth-rate\";\n QuickTableCalcType[\"YearOverYearGrowth\"] = \"year-over-year-growth\";\n QuickTableCalcType[\"YTDGrowth\"] = \"ytd-growth\";\n QuickTableCalcType[\"Undefined\"] = \"undefined\";\n })(QuickTableCalcType = Tableau.QuickTableCalcType || (Tableau.QuickTableCalcType = {}));\n /**\n * Enum for specifying the selection type for select marks api.\n */\n let SelectionUpdateType;\n (function (SelectionUpdateType) {\n SelectionUpdateType[\"Replace\"] = \"select-replace\";\n SelectionUpdateType[\"Add\"] = \"select-add\";\n SelectionUpdateType[\"Remove\"] = \"select-remove\";\n })(SelectionUpdateType = Tableau.SelectionUpdateType || (Tableau.SelectionUpdateType = {}));\n /**\n * Enum for specifying the select option for the `extensions.Worksheet.selectTuplesAsync` method.\n */\n let SelectOptions;\n (function (SelectOptions) {\n /**\n * Clears existing selection before selecting the tuples specified\n */\n SelectOptions[\"Simple\"] = \"select-options-simple\";\n /**\n * Adds specified tuples to the existing selection\n */\n SelectOptions[\"Toggle\"] = \"select-options-toggle\";\n })(SelectOptions = Tableau.SelectOptions || (Tableau.SelectOptions = {}));\n /**\n * The type of sheet a [[Sheet]] object represents\n */\n let SheetType;\n (function (SheetType) {\n SheetType[\"Dashboard\"] = \"dashboard\";\n SheetType[\"Story\"] = \"story\";\n SheetType[\"Worksheet\"] = \"worksheet\";\n })(SheetType = Tableau.SheetType || (Tableau.SheetType = {}));\n let SortDirection;\n (function (SortDirection) {\n SortDirection[\"Increasing\"] = \"increasing\";\n SortDirection[\"Decreasing\"] = \"decreasing\";\n })(SortDirection = Tableau.SortDirection || (Tableau.SortDirection = {}));\n let TrendLineModelType;\n (function (TrendLineModelType) {\n TrendLineModelType[\"Linear\"] = \"linear\";\n TrendLineModelType[\"Logarithmic\"] = \"logarithmic\";\n TrendLineModelType[\"Exponential\"] = \"exponential\";\n TrendLineModelType[\"Polynomial\"] = \"polynomial\";\n })(TrendLineModelType = Tableau.TrendLineModelType || (Tableau.TrendLineModelType = {}));\n /**\n * Enum that represents the replay speed of an animation.\n * @since 1.7.0\n */\n let ReplaySpeedType;\n (function (ReplaySpeedType) {\n /** Used for setting the replay speed of an animation to 0.5x.*/\n ReplaySpeedType[\"Slow\"] = \"slow\";\n /** Used for setting the replay speed of an animation to 1.0x.*/\n ReplaySpeedType[\"Normal\"] = \"normal\";\n /** Used for setting the replay speed of an animation to 2.0x.*/\n ReplaySpeedType[\"Fast\"] = \"fast\";\n })(ReplaySpeedType = Tableau.ReplaySpeedType || (Tableau.ReplaySpeedType = {}));\n /**\n * Enum that represents the selection state of a level in a hierarchical filter\n * @since Extensions 1.10.0\n */\n let HierarchicalLevelSelectionState;\n (function (HierarchicalLevelSelectionState) {\n HierarchicalLevelSelectionState[\"AllSelected\"] = \"all-selected\";\n HierarchicalLevelSelectionState[\"NoneSelected\"] = \"none-selected\";\n HierarchicalLevelSelectionState[\"SomeSelected\"] = \"some-selected\";\n HierarchicalLevelSelectionState[\"UnknownSelected\"] = \"unknown-selected\";\n })(HierarchicalLevelSelectionState = Tableau.HierarchicalLevelSelectionState || (Tableau.HierarchicalLevelSelectionState = {}));\n Tableau.ZoneVisibilityType = Object.assign({}, DashboardObjectVisibilityType);\n})(Tableau || (Tableau = {}));\nmodule.exports = Tableau;\n//# sourceMappingURL=Tableau.js.map","\"use strict\";\n// This file re-exports everything which is part of the shared api public interface\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__export(require(\"./ExternalContract/Shared/Enums\"));\nvar Tableau_1 = require(\"./ExternalContract/Shared/Namespaces/Tableau\");\nexports.AnalyticsObjectType = Tableau_1.AnalyticsObjectType;\nexports.AnnotationType = Tableau_1.AnnotationType;\nexports.ClassNameKey = Tableau_1.ClassNameKey;\nexports.ColumnType = Tableau_1.ColumnType;\nexports.DashboardLayoutChange = Tableau_1.DashboardLayoutChange;\nexports.DashboardObjectType = Tableau_1.DashboardObjectType;\nexports.DashboardObjectVisibilityType = Tableau_1.DashboardObjectVisibilityType;\nexports.DataType = Tableau_1.DataType;\nexports.DateRangeType = Tableau_1.DateRangeType;\nexports.DialogStyle = Tableau_1.DialogStyle;\nexports.EncodingType = Tableau_1.EncodingType;\nexports.FieldAggregationType = Tableau_1.FieldAggregationType;\nexports.FieldRoleType = Tableau_1.FieldRoleType;\nexports.FilterDomainType = Tableau_1.FilterDomainType;\nexports.FilterNullOption = Tableau_1.FilterNullOption;\nexports.FilterType = Tableau_1.FilterType;\nexports.FilterUpdateType = Tableau_1.FilterUpdateType;\nexports.HierarchicalLevelSelectionState = Tableau_1.HierarchicalLevelSelectionState;\nexports.IncludeDataValuesOption = Tableau_1.IncludeDataValuesOption;\nexports.MarkType = Tableau_1.MarkType;\nexports.ParameterValueType = Tableau_1.ParameterValueType;\nexports.PeriodType = Tableau_1.PeriodType;\nexports.QuickTableCalcType = Tableau_1.QuickTableCalcType;\nexports.ReplaySpeedType = Tableau_1.ReplaySpeedType;\nexports.SelectOptions = Tableau_1.SelectOptions;\nexports.SelectionUpdateType = Tableau_1.SelectionUpdateType;\nexports.SheetType = Tableau_1.SheetType;\nexports.SortDirection = Tableau_1.SortDirection;\nexports.TrendLineModelType = Tableau_1.TrendLineModelType;\nexports.ZoneVisibilityType = Tableau_1.ZoneVisibilityType;\n//# sourceMappingURL=SharedApiExternalContract.js.map","\"use strict\";\n/**\n * This is your main. This is where you re-export everything you want to be publicly available.\n *\n * The build enforces that the file has the same name as the global variable that is exported.\n */\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// Export the version of the internal contract to be available at runtime\n// This file is generated by yarn publish:bump via scripts/publish-check.ts\n// updateInternalContractRuntimeVersion in the monorepo root.\nconst internalContractVersion = require(\"../internal-contract-version.json\");\nexports.INTERNAL_CONTRACT_VERSION = internalContractVersion;\n__export(require(\"./contract/DataTypeConverter\"));\n__export(require(\"./contract/Enums\"));\n__export(require(\"./contract/Notifications\"));\n__export(require(\"./contract/Parameters\"));\n__export(require(\"./contract/Verbs\"));\n__export(require(\"./interface/AskDataInterface\"));\n__export(require(\"./interface/PulseInterface\"));\n__export(require(\"./interface/VqlInterface\"));\n__export(require(\"./messaging/CrossFrameMessenger\"));\n__export(require(\"./messaging/interface/MessageTypes\"));\n__export(require(\"./versioning/external/ExternalIdentityVersionConverter\"));\n__export(require(\"./versioning/external/ExternalVersionConverterFactory\"));\n__export(require(\"./versioning/VersionConverterFactory\"));\n// Export the version number of messaging for consumers to use.\n// Be very careful making any updates to this contract which break version compatibility.\nexports.MESSAGING_VERSION = {\n major: 1,\n minor: 0,\n fix: 0,\n};\n//# sourceMappingURL=JsApiInternalContract.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Enums_1 = require(\"./Enums\");\nclass DataTypeConverter {\n static isSpecial(valueAsString) {\n // Prior to ShowDataTablePresModel, special values come to us as\n // '%null%', '%all%', '%wildcard%', '%missing%'...\n // While this function will never return true for ShowDataTablePresModel conversion,\n // it is as cheap as passing around a version and checking that.\n // (See DataValueFormatter.cpp)\n if (valueAsString.length > 2 && valueAsString[0] === '%' && valueAsString[valueAsString.length - 1] === '%') {\n return true;\n }\n return false;\n }\n // tslint:disable-next-line:no-any\n static parseBoolean(booleanString) {\n // boolean values come to us as 'true'|'false'\n const normalizedBoolean = booleanString.toLowerCase();\n return normalizedBoolean !== 'true' && normalizedBoolean !== 'false' ? this.specialValueIndicator : normalizedBoolean === 'true';\n }\n // tslint:disable-next-line:no-any\n static parseNumber(valueAsString) {\n const value = Number(valueAsString);\n return isNaN(value) ? this.specialValueIndicator : value;\n }\n static parseDate(dateAsString) {\n // Note that without a time, the date is assumed to be UTC\n // Input of 2020-03-25 is printed as: Mar 24 2020 17:00:00 GMT-0700\n // This matches style used in existing convertFilterValuePresModel\n const value = new Date(dateAsString);\n return Number.isNaN(value.getTime()) ? null : value;\n }\n static parseDateTime(dateAsString) {\n // With a time, the date is assumed to be UTC.\n // Our date format is always: yyyy-mm-dd hh:mm:ss\n // Unfortunately, IE11 can't parse that format so we add a T between the day and time.\n // We also add a Z so that it is UTC. (Without the Z, some browsers assume local, and others UTC)\n // Even though we've dropped support for IE11, it's riskier/costlier to make updates here.\n const formattedDateString = dateAsString.replace(' ', 'T').concat('Z');\n const value = new Date(formattedDateString);\n return Number.isNaN(value.getTime()) ? null : value;\n }\n // It would be nice to merge this and the method FilterConverter::convertFilterValuePresModel in api-platform-js\n static convertValueAsStringToValue(valueAsString, type) {\n // This is both DataDictionary and ShowDataTablePresModel compatible.\n // In the DataDictionary, valueAsString can be '%null%' or '%missing%', while in\n // ShowDataTablePresModel, we can get 'null' or 'missing', or '%null%' for string special values.\n // For either of these cases, we return specialValueIndicator (or the original special string).\n // To maintain backwards compatibilty, this converter:\n // 1. returns a string for any special values\n // 2. returns a string for any date\n // Parameter min/max values can be undefined, so result is also undefined\n if (valueAsString === undefined || valueAsString === null) {\n return undefined;\n }\n if (this.isSpecial(valueAsString)) {\n return valueAsString;\n }\n switch (type) {\n case Enums_1.DataType.Bool:\n return this.parseBoolean(valueAsString);\n case Enums_1.DataType.Int:\n case Enums_1.DataType.Float:\n // Return special value '%null%' for any failure in parsing.\n // We need to do that because ShowDataTablePresModel will give us strings like 'null'\n // for special values.\n return this.parseNumber(valueAsString);\n case Enums_1.DataType.Date:\n // For ShowDataTablePresModel, special values will be \"null\" which will fail to parse.\n // In that case, we return '%null%'.\n return this.parseDate(valueAsString) === null ? this.specialValueIndicator : valueAsString;\n case Enums_1.DataType.DateTime:\n // For ShowDataTablePresModel, special values will be \"null\" which will fail to parse.\n // In that case, we return '%null%'\n return this.parseDateTime(valueAsString) === null ? this.specialValueIndicator : valueAsString;\n case Enums_1.DataType.Spatial:\n case Enums_1.DataType.String:\n default:\n return valueAsString;\n }\n }\n // tslint:disable-next-line:no-any\n static convertValueToNativeValue(value, type) {\n // This converts from our 1.2 API that returns strings for specials, and dates as strings.\n // It takes the special case of '%null%' and returns a null.\n // For dates, it returns a Date object rather than a string.\n // convertValueToNativeValue should be used to build a DataValue.nativeValue field.\n // Parameter min/max can be undefined. If that is the case, nativeValue is treated like a special\n if (value === undefined || value === null) {\n return null;\n }\n switch (type) {\n case Enums_1.DataType.Bool:\n return typeof value === 'string' ? null : value;\n case Enums_1.DataType.Int:\n case Enums_1.DataType.Float:\n return typeof value === 'string' ? null : value;\n case Enums_1.DataType.Date:\n // Convert the string to Date object (or null if parsing fails ... we assume special)\n return this.parseDate(value);\n case Enums_1.DataType.DateTime:\n // Convert the string to Date object (or null if parsing fails ... we assume special)\n return this.parseDateTime(value);\n case Enums_1.DataType.String:\n return this.isSpecial(value) ? null : value;\n case Enums_1.DataType.Spatial:\n default:\n return value;\n }\n }\n // tslint:disable-next-line:no-any\n static convertStringValueToNativeValue(value, type) {\n // This handles the conversion from string directly to native value for all types\n return this.convertValueToNativeValue(this.convertValueAsStringToValue(value, type), type);\n }\n}\nexports.DataTypeConverter = DataTypeConverter;\nDataTypeConverter.specialValueIndicator = '%null%';\n//# sourceMappingURL=DataTypeConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ExtensionContext;\n(function (ExtensionContext) {\n ExtensionContext[\"Desktop\"] = \"desktop\";\n ExtensionContext[\"Server\"] = \"server\";\n ExtensionContext[\"Unknown\"] = \"unknown\";\n ExtensionContext[\"Cloud\"] = \"cloud\";\n ExtensionContext[\"PublicWeb\"] = \"public-web\";\n ExtensionContext[\"PublicDesktop\"] = \"public-desktop\";\n})(ExtensionContext = exports.ExtensionContext || (exports.ExtensionContext = {}));\nvar ExtensionMode;\n(function (ExtensionMode) {\n ExtensionMode[\"Authoring\"] = \"authoring\";\n ExtensionMode[\"Viewing\"] = \"viewing\";\n ExtensionMode[\"Unknown\"] = \"unknown\";\n})(ExtensionMode = exports.ExtensionMode || (exports.ExtensionMode = {}));\nvar AnnotateEnum;\n(function (AnnotateEnum) {\n AnnotateEnum[\"Mark\"] = \"mark\";\n AnnotateEnum[\"Point\"] = \"point\";\n AnnotateEnum[\"Area\"] = \"area\";\n})(AnnotateEnum = exports.AnnotateEnum || (exports.AnnotateEnum = {}));\nvar ColumnType;\n(function (ColumnType) {\n ColumnType[\"Discrete\"] = \"discrete\";\n ColumnType[\"Continuous\"] = \"continuous\";\n ColumnType[\"Unknown\"] = \"unknown\";\n})(ColumnType = exports.ColumnType || (exports.ColumnType = {}));\nvar DashboardObjectType;\n(function (DashboardObjectType) {\n DashboardObjectType[\"Blank\"] = \"blank\";\n DashboardObjectType[\"Worksheet\"] = \"worksheet\";\n DashboardObjectType[\"QuickFilter\"] = \"quick-filter\";\n DashboardObjectType[\"ParameterControl\"] = \"parameter-control\";\n DashboardObjectType[\"PageFilter\"] = \"page-filter\";\n DashboardObjectType[\"Legend\"] = \"legend\";\n DashboardObjectType[\"Title\"] = \"title\";\n DashboardObjectType[\"Text\"] = \"text\";\n DashboardObjectType[\"Image\"] = \"image\";\n DashboardObjectType[\"WebPage\"] = \"web-page\";\n DashboardObjectType[\"Extension\"] = \"extension\";\n})(DashboardObjectType = exports.DashboardObjectType || (exports.DashboardObjectType = {}));\nvar DataType;\n(function (DataType) {\n DataType[\"String\"] = \"string\";\n DataType[\"Int\"] = \"int\";\n DataType[\"Float\"] = \"float\";\n DataType[\"Bool\"] = \"bool\";\n DataType[\"Date\"] = \"date\";\n DataType[\"DateTime\"] = \"date-time\";\n DataType[\"Spatial\"] = \"spatial\";\n DataType[\"Unknown\"] = \"unknown\";\n})(DataType = exports.DataType || (exports.DataType = {}));\nvar DialogStyle;\n(function (DialogStyle) {\n DialogStyle[\"Window\"] = \"window\";\n DialogStyle[\"Modal\"] = \"modal\";\n DialogStyle[\"Modeless\"] = \"modeless\";\n})(DialogStyle = exports.DialogStyle || (exports.DialogStyle = {}));\nvar EncodedDataType;\n(function (EncodedDataType) {\n EncodedDataType[\"Number\"] = \"number\";\n EncodedDataType[\"String\"] = \"string\";\n EncodedDataType[\"Date\"] = \"date\";\n EncodedDataType[\"Boolean\"] = \"boolean\";\n})(EncodedDataType = exports.EncodedDataType || (exports.EncodedDataType = {}));\nvar ErrorCodes;\n(function (ErrorCodes) {\n ErrorCodes[\"INITIALIZATION_ERROR\"] = \"initialization-error\";\n ErrorCodes[\"INTERNAL_ERROR\"] = \"internal-error\";\n ErrorCodes[\"MISSING_ENUM_MAPPING\"] = \"missing-enum-mapping\";\n ErrorCodes[\"MISSING_PARAMETER\"] = \"missing-parameter\";\n ErrorCodes[\"PERMISSION_DENIED\"] = \"permission-denied\";\n ErrorCodes[\"PRES_MODEL_PARSING_ERROR\"] = \"pres-model-parsing-error\";\n ErrorCodes[\"VERSION_NOT_CONFIGURED\"] = \"version-not-configured\";\n ErrorCodes[\"VISIBILITY_ERROR\"] = \"visibility-error\";\n ErrorCodes[\"UNKNOWN_VERB_ID\"] = \"unknown-verb-id\";\n})(ErrorCodes = exports.ErrorCodes || (exports.ErrorCodes = {}));\nvar FieldAggregationType;\n(function (FieldAggregationType) {\n FieldAggregationType[\"Sum\"] = \"sum\";\n FieldAggregationType[\"Avg\"] = \"avg\";\n FieldAggregationType[\"Min\"] = \"min\";\n FieldAggregationType[\"Max\"] = \"max\";\n FieldAggregationType[\"Stdev\"] = \"stdev\";\n FieldAggregationType[\"Stdevp\"] = \"stdevp\";\n FieldAggregationType[\"Var\"] = \"var\";\n FieldAggregationType[\"Varp\"] = \"varp\";\n FieldAggregationType[\"Collect\"] = \"collect\";\n FieldAggregationType[\"Count\"] = \"count\";\n FieldAggregationType[\"Countd\"] = \"countd\";\n FieldAggregationType[\"Median\"] = \"median\";\n FieldAggregationType[\"Attr\"] = \"attr\";\n FieldAggregationType[\"None\"] = \"none\";\n FieldAggregationType[\"Year\"] = \"year\";\n FieldAggregationType[\"Qtr\"] = \"qtr\";\n FieldAggregationType[\"Month\"] = \"month\";\n FieldAggregationType[\"Day\"] = \"day\";\n FieldAggregationType[\"Hour\"] = \"hour\";\n FieldAggregationType[\"Minute\"] = \"minute\";\n FieldAggregationType[\"Second\"] = \"second\";\n FieldAggregationType[\"Week\"] = \"week\";\n FieldAggregationType[\"Weekday\"] = \"weekday\";\n FieldAggregationType[\"MonthYear\"] = \"month-year\";\n FieldAggregationType[\"Mdy\"] = \"mdy\";\n FieldAggregationType[\"End\"] = \"end\";\n FieldAggregationType[\"TruncYear\"] = \"trunc-year\";\n FieldAggregationType[\"TruncQtr\"] = \"trunc-qtr\";\n FieldAggregationType[\"TruncMonth\"] = \"trunc-month\";\n FieldAggregationType[\"TruncWeek\"] = \"trunc-week\";\n FieldAggregationType[\"TruncDay\"] = \"trunc-day\";\n FieldAggregationType[\"TruncHour\"] = \"trunc-hour\";\n FieldAggregationType[\"TruncMinute\"] = \"trunc-minute\";\n FieldAggregationType[\"TruncSecond\"] = \"trunc-second\";\n FieldAggregationType[\"Quart1\"] = \"quart1\";\n FieldAggregationType[\"Quart3\"] = \"quart3\";\n FieldAggregationType[\"Skewness\"] = \"skewness\";\n FieldAggregationType[\"Kurtosis\"] = \"kurtosis\";\n FieldAggregationType[\"InOut\"] = \"in-out\";\n FieldAggregationType[\"User\"] = \"user\";\n})(FieldAggregationType = exports.FieldAggregationType || (exports.FieldAggregationType = {}));\nvar FieldRoleType;\n(function (FieldRoleType) {\n FieldRoleType[\"Dimension\"] = \"dimension\";\n FieldRoleType[\"Measure\"] = \"measure\";\n FieldRoleType[\"Unknown\"] = \"unknown\";\n})(FieldRoleType = exports.FieldRoleType || (exports.FieldRoleType = {}));\n/**\n * The different update types for applying filter.\n */\nvar FilterUpdateType;\n(function (FilterUpdateType) {\n FilterUpdateType[\"Add\"] = \"add\";\n FilterUpdateType[\"All\"] = \"all\";\n FilterUpdateType[\"Replace\"] = \"replace\";\n FilterUpdateType[\"Remove\"] = \"remove\";\n})(FilterUpdateType = exports.FilterUpdateType || (exports.FilterUpdateType = {}));\nvar SheetType;\n(function (SheetType) {\n SheetType[\"Dashboard\"] = \"dashboard\";\n SheetType[\"Story\"] = \"story\";\n SheetType[\"Worksheet\"] = \"worksheet\";\n})(SheetType = exports.SheetType || (exports.SheetType = {}));\nvar DomainRestrictionType;\n(function (DomainRestrictionType) {\n DomainRestrictionType[\"All\"] = \"all\";\n DomainRestrictionType[\"List\"] = \"list\";\n DomainRestrictionType[\"Range\"] = \"range\";\n})(DomainRestrictionType = exports.DomainRestrictionType || (exports.DomainRestrictionType = {}));\nvar DateStepPeriod;\n(function (DateStepPeriod) {\n DateStepPeriod[\"Years\"] = \"years\";\n DateStepPeriod[\"Quarters\"] = \"quarters\";\n DateStepPeriod[\"Months\"] = \"months\";\n DateStepPeriod[\"Weeks\"] = \"weeks\";\n DateStepPeriod[\"Days\"] = \"days\";\n DateStepPeriod[\"Hours\"] = \"hours\";\n DateStepPeriod[\"Minutes\"] = \"minutes\";\n DateStepPeriod[\"Seconds\"] = \"seconds\";\n})(DateStepPeriod = exports.DateStepPeriod || (exports.DateStepPeriod = {}));\n/**\n * The option for specifying which values to include for filtering.\n */\nvar FilterNullOption;\n(function (FilterNullOption) {\n FilterNullOption[\"NullValues\"] = \"nullvalues\";\n FilterNullOption[\"NonNullValues\"] = \"nonnullvalues\";\n FilterNullOption[\"AllValues\"] = \"allvalues\";\n})(FilterNullOption = exports.FilterNullOption || (exports.FilterNullOption = {}));\n/**\n * The type of filter domain\n */\nvar FilterDomainType;\n(function (FilterDomainType) {\n FilterDomainType[\"Relevant\"] = \"relevant\";\n FilterDomainType[\"Database\"] = \"database\";\n})(FilterDomainType = exports.FilterDomainType || (exports.FilterDomainType = {}));\n/**\n * Internal enum for specifying the selection type for select marks api.\n */\nvar SelectionUpdateType;\n(function (SelectionUpdateType) {\n SelectionUpdateType[\"Replace\"] = \"select-replace\";\n SelectionUpdateType[\"Add\"] = \"select-add\";\n SelectionUpdateType[\"Remove\"] = \"select-remove\";\n})(SelectionUpdateType = exports.SelectionUpdateType || (exports.SelectionUpdateType = {}));\n/**\n * Internal enum for specifying the select option for the select tuples api.\n */\nvar SelectOptions;\n(function (SelectOptions) {\n SelectOptions[\"Simple\"] = \"select-options-simple\";\n SelectOptions[\"Toggle\"] = \"select-options-toggle\";\n SelectOptions[\"Menu\"] = \"select-options-menu\";\n SelectOptions[\"Range\"] = \"select-options-range\";\n SelectOptions[\"Search\"] = \"select-options-search\";\n})(SelectOptions = exports.SelectOptions || (exports.SelectOptions = {}));\n/**\n * Internal enum for specifying the included values type for range selection.\n */\nvar QuantitativeIncludedValues;\n(function (QuantitativeIncludedValues) {\n QuantitativeIncludedValues[\"IncludeNull\"] = \"include-null\";\n QuantitativeIncludedValues[\"IncludeNonNull\"] = \"include-non-null\";\n QuantitativeIncludedValues[\"IncludeAll\"] = \"include-all\";\n})(QuantitativeIncludedValues = exports.QuantitativeIncludedValues || (exports.QuantitativeIncludedValues = {}));\n/**\n * Internal enum for specifying a hierarchical level selection state.\n */\nvar HierarchicalLevelSelectionState;\n(function (HierarchicalLevelSelectionState) {\n HierarchicalLevelSelectionState[\"AllSelected\"] = \"all-selected\";\n HierarchicalLevelSelectionState[\"NoneSelected\"] = \"none-selected\";\n HierarchicalLevelSelectionState[\"SomeSelected\"] = \"some-selected\";\n HierarchicalLevelSelectionState[\"UnknownSelected\"] = \"unknown-selected\";\n})(HierarchicalLevelSelectionState = exports.HierarchicalLevelSelectionState || (exports.HierarchicalLevelSelectionState = {}));\n/**\n * Type of mark for a given marks card in a viz.\n */\nvar MarkType;\n(function (MarkType) {\n MarkType[\"Bar\"] = \"bar\";\n MarkType[\"Line\"] = \"line\";\n MarkType[\"Area\"] = \"area\";\n MarkType[\"Square\"] = \"square\";\n MarkType[\"Circle\"] = \"circle\";\n MarkType[\"Shape\"] = \"shape\";\n MarkType[\"Text\"] = \"text\";\n MarkType[\"Map\"] = \"map\";\n MarkType[\"Pie\"] = \"pie\";\n MarkType[\"GanttBar\"] = \"gantt-bar\";\n MarkType[\"Polygon\"] = \"polygon\";\n MarkType[\"Heatmap\"] = \"heatmap\";\n MarkType[\"VizExtension\"] = \"viz-extension\";\n})(MarkType = exports.MarkType || (exports.MarkType = {}));\n/**\n * Internal enum for specifying the type of filter\n */\nvar FilterType;\n(function (FilterType) {\n FilterType[\"Categorical\"] = \"categorical\";\n FilterType[\"Range\"] = \"range\";\n FilterType[\"RelativeDate\"] = \"relativeDate\";\n FilterType[\"Hierarchical\"] = \"hierarchical\";\n})(FilterType = exports.FilterType || (exports.FilterType = {}));\n/**\n * Internal enum for specifying the DateRangeType of a relative date filter\n */\nvar DateRangeType;\n(function (DateRangeType) {\n /**\n * Refers to the last day, week, month, etc. of the date period.\n */\n DateRangeType[\"Last\"] = \"last\";\n /**\n * Refers to the last N days, weeks, months, etc. of the date period.\n */\n DateRangeType[\"LastN\"] = \"lastN\";\n /**\n * Refers to the next day, week, month, etc. of the date period.\n */\n DateRangeType[\"Next\"] = \"next\";\n /**\n * Refers to the next N days, weeks, months, etc. of the date period.\n */\n DateRangeType[\"NextN\"] = \"nextN\";\n /**\n * Refers to the current day, week, month, etc. of the date period.\n */\n DateRangeType[\"Current\"] = \"current\";\n /**\n * Refers to everything up to and including the current day, week, month, etc. of the date period.\n */\n DateRangeType[\"ToDate\"] = \"toDate\";\n})(DateRangeType = exports.DateRangeType || (exports.DateRangeType = {}));\n/**\n * Used to determine if the launching of an extension dialog succeeded or failed.\n */\nvar ExtensionDialogResult;\n(function (ExtensionDialogResult) {\n ExtensionDialogResult[\"DialogAlreadyOpen\"] = \"dialog-already-open\";\n ExtensionDialogResult[\"InvalidDomain\"] = \"invalid-domain\";\n ExtensionDialogResult[\"Success\"] = \"success\";\n})(ExtensionDialogResult = exports.ExtensionDialogResult || (exports.ExtensionDialogResult = {}));\n/**\n * Used to optimize the getSummaryData/getUnderlyingTableData results\n * Mapped from external IncludeDataValuesOption\n */\nvar ApiShowDataTableFormat;\n(function (ApiShowDataTableFormat) {\n ApiShowDataTableFormat[\"NativeValuesOnly\"] = \"native-values-only\";\n ApiShowDataTableFormat[\"FormattedValuesOnly\"] = \"formatted-values-only\";\n ApiShowDataTableFormat[\"NativeAndFormattedValues\"] = \"native-and-formatted-values\";\n})(ApiShowDataTableFormat = exports.ApiShowDataTableFormat || (exports.ApiShowDataTableFormat = {}));\n/**\n * Used to set page size for export layout options.\n */\nvar PageSizeOption;\n(function (PageSizeOption) {\n PageSizeOption[\"Letter\"] = \"letter\";\n PageSizeOption[\"Legal\"] = \"legal\";\n PageSizeOption[\"Note\"] = \"note\";\n PageSizeOption[\"Folio\"] = \"folio\";\n PageSizeOption[\"Tabloid\"] = \"tabloid\";\n PageSizeOption[\"Ledger\"] = \"ledger\";\n PageSizeOption[\"Statement\"] = \"statement\";\n PageSizeOption[\"Executive\"] = \"executive\";\n PageSizeOption[\"A3\"] = \"a3\";\n PageSizeOption[\"A4\"] = \"a4\";\n PageSizeOption[\"A5\"] = \"a5\";\n PageSizeOption[\"B4\"] = \"b4\";\n PageSizeOption[\"B5\"] = \"b5\";\n PageSizeOption[\"Quarto\"] = \"quarto\";\n PageSizeOption[\"Unspecified\"] = \"unspecified\";\n})(PageSizeOption = exports.PageSizeOption || (exports.PageSizeOption = {}));\n/**\n * Used to set the page orientation mode for export layout options.\n */\nvar PageOrientation;\n(function (PageOrientation) {\n PageOrientation[\"Printer\"] = \"printer\";\n PageOrientation[\"Portrait\"] = \"portrait\";\n PageOrientation[\"Landscape\"] = \"landscape\";\n})(PageOrientation = exports.PageOrientation || (exports.PageOrientation = {}));\n/**\n * Used to set scale mode for export layout options.\n */\nvar ScaleMode;\n(function (ScaleMode) {\n ScaleMode[\"ScaleAuto\"] = \"auto\";\n ScaleMode[\"ScalePercentage\"] = \"percent\";\n ScaleMode[\"ScaleFitPages\"] = \"fit-pages\";\n})(ScaleMode = exports.ScaleMode || (exports.ScaleMode = {}));\n/**\n * Used by setFitAndScaleValues to scale percent values\n */\nvar PageScalingOption;\n(function (PageScalingOption) {\n PageScalingOption[\"ScalePctAuto\"] = \"auto\";\n PageScalingOption[\"ScalePct400\"] = \"pct400\";\n PageScalingOption[\"ScalePct200\"] = \"pct200\";\n PageScalingOption[\"ScalePct100\"] = \"pct100\";\n PageScalingOption[\"ScalePct90\"] = \"pct90\";\n PageScalingOption[\"ScalePct80\"] = \"pct80\";\n PageScalingOption[\"ScalePct75\"] = \"pct75\";\n PageScalingOption[\"ScalePct60\"] = \"pct60\";\n PageScalingOption[\"ScalePct50\"] = \"pct50\";\n PageScalingOption[\"ScalePct25\"] = \"pct25\";\n})(PageScalingOption = exports.PageScalingOption || (exports.PageScalingOption = {}));\n/**\n * Used by setFitAndScaleValues to scale fit page values\n */\nvar FitPages;\n(function (FitPages) {\n FitPages[\"FitOneHigh\"] = \"fit0x1\";\n FitPages[\"FitTwoHigh\"] = \"fit0x2\";\n FitPages[\"FitOneWide\"] = \"fit1x0\";\n FitPages[\"FitTwoWide\"] = \"fit2x0\";\n})(FitPages = exports.FitPages || (exports.FitPages = {}));\n/**\n * Used by getVisualSpecificationAsync\n */\nvar EncodingType;\n(function (EncodingType) {\n EncodingType[\"Color\"] = \"color\";\n EncodingType[\"Size\"] = \"size\";\n EncodingType[\"Label\"] = \"label\";\n EncodingType[\"Detail\"] = \"detail\";\n EncodingType[\"Tooltip\"] = \"tooltip\";\n EncodingType[\"Shape\"] = \"shape\";\n EncodingType[\"Path\"] = \"path\";\n EncodingType[\"Angle\"] = \"angle\";\n EncodingType[\"Geometry\"] = \"geometry\";\n EncodingType[\"Custom\"] = \"custom\";\n})(EncodingType = exports.EncodingType || (exports.EncodingType = {}));\nvar PulseTimeDimension;\n(function (PulseTimeDimension) {\n PulseTimeDimension[\"Today\"] = \"Today\";\n PulseTimeDimension[\"Yesterday\"] = \"Yesterday\";\n PulseTimeDimension[\"WeekToDate\"] = \"WeekToDate\";\n PulseTimeDimension[\"LastWeek\"] = \"LastWeek\";\n PulseTimeDimension[\"MonthToDate\"] = \"MonthToDate\";\n PulseTimeDimension[\"LastMonth\"] = \"LastMonth\";\n PulseTimeDimension[\"QuarterToDate\"] = \"QuarterToDate\";\n PulseTimeDimension[\"LastQuarter\"] = \"LastQuarter\";\n PulseTimeDimension[\"YearToDate\"] = \"YearToDate\";\n PulseTimeDimension[\"LastYear\"] = \"LastYear\";\n})(PulseTimeDimension = exports.PulseTimeDimension || (exports.PulseTimeDimension = {}));\nvar PulseErrorMessageVisibility;\n(function (PulseErrorMessageVisibility) {\n PulseErrorMessageVisibility[\"Visible\"] = \"visible\";\n PulseErrorMessageVisibility[\"Hidden\"] = \"hidden\";\n PulseErrorMessageVisibility[\"Suppressed\"] = \"suppressed\";\n})(PulseErrorMessageVisibility = exports.PulseErrorMessageVisibility || (exports.PulseErrorMessageVisibility = {}));\n//# sourceMappingURL=Enums.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar NotificationId;\n(function (NotificationId) {\n NotificationId[\"CustomMarkContextMenuClicked\"] = \"custom-mark-context-menu-clicked\";\n NotificationId[\"ContextMenuClick\"] = \"context-menu-click\";\n NotificationId[\"CustomViewRemoved\"] = \"custom-view-removed\";\n NotificationId[\"CustomViewSaved\"] = \"custom-view-saved\";\n NotificationId[\"CustomViewSetDefault\"] = \"custom-view-set-default\";\n NotificationId[\"CustomViewsLoaded\"] = \"custom-views-loaded\";\n NotificationId[\"DashboardLayoutChanged\"] = \"dashboard-layout-changed\";\n NotificationId[\"EditButtonClicked\"] = \"edit-button-clicked\";\n NotificationId[\"EditInDesktopButtonClicked\"] = \"edit-in-desktop-button-clicked\";\n NotificationId[\"ExtensionDialogUpdate\"] = \"extension-dialog-update\";\n NotificationId[\"ExtensionDialogMessage\"] = \"extension-dialog-message\";\n NotificationId[\"FilterChanged\"] = \"filter-changed\";\n NotificationId[\"FirstVizSizeKnown\"] = \"first-viz-size-known\";\n NotificationId[\"FirstPulseMetricSizeKnown\"] = \"first-pulse-metric-size-known\";\n NotificationId[\"ParameterChanged\"] = \"parameter-changed\";\n NotificationId[\"PulseError\"] = \"pulse-error\";\n NotificationId[\"PulseFiltersChanged\"] = \"pulse-filters-changed\";\n NotificationId[\"PulseMetricSizeChanged\"] = \"pulse-metric-size-changed\";\n NotificationId[\"PulseInsightDiscovered\"] = \"pulse-insight-discovered\";\n NotificationId[\"PulseInteractive\"] = \"pulse-interactive\";\n NotificationId[\"PulseTimeDimensionChanged\"] = \"pulse-time-dimension-changed\";\n NotificationId[\"PulseUrlChanged\"] = \"pulse-url-changed\";\n NotificationId[\"SelectedMarksChanged\"] = \"selected-marks-changed\";\n NotificationId[\"SettingsChanged\"] = \"settings-changed\";\n NotificationId[\"SummaryDataChanged\"] = \"summary-data-changed\";\n NotificationId[\"TestConversionNotification\"] = \"test-conversion-notification\";\n NotificationId[\"ToolbarStateChanged\"] = \"toolbar-state-changed\";\n NotificationId[\"VizInteractive\"] = \"viz-interactive\";\n NotificationId[\"AskDataInteractive\"] = \"ask-data-interactive\";\n NotificationId[\"WorkbookReadyToClose\"] = \"workbook-ready-to-close\";\n NotificationId[\"WorkbookFormattingChanged\"] = \"workbook-formatting-changed\";\n NotificationId[\"WorkbookPublished\"] = \"workbook-published\";\n NotificationId[\"WorkbookPublishedAs\"] = \"workbook-published-as\";\n NotificationId[\"WorksheetFormattingChanged\"] = \"worksheet-formatting-changed\";\n NotificationId[\"UrlAction\"] = \"url-action\";\n NotificationId[\"TabSwitched\"] = \"tab-switched\";\n NotificationId[\"StoryPointSwitched\"] = \"story-point-switched\";\n NotificationId[\"ReadyToReceiveAuthToken\"] = \"ready-to-receive-auth-token\";\n})(NotificationId = exports.NotificationId || (exports.NotificationId = {}));\n//# sourceMappingURL=Notifications.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// PLEASE KEEP IN ALPHABETICAL ORDER. This helps with visually finding entries, knowing where to put\n// new ones, and merge conflicts.\nvar ParameterId;\n(function (ParameterId) {\n ParameterId[\"ActiveTablesInfo\"] = \"active-tables-info\";\n ParameterId[\"AnchorDate\"] = \"anchor-date\";\n ParameterId[\"AnnotateEnum\"] = \"annotate-enum\";\n ParameterId[\"AnnotationList\"] = \"annotation-list\";\n ParameterId[\"ApplyWorksheetFormatting\"] = \"apply-worksheet-formatting\";\n ParameterId[\"CategoricalDomain\"] = \"categorical-domain\";\n ParameterId[\"ClickThroughEnabled\"] = \"click-through-enabled\";\n ParameterId[\"Columns\"] = \"columns\";\n ParameterId[\"ColumnsToInclude\"] = \"columns-to-include\";\n ParameterId[\"ColumnsToIncludeById\"] = \"columns-to-include-by-id\";\n ParameterId[\"ConnectionDescriptionSummaries\"] = \"connection-description-summaries\";\n ParameterId[\"CurrentSheetType\"] = \"current-sheet-type\";\n ParameterId[\"CustomView\"] = \"custom-view\";\n ParameterId[\"CustomViewIsDefault\"] = \"custom-view-is-default\";\n ParameterId[\"CustomViewIsPublic\"] = \"custom-view-is-public\";\n ParameterId[\"CustomViewLuid\"] = \"custom-view-luid\";\n ParameterId[\"CustomViewName\"] = \"custom-view-name\";\n ParameterId[\"CustomViews\"] = \"custom-views\";\n ParameterId[\"Dashboard\"] = \"dashboard\";\n ParameterId[\"DashboardFilters\"] = \"dashboard-filters\";\n ParameterId[\"DashboardName\"] = \"dashboard\";\n ParameterId[\"DashboardObjectPositionAndSizeUpdate\"] = \"dashboard-object-position-and-size-update\";\n ParameterId[\"DashboardObjectPositionAndSizeUpdateList\"] = \"dashboard-object-position-and-size-update-list\";\n ParameterId[\"DataRowIndex\"] = \"data-row-index\";\n ParameterId[\"DataSchema\"] = \"data-schema\";\n ParameterId[\"DataSource\"] = \"data-source\";\n ParameterId[\"DataSourceDataTable\"] = \"data-source-data-table\";\n ParameterId[\"DataSourceId\"] = \"data-source-id\";\n ParameterId[\"DataSourceName\"] = \"data-source-name\";\n ParameterId[\"DataTable\"] = \"data-table\";\n ParameterId[\"DataTableReader\"] = \"data-table-reader\";\n ParameterId[\"DateRangeType\"] = \"date-range-type\";\n ParameterId[\"DeleteCount\"] = \"delete-count\";\n ParameterId[\"DeltaTimeMs\"] = \"delta-time-ms\";\n ParameterId[\"DimValSelectionModels\"] = \"dimensionValueSelectionModels\";\n ParameterId[\"DomainType\"] = \"domain-type\";\n ParameterId[\"EmbeddingAbstractQuery\"] = \"embedding-abstract-query\";\n ParameterId[\"EmbeddingBootstrapInfo\"] = \"embedding-bootstrap-info\";\n ParameterId[\"EncodingType\"] = \"encoding-type\";\n ParameterId[\"ExportCrosstabSheetMap\"] = \"export-crosstab-sheet-map\";\n ParameterId[\"ExportFile\"] = \"export-file\";\n ParameterId[\"ExportOriginUrl\"] = \"export-origin-url\";\n ParameterId[\"ExportPdfOptions\"] = \"export-pdf-options\";\n ParameterId[\"ExtensionBootstrapInfo\"] = \"extension-bootstrap-info\";\n ParameterId[\"ExtensionContextMenuIds\"] = \"extension-context-menu-ids\";\n ParameterId[\"ExtensionDialogH\"] = \"extension-dialog-height\";\n ParameterId[\"ExtensionDialogMessage\"] = \"extension-dialog-message\";\n ParameterId[\"ExtensionDialogPayload\"] = \"extension-dialog-payload\";\n ParameterId[\"ExtensionDialogResult\"] = \"extension-dialog-result\";\n ParameterId[\"ExtensionDialogStyle\"] = \"extension-dialog-style\";\n ParameterId[\"ExtensionDialogUrl\"] = \"extension-dialog-url\";\n ParameterId[\"ExtensionDialogW\"] = \"extension-dialog-width\";\n ParameterId[\"ExtensionLocator\"] = \"extension-locator\";\n ParameterId[\"ExtensionSettingsInfo\"] = \"extension-settings-info\";\n ParameterId[\"ExtensionZoneId\"] = \"extension-zone-id\";\n ParameterId[\"ExternalMenuDescription\"] = \"external-menu-description\";\n ParameterId[\"ExternalMenuHeader\"] = \"external-menu-header\";\n ParameterId[\"ExternalMenuItemDisplayName\"] = \"external-menu-item-display-name\";\n ParameterId[\"ExternalMenuItemId\"] = \"external-menu-item-id\";\n ParameterId[\"Field\"] = \"field\";\n ParameterId[\"FieldCount\"] = \"field-count\";\n ParameterId[\"FieldId\"] = \"field-id\";\n ParameterId[\"FieldName\"] = \"field-name\";\n ParameterId[\"FilterLevels\"] = \"filter-levels\";\n ParameterId[\"FilterRangeMax\"] = \"filter-range-max\";\n ParameterId[\"FilterRangeMin\"] = \"filter-range-min\";\n ParameterId[\"FilterRangeNullOption\"] = \"filter-range-null-option\";\n ParameterId[\"FilterUpdateType\"] = \"filter-update-type\";\n ParameterId[\"FilterValues\"] = \"filter-values\";\n ParameterId[\"FontNameListItems\"] = \"font-name-list-items\";\n ParameterId[\"FormattedText\"] = \"formatted-text\";\n ParameterId[\"FunctionName\"] = \"function-name\";\n ParameterId[\"FromIndex\"] = \"from-index\";\n ParameterId[\"HierValSelectionModels\"] = \"hierarchicalValueSelectionModels\";\n ParameterId[\"HighlightedData\"] = \"highlighted-data\";\n ParameterId[\"HoverTupleInteraction\"] = \"hover-tuple-interaction\";\n ParameterId[\"IgnoreAliases\"] = \"ignore-aliases\";\n ParameterId[\"IgnoreSelection\"] = \"ignore-selection\";\n ParameterId[\"IncludeAllColumns\"] = \"include-all-columns\";\n ParameterId[\"InvalidAggFieldName\"] = \"invalid-agg-field-name\";\n ParameterId[\"InvalidDates\"] = \"invalid-dates\";\n ParameterId[\"InvalidFieldCaption\"] = \"invalid-field-caption\";\n ParameterId[\"InvalidFields\"] = \"invalid-fields\";\n ParameterId[\"InvalidValues\"] = \"invalid-values\";\n ParameterId[\"IsAnalyticsAssistantAvailable\"] = \"is-analytics-assistant-available\";\n ParameterId[\"IsExcludeMode\"] = \"is-exclude\";\n ParameterId[\"IsExtensionDialog\"] = \"is-extension-dialog\";\n ParameterId[\"IsFromCalcDialog\"] = \"is-from-calc-dialog\";\n ParameterId[\"JoinDescription\"] = \"join-description\";\n ParameterId[\"LogicalTableId\"] = \"logical-table-id\";\n ParameterId[\"LogicalTableInfoList\"] = \"logical-table-info-list\";\n ParameterId[\"MarksCardIndex\"] = \"marks-card-index\";\n ParameterId[\"MaxHeight\"] = \"max-height\";\n ParameterId[\"MaxRows\"] = \"max-rows\";\n ParameterId[\"MaxWidth\"] = \"max-width\";\n ParameterId[\"MinHeight\"] = \"min-height\";\n ParameterId[\"MinWidth\"] = \"min-width\";\n ParameterId[\"PageRowCount\"] = \"page-row-count\";\n ParameterId[\"ParameterCaption\"] = \"paremeter-caption\";\n ParameterId[\"ParameterError\"] = \"parameter-error\";\n ParameterId[\"ParameterFieldName\"] = \"parameter-field-name\";\n ParameterId[\"ParameterInfo\"] = \"parameter-info\";\n ParameterId[\"ParameterInfos\"] = \"parameter-infos\";\n ParameterId[\"ParameterValue\"] = \"parameter-value\";\n ParameterId[\"PeriodType\"] = \"period-type\";\n ParameterId[\"PulseFieldName\"] = \"fieldName\";\n ParameterId[\"PulseFieldNames\"] = \"fieldNames\";\n ParameterId[\"PulseFilterDomainType\"] = \"domainType\";\n ParameterId[\"PulseFilterDomainSearchTerm\"] = \"searchTerm\";\n ParameterId[\"PulsePageSize\"] = \"pageSize\";\n ParameterId[\"PulseNextPageToken\"] = \"nextPageToken\";\n ParameterId[\"PulseFilters\"] = \"filters\";\n ParameterId[\"PulseTimeDimension\"] = \"timeDimension\";\n ParameterId[\"QuantitativeDomain\"] = \"quantitative-dmain\";\n ParameterId[\"QuantRangeSelectionModels\"] = \"quantativeRangeSelectionModels\";\n ParameterId[\"RangeN\"] = \"range-n\";\n ParameterId[\"ReplaySpeed\"] = \"replay-speed\";\n ParameterId[\"SelectedData\"] = \"selected-data\";\n ParameterId[\"SelectedSheetNames\"] = \"selected-sheet-names\";\n ParameterId[\"Selection\"] = \"selection\";\n ParameterId[\"SelectionList\"] = \"selection-list\";\n ParameterId[\"SelectionUpdateType\"] = \"selectionUpdateType\";\n ParameterId[\"SelectTuplesInteraction\"] = \"select-tuples-interaction\";\n ParameterId[\"SendNotifications\"] = \"send-notifications\";\n ParameterId[\"SettingsValues\"] = \"settings-values\";\n ParameterId[\"SharedFilterSheets\"] = \"shared-filter-sheets\";\n ParameterId[\"SharedFiltersInfo\"] = \"shared-filters-info\";\n ParameterId[\"SheetIdentifier\"] = \"sheet-identifier\";\n ParameterId[\"SheetName\"] = \"sheet-name\";\n ParameterId[\"SheetPath\"] = \"sheet-path\";\n ParameterId[\"ShouldRefreshDS\"] = \"should-refresh-ds\";\n ParameterId[\"ShowDataTableFormat\"] = \"show-data-table-format\";\n ParameterId[\"StartIndex\"] = \"start-index\";\n ParameterId[\"State\"] = \"state\";\n ParameterId[\"StoryPointIndex\"] = \"story-point-index\";\n ParameterId[\"StoryPointInfo\"] = \"story-point-info\";\n ParameterId[\"SwitchToSheetName\"] = \"switch-to-sheet-name\";\n ParameterId[\"TargetPoint\"] = \"target-point\";\n ParameterId[\"TestConversionParameter\"] = \"test-conversion-parameter\";\n ParameterId[\"Text\"] = \"formatted-text\";\n ParameterId[\"ToIndex\"] = \"to-index\";\n ParameterId[\"TooltipContext\"] = \"tooltip-context\";\n ParameterId[\"TooltipTextRequest\"] = \"tooltip-text-request\";\n ParameterId[\"TooltipText\"] = \"tooltip-text\";\n ParameterId[\"UnderlyingDataTable\"] = \"underlying-data-table\";\n ParameterId[\"UnderlyingSummaryDataTable\"] = \"underlying-summary-data-table\";\n ParameterId[\"Url\"] = \"url\";\n ParameterId[\"UseTabDelimiters\"] = \"use-tab-delimiters\";\n ParameterId[\"ViewDataTableCacheId\"] = \"view-data-table-cache-id\";\n ParameterId[\"ViewDataTableId\"] = \"view-data-table-id\";\n ParameterId[\"VisualId\"] = \"visual-id\";\n ParameterId[\"VisualSpecification\"] = \"visual-specification\";\n ParameterId[\"VizAPIInputJson\"] = \"vizapi-input-json\";\n ParameterId[\"VizAPIStateWithDataModel\"] = \"vizapi-state-with-data-model\";\n ParameterId[\"VizAPIStateWarningMsg\"] = \"vizapi-state-warning-msg\";\n ParameterId[\"VizAPISVG\"] = \"vizapi-svg\";\n ParameterId[\"WorksheetName\"] = \"worksheet-name\";\n ParameterId[\"WorksheetFilters\"] = \"worksheet-filters\";\n ParameterId[\"ZoneIdsVisibilityMap\"] = \"zone-ids-visibility-map\";\n})(ParameterId = exports.ParameterId || (exports.ParameterId = {}));\n//# sourceMappingURL=Parameters.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// Declare this key type and export the NotificationId to make this behave like a string enum.\n//\n// PLEASE KEEP IN ALPHABETICAL ORDER. This helps with visually finding entries, knowing where to put\n// new ones, and merge conflicts.\nvar VerbId;\n(function (VerbId) {\n VerbId[\"ActivateNextStoryPoint\"] = \"activate-next-story-point\";\n VerbId[\"ActivatePreviousStoryPoint\"] = \"activate-previous-story-point\";\n VerbId[\"ActivateSheet\"] = \"activateSheet\";\n VerbId[\"ActivateStoryPoint\"] = \"activate-story-point\";\n VerbId[\"AddMarksCardFields\"] = \"add-marks-card-fields\";\n VerbId[\"AppendExternalMenuItem\"] = \"append-external-menu-item\";\n VerbId[\"ApplyCategoricalFilter\"] = \"categorical-filter\";\n VerbId[\"ApplyPulseFilters\"] = \"apply-pulse-filters\";\n VerbId[\"ApplyPulseTimeDimension\"] = \"apply-pulse-time-dimension\";\n VerbId[\"ApplyRangeFilter\"] = \"range-filter\";\n VerbId[\"ApplyRelativeDateFilter\"] = \"apply-relative-date-Filter\";\n VerbId[\"Authenticate\"] = \"authenticate\";\n VerbId[\"BlockExtension\"] = \"block-extension\";\n VerbId[\"ChangeParameterValue\"] = \"change-parameter-value\";\n VerbId[\"ChangeSharedFilter\"] = \"change-shared-filter\";\n VerbId[\"ClearAllPulseFilters\"] = \"clear-all-pulse-filters\";\n VerbId[\"ClearFilter\"] = \"clear-filter\";\n VerbId[\"ClearPulseFilters\"] = \"clear-pulse-filters\";\n VerbId[\"ClearSelectedMarks\"] = \"clear-selected-marks\";\n VerbId[\"CloseDialog\"] = \"close-dialog\";\n VerbId[\"CreateAnnotation\"] = \"create-annotation\";\n VerbId[\"DashboardCategoricalFilter\"] = \"dashboard-categorical-filter\";\n VerbId[\"DisplayDialog\"] = \"display-dialog\";\n VerbId[\"DownloadWorkbook\"] = \"download-workbook\";\n VerbId[\"EditAliasesDialog\"] = \"edit-aliases-dialog\";\n VerbId[\"ExecuteExternalMenuItem\"] = \"execute-external-menu-item\";\n VerbId[\"ExportCrosstab\"] = \"export-crosstab\";\n VerbId[\"ExportCrosstabCsvDownload\"] = \"export-crosstab-csv-download\";\n VerbId[\"ExportCrosstabExcelDownload\"] = \"export-crosstab-excel-download\";\n VerbId[\"ExportData\"] = \"export-data\";\n VerbId[\"ExportDataDownload\"] = \"export-data-download\";\n VerbId[\"ExportImage\"] = \"export-image\";\n VerbId[\"ExportPdf\"] = \"export-pdf\";\n VerbId[\"ExportPdfDownload\"] = \"export-pdf-download\";\n VerbId[\"ExportPowerpoint\"] = \"export-powerpoint\";\n VerbId[\"ExportPowerpointDownload\"] = \"export-powerpoint-download\";\n VerbId[\"FindParameter\"] = \"find-parameter\";\n VerbId[\"GetActiveTables\"] = \"get-active-tables\";\n VerbId[\"GetAllDataSources\"] = \"get-all-data-sources\";\n VerbId[\"GetAnnotations\"] = \"get-annotations\";\n VerbId[\"GetCategoricalDomain\"] = \"get-categorical-domain\";\n VerbId[\"GetConnectionDescriptionSummaries\"] = \"get-connection-description-summaries\";\n VerbId[\"GetCurrentSrc\"] = \"get-current-src\";\n VerbId[\"GetCustomViews\"] = \"get-custom-views\";\n VerbId[\"GetDashboardFilters\"] = \"get-dashboard-filters\";\n VerbId[\"GetDataSource\"] = \"get-datasource\";\n VerbId[\"GetDataSourceData\"] = \"get-datasource-data\";\n VerbId[\"GetDataSources\"] = \"get-data-sources\";\n VerbId[\"GetDataSummaryData\"] = \"get-summary-data\";\n VerbId[\"GetDataSummaryDataReader\"] = \"get-summary-data-reader\";\n VerbId[\"GetDataTableReaderPage\"] = \"get-data-table-reader-page\";\n VerbId[\"GetEmbeddingAbstractQueryWithDataModel\"] = \"get-embedding-abstract-query-with-data-model\";\n VerbId[\"GetEmbeddingClientInfo\"] = \"get-embedding-client-info\";\n VerbId[\"GetVizStateWithDataModel\"] = \"get-viz-state-with-data-model\";\n VerbId[\"GetExportCrosstabSheetMap\"] = \"get-export-crosstab-sheet-map\";\n VerbId[\"GetExportPdfOptions\"] = \"get-export-pdf-options\";\n VerbId[\"GetField\"] = \"get-field\";\n VerbId[\"GetFieldAndDataSource\"] = \"get-field-and-datasource\";\n VerbId[\"GetVisualSpecification\"] = \"get-visual-specification\";\n VerbId[\"GetFilters\"] = \"get-filters\";\n VerbId[\"GetFonts\"] = \"get-fonts\";\n VerbId[\"GetHighlightedMarks\"] = \"get-highlighted-marks\";\n VerbId[\"GetJoinDescription\"] = \"get-join-description\";\n VerbId[\"GetLogicalTableData\"] = \"get-logical-table-data\";\n VerbId[\"GetLogicalTableDataReader\"] = \"get-logical-table-data-reader\";\n VerbId[\"GetLogicalTables\"] = \"get-logical-tables\";\n VerbId[\"GetParametersForSheet\"] = \"get-parameters-for-sheet\";\n VerbId[\"GetPulseCategoricalDomain\"] = \"get-pulse-categorical-domain\";\n VerbId[\"GetPulseFilters\"] = \"get-pulse-filters\";\n VerbId[\"GetPulseTimeDimension\"] = \"get-pulse-time-dimension\";\n VerbId[\"GetRangeDomain\"] = \"get-range-domain\";\n VerbId[\"GetSelectedMarks\"] = \"get-selected-marks\";\n VerbId[\"GetSharedFilter\"] = \"get-shared-filter\";\n VerbId[\"GetTooltipText\"] = \"get-tooltip-text\";\n VerbId[\"GetUnderlyingData\"] = \"get-underlying-data\";\n VerbId[\"GetUnderlyingTableData\"] = \"get-underlying-table-data\";\n VerbId[\"GetUnderlyingTableDataReader\"] = \"get-underlying-table-data-reader\";\n VerbId[\"GetUnderlyingTables\"] = \"get-underlying-tables\";\n VerbId[\"HierarchicalFilter\"] = \"hierachical-filter\";\n VerbId[\"InitializeExtension\"] = \"initialize-extension\";\n VerbId[\"IsAnalyticsAssistantAvailable\"] = \"is-analytics-assistant-available\";\n VerbId[\"LaunchAnalyticsAssistant\"] = \"launch-analytics-assistant\";\n VerbId[\"MoveAndResizeZones\"] = \"move-and-resize-zones\";\n VerbId[\"MoveMarksCardField\"] = \"move-marks-card-field\";\n VerbId[\"RaiseLeaveMarkNavNotification\"] = \"raise-leave-mark-nav-notification\";\n VerbId[\"RaiseHoverTupleNotification\"] = \"raise-hover-tuple-notification\";\n VerbId[\"RaiseSelectTuplesNotification\"] = \"raise-select-tuples-notification\";\n VerbId[\"Redo\"] = \"redo\";\n VerbId[\"RefreshDataSource\"] = \"refresh-data-source\";\n VerbId[\"ReleaseDataTableReader\"] = \"release-data-table-reader\";\n VerbId[\"RemoveAnnotation\"] = \"remove-annotation\";\n VerbId[\"RemoveCustomView\"] = \"remove-custom-view\";\n VerbId[\"RemoveExternalMenuItem\"] = \"remove-external-menu-item\";\n VerbId[\"RenameExternalMenu\"] = \"rename-external-menu\";\n VerbId[\"ReplayAnimation\"] = \"replay-animation\";\n VerbId[\"RevertStoryPoint\"] = \"revert-story-point\";\n VerbId[\"RevertWorkbook\"] = \"revert-workbook\";\n VerbId[\"SaveExtensionSettings\"] = \"save-extension-settings\";\n VerbId[\"SaveWorkbookAsCustomView\"] = \"save-workbook-as-custom-view\";\n VerbId[\"SelectByValue\"] = \"select-by-value\";\n VerbId[\"SetActiveCustomViewAsDefault\"] = \"set-active-custom-view-as-default\";\n VerbId[\"SetAutoUpdate\"] = \"set-auto-update\";\n VerbId[\"SetClickThrough\"] = \"set-click-through\";\n VerbId[\"SendDialogMessage\"] = \"send-dialog-message\";\n VerbId[\"SetVizStateWithDataModel\"] = \"set-viz-state-with-data-model\";\n VerbId[\"SetSheetSize\"] = \"set-sheet-size\";\n VerbId[\"SetZoneVisibility\"] = \"set-zone-visibility\";\n VerbId[\"Share\"] = \"share\";\n VerbId[\"ShowCustomView\"] = \"show-custom-view\";\n VerbId[\"SpliceMarksCardFields\"] = \"splice-marks-card-fields\";\n VerbId[\"TestConversionVerb\"] = \"test-conversion-verb\";\n VerbId[\"Undo\"] = \"undo\";\n VerbId[\"UpdateCustomView\"] = \"update-custom-view\";\n VerbId[\"VizAPI\"] = \"viz-api\";\n})(VerbId = exports.VerbId || (exports.VerbId = {}));\n//# sourceMappingURL=Verbs.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar AskDataOptionNames;\n(function (AskDataOptionNames) {\n AskDataOptionNames[\"token\"] = \"token\";\n AskDataOptionNames[\"origin\"] = \"origin\";\n AskDataOptionNames[\"showEmbed\"] = \"showEmbed\";\n AskDataOptionNames[\"showPin\"] = \"showPin\";\n AskDataOptionNames[\"showSave\"] = \"showSave\";\n AskDataOptionNames[\"showShare\"] = \"showShare\";\n AskDataOptionNames[\"debug\"] = \":jsdebug\";\n AskDataOptionNames[\"ApiID\"] = \":apiID\";\n AskDataOptionNames[\"ApiExternalVersion\"] = \":apiExternalVersion\";\n AskDataOptionNames[\"ApiInternalVersion\"] = \":apiInternalVersion\";\n AskDataOptionNames[\"AskDataWebComponent\"] = \":askDataWebComponent\";\n})(AskDataOptionNames = exports.AskDataOptionNames || (exports.AskDataOptionNames = {}));\n//# sourceMappingURL=AskDataInterface.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar PulseOptionNames;\n(function (PulseOptionNames) {\n PulseOptionNames[\"embed\"] = \"embed\";\n PulseOptionNames[\"token\"] = \"token\";\n PulseOptionNames[\"disableExploreFilter\"] = \"disableExploreFilter\";\n PulseOptionNames[\"layout\"] = \"embed_layout\";\n PulseOptionNames[\"theme\"] = \"embed_theme\";\n PulseOptionNames[\"ApiExternalVersion\"] = \":apiExternalVersion\";\n PulseOptionNames[\"ApiInternalVersion\"] = \":apiInternalVersion\";\n PulseOptionNames[\"PulseWebComponent\"] = \":pulseWebComponent\";\n})(PulseOptionNames = exports.PulseOptionNames || (exports.PulseOptionNames = {}));\n//# sourceMappingURL=PulseInterface.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * These strings were *manually copied* from the server,\n * workgroup/src/silos/tableau-server/libraries/tab-controller-vizql/src/com/tableausoftware/\n * controller/vizql/constants/ParameterKeys.java#L9\n * should be exported instead\n * parameters that vizql will accept in an embedding URL\n **/\nvar VqlParameterNames;\n(function (VqlParameterNames) {\n VqlParameterNames[\"ONE\"] = \"1\";\n VqlParameterNames[\"ALERTS\"] = \":alerts\";\n VqlParameterNames[\"ALIAS\"] = \"alias\";\n VqlParameterNames[\"ALLOW_DEFERRED_BOOTSTRAP\"] = \":allowDeferredBootstrap\";\n VqlParameterNames[\"ALLOW_AUTOGEN_WORKSHEET_PHONE_LAYOUTS\"] = \"allowAutogenWorksheetPhoneLayouts\";\n VqlParameterNames[\"API_ID\"] = \":apiID\";\n VqlParameterNames[\"APP\"] = \":app\";\n VqlParameterNames[\"ATTACHMENT\"] = \"attachment\";\n VqlParameterNames[\"IS_IPAD_APP\"] = \"app\";\n VqlParameterNames[\"ANIMATE_TRANSITION\"] = \":animate_transition\";\n VqlParameterNames[\"ASCENDING\"] = \"ascending\";\n VqlParameterNames[\"AUTHENTICATION\"] = \"authentication\";\n VqlParameterNames[\"ATTRIBUTES\"] = \"attributes\";\n VqlParameterNames[\"AUTHORING_SHEET\"] = \":authSheet\";\n VqlParameterNames[\"AXIS\"] = \"axis\";\n VqlParameterNames[\"BOOTSTRAP_WHEN_NOTIFIED\"] = \":bootstrapWhenNotified\";\n VqlParameterNames[\"BROWSER_BACK_BUTTON_UNDO\"] = \":browserBackButtonUndo\";\n VqlParameterNames[\"BROWSER_RENDERING_ON\"] = \"isBrowserRendering\";\n VqlParameterNames[\"BROWSER_RENDERING_THRESHOLD\"] = \"browserRenderingThreshold\";\n VqlParameterNames[\"CHARSET\"] = \"charset\";\n VqlParameterNames[\"CLIENT_DIMENSION\"] = \"clientDimension\";\n VqlParameterNames[\"CLIENT_IP\"] = \"client_ip\";\n VqlParameterNames[\"CLIENT_NUM\"] = \"clientNum\";\n VqlParameterNames[\"COLON_EMBEDDED\"] = \":embedded\";\n VqlParameterNames[\"COLON_MOBILE\"] = \":mobile\";\n VqlParameterNames[\"COLON_DEEP_LINKING_DISABLED\"] = \":deepLinkingDisabled\";\n VqlParameterNames[\"COLON_WATERMARK\"] = \":watermark\";\n VqlParameterNames[\"COMMENTS\"] = \":comments\";\n VqlParameterNames[\"COMMENTING_ENABLED\"] = \":commentingEnabled\";\n VqlParameterNames[\"COMMENTING_MENTIONS_ENABLED\"] = \":commentingMentions\";\n VqlParameterNames[\"CONNECTION\"] = \"connection\";\n VqlParameterNames[\"CREATED_BY_FEATURE\"] = \"createdByFeature\";\n VqlParameterNames[\"CRYPTED_PASSWORD\"] = \"crypted\";\n VqlParameterNames[\"CSSDEBUG\"] = \":cssdebug\";\n VqlParameterNames[\"CSV\"] = \"csv\";\n VqlParameterNames[\"CUSTOM_VIEWS\"] = \":customViews\";\n VqlParameterNames[\"CV\"] = \":cv\";\n VqlParameterNames[\"CV_ID\"] = \"cvId\";\n VqlParameterNames[\"DASHBOARD_PORT_SIZE\"] = \"dashboardPortSize\";\n VqlParameterNames[\"DATA_DETAILS\"] = \":dataDetails\";\n VqlParameterNames[\"DATASOURCE\"] = \"datasource\";\n VqlParameterNames[\"DEBUG\"] = \":debug\";\n VqlParameterNames[\"DELAY\"] = \":delay\";\n VqlParameterNames[\"DEPTH\"] = \"depth\";\n VqlParameterNames[\"DEVICE_TYPE\"] = \":device\";\n VqlParameterNames[\"DEVICE_PIXEL_RATIO\"] = \"devicePixelRatio\";\n VqlParameterNames[\"DEVICE_PREVIEW_MODE\"] = \":devicepreviewmode\";\n VqlParameterNames[\"DIMENSIONS\"] = \":dimensions\";\n VqlParameterNames[\"DISABLE_SHARED_SESSIONS\"] = \":disable_shared_sessions\";\n VqlParameterNames[\"DISABLE_URL_ACTIONS_POPUPS\"] = \":disableUrlActionsPopups\";\n VqlParameterNames[\"DIRECTION\"] = \"direction\";\n VqlParameterNames[\"DISPLAY_OVERLAY\"] = \":display_overlay\";\n VqlParameterNames[\"DISPLAY_SHARE\"] = \":display_share\";\n VqlParameterNames[\"DISPLAY_SPINNER\"] = \":display_spinner\";\n VqlParameterNames[\"DISPLAY_STATIC_IMAGE\"] = \":display_static_image\";\n VqlParameterNames[\"DISPLAY_TABS\"] = \"display_tabs\";\n VqlParameterNames[\"DISPLAY_VIEW_COUNT\"] = \":display_count\";\n VqlParameterNames[\"IGNORE_STICKY_SESSION\"] = \":ignore_sticky_session\";\n VqlParameterNames[\"INCREMENT_VIEW_COUNT\"] = \":increment_view_count\";\n VqlParameterNames[\"DOCMODE\"] = \"docmode\";\n VqlParameterNames[\"DOMAIN\"] = \"domain\";\n VqlParameterNames[\"DO_WORK\"] = \"do_work\";\n VqlParameterNames[\"DX\"] = \"dx\";\n VqlParameterNames[\"DY\"] = \"dy\";\n VqlParameterNames[\"EDIT_DATA_ALERT\"] = \":editDataAlert\";\n VqlParameterNames[\"EMBED\"] = \":embed\";\n VqlParameterNames[\"EMBEDDED\"] = \"embedded\";\n VqlParameterNames[\"ENCRYPTED\"] = \"encrypted\";\n VqlParameterNames[\"API_EXTERNAL_VERSION\"] = \":apiExternalVersion\";\n VqlParameterNames[\"API_INTERNAL_VERSION\"] = \":apiInternalVersion\";\n VqlParameterNames[\"EXCLUDE\"] = \"exclude\";\n VqlParameterNames[\"EXPORT_FORMAT\"] = \":export_format\";\n VqlParameterNames[\"FIELDNAME\"] = \"fieldname\";\n VqlParameterNames[\"FIELD_NAME\"] = \"field_name\";\n VqlParameterNames[\"FIELD_SEP\"] = \"field_sep\";\n VqlParameterNames[\"FILE\"] = \"file\";\n VqlParameterNames[\"FILTER_TILE_SIZE\"] = \"filterTileSize\";\n VqlParameterNames[\"FN\"] = \"fn\";\n VqlParameterNames[\"FOCUS\"] = \"focus\";\n VqlParameterNames[\"FORCE_CACHE\"] = \"force_cache\";\n VqlParameterNames[\"FORMAT\"] = \"format\";\n VqlParameterNames[\"FORMAT_DATA_VALUE_LOCALLY\"] = \"formatDataValueLocally\";\n VqlParameterNames[\"FROM_WG\"] = \":from_wg\";\n VqlParameterNames[\"GRAPHQL_DATABASE_ID\"] = \":graphQLDatabaseId\";\n VqlParameterNames[\"GRAPHQL_TABLE_ID\"] = \":graphQLTableId\";\n VqlParameterNames[\"GUID\"] = \":guid\";\n VqlParameterNames[\"H\"] = \"h\";\n VqlParameterNames[\"HIDDEN\"] = \"hidden\";\n VqlParameterNames[\"HIDE_CLOSE_BUTTON\"] = \":hideCloseButton\";\n VqlParameterNames[\"HIDE_EDIT_BUTTON\"] = \":hideEditButton\";\n VqlParameterNames[\"HIDE_EDIT_IN_DESKTOP_BUTTON\"] = \":hideEditInDesktopButton\";\n VqlParameterNames[\"HIGH_DPI\"] = \":highdpi\";\n VqlParameterNames[\"IMAGE_SIZE_LIMIT\"] = \"imageSizeLimit\";\n VqlParameterNames[\"TRANSPARENT_LINE_MARKS_LIMIT\"] = \"transparentLineMarkLimit\";\n VqlParameterNames[\"CLIENT_RENDER_PIXEL_LIMIT\"] = \"clientRenderPixelLimit\";\n VqlParameterNames[\"IN\"] = \"in\";\n VqlParameterNames[\"INSTANCE_ID\"] = \":iid\";\n VqlParameterNames[\"IS_GUEST_REDIRECT_FROM_VIZPORTAL\"] = \":isGuestRedirectFromVizportal\";\n VqlParameterNames[\"IS_MARK_ANIMATION_ENABLED\"] = \"isMarkAnimationEnabled\";\n VqlParameterNames[\"IS_VIZPORTAL\"] = \":isVizPortal\";\n VqlParameterNames[\"INPUT_\"] = \"input_string\";\n VqlParameterNames[\"JSDEBUG\"] = \":jsdebug\";\n VqlParameterNames[\"JSON\"] = \"json\";\n VqlParameterNames[\"JSON_ONLY\"] = \":jsonOnly\";\n VqlParameterNames[\"KEEPFILE\"] = \"keepfile\";\n VqlParameterNames[\"KEY\"] = \"key\";\n VqlParameterNames[\"LANGUAGE\"] = \"language\";\n VqlParameterNames[\"LANGUAGE_REQUESTED\"] = \":language\";\n VqlParameterNames[\"LINKTARGET\"] = \":linktarget\";\n VqlParameterNames[\"LOAD_ORDER_ID\"] = \":loadOrderID\";\n VqlParameterNames[\"LOAD_NEWEST_REVISION\"] = \":loadNewestRevision\";\n VqlParameterNames[\"LOCAL_PATHS\"] = \":localPaths\";\n VqlParameterNames[\"LOCALE\"] = \"locale\";\n VqlParameterNames[\"LOCATION_ID\"] = \"locationid\";\n VqlParameterNames[\"LOCATION_TYPE\"] = \"locationtype\";\n VqlParameterNames[\"WORKBOOK_LOCALE\"] = \"workbookLocale\";\n VqlParameterNames[\"MAXROWS\"] = \"maxrows\";\n VqlParameterNames[\"MAX_AGE\"] = \"maxAge\";\n VqlParameterNames[\"MAX_ROWS\"] = \"maxRows\";\n VqlParameterNames[\"METHOD\"] = \"method\";\n VqlParameterNames[\"MOBILE\"] = \"mobile\";\n VqlParameterNames[\"MODIFIER\"] = \"modifier\";\n VqlParameterNames[\"NAME\"] = \"name\";\n VqlParameterNames[\"NAV_TYPE\"] = \"navType\";\n VqlParameterNames[\"NAV_SRC\"] = \"navSrc\";\n VqlParameterNames[\"NOATTACHMENT\"] = \"no-attachment\";\n VqlParameterNames[\"NO_OVERWRITE\"] = \"no_overwrite\";\n VqlParameterNames[\"OPEN_AUTHORING_IN_TOP_WINDOW\"] = \":openAuthoringInTopWindow\";\n VqlParameterNames[\"OPENID_HD\"] = \":openid_hd\";\n VqlParameterNames[\"OPENID_LOGIN_HINT\"] = \":openid_login_hint\";\n VqlParameterNames[\"OAUTHREQUEST\"] = \"oauthrequest\";\n VqlParameterNames[\"OAUTH_CREDENTIAL_IDS\"] = \"oauth_credential_ids\";\n VqlParameterNames[\"OFFLINE_MODE\"] = \":offlinemode\";\n VqlParameterNames[\"ORIGIN\"] = \":origin\";\n VqlParameterNames[\"OVERLAY\"] = \":overlay\";\n VqlParameterNames[\"P\"] = \"p\";\n VqlParameterNames[\"PATH\"] = \"path\";\n VqlParameterNames[\"PANE_RESOLVER_X\"] = \"paneResolverX\";\n VqlParameterNames[\"PANE_RESOLVER_Y\"] = \"paneResolverY\";\n VqlParameterNames[\"PARAM\"] = \"param\";\n VqlParameterNames[\"PARENT_ID\"] = \"parent_id\";\n VqlParameterNames[\"PASSWORD\"] = \"password\";\n VqlParameterNames[\"PATTERN\"] = \"pattern\";\n VqlParameterNames[\"PIXEL_RATIO\"] = \":pixelratio\";\n VqlParameterNames[\"PREFIX\"] = \":prefix\";\n VqlParameterNames[\"PREVIEW\"] = \":preview\";\n VqlParameterNames[\"PRIMARY_CONTENT_URL\"] = \"primary_content_url\";\n VqlParameterNames[\"PROJECT\"] = \"project\";\n VqlParameterNames[\"PROTOCOL\"] = \"protocol\";\n VqlParameterNames[\"PSEUDO\"] = \":pseudo\";\n VqlParameterNames[\"QUERY\"] = \"query\";\n VqlParameterNames[\"R\"] = \"r\";\n VqlParameterNames[\"RANGE_TYPE\"] = \"range_type\";\n VqlParameterNames[\"RECORD_SEP\"] = \"record_sep\";\n VqlParameterNames[\"RECORD_CLIENT_PERFORMANCE\"] = \":record_client_performance\";\n VqlParameterNames[\"RECORD_PERFORMANCE\"] = \":record_performance\";\n VqlParameterNames[\"RECOVER_OLD_SESSION_ID\"] = \":recover_old_session_id\";\n VqlParameterNames[\"RECOVER_SESSION_STATE_TICKETS\"] = \":recover_session_state_tickets\";\n VqlParameterNames[\"REFRESH\"] = \":refresh\";\n VqlParameterNames[\"REFRESHUNMODIFIED\"] = \":refreshunmodified\";\n VqlParameterNames[\"REGION\"] = \"region\";\n VqlParameterNames[\"RELOAD_ON_CUSTOM_VIEW_SAVE\"] = \":reloadOnCustomViewSave\";\n VqlParameterNames[\"RENDER\"] = \":render\";\n VqlParameterNames[\"RENDER_MAPS_CLIENT_SIDE\"] = \"renderMapsClientSide\";\n VqlParameterNames[\"RETRY\"] = \":retry\";\n VqlParameterNames[\"REUSE\"] = \"reuse\";\n VqlParameterNames[\"REUSE_FOREVER\"] = \"reuse_forever\";\n VqlParameterNames[\"REVERT\"] = \":revert\";\n VqlParameterNames[\"SAVE_DB_PASSWORDS\"] = \"save_db_passwords\";\n VqlParameterNames[\"SELECT_X\"] = \"select_x\";\n VqlParameterNames[\"SELECT_Y\"] = \"select_y\";\n VqlParameterNames[\"SESSION_FEATURE_PREFIX\"] = \":ff_\";\n VqlParameterNames[\"SESSION_FLAGS\"] = \":session_feature_flags\";\n VqlParameterNames[\"SHARE_BUTTON\"] = \"share_button\";\n VqlParameterNames[\"SHEET_ID\"] = \"sheet_id\";\n VqlParameterNames[\"SHARED\"] = \"shared\";\n VqlParameterNames[\"SHOWALL\"] = \"showall\";\n VqlParameterNames[\"SHOW_APP_BANNER\"] = \":showAppBanner\";\n VqlParameterNames[\"SHOW_ASK_DATA\"] = \":showAskData\";\n VqlParameterNames[\"SHOW_PARAMS\"] = \"showParams\";\n VqlParameterNames[\"SHOW_SHARE_OPTIONS\"] = \":showShareOptions\";\n VqlParameterNames[\"SIZE\"] = \":size\";\n VqlParameterNames[\"SOURCE\"] = \"source\";\n VqlParameterNames[\"STATE\"] = \"state\";\n VqlParameterNames[\"STICKY_SESSION_KEY\"] = \"stickySessionKey\";\n VqlParameterNames[\"SUBSCRIPTIONS\"] = \":subscriptions\";\n VqlParameterNames[\"SUMMARY\"] = \"summary\";\n VqlParameterNames[\"SUPPRESS_DEFAULT_EDIT_BEHAVIOR\"] = \":suppressDefaultEditBehavior\";\n VqlParameterNames[\"SYNC_SESSION\"] = \":sync_session\";\n VqlParameterNames[\"SYNC_SESSION_STATE\"] = \"sync_session_state\";\n VqlParameterNames[\"TABS\"] = \":tabs\";\n VqlParameterNames[\"TARGET\"] = \"target\";\n VqlParameterNames[\"TARGET_SITE\"] = \"target_site\";\n VqlParameterNames[\"TOOLBAR\"] = \":toolbar\";\n VqlParameterNames[\"TOOLTIP\"] = \":tooltip\";\n VqlParameterNames[\"TS\"] = \"ts\";\n VqlParameterNames[\"UNDERLYING_TABLE_ID\"] = \"underlying_table_id\";\n VqlParameterNames[\"UNDERLYING_TABLE_CAPTION\"] = \"underlying_table_caption\";\n VqlParameterNames[\"UPDATE_TYPE\"] = \"update_type\";\n VqlParameterNames[\"USE_GUEST\"] = \":useGuest\";\n VqlParameterNames[\"USE_INLINE_IMAGES\"] = \"use_inline_images\";\n VqlParameterNames[\"USERAGENT\"] = \"useragent\";\n VqlParameterNames[\"USERNAME\"] = \"username\";\n VqlParameterNames[\"VALUE\"] = \"value\";\n VqlParameterNames[\"VERBOSE_MODE\"] = \"verboseMode\";\n VqlParameterNames[\"VIEW_ID\"] = \"views_id\";\n VqlParameterNames[\"VIZ_SNAPSHOT_ID\"] = \"viz_snapshot_id\";\n VqlParameterNames[\"VW\"] = \":vw\";\n VqlParameterNames[\"W\"] = \"w\";\n VqlParameterNames[\"WORKSHEET_PORT_SIZE\"] = \"worksheetPortSize\";\n VqlParameterNames[\"WATERMARK\"] = \"watermark\";\n VqlParameterNames[\"WATERMARK_MARGIN\"] = \":watermark_margin\";\n VqlParameterNames[\"WB\"] = \":wb\";\n VqlParameterNames[\"WHICH\"] = \"which\";\n VqlParameterNames[\"X\"] = \"x\";\n VqlParameterNames[\"Y\"] = \"y\";\n VqlParameterNames[\"ZID\"] = \"zid\";\n VqlParameterNames[\"ZONE_ID\"] = \"zone_id\";\n VqlParameterNames[\"KEYCHAIN_VERSION\"] = \"keychain_version\";\n VqlParameterNames[\"DATASOURCE_ID\"] = \"datasource_id\";\n VqlParameterNames[\"DATASOURCE_NAME\"] = \"datasource_name\";\n VqlParameterNames[\"LENS_ID\"] = \"lens_id\";\n VqlParameterNames[\"WIDTH\"] = \"width\";\n VqlParameterNames[\"HEIGHT\"] = \"height\";\n // Default Layout params\n VqlParameterNames[\"LAYOUT_VIEWS\"] = \"views\";\n VqlParameterNames[\"LAYOUT_MENUS\"] = \"menus\";\n VqlParameterNames[\"LAYOUT_GEOMETRY\"] = \"geometry\";\n VqlParameterNames[\"LAYOUT_PAGES\"] = \"pages\";\n VqlParameterNames[\"LAYOUT_CACHEURL\"] = \"cacheurl\";\n VqlParameterNames[\"LAYOUT_SHEET\"] = \"sheet\";\n VqlParameterNames[\"LAYOUT_DEPTH\"] = \"depth\";\n})(VqlParameterNames || (VqlParameterNames = {}));\n/**\n * parameters that are only relevant when working with Tableau Public\n * maybe not really necessry to split them out\n */\nvar PublicParameterNames;\n(function (PublicParameterNames) {\n PublicParameterNames[\"SHOW_VIZ_HOME\"] = \":showVizHome\";\n // display view count\n})(PublicParameterNames || (PublicParameterNames = {}));\n/**\n * Map the parameter names as used in the url to what we call them publicly in the embedding library.\n * The only parameters listed here should be the ones that get sent to vizql\n * - this should match the interface at external-contract:VizInterfaces:VizSettings\n */\nvar VizOptionNames;\n(function (VizOptionNames) {\n // publicName = internalStringValue\n VizOptionNames[\"Size\"] = \":size\";\n VizOptionNames[\"Embed\"] = \":embed\";\n VizOptionNames[\"ApiInternalVersion\"] = \":apiInternalVersion\";\n VizOptionNames[\"ApiExternalVersion\"] = \":apiExternalVersion\";\n VizOptionNames[\"ShowVizHome\"] = \":showVizHome\";\n VizOptionNames[\"Jsdebug\"] = \":jsdebug\";\n VizOptionNames[\"BootstrapWhenNotified\"] = \":bootstrapWhenNotified\";\n VizOptionNames[\"NavType\"] = \"navType\";\n VizOptionNames[\"NavSrc\"] = \"navSrc\";\n VizOptionNames[\"debug\"] = \":jsdebug\";\n VizOptionNames[\"ApiID\"] = \":apiID\";\n VizOptionNames[\"disableUrlActionsPopups\"] = \":disableUrlActionsPopups\";\n VizOptionNames[\"hideTabs\"] = \":tabs\";\n VizOptionNames[\"toolbar\"] = \":toolbar\";\n VizOptionNames[\"device\"] = \":device\";\n VizOptionNames[\"instanceIdToClone\"] = \":iid\";\n VizOptionNames[\"touchOptimize\"] = \"mobile\";\n VizOptionNames[\"hideEditButton\"] = \":hideEditButton\";\n VizOptionNames[\"hideEditInDesktopButton\"] = \":hideEditInDesktopButton\";\n VizOptionNames[\"suppressDefaultEditBehavior\"] = \":suppressDefaultEditBehavior\";\n VizOptionNames[\"hideCloseButton\"] = \":hideCloseButton\";\n})(VizOptionNames = exports.VizOptionNames || (exports.VizOptionNames = {}));\n//# sourceMappingURL=VqlInterface.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst guid = require(\"guid\");\nconst JsApiInternalContract_1 = require(\"../JsApiInternalContract\");\nconst CrossFramePreparedMessage_1 = require(\"./CrossFramePreparedMessage\");\nconst MessageTypeChecks_1 = require(\"./MessageTypeChecks\");\nconst MessageTypes_1 = require(\"./interface/MessageTypes\");\n/**\n * The CrossFrameMessenger is the primary export from the api-messaging module. An instance of\n * this class can be instantiated on both sides of a frame boundary to facilitate communication\n * in both directions between the frames. This class implements both the dispatcher and the listener\n * portions, but doesn't require callers to care about both.\n */\nclass CrossFrameMessenger {\n /**\n * Creates an instance of CrossFrameMessenger. If you would like to use the CrossFrameMessenger as a MessageListener,\n * be sure to call StartListening and register message handlers.\n * @param thisWindow The window object which the CrossFrameMessenger lives. An onMessage listener will be added here.\n * @param [otherWindow] Optional otherWindow which messages will be posted to.\n * If defined, incoming messages must originate from otherWindow to be passed on\n * @param [otherWindowOrigin] The target origin which otherWindow must have in order to receive dispatched messages.\n * This value will be sent as the targetOrigin of a postMessage\n * (https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage)\n */\n constructor(thisWindow, otherWindow, otherWindowOrigin) {\n this.thisWindow = thisWindow;\n this.otherWindow = otherWindow;\n this.otherWindowOrigin = otherWindowOrigin;\n // Make sure to call StartListening\n }\n ///// MessageListener Implementation\n startListening() {\n // Check if we already are listening, if not, hook up a message listener\n if (!this.unregisterFunction) {\n const boundHandler = this.onMessageReceived.bind(this);\n this.thisWindow.addEventListener('message', boundHandler, true);\n this.unregisterFunction = () => this.thisWindow.removeEventListener('message', boundHandler, true);\n }\n }\n stopListening() {\n // Stop listening if we have started listening\n if (this.unregisterFunction) {\n this.unregisterFunction();\n this.unregisterFunction = undefined;\n }\n }\n setInitializeMessageHandler(handler) {\n this.initializeMessageHandler = handler;\n }\n setCommandResponseMessageHandler(handler) {\n this.commandResponseMessageHandler = handler;\n }\n setCommandMessageHandler(handler) {\n this.commandMessageHandler = handler;\n }\n setNotificationMessageHandler(handler) {\n this.notificationMessageHandler = handler;\n }\n setHandshakeMessageHandler(handler) {\n this.handshakeMessageHandler = handler;\n }\n ///// MessageDispatcher Implementation\n /**\n * @param apiVersion api-internal-contract-js version (exported in JsApiInternalConntract)\n * @param crossFrameVersion crossframe messaging version (exported in JsApiInternalConntract)\n * @param options additional options that can be passed at initialization (information about the version of\n * external being used for example)\n */\n prepareInitializationMessage(apiVersion, crossFrameVersion, options) {\n const message = {\n msgGuid: guid.raw(),\n msgType: MessageTypes_1.MessageType.Initialize,\n crossFrameVersion: crossFrameVersion,\n apiVersion: apiVersion,\n options: options,\n };\n return this.prepareMessage(message);\n }\n prepareCommandMessage(verbId, parameters) {\n const message = {\n msgGuid: guid.raw(),\n msgType: MessageTypes_1.MessageType.Command,\n verbId: verbId,\n parameters: parameters,\n };\n return this.prepareMessage(message);\n }\n prepareCommandResponseMessage(commandGuid, data, error) {\n const message = {\n msgGuid: guid.raw(),\n msgType: MessageTypes_1.MessageType.CommandResponse,\n commandGuid: commandGuid,\n data: data,\n error: error,\n };\n if (error) {\n // stringify error object to remove unserializable fields like functions and prevent serialization errors\n message.error = JSON.parse(JSON.stringify(error));\n }\n return this.prepareMessage(message);\n }\n prepareNotificationMessage(notificationId, data) {\n const message = {\n msgGuid: guid.raw(),\n msgType: MessageTypes_1.MessageType.Notification,\n notificationId: notificationId,\n data: data,\n };\n return this.prepareMessage(message);\n }\n prepareAckMessage() {\n const message = {\n msgGuid: guid.raw(),\n msgType: MessageTypes_1.MessageType.Ack,\n platformVersion: JsApiInternalContract_1.INTERNAL_CONTRACT_VERSION,\n };\n return this.prepareMessage(message);\n }\n /**\n * Prepares a pending message for sending and returns the prepared message\n *\n * @param msg The message to be sent to this.otherWindow\n * @returns The prepared message\n */\n prepareMessage(msg) {\n if (!this.otherWindow || !this.otherWindowOrigin) {\n throw 'Other window not initialized, cannot dispatch messages';\n }\n const preparedMessage = new CrossFramePreparedMessage_1.CrossFramePreparedMessage(msg, this.otherWindow, this.otherWindowOrigin);\n return preparedMessage;\n }\n /**\n * Called when a message is received. Does some validation of the message, and then\n * calls an appropriate message handler if one is defined\n *\n * @param event The incoming MessageEvent\n */\n onMessageReceived(event) {\n // If we have an otherWindow defined, make sure the message is coming from there\n if (this.otherWindow && event.source !== this.otherWindow) {\n return;\n }\n // Do some validation on event.data to make sure that we have received a real message\n if (!event.data) {\n return;\n }\n const message = event.data;\n if (!MessageTypeChecks_1.isMessage(message)) {\n return;\n }\n // Check the declared message type, validate the message, and call an appropriate hander if one exists\n switch (message.msgType) {\n case MessageTypes_1.MessageType.Initialize: {\n if (!MessageTypeChecks_1.isInitMessage(message) || !this.initializeMessageHandler) {\n return;\n }\n this.initializeMessageHandler(message, event.source);\n break;\n }\n case MessageTypes_1.MessageType.CommandResponse: {\n if (!MessageTypeChecks_1.isCommandResponseMessage(message) || !this.commandResponseMessageHandler) {\n return;\n }\n this.commandResponseMessageHandler(message, event.source);\n break;\n }\n case MessageTypes_1.MessageType.Command: {\n if (!MessageTypeChecks_1.isCommandMessage(message) || !this.commandMessageHandler) {\n return;\n }\n this.commandMessageHandler(message, event.source);\n break;\n }\n case MessageTypes_1.MessageType.Notification: {\n if (!MessageTypeChecks_1.isNotificationMessage(message) || !this.notificationMessageHandler) {\n return;\n }\n this.notificationMessageHandler(message, event.source);\n break;\n }\n case MessageTypes_1.MessageType.Handshake: {\n if (!MessageTypeChecks_1.isHandshakeMessage(message) || !this.handshakeMessageHandler) {\n return;\n }\n this.handshakeMessageHandler(message, event.source);\n break;\n }\n default:\n // Just ignore this since we don't know how to handle the message type\n }\n }\n setOtherWindow(otherWindow) {\n this.otherWindow = otherWindow;\n }\n setOtherWindowOrigin(origin) {\n this.otherWindowOrigin = origin;\n }\n}\nexports.CrossFrameMessenger = CrossFrameMessenger;\n//# sourceMappingURL=CrossFrameMessenger.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Implementation of the PreparedMessage interface used to post messages between\n * two frames using window.postMessage\n */\nclass CrossFramePreparedMessage {\n /**\n * Creates an instance of CrossFramePreparedMessage.\n * @param _message The message to be sent\n * @param _target The target window where the message will be sent\n * @param _origin The targetOrigin where this message can be received\n */\n constructor(_message, _target, _origin) {\n this._message = _message;\n this._target = _target;\n this._origin = _origin;\n }\n get messageGuid() {\n return this._message.msgGuid;\n }\n send() {\n this._target.postMessage(this._message, this._origin);\n return this;\n }\n}\nexports.CrossFramePreparedMessage = CrossFramePreparedMessage;\n//# sourceMappingURL=CrossFramePreparedMessage.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst guid = require(\"guid\");\nconst Notifications_1 = require(\"../contract/Notifications\");\nconst MessageTypes_1 = require(\"./interface/MessageTypes\");\nconst expectedEmptyNotifications = new Set([\n Notifications_1.NotificationId.EditButtonClicked,\n Notifications_1.NotificationId.EditInDesktopButtonClicked,\n Notifications_1.NotificationId.WorkbookPublished,\n Notifications_1.NotificationId.WorkbookReadyToClose,\n Notifications_1.NotificationId.ReadyToReceiveAuthToken,\n]);\n/* tslint:disable no-any */\nfunction isMessage(data) {\n if (!data) {\n return false;\n }\n const message = data;\n if (!message || !message.msgGuid || !message.msgType) {\n return false;\n }\n if (!guid.isGuid(message.msgGuid)) {\n return false;\n }\n if (typeof message.msgType !== 'string') {\n return false;\n }\n const messageTypes = [\n MessageTypes_1.MessageType.Command,\n MessageTypes_1.MessageType.CommandResponse,\n MessageTypes_1.MessageType.Initialize,\n MessageTypes_1.MessageType.Notification,\n MessageTypes_1.MessageType.Handshake,\n ];\n if (messageTypes.indexOf(message.msgType) < 0) {\n return false;\n }\n return true;\n}\nexports.isMessage = isMessage;\nfunction isVersion(versionNumber) {\n if (!versionNumber) {\n return false;\n }\n const v = versionNumber;\n if (typeof v !== 'object') {\n return false;\n }\n if (typeof v.fix !== 'number' || typeof v.minor !== 'number' || typeof v.major !== 'number') {\n return false;\n }\n return true;\n}\nexports.isVersion = isVersion;\nfunction isInitMessage(message) {\n if (!isMessage(message)) {\n return false;\n }\n const initMessage = message;\n if (initMessage.msgType !== MessageTypes_1.MessageType.Initialize) {\n return false;\n }\n if (!initMessage.apiVersion || !isVersion(initMessage.apiVersion)) {\n return false;\n }\n if (!initMessage.crossFrameVersion || !isVersion(initMessage.crossFrameVersion)) {\n return false;\n }\n return true;\n}\nexports.isInitMessage = isInitMessage;\nfunction isCommandResponseMessage(message) {\n if (!isMessage(message)) {\n return false;\n }\n const crMessage = message;\n if (crMessage.msgType !== MessageTypes_1.MessageType.CommandResponse) {\n return false;\n }\n if (!guid.isGuid(crMessage.commandGuid)) {\n return false;\n }\n if (!crMessage.data && !crMessage.error) {\n return false;\n }\n return true;\n}\nexports.isCommandResponseMessage = isCommandResponseMessage;\nfunction isCommandMessage(message) {\n if (!isMessage(message)) {\n return false;\n }\n const commandMessage = message;\n if (commandMessage.msgType !== MessageTypes_1.MessageType.Command) {\n return false;\n }\n if (!commandMessage.parameters || typeof commandMessage.parameters !== 'object') {\n return false;\n }\n if (!commandMessage.verbId || typeof commandMessage.verbId !== 'string') {\n return false;\n }\n return true;\n}\nexports.isCommandMessage = isCommandMessage;\nfunction isNotificationMessage(message) {\n if (!isMessage(message)) {\n return false;\n }\n const notificationMessage = message;\n if (notificationMessage.msgType !== MessageTypes_1.MessageType.Notification) {\n return false;\n }\n if (!notificationMessage.data && !expectedEmptyNotifications.has(notificationMessage.notificationId)) {\n return false;\n }\n if (!notificationMessage.notificationId || typeof notificationMessage.notificationId !== 'string') {\n return false;\n }\n return true;\n}\nexports.isNotificationMessage = isNotificationMessage;\nfunction isHandshakeMessage(message) {\n if (!isMessage(message)) {\n return false;\n }\n const handshakeMessage = message;\n if (handshakeMessage.msgType !== MessageTypes_1.MessageType.Handshake) {\n return false;\n }\n return true;\n}\nexports.isHandshakeMessage = isHandshakeMessage;\n//# sourceMappingURL=MessageTypeChecks.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Enum defining the 4 different types of messages we have defined\n */\nvar MessageType;\n(function (MessageType) {\n MessageType[\"Initialize\"] = \"initialize\";\n MessageType[\"Notification\"] = \"notification\";\n MessageType[\"Command\"] = \"command\";\n MessageType[\"CommandResponse\"] = \"command-response\";\n MessageType[\"Handshake\"] = \"v-handshake\";\n MessageType[\"Ack\"] = \"v-ack\";\n})(MessageType = exports.MessageType || (exports.MessageType = {}));\n//# sourceMappingURL=MessageTypes.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// tslint:disable:no-any\n/**\n * This version converter doesn't actually do anything but is useful for testing or when we have\n * a matching platform and internal version number\n */\nclass IdentityVersionConverter {\n upgradeExecuteCall(verb, parameters) {\n return {\n verb: verb,\n parameters: parameters,\n };\n }\n downgradeExecuteReturn(executeResponse) {\n return executeResponse;\n }\n downgradeNotification(notification) {\n return notification;\n }\n}\nexports.IdentityVersionConverter = IdentityVersionConverter;\n//# sourceMappingURL=IdentityVersionConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// tslint:disable:no-any\n/**\n * The version converter is designed to allow the platform and external modules\n * to seemlessly communicate over two different versions of the internal API. The only\n * mode it supports is external's version <= platform's version. When executing\n * commands, it is used to upgrade the external representation to what platform knows on the way in\n * and downgrade the representations on the way out. Similarly for notifications, it can\n * downgrade those on the way from platform to external.\n */\nclass StackingVersionConverter {\n /**\n * Creates a new instance of the StackingVersionConverter\n *\n * @param _externalMajorVersion The major version of the internal contract api-external-js is using\n * @param _platformMajorVersion The major version of the internal contract the api-platform-js is using\n * @param _upgradeExecuteTranslations Ordered list of the translations to perform when upgrading cmd parameters\n * @param _downgradeExecuteTranslations Ordered list of downgrade translations to perform after a cmd\n * @param _downgradeNotificationTranslations Ordered list of downgrade translations to perform on a notification\n */\n constructor(_externalMajorVersion, _platformMajorVersion, _upgradeExecuteTranslations, _downgradeExecuteTranslations, _downgradeNotificationTranslations) {\n this._externalMajorVersion = _externalMajorVersion;\n this._platformMajorVersion = _platformMajorVersion;\n this._upgradeExecuteTranslations = _upgradeExecuteTranslations;\n this._downgradeExecuteTranslations = _downgradeExecuteTranslations;\n this._downgradeNotificationTranslations = _downgradeNotificationTranslations;\n if (this._externalMajorVersion > this._platformMajorVersion) {\n throw new Error(`Cannot convert between external version ${this._externalMajorVersion} and ${this._platformMajorVersion}`);\n }\n }\n /**\n * Creates a new instance of the StackingVersionConverter\n *\n * @param _externalVersion The version of the internal contract api-external-js is using\n * @param _platformVersion The version of the internal contract the api-platform-js is using\n * @param _upgradeExecuteTranslations Ordered list of the translations to perform when upgrading cmd parameters\n * @param _downgradeExecuteTranslations Ordered list of downgrade translations to perform after a cmd\n * @param _downgradeNotificationTranslations Ordered list of downgrade translations to perform on a notification\n */\n static fromData(externalVersion, platformVersion, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations) {\n return new this(externalVersion.major, platformVersion.major, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations);\n }\n upgradeExecuteCall(verb, parameters) {\n // Perform the upgrade of the verb and parameters to the level that platform is using\n let upgraded = { verb: verb, parameters: parameters };\n for (const upgradeTranslation of this._upgradeExecuteTranslations) {\n upgraded = upgradeTranslation(upgraded.verb, upgraded.parameters);\n }\n return upgraded;\n }\n downgradeExecuteReturn(executeResponse) {\n // Downgrade the response to what the external module is expecting\n let downgraded = executeResponse;\n for (const downgradeTranslation of this._downgradeExecuteTranslations) {\n downgraded = downgradeTranslation(downgraded);\n }\n return downgraded;\n }\n downgradeNotification(notification) {\n // Downgrade the notification to what the external module is expecting\n let downgraded = notification;\n for (const downgradeTranslation of this._downgradeNotificationTranslations) {\n downgraded = downgradeTranslation(downgraded);\n }\n return downgraded;\n }\n}\nexports.StackingVersionConverter = StackingVersionConverter;\n//# sourceMappingURL=StackingVersionConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst IdentityVersionConverter_1 = require(\"./IdentityVersionConverter\");\nconst StackingVersionConverter_1 = require(\"./StackingVersionConverter\");\nconst VersionTranslations_1 = require(\"./VersionTranslations\");\n/**\n * @returns true if lhs < rhs (ignoring fix number)\n * @param lhs\n * @param rhs\n */\nfunction VersionLessThan(lhs, rhs) {\n if (lhs.major > rhs.major) {\n return false;\n }\n if (lhs.major < rhs.major) {\n return true;\n }\n return lhs.minor < rhs.minor;\n}\nexports.VersionLessThan = VersionLessThan;\n/**\n * @returns true if lhs == rhs (ignoring fix number)\n * @param lhs\n * @param rhs\n */\nfunction VersionEqualTo(lhs, rhs) {\n return lhs.major === rhs.major && lhs.minor === rhs.minor;\n}\nexports.VersionEqualTo = VersionEqualTo;\n// A mapping from an older client version of internal-contract to the current platform version of this contract.\n// Each version bump can have an array of translations to perform in order. Notice that this is\n// different than the major upgrades/downgrades above because it handles both major and minor version changes.\n// Also please note: downgradeExecuteCall is handled on the client/external side rather than platform side.\n// When updating the major or minor version of our internal-contract, you will need to update these data structures.\n// * If there are translations to add, add them to the version to \"upgrade from\" or \"downgrade to\".\nexports.ExecuteMinorUpgrades = {\n 1: {\n 9: [],\n },\n};\nexports.ExecuteMinorDowngrades = {\n 1: {\n 5: [VersionTranslations_1.DowngradeWorksheetNames],\n 9: [],\n 175: [VersionTranslations_1.DowngradeWorksheetFomatting175],\n 182: [VersionTranslations_1.DowngradeExtensionEnvironmentContext],\n },\n};\nexports.NotificationMinorDowngrades = {\n 1: {\n 9: [],\n 10: [VersionTranslations_1.DowngradeFlipboardZoneID],\n 175: [VersionTranslations_1.DowngradeWorksheetFomattingNotification175],\n },\n};\n/**\n * Creates a new InternalContractVersionConverter which has the ability to upgrade and downgrade the contract\n * between the two versions, which are specified. If externalMajorVersion is greater than platformMajorVersion,\n * an error will be thrown because we won't know how to do those conversions.\n * This converter can handle both major and minor updates when the platform version is greater than external version.\n *\n * @param externalVersion VersionNumber of the internal api which the external module is using\n * @param platformVersion VersionNumber of the internal api which the platform is using\n */\nfunction CreateVersionConverter(externalVersion, platformVersion) {\n return CreateVersionConverterWithTranslators(externalVersion, platformVersion, exports.ExecuteMinorUpgrades, exports.ExecuteMinorDowngrades, exports.NotificationMinorDowngrades);\n}\nexports.CreateVersionConverter = CreateVersionConverter;\n/**\n * Implementation of CreateVersionConverter. This function takes the upgrade, downgrade, and\n * notification arrays so that all the logic can be tested.\n *\n * @param externalVersion VersionNumber of the internal api which the external module is using\n * @param platformVersion VersionNumber of the internal api which the platform is using\n * @param upgrades MajorMinorTranslators for upgrades\n * @param downgrades MajorMinorTranslators for downgrades\n * @param notificationDowngrades MajorMinorTranslators for notification downgrades\n */\nfunction CreateVersionConverterWithTranslators(externalVersion, platformVersion, upgrades, downgrades, notificationDowngrades) {\n const externalMajorVersion = externalVersion.major;\n const externalMinorVersion = externalVersion.minor;\n const platformMajorVersion = platformVersion.major;\n if (externalMajorVersion > platformMajorVersion) {\n throw new Error(`External version must be less than or equal to platform version.\n externalMajorVersion=${externalMajorVersion} platformMajorVersion=${platformMajorVersion}`);\n }\n // If we are using the exact same versions (major.minor), just use the identity converter\n if (VersionEqualTo(externalVersion, platformVersion)) {\n return new IdentityVersionConverter_1.IdentityVersionConverter();\n }\n // Walk the span between the versions we have here and collect the upgrade and downgrades necessary\n const neededExecuteUpgrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, upgrades);\n const neededExecuteDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, downgrades);\n const neededNotificationDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, notificationDowngrades);\n // We want to apply the downgrades in reverse order in case of dependencies between them\n neededExecuteDowngrades.reverse();\n neededNotificationDowngrades.reverse();\n return StackingVersionConverter_1.StackingVersionConverter.fromData(externalVersion, platformVersion, neededExecuteUpgrades, neededExecuteDowngrades, neededNotificationDowngrades);\n}\nexports.CreateVersionConverterWithTranslators = CreateVersionConverterWithTranslators;\nfunction GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, majorMinorTranslators) {\n const neededTranslations = [];\n for (let major = externalMajorVersion; major <= platformMajorVersion; major++) {\n if (major in majorMinorTranslators) {\n const start = major === externalMajorVersion ? externalMinorVersion : 0;\n const maximumMinorVersion = GetMaximumMinorIndex(Object.keys(majorMinorTranslators[major]));\n for (let minor = start; minor <= maximumMinorVersion; minor++) {\n if (minor in majorMinorTranslators[major]) {\n neededTranslations.push(...majorMinorTranslators[major][minor]);\n }\n }\n }\n }\n return neededTranslations;\n}\nfunction GetMaximumMinorIndex(minorVersions) {\n return minorVersions.map((a) => Number(a)).reduce((a, b) => (a > b ? a : b));\n}\nexports.GetMaximumMinorIndex = GetMaximumMinorIndex;\n//# sourceMappingURL=VersionConverterFactory.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst JsApiInternalContract_1 = require(\"../JsApiInternalContract\");\nconst Notifications_1 = require(\"../contract/Notifications\");\n// This is where we will start to define some of these translations.\n// When modifying existing models, add the requisite conversion functions here, then use them\n// in the VersionConverterFactory implementation. Import old versions as you would any other module\n// 0 <-> Translations\n// Uncomment this line to import from the V0 definition of the API\n// import * as V0 from '@tableau-api-internal-contract-js_v0';\n// 1 <-> 2 Translations\n// Uncomment this line to import from the V1 definition of the API\n// import * as V1 from '@tableau-api-internal-contract-js_v1';\nfunction DowngradeWorksheetNames(executeResponse) {\n // Fix the dashboard friendly name issue. The structures are compatible,\n // so we still return the original reply, but we copy the SheetInfo.name\n // into the DashboardZone.name, where v1 wants to find it.\n const bootstrapInfo = executeResponse.result;\n if (bootstrapInfo.extensionDashboardInfo !== undefined) {\n bootstrapInfo.extensionDashboardInfo.zones.forEach((zone) => {\n if (zone.sheetInfo) {\n zone.name = zone.sheetInfo.name;\n }\n });\n }\n return executeResponse;\n}\nexports.DowngradeWorksheetNames = DowngradeWorksheetNames;\nfunction DowngradeFlipboardZoneID(notification) {\n // Fix the FlipboardZoneId issue. Older external versions still check for flipboardZoneIDs.\n // When running against a newer server, if flipboardZoneId is absent, set it to default(0).\n if (notification.notificationId === Notifications_1.NotificationId.SelectedMarksChanged) {\n const visualModel = notification.data;\n if (visualModel.flipboardZoneID === undefined) {\n visualModel.flipboardZoneID = 0;\n }\n }\n return notification;\n}\nexports.DowngradeFlipboardZoneID = DowngradeFlipboardZoneID;\n// Filter out formatting sheets that are specified in the classNames list\nfunction DowngradeWorksheetFormatting(executeResponse, classNames) {\n var _a, _b;\n const bootstrapInfo = executeResponse.result;\n if ((_b = (_a = bootstrapInfo) === null || _a === void 0 ? void 0 : _a.extensionWorksheetInfo) === null || _b === void 0 ? void 0 : _b.formatting)\n bootstrapInfo.extensionWorksheetInfo.formatting.formattingSheets =\n bootstrapInfo.extensionWorksheetInfo.formatting.formattingSheets.filter((x) => !classNames.includes(x.classNameKey));\n return executeResponse;\n}\n// Filter out formatting sheets that are specified in the classNames list\n// Filter out formatting sheets that are specified in the classNames list\nfunction DowngradeWorksheetFormattingNotification(notification, classNames) {\n if (notification.notificationId === Notifications_1.NotificationId.WorksheetFormattingChanged) {\n const formatting = notification.data;\n notification.data = formatting.formattingSheets.filter((x) => !classNames.includes(x.classNameKey));\n }\n return notification;\n}\n// We added new enum values for ClassNameKeys enum in 176. Need to filter them out if the client version is <176\nconst ClassNameKeysToFilter175 = [\"tableau-row-dividers\" /* RowDividers */, \"tableau-column-dividers\" /* ColumnDividers */, \"tableau-pane\" /* Pane */];\nexports.DowngradeWorksheetFomatting175 = (response) => DowngradeWorksheetFormatting(response, ClassNameKeysToFilter175);\nexports.DowngradeWorksheetFomattingNotification175 = (notification) => DowngradeWorksheetFormattingNotification(notification, ClassNameKeysToFilter175);\nfunction DowngradeExtensionEnvironmentContext(executeResponse) {\n // Fix the extension environment context issue. Replaces new enum values that go unrecognized\n // by older extensions with their respective older enum values.\n const bootstrapInfo = executeResponse.result;\n if (bootstrapInfo.extensionEnvironment !== undefined) {\n const context = bootstrapInfo.extensionEnvironment.extensionContext;\n if (context === JsApiInternalContract_1.ExtensionContext.PublicWeb || context === JsApiInternalContract_1.ExtensionContext.Cloud) {\n bootstrapInfo.extensionEnvironment.extensionContext = JsApiInternalContract_1.ExtensionContext.Server;\n }\n else if (context === JsApiInternalContract_1.ExtensionContext.PublicDesktop) {\n bootstrapInfo.extensionEnvironment.extensionContext = JsApiInternalContract_1.ExtensionContext.Desktop;\n }\n }\n return executeResponse;\n}\nexports.DowngradeExtensionEnvironmentContext = DowngradeExtensionEnvironmentContext;\n//# sourceMappingURL=VersionTranslations.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// tslint:disable:no-any\n/**\n * This version converter doesn't actually do anything but is useful for testing or when we have\n * a matching platform and external version number\n */\nclass ExternalIdentityVersionConverter {\n downgradeExecuteCall(verb, parameters) {\n return {\n verb: verb,\n parameters: parameters,\n };\n }\n upgradeExecuteReturn(executeResponse, verb, parameters) {\n return executeResponse;\n }\n upgradeNotification(notification) {\n return notification;\n }\n}\nexports.ExternalIdentityVersionConverter = ExternalIdentityVersionConverter;\n//# sourceMappingURL=ExternalIdentityVersionConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// tslint:disable:no-any\n/**\n * The version converter is designed to allow the platform and external modules\n * to seemlessly communicate over two different versions of the internal API. This converter\n * supports external's version(minor) >= platform's version(minor). When executing\n * commands, it is used to downgrade the external representation to what platform knows on the way in\n * and upgrade the representations on the way out.\n */\nclass ExternalStackingVersionConverter {\n /**\n * Creates a new instance of the StackingVersionConverter\n *\n * @param _externalVersion The version of the internal contract api-external-js is using\n * @param _platformVersion The version of the internal contract the api-platform-js is using\n * @param _downgradeExecuteCallTranslations Ordered list of the translations to perform when downgrading cmd parameters\n * @param _upgradeExecuteReturnTranslations Ordered list of upgrade translations to perform after a cmd is executed\n * @param _upgradeNotificationTranslations Ordered list of upgrade notfications to perform on events\n */\n constructor(_externalVersion, _platformVersion, _downgradeExecuteCallTranslations, _upgradeExecuteReturnTranslations, _upgradeNotificationTranslations) {\n this._externalVersion = _externalVersion;\n this._platformVersion = _platformVersion;\n this._downgradeExecuteCallTranslations = _downgradeExecuteCallTranslations;\n this._upgradeExecuteReturnTranslations = _upgradeExecuteReturnTranslations;\n this._upgradeNotificationTranslations = _upgradeNotificationTranslations;\n if (this._externalVersion.major > this._platformVersion.major) {\n throw new Error(`Cannot convert between external version ${this._externalVersion.major}\n and ${this._platformVersion.major}`);\n }\n }\n downgradeExecuteCall(verb, parameters) {\n // Perform the downgrade of the verb and parameters to the level that platform is using\n let downgraded = { verb: verb, parameters: parameters };\n for (const downgradeTranslation of this._downgradeExecuteCallTranslations) {\n downgraded = downgradeTranslation(downgraded.verb, downgraded.parameters);\n }\n return downgraded;\n }\n upgradeExecuteReturn(executeResponse, verb, parameters) {\n // Perform the upgrade of the response to what the external module is expecting\n let upgraded = executeResponse;\n for (const upgradeTranslation of this._upgradeExecuteReturnTranslations) {\n upgraded = upgradeTranslation(upgraded, verb, parameters);\n }\n return upgraded;\n }\n upgradeNotification(notification) {\n // Perform the upgrade of notification to what the external module is expecting\n let upgraded = notification;\n for (const upgradeNotification of this._upgradeNotificationTranslations) {\n upgraded = upgradeNotification(upgraded);\n }\n return upgraded;\n }\n}\nexports.ExternalStackingVersionConverter = ExternalStackingVersionConverter;\n//# sourceMappingURL=ExternalStackingVersionConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst VersionConverterFactory_1 = require(\"../VersionConverterFactory\");\nconst ExternalIdentityVersionConverter_1 = require(\"./ExternalIdentityVersionConverter\");\nconst ExternalStackingVersionConverter_1 = require(\"./ExternalStackingVersionConverter\");\n// A mapping from the current client version of internal-contract to an older platform version of the contract.\n// Each version bump can have an array of translations to perform in order.\n// These translations handle downgradeExecuteCall and upgradeExecuteReturn and are meant to be called on the\n// client/external side.\n// When updating the major or minor version of our internal-contract, you will need to update these data structures.\n// * If there are translations to add, add them to the version to 'upgrade from' or 'downgrade to'.\nexports.ExecuteMinorDowngradeCallExternal = {\n 1: {\n 9: [],\n },\n};\nexports.ExecuteMinorUpgradeReturnExternal = {\n 1: {\n 9: [],\n },\n};\nexports.ExecuteMinorUpgradeNotification = {\n 1: {\n 9: [],\n },\n};\n/**\n * Creates a new ExternalContractVersionConverter which has the ability to upgrade and downgrade\n * the contract between the two versions which are specified. If externalMajorVersion is less than\n * platformMajorVersion, an ExternalIdentityVersionConverter will be returned.\n * Handles upgrade/downgrade for both major and minor updates.\n *\n * @param externalVersion VersionNumber of the internal api which the external module is using\n * @param platformVersion VersionNumber of the internal api which the platform is using\n */\nfunction CreateExternalCompatibleVersionConverter(externalVersion, platformVersion) {\n return CreateExternalCompatibleVersionConverterWithTranslators(externalVersion, platformVersion, exports.ExecuteMinorDowngradeCallExternal, exports.ExecuteMinorUpgradeReturnExternal, exports.ExecuteMinorUpgradeNotification);\n}\nexports.CreateExternalCompatibleVersionConverter = CreateExternalCompatibleVersionConverter;\n/**\n * Implementation of CreateExternalCompatibleVersionConverterWithTranslators.\n * This function takes the upgrade, downgrade arrays so that all the logic can be tested.\n *\n * @param externalVersion VersionNumber of the internal contract which the external module is using\n * @param platformVersion VersionNumber of the internal contract which the platform is using\n * @param upgrades MajorMinorTranslators for response upgrades\n * @param downgrades MajorMinorTranslators for execute call downgrades\n */\nfunction CreateExternalCompatibleVersionConverterWithTranslators(externalVersion, platformVersion, downgrades, upgrades, upgradeNotifications) {\n const externalMajorVersion = externalVersion.major;\n const platformMajorVersion = platformVersion.major;\n const platformMinorVersion = platformVersion.minor;\n // This check is present in VersionConverterFactory. We throw the same error here as well.\n // Hence we only need to check the minor versions for translations.\n if (externalMajorVersion > platformMajorVersion) {\n throw new Error(`External version must be less than or equal to platform version.\n externalMajorVersion=${externalMajorVersion} platformMajorVersion=${platformMajorVersion}`);\n }\n if (externalMajorVersion < platformMajorVersion || VersionConverterFactory_1.VersionEqualTo(externalVersion, platformVersion)) {\n return new ExternalIdentityVersionConverter_1.ExternalIdentityVersionConverter();\n }\n // Walk the span between the versions we have here and collect the upgrade and downgrades necessary\n const neededExecuteCallDowngrade = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, downgrades);\n const neededExecuteReturnUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgrades);\n const neededNotificationUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgradeNotifications);\n // Reverse the downgrade calls, so that we start the downgrade from the external version to the platform version\n neededExecuteCallDowngrade.reverse();\n return new ExternalStackingVersionConverter_1.ExternalStackingVersionConverter(externalVersion, platformVersion, neededExecuteCallDowngrade, neededExecuteReturnUpgrades, neededNotificationUpgrades);\n}\nexports.CreateExternalCompatibleVersionConverterWithTranslators = CreateExternalCompatibleVersionConverterWithTranslators;\nfunction GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, majorMinorTranslators) {\n const neededTranslations = [];\n if (platformMajorVersion in majorMinorTranslators) {\n const start = platformMinorVersion;\n const maximumMinorVersion = VersionConverterFactory_1.GetMaximumMinorIndex(Object.keys(majorMinorTranslators[platformMajorVersion]));\n for (let minor = start; minor <= maximumMinorVersion; minor++) {\n if (minor in majorMinorTranslators[platformMajorVersion]) {\n neededTranslations.push(...majorMinorTranslators[platformMajorVersion][minor]);\n }\n }\n }\n return neededTranslations;\n}\n//# sourceMappingURL=ExternalVersionConverterFactory.js.map","\"use strict\";\n// Export everything which had been previously in the api-shared module\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ApiVersion_1 = require(\"./ApiShared/ApiVersion\");\nexports.ApiVersion = ApiVersion_1.ApiVersion;\n__export(require(\"./ApiShared/CrossFrame/CrossFrameBootstrap\"));\nvar CrossFrameDispatcher_1 = require(\"./ApiShared/CrossFrame/CrossFrameDispatcher\");\nexports.CrossFrameDispatcher = CrossFrameDispatcher_1.CrossFrameDispatcher;\nvar DataSource_1 = require(\"./ApiShared/DataSource\");\nexports.DataSource = DataSource_1.DataSource;\nvar ExternalToInternalEnumMappings_1 = require(\"./ApiShared/EnumMappings/ExternalToInternalEnumMappings\");\nexports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings;\nvar InternalToExternalEnumMappings_1 = require(\"./ApiShared/EnumMappings/InternalToExternalEnumMappings\");\nexports.InternalToExternalEnumMappings = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings;\nvar EventListenerManager_1 = require(\"./ApiShared/EventListenerManager\");\nexports.EventListenerManager = EventListenerManager_1.EventListenerManager;\nvar Field_1 = require(\"./ApiShared/Field\");\nexports.Field = Field_1.Field;\nvar CustomViewImpl_1 = require(\"./ApiShared/Impl/CustomViewImpl\");\nexports.CustomViewImpl = CustomViewImpl_1.CustomViewImpl;\nvar DashboardImpl_1 = require(\"./ApiShared/Impl/DashboardImpl\");\nexports.DashboardImpl = DashboardImpl_1.DashboardImpl;\nvar DashboardObjectImpl_1 = require(\"./ApiShared/Impl/DashboardObjectImpl\");\nexports.DashboardObjectImpl = DashboardObjectImpl_1.DashboardObjectImpl;\nvar DataSourceImpl_1 = require(\"./ApiShared/Impl/DataSourceImpl\");\nexports.DataSourceImpl = DataSourceImpl_1.DataSourceImpl;\nvar ParameterImpl_1 = require(\"./ApiShared/Impl/ParameterImpl\");\nexports.ParameterImpl = ParameterImpl_1.ParameterImpl;\nvar SheetImpl_1 = require(\"./ApiShared/Impl/SheetImpl\");\nexports.SheetImpl = SheetImpl_1.SheetImpl;\nvar SheetInfoImpl_1 = require(\"./ApiShared/Impl/SheetInfoImpl\");\nexports.SheetInfoImpl = SheetInfoImpl_1.SheetInfoImpl;\nvar SingleEventManagerImpl_1 = require(\"./ApiShared/Impl/SingleEventManagerImpl\");\nexports.SingleEventManagerImpl = SingleEventManagerImpl_1.SingleEventManagerImpl;\nvar StoryImpl_1 = require(\"./ApiShared/Impl/StoryImpl\");\nexports.StoryImpl = StoryImpl_1.StoryImpl;\nvar StoryPointImpl_1 = require(\"./ApiShared/Impl/StoryPointImpl\");\nexports.StoryPointImpl = StoryPointImpl_1.StoryPointImpl;\nvar StoryPointInfoImpl_1 = require(\"./ApiShared/Impl/StoryPointInfoImpl\");\nexports.StoryPointInfoImpl = StoryPointInfoImpl_1.StoryPointInfoImpl;\nvar WorkbookImpl_1 = require(\"./ApiShared/Impl/WorkbookImpl\");\nexports.WorkbookImpl = WorkbookImpl_1.WorkbookImpl;\nvar WorksheetImpl_1 = require(\"./ApiShared/Impl/WorksheetImpl\");\nexports.WorksheetImpl = WorksheetImpl_1.WorksheetImpl;\nvar Point_1 = require(\"./ApiShared/Point\");\nexports.Point = Point_1.Point;\n__export(require(\"./ApiShared/Services/RegisterAllSharedServices\"));\n__export(require(\"./ApiShared/Services/ServiceRegistry\"));\nvar ClientInfoServiceImpl_1 = require(\"./ApiShared/Services/impl/ClientInfoServiceImpl\");\nexports.ClientInfoServiceImpl = ClientInfoServiceImpl_1.ClientInfoServiceImpl;\nvar NotificationServiceImpl_1 = require(\"./ApiShared/Services/impl/NotificationServiceImpl\");\nexports.NotificationServiceImpl = NotificationServiceImpl_1.NotificationServiceImpl;\nvar NotificationServiceImplBase_1 = require(\"./ApiShared/Services/impl/NotificationServiceImplBase\");\nexports.NotificationServiceImplBase = NotificationServiceImplBase_1.NotificationServiceImplBase;\nexports.Registration = NotificationServiceImplBase_1.Registration;\nvar ServiceImplBase_1 = require(\"./ApiShared/Services/impl/ServiceImplBase\");\nexports.ServiceImplBase = ServiceImplBase_1.ServiceImplBase;\nvar SizeServiceImpl_1 = require(\"./ApiShared/Services/impl/SizeServiceImpl\");\nexports.SizeServiceImpl = SizeServiceImpl_1.SizeServiceImpl;\nvar StoryActivationServiceImpl_1 = require(\"./ApiShared/Services/impl/StoryActivationServiceImpl\");\nexports.StoryActivationServiceImpl = StoryActivationServiceImpl_1.StoryActivationServiceImpl;\nvar TableauError_1 = require(\"./ApiShared/TableauError\");\nexports.TableauError = TableauError_1.TableauError;\nvar Deferred_1 = require(\"./ApiShared/Utils/Deferred\");\nexports.Deferred = Deferred_1.Deferred;\nvar ErrorHelpers_1 = require(\"./ApiShared/Utils/ErrorHelpers\");\nexports.ErrorHelpers = ErrorHelpers_1.ErrorHelpers;\nvar ExportHelpers_1 = require(\"./ApiShared/Utils/ExportHelpers\");\nexports.ExportHelpers = ExportHelpers_1.ExportHelpers;\nvar SheetUtils_1 = require(\"./ApiShared/Utils/SheetUtils\");\nexports.SheetUtils = SheetUtils_1.SheetUtils;\nvar VersionNumber_1 = require(\"./ApiShared/VersionNumber\");\nexports.VersionNumber = VersionNumber_1.VersionNumber;\nvar VersionedExternalApiDispatcher_1 = require(\"./VersionedExternalApiDispatcher\");\nexports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher_1.VersionedExternalApiDispatcher;\n//# sourceMappingURL=ApiShared.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst VersionNumber_1 = require(\"./VersionNumber\");\n/**\n * This is the singleton wrapper of VersionNumber\n */\nclass ApiVersion {\n /**\n * Gets the singleton instance of the version number.\n */\n static get Instance() {\n return ApiVersion._instance;\n }\n static SetVersionNumber(numString, isAlpha) {\n ApiVersion._instance = new VersionNumber_1.VersionNumber(numString, isAlpha);\n }\n}\nexports.ApiVersion = ApiVersion;\n//# sourceMappingURL=ApiVersion.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Implementation of a connection summary.\n * This does not follow the Impl pattern as it is just a property bag.\n */\nclass ConnectionSummary {\n constructor(_connectionInfo) {\n this._connectionInfo = _connectionInfo;\n }\n get name() {\n return this._connectionInfo.name;\n }\n get id() {\n return this._connectionInfo.id;\n }\n get serverURI() {\n return this._connectionInfo.serverURI;\n }\n get type() {\n return this._connectionInfo.type;\n }\n}\nexports.ConnectionSummary = ConnectionSummary;\n//# sourceMappingURL=ConnectionSummary.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst CrossFrameDispatcher_1 = require(\"./CrossFrameDispatcher\");\n// Checks to see if we are running in an iframe currently: https://stackoverflow.com/a/326076/8821153\nfunction inIframe(thisWindow) {\n try {\n return thisWindow.self !== thisWindow.parent;\n }\n catch (e) {\n return true;\n }\n}\n/**\n * Attempts to bootstrap the extension with a cross-frame parent where Tableau is running\n *\n * @param thisWindow The window which we are running in (injected for unit testing purposes)\n * @param internalContractVersion The version number of the internal contract we are using\n * @returns A promise which is doing the actual bootstrapping\n */\nfunction doCrossFrameBootstrap(thisWindow, internalContractVersion, options) {\n return new Promise((resolve, reject) => {\n let parent;\n // Normally, we are running inside an iframe. The exception to this is\n // when we are running as an extension inside a dialog as part of the UINamespace\n // functionality. In that case, we want the opener of this window rather than the parent.\n if (!inIframe(thisWindow)) {\n parent = thisWindow.opener;\n }\n else {\n parent = thisWindow.parent;\n }\n if (!parent) {\n reject('This extension is not running inside an iframe, desktop, or popup window. Initialization failed.');\n }\n // Create the messenger which will do he communication between this window and our parent\n // Since we don't know where we are running yet, we have to make this initial origin '*'. Once\n // we have successfully initialized our extension, we will limit where we send messages\n const messenger = new api_internal_contract_js_1.CrossFrameMessenger(thisWindow, parent, '*');\n // Prepare to send an initialization message to the parent frame\n const initializationMessage = messenger.prepareInitializationMessage(internalContractVersion, api_internal_contract_js_1.MESSAGING_VERSION, options);\n // When we receive a response back from the parent, we check to make sure the guids match and then we know\n // that the parent is aware of us and we can start communicating\n messenger.setCommandResponseMessageHandler(function (msg) {\n // Verify we are getting a response from our initialize message\n if (msg.commandGuid === initializationMessage.messageGuid) {\n // The versioning of the dispatcher happens on the other side of our frame, and\n // in a wrapper on this side. This one doesn't have any version knowledge.\n const dispatcherFactory = () => new CrossFrameDispatcher_1.CrossFrameDispatcher(messenger);\n resolve(dispatcherFactory);\n }\n });\n // Now that our handlers are ready, start listening and send our initialization message\n messenger.startListening();\n initializationMessage.send();\n });\n}\nexports.doCrossFrameBootstrap = doCrossFrameBootstrap;\n//# sourceMappingURL=CrossFrameBootstrap.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\n/**\n * This is an implementation of the InternalApiDispatcher interface which functions by passing messages\n * across a frame boundary. This is usually between the code where our javscript library has been included\n * by a 3rd party dev and another frame where Tableau server has content.\n */\nclass CrossFrameDispatcher {\n /**\n * Creates an instance of CrossFrameDispatcher which will use the given messenger to communicate\n * @param _messenger an instantiated and listening messenger object\n */\n constructor(_messenger) {\n this._messenger = _messenger;\n // Collection of pending promises which are waiting to be resolved. When we receive a response back from the other frame,\n // these promises can be either resolved or rejected\n this._pendingPromises = {};\n // The collection of notification handlers which have been registered with this dispatcher\n this._notificationHandlers = [];\n if (!this._messenger) {\n throw 'Missing messenger object';\n }\n // Set up our message handlers. We only care about incoming notifications and command responses\n this._messenger.setCommandResponseMessageHandler(this.onCommandResponse.bind(this));\n this._messenger.setNotificationMessageHandler(this.onNotification.bind(this));\n }\n ////// Start InternalApiDispatcher implementation\n execute(verb, parameters) {\n // To execute a verb, we first prepare a command message and then define a promise.\n const preparedMessage = this._messenger.prepareCommandMessage(verb, parameters);\n const promise = new Promise((resolve, reject) => {\n // Save off the pending promise by the messageGuid we are about to send. When a response is\n // received, we'll be able to resolve this promise with the result\n this._pendingPromises[preparedMessage.messageGuid] = { resolve: resolve, reject: reject };\n });\n // Actually send the message and return the promise\n preparedMessage.send();\n return promise;\n }\n registerNotificationHandler(handler) {\n this._notificationHandlers.push(handler);\n }\n unregisterNotificationHandler(handler) {\n this._notificationHandlers = this._notificationHandlers.filter((h) => h !== handler);\n }\n ////// End InternalApiDispatcher implementation\n onCommandResponse(response) {\n // We got a command response, look through the pending promises and resolve\n if (Object.keys(this._pendingPromises).indexOf(response.commandGuid) < 0) {\n return; // We don't have any reference to this command, just return\n }\n const pendingPromise = this._pendingPromises[response.commandGuid];\n // If we have an error defined, reject the promise\n if (response.error) {\n pendingPromise.reject(response.error);\n }\n // If we have data defined, resolve the promise\n if (response.data) {\n pendingPromise.resolve({ result: response.data });\n }\n // Clean up our pending promises object\n delete this._pendingPromises[response.commandGuid];\n }\n onNotification(notificationMessage) {\n // Go through each notification handler we have registered and let them know a notification came in\n for (const handler of this._notificationHandlers) {\n try {\n handler({ notificationId: notificationMessage.notificationId, data: notificationMessage.data });\n }\n catch (e) {\n // Incase of a IncompatibleVersionError, re-throw the error.\n if (e.errorCode === api_external_contract_js_1.EmbeddingErrorCodes.IncompatibleVersionError) {\n throw e;\n }\n // Else Ignore so if one handler errors, the other still get the message.\n }\n }\n }\n}\nexports.CrossFrameDispatcher = CrossFrameDispatcher;\n//# sourceMappingURL=CrossFrameDispatcher.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nclass DataSource {\n constructor(_dataSourceImpl) {\n this._dataSourceImpl = _dataSourceImpl;\n }\n get name() {\n return this._dataSourceImpl.name;\n }\n get id() {\n return this._dataSourceImpl.id;\n }\n get fields() {\n return this._dataSourceImpl.fields;\n }\n get extractUpdateTime() {\n return this._dataSourceImpl.extractUpdateTime;\n }\n get isExtract() {\n return this._dataSourceImpl.isExtract;\n }\n get isPublished() {\n return this._dataSourceImpl.isPublished;\n }\n publishedUrl() {\n return this._dataSourceImpl.publishedUrl();\n }\n refreshAsync() {\n return this._dataSourceImpl.refreshAsync();\n }\n getActiveTablesAsync() {\n console.warn('DataSource.getActiveTablesAsync is deprecated. Please use DataSource.getLogicalTablesAsync.');\n return this._dataSourceImpl.getActiveTablesAsync();\n }\n getConnectionSummariesAsync() {\n return this._dataSourceImpl.getConnectionSummariesAsync();\n }\n getUnderlyingDataAsync(options) {\n console.warn('DataSource.getUnderlyingDataAsync is deprecated. Please use ' +\n 'DataSource.getLogicalTablesAsync and DataSource.getLogicalTableDataAsync.');\n return this._dataSourceImpl.getUnderlyingDataAsync(options);\n }\n getLogicalTablesAsync() {\n return this._dataSourceImpl.getLogicalTablesAsync();\n }\n getLogicalTableDataAsync(logicalTableId, options) {\n return this._dataSourceImpl.getLogicalTableDataAsync(logicalTableId, options);\n }\n getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options) {\n return this._dataSourceImpl.getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options);\n }\n}\nexports.DataSource = DataSource;\n//# sourceMappingURL=DataSource.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst EnumConverter_1 = require(\"../Utils/EnumConverter\");\n/* tslint:disable:typedef - Disable this to make declaring these classes a bit easier */\n/**\n * Maps enums used by the external-api-contract to the enums used\n * in the internal-api-contract, which developers code against.\n */\nclass ExternalToInternalEnumMappings {\n}\nexports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings;\nExternalToInternalEnumMappings.filterDomainType = new EnumConverter_1.EnumConverter({\n [api_external_contract_js_1.FilterDomainType.Relevant]: api_internal_contract_js_1.FilterDomainType.Relevant,\n [api_external_contract_js_1.FilterDomainType.Database]: api_internal_contract_js_1.FilterDomainType.Database,\n});\nExternalToInternalEnumMappings.nullOptions = new EnumConverter_1.EnumConverter({\n [api_external_contract_js_1.FilterNullOption.AllValues]: api_internal_contract_js_1.FilterNullOption.AllValues,\n [api_external_contract_js_1.FilterNullOption.NonNullValues]: api_internal_contract_js_1.FilterNullOption.NonNullValues,\n [api_external_contract_js_1.FilterNullOption.NullValues]: api_internal_contract_js_1.FilterNullOption.NullValues,\n});\nExternalToInternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter({\n [api_external_contract_js_1.FilterUpdateType.Add]: api_internal_contract_js_1.FilterUpdateType.Add,\n [api_external_contract_js_1.FilterUpdateType.All]: api_internal_contract_js_1.FilterUpdateType.All,\n [api_external_contract_js_1.FilterUpdateType.Remove]: api_internal_contract_js_1.FilterUpdateType.Remove,\n [api_external_contract_js_1.FilterUpdateType.Replace]: api_internal_contract_js_1.FilterUpdateType.Replace,\n});\nExternalToInternalEnumMappings.setVisibilityType = new EnumConverter_1.EnumConverter({\n [api_external_contract_js_1.ZoneVisibilityType.Show]: true,\n [api_external_contract_js_1.ZoneVisibilityType.Hide]: false,\n});\nExternalToInternalEnumMappings.setReplaySpeedType = new EnumConverter_1.EnumConverter({\n // these numbers are duration multipliers\n // 2.0, for example, doubles the duration of the replay, slowing it down to 0.5x speed\n [api_external_contract_js_1.ReplaySpeedType.Slow]: 2.0,\n [api_external_contract_js_1.ReplaySpeedType.Normal]: 1.0,\n [api_external_contract_js_1.ReplaySpeedType.Fast]: 0.5,\n});\nExternalToInternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter({\n [api_external_contract_js_1.SheetType.Dashboard]: api_internal_contract_js_1.SheetType.Dashboard,\n [api_external_contract_js_1.SheetType.Worksheet]: api_internal_contract_js_1.SheetType.Worksheet,\n [api_external_contract_js_1.SheetType.Story]: api_internal_contract_js_1.SheetType.Story,\n});\nExternalToInternalEnumMappings.showDataTableFormatType = new EnumConverter_1.EnumConverter({\n [api_external_contract_js_1.IncludeDataValuesOption.AllValues]: api_internal_contract_js_1.ApiShowDataTableFormat.NativeAndFormattedValues,\n [api_external_contract_js_1.IncludeDataValuesOption.OnlyNativeValues]: api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly,\n [api_external_contract_js_1.IncludeDataValuesOption.OnlyFormattedValues]: api_internal_contract_js_1.ApiShowDataTableFormat.FormattedValuesOnly,\n});\nExternalToInternalEnumMappings.periodType = new EnumConverter_1.EnumConverter({\n [api_external_contract_js_1.PeriodType.Years]: api_internal_contract_js_1.DateStepPeriod.Years,\n [api_external_contract_js_1.PeriodType.Quarters]: api_internal_contract_js_1.DateStepPeriod.Quarters,\n [api_external_contract_js_1.PeriodType.Months]: api_internal_contract_js_1.DateStepPeriod.Months,\n [api_external_contract_js_1.PeriodType.Weeks]: api_internal_contract_js_1.DateStepPeriod.Weeks,\n [api_external_contract_js_1.PeriodType.Days]: api_internal_contract_js_1.DateStepPeriod.Days,\n [api_external_contract_js_1.PeriodType.Hours]: api_internal_contract_js_1.DateStepPeriod.Hours,\n [api_external_contract_js_1.PeriodType.Minutes]: api_internal_contract_js_1.DateStepPeriod.Minutes,\n [api_external_contract_js_1.PeriodType.Seconds]: api_internal_contract_js_1.DateStepPeriod.Seconds,\n});\nExternalToInternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter({\n [api_external_contract_js_1.DateRangeType.Last]: api_internal_contract_js_1.DateRangeType.Last,\n [api_external_contract_js_1.DateRangeType.LastN]: api_internal_contract_js_1.DateRangeType.LastN,\n [api_external_contract_js_1.DateRangeType.Next]: api_internal_contract_js_1.DateRangeType.Next,\n [api_external_contract_js_1.DateRangeType.NextN]: api_internal_contract_js_1.DateRangeType.NextN,\n [api_external_contract_js_1.DateRangeType.Current]: api_internal_contract_js_1.DateRangeType.Current,\n [api_external_contract_js_1.DateRangeType.ToDate]: api_internal_contract_js_1.DateRangeType.ToDate,\n});\nExternalToInternalEnumMappings.dialogStyles = new EnumConverter_1.EnumConverter({\n [api_external_contract_js_1.DialogStyle.Window]: api_internal_contract_js_1.DialogStyle.Window,\n [api_external_contract_js_1.DialogStyle.Modal]: api_internal_contract_js_1.DialogStyle.Modal,\n [api_external_contract_js_1.DialogStyle.Modeless]: api_internal_contract_js_1.DialogStyle.Modeless,\n});\n/* tslint:enable:typedef */\n//# sourceMappingURL=ExternalToInternalEnumMappings.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst EnumConverter_1 = require(\"../Utils/EnumConverter\");\n/* tslint:disable:typedef - Disable this to make declaring these classes a bit easier */\n/**\n * Maps enums used by the internal-api-contract to the enums used\n * in the external-api-contract, which developers code against.\n */\nclass InternalToExternalEnumMappings {\n}\nexports.InternalToExternalEnumMappings = InternalToExternalEnumMappings;\nInternalToExternalEnumMappings.extensionContext = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.ExtensionContext.Desktop]: api_external_contract_js_1.ExtensionContext.Desktop,\n [api_internal_contract_js_1.ExtensionContext.Server]: api_external_contract_js_1.ExtensionContext.Server,\n [api_internal_contract_js_1.ExtensionContext.PublicWeb]: api_external_contract_js_1.ExtensionContext.PublicWeb,\n [api_internal_contract_js_1.ExtensionContext.PublicDesktop]: api_external_contract_js_1.ExtensionContext.PublicDesktop,\n [api_internal_contract_js_1.ExtensionContext.Cloud]: api_external_contract_js_1.ExtensionContext.Cloud,\n});\nInternalToExternalEnumMappings.extensionMode = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.ExtensionMode.Authoring]: api_external_contract_js_1.ExtensionMode.Authoring,\n [api_internal_contract_js_1.ExtensionMode.Viewing]: api_external_contract_js_1.ExtensionMode.Viewing,\n});\nInternalToExternalEnumMappings.columnType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.ColumnType.Continuous]: api_external_contract_js_1.ColumnType.Continuous,\n [api_internal_contract_js_1.ColumnType.Discrete]: api_external_contract_js_1.ColumnType.Discrete,\n [api_internal_contract_js_1.ColumnType.Unknown]: api_external_contract_js_1.ColumnType.Unknown,\n});\nInternalToExternalEnumMappings.fieldAggregationType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.FieldAggregationType.Attr]: api_external_contract_js_1.FieldAggregationType.Attr,\n [api_internal_contract_js_1.FieldAggregationType.Avg]: api_external_contract_js_1.FieldAggregationType.Avg,\n [api_internal_contract_js_1.FieldAggregationType.Collect]: api_external_contract_js_1.FieldAggregationType.Collect,\n [api_internal_contract_js_1.FieldAggregationType.Count]: api_external_contract_js_1.FieldAggregationType.Count,\n [api_internal_contract_js_1.FieldAggregationType.Countd]: api_external_contract_js_1.FieldAggregationType.Countd,\n [api_internal_contract_js_1.FieldAggregationType.Day]: api_external_contract_js_1.FieldAggregationType.Day,\n [api_internal_contract_js_1.FieldAggregationType.End]: api_external_contract_js_1.FieldAggregationType.End,\n [api_internal_contract_js_1.FieldAggregationType.Hour]: api_external_contract_js_1.FieldAggregationType.Hour,\n [api_internal_contract_js_1.FieldAggregationType.InOut]: api_external_contract_js_1.FieldAggregationType.InOut,\n [api_internal_contract_js_1.FieldAggregationType.Kurtosis]: api_external_contract_js_1.FieldAggregationType.Kurtosis,\n [api_internal_contract_js_1.FieldAggregationType.Max]: api_external_contract_js_1.FieldAggregationType.Max,\n [api_internal_contract_js_1.FieldAggregationType.Mdy]: api_external_contract_js_1.FieldAggregationType.Mdy,\n [api_internal_contract_js_1.FieldAggregationType.Median]: api_external_contract_js_1.FieldAggregationType.Median,\n [api_internal_contract_js_1.FieldAggregationType.Min]: api_external_contract_js_1.FieldAggregationType.Min,\n [api_internal_contract_js_1.FieldAggregationType.Minute]: api_external_contract_js_1.FieldAggregationType.Minute,\n [api_internal_contract_js_1.FieldAggregationType.MonthYear]: api_external_contract_js_1.FieldAggregationType.MonthYear,\n [api_internal_contract_js_1.FieldAggregationType.None]: api_external_contract_js_1.FieldAggregationType.None,\n [api_internal_contract_js_1.FieldAggregationType.Qtr]: api_external_contract_js_1.FieldAggregationType.Qtr,\n [api_internal_contract_js_1.FieldAggregationType.Quart1]: api_external_contract_js_1.FieldAggregationType.Quart1,\n [api_internal_contract_js_1.FieldAggregationType.Quart3]: api_external_contract_js_1.FieldAggregationType.Quart3,\n [api_internal_contract_js_1.FieldAggregationType.Second]: api_external_contract_js_1.FieldAggregationType.Second,\n [api_internal_contract_js_1.FieldAggregationType.Skewness]: api_external_contract_js_1.FieldAggregationType.Skewness,\n [api_internal_contract_js_1.FieldAggregationType.Stdev]: api_external_contract_js_1.FieldAggregationType.Stdev,\n [api_internal_contract_js_1.FieldAggregationType.Stdevp]: api_external_contract_js_1.FieldAggregationType.Stdevp,\n [api_internal_contract_js_1.FieldAggregationType.Sum]: api_external_contract_js_1.FieldAggregationType.Sum,\n [api_internal_contract_js_1.FieldAggregationType.TruncDay]: api_external_contract_js_1.FieldAggregationType.TruncDay,\n [api_internal_contract_js_1.FieldAggregationType.TruncHour]: api_external_contract_js_1.FieldAggregationType.TruncHour,\n [api_internal_contract_js_1.FieldAggregationType.TruncMinute]: api_external_contract_js_1.FieldAggregationType.TruncMinute,\n [api_internal_contract_js_1.FieldAggregationType.TruncMonth]: api_external_contract_js_1.FieldAggregationType.TruncMonth,\n [api_internal_contract_js_1.FieldAggregationType.TruncQtr]: api_external_contract_js_1.FieldAggregationType.TruncQtr,\n [api_internal_contract_js_1.FieldAggregationType.TruncSecond]: api_external_contract_js_1.FieldAggregationType.TruncSecond,\n [api_internal_contract_js_1.FieldAggregationType.TruncWeek]: api_external_contract_js_1.FieldAggregationType.TruncWeek,\n [api_internal_contract_js_1.FieldAggregationType.TruncYear]: api_external_contract_js_1.FieldAggregationType.TruncYear,\n [api_internal_contract_js_1.FieldAggregationType.User]: api_external_contract_js_1.FieldAggregationType.User,\n [api_internal_contract_js_1.FieldAggregationType.Var]: api_external_contract_js_1.FieldAggregationType.Var,\n [api_internal_contract_js_1.FieldAggregationType.Varp]: api_external_contract_js_1.FieldAggregationType.Varp,\n [api_internal_contract_js_1.FieldAggregationType.Week]: api_external_contract_js_1.FieldAggregationType.Week,\n [api_internal_contract_js_1.FieldAggregationType.Weekday]: api_external_contract_js_1.FieldAggregationType.Weekday,\n [api_internal_contract_js_1.FieldAggregationType.Year]: api_external_contract_js_1.FieldAggregationType.Year,\n});\nInternalToExternalEnumMappings.fieldRoleType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.FieldRoleType.Dimension]: api_external_contract_js_1.FieldRoleType.Dimension,\n [api_internal_contract_js_1.FieldRoleType.Measure]: api_external_contract_js_1.FieldRoleType.Measure,\n [api_internal_contract_js_1.FieldRoleType.Unknown]: api_external_contract_js_1.FieldRoleType.Unknown,\n});\nInternalToExternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.SheetType.Dashboard]: api_external_contract_js_1.SheetType.Dashboard,\n [api_internal_contract_js_1.SheetType.Story]: api_external_contract_js_1.SheetType.Story,\n [api_internal_contract_js_1.SheetType.Worksheet]: api_external_contract_js_1.SheetType.Worksheet,\n});\nInternalToExternalEnumMappings.dashboardObjectType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.DashboardObjectType.Extension]: api_external_contract_js_1.DashboardObjectType.Extension,\n [api_internal_contract_js_1.DashboardObjectType.Blank]: api_external_contract_js_1.DashboardObjectType.Blank,\n [api_internal_contract_js_1.DashboardObjectType.Image]: api_external_contract_js_1.DashboardObjectType.Image,\n [api_internal_contract_js_1.DashboardObjectType.Legend]: api_external_contract_js_1.DashboardObjectType.Legend,\n [api_internal_contract_js_1.DashboardObjectType.PageFilter]: api_external_contract_js_1.DashboardObjectType.PageFilter,\n [api_internal_contract_js_1.DashboardObjectType.ParameterControl]: api_external_contract_js_1.DashboardObjectType.ParameterControl,\n [api_internal_contract_js_1.DashboardObjectType.QuickFilter]: api_external_contract_js_1.DashboardObjectType.QuickFilter,\n [api_internal_contract_js_1.DashboardObjectType.Text]: api_external_contract_js_1.DashboardObjectType.Text,\n [api_internal_contract_js_1.DashboardObjectType.Title]: api_external_contract_js_1.DashboardObjectType.Title,\n [api_internal_contract_js_1.DashboardObjectType.WebPage]: api_external_contract_js_1.DashboardObjectType.WebPage,\n [api_internal_contract_js_1.DashboardObjectType.Worksheet]: api_external_contract_js_1.DashboardObjectType.Worksheet,\n});\nInternalToExternalEnumMappings.dataType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.DataType.Bool]: api_external_contract_js_1.DataType.Bool,\n [api_internal_contract_js_1.DataType.Date]: api_external_contract_js_1.DataType.Date,\n [api_internal_contract_js_1.DataType.DateTime]: api_external_contract_js_1.DataType.DateTime,\n [api_internal_contract_js_1.DataType.Float]: api_external_contract_js_1.DataType.Float,\n [api_internal_contract_js_1.DataType.Int]: api_external_contract_js_1.DataType.Int,\n [api_internal_contract_js_1.DataType.Spatial]: api_external_contract_js_1.DataType.Spatial,\n [api_internal_contract_js_1.DataType.String]: api_external_contract_js_1.DataType.String,\n});\nInternalToExternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.FilterUpdateType.Add]: api_external_contract_js_1.FilterUpdateType.Add,\n [api_internal_contract_js_1.FilterUpdateType.All]: api_external_contract_js_1.FilterUpdateType.All,\n [api_internal_contract_js_1.FilterUpdateType.Remove]: api_external_contract_js_1.FilterUpdateType.Remove,\n [api_internal_contract_js_1.FilterUpdateType.Replace]: api_external_contract_js_1.FilterUpdateType.Replace,\n});\nInternalToExternalEnumMappings.allowableValues = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.DomainRestrictionType.All]: api_external_contract_js_1.ParameterValueType.All,\n [api_internal_contract_js_1.DomainRestrictionType.List]: api_external_contract_js_1.ParameterValueType.List,\n [api_internal_contract_js_1.DomainRestrictionType.Range]: api_external_contract_js_1.ParameterValueType.Range,\n});\nInternalToExternalEnumMappings.dateStepPeriod = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.DateStepPeriod.Years]: api_external_contract_js_1.PeriodType.Years,\n [api_internal_contract_js_1.DateStepPeriod.Quarters]: api_external_contract_js_1.PeriodType.Quarters,\n [api_internal_contract_js_1.DateStepPeriod.Months]: api_external_contract_js_1.PeriodType.Months,\n [api_internal_contract_js_1.DateStepPeriod.Weeks]: api_external_contract_js_1.PeriodType.Weeks,\n [api_internal_contract_js_1.DateStepPeriod.Days]: api_external_contract_js_1.PeriodType.Days,\n [api_internal_contract_js_1.DateStepPeriod.Hours]: api_external_contract_js_1.PeriodType.Hours,\n [api_internal_contract_js_1.DateStepPeriod.Minutes]: api_external_contract_js_1.PeriodType.Minutes,\n [api_internal_contract_js_1.DateStepPeriod.Seconds]: api_external_contract_js_1.PeriodType.Seconds,\n});\nInternalToExternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.DateRangeType.Current]: api_external_contract_js_1.DateRangeType.Current,\n [api_internal_contract_js_1.DateRangeType.Last]: api_external_contract_js_1.DateRangeType.Last,\n [api_internal_contract_js_1.DateRangeType.LastN]: api_external_contract_js_1.DateRangeType.LastN,\n [api_internal_contract_js_1.DateRangeType.Next]: api_external_contract_js_1.DateRangeType.Next,\n [api_internal_contract_js_1.DateRangeType.NextN]: api_external_contract_js_1.DateRangeType.NextN,\n [api_internal_contract_js_1.DateRangeType.ToDate]: api_external_contract_js_1.DateRangeType.ToDate,\n});\nInternalToExternalEnumMappings.errorCode = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.ErrorCodes.INITIALIZATION_ERROR]: api_external_contract_js_1.ErrorCodes.InternalError,\n [api_internal_contract_js_1.ErrorCodes.INTERNAL_ERROR]: api_external_contract_js_1.ErrorCodes.InternalError,\n [api_internal_contract_js_1.ErrorCodes.MISSING_ENUM_MAPPING]: api_external_contract_js_1.ErrorCodes.InternalError,\n [api_internal_contract_js_1.ErrorCodes.MISSING_PARAMETER]: api_external_contract_js_1.ErrorCodes.InternalError,\n [api_internal_contract_js_1.ErrorCodes.PERMISSION_DENIED]: api_external_contract_js_1.ErrorCodes.InternalError,\n [api_internal_contract_js_1.ErrorCodes.PRES_MODEL_PARSING_ERROR]: api_external_contract_js_1.ErrorCodes.InternalError,\n [api_internal_contract_js_1.ErrorCodes.UNKNOWN_VERB_ID]: api_external_contract_js_1.ErrorCodes.InternalError,\n [api_internal_contract_js_1.ErrorCodes.VERSION_NOT_CONFIGURED]: api_external_contract_js_1.ErrorCodes.APINotInitialized,\n [api_internal_contract_js_1.ErrorCodes.VISIBILITY_ERROR]: api_external_contract_js_1.ErrorCodes.VisibilityError,\n}, api_external_contract_js_1.ErrorCodes.InternalError);\nInternalToExternalEnumMappings.filterType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.FilterType.Categorical]: api_external_contract_js_1.FilterType.Categorical,\n [api_internal_contract_js_1.FilterType.Range]: api_external_contract_js_1.FilterType.Range,\n [api_internal_contract_js_1.FilterType.RelativeDate]: api_external_contract_js_1.FilterType.RelativeDate,\n [api_internal_contract_js_1.FilterType.Hierarchical]: api_external_contract_js_1.FilterType.Hierarchical,\n});\nInternalToExternalEnumMappings.classNameKey = new EnumConverter_1.EnumConverter({\n [\"tableau-dashboard-title\" /* DashboardTitle */]: api_external_contract_js_1.ClassNameKey.DashboardTitle,\n [\"tableau-story-title\" /* StoryTitle */]: api_external_contract_js_1.ClassNameKey.StoryTitle,\n [\"tableau-tooltip\" /* Tooltip */]: api_external_contract_js_1.ClassNameKey.Tooltip,\n [\"tableau-worksheet\" /* Worksheet */]: api_external_contract_js_1.ClassNameKey.Worksheet,\n [\"tableau-worksheet-title\" /* WorksheetTitle */]: api_external_contract_js_1.ClassNameKey.WorksheetTitle,\n [\"tableau-pane\" /* Pane */]: api_external_contract_js_1.ClassNameKey.Pane,\n [\"tableau-row-dividers\" /* RowDividers */]: api_external_contract_js_1.ClassNameKey.RowDividers,\n [\"tableau-column-dividers\" /* ColumnDividers */]: api_external_contract_js_1.ClassNameKey.ColumnDividers,\n // Temporary until we fix 1317266 - Platform hasn't been updated currently because near branch is closed\n ['dashboard-title']: api_external_contract_js_1.ClassNameKey.DashboardTitle,\n ['story-title']: api_external_contract_js_1.ClassNameKey.StoryTitle,\n ['tooltip']: api_external_contract_js_1.ClassNameKey.Tooltip,\n ['worksheet']: api_external_contract_js_1.ClassNameKey.Worksheet,\n ['worksheet-title']: api_external_contract_js_1.ClassNameKey.WorksheetTitle,\n ['pane']: api_external_contract_js_1.ClassNameKey.Pane,\n ['row-dividers']: api_external_contract_js_1.ClassNameKey.RowDividers,\n ['column-dividers']: api_external_contract_js_1.ClassNameKey.ColumnDividers,\n});\nInternalToExternalEnumMappings.hierarchicalLevelSelectionState = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.HierarchicalLevelSelectionState.AllSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.AllSelected,\n [api_internal_contract_js_1.HierarchicalLevelSelectionState.NoneSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.NoneSelected,\n [api_internal_contract_js_1.HierarchicalLevelSelectionState.SomeSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.SomeSelected,\n [api_internal_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected,\n});\nInternalToExternalEnumMappings.annotationType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.AnnotateEnum.Area]: api_external_contract_js_1.AnnotationType.Area,\n [api_internal_contract_js_1.AnnotateEnum.Mark]: api_external_contract_js_1.AnnotationType.Mark,\n [api_internal_contract_js_1.AnnotateEnum.Point]: api_external_contract_js_1.AnnotationType.Point,\n});\nInternalToExternalEnumMappings.markType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.MarkType.Area]: api_external_contract_js_1.MarkType.Area,\n [api_internal_contract_js_1.MarkType.Bar]: api_external_contract_js_1.MarkType.Bar,\n [api_internal_contract_js_1.MarkType.Circle]: api_external_contract_js_1.MarkType.Circle,\n [api_internal_contract_js_1.MarkType.GanttBar]: api_external_contract_js_1.MarkType.GanttBar,\n [api_internal_contract_js_1.MarkType.Heatmap]: api_external_contract_js_1.MarkType.Heatmap,\n [api_internal_contract_js_1.MarkType.Line]: api_external_contract_js_1.MarkType.Line,\n [api_internal_contract_js_1.MarkType.Map]: api_external_contract_js_1.MarkType.Map,\n [api_internal_contract_js_1.MarkType.Pie]: api_external_contract_js_1.MarkType.Pie,\n [api_internal_contract_js_1.MarkType.Polygon]: api_external_contract_js_1.MarkType.Polygon,\n [api_internal_contract_js_1.MarkType.Shape]: api_external_contract_js_1.MarkType.Shape,\n [api_internal_contract_js_1.MarkType.Square]: api_external_contract_js_1.MarkType.Square,\n [api_internal_contract_js_1.MarkType.Text]: api_external_contract_js_1.MarkType.Text,\n [api_internal_contract_js_1.MarkType.VizExtension]: api_external_contract_js_1.MarkType.VizExtension,\n});\n/* tslint:enable:typedef */\n//# sourceMappingURL=InternalToExternalEnumMappings.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst TableauError_1 = require(\"./TableauError\");\n/**\n * Class designed to register and unregister handlers from a user. Only those events\n * which are added via AddNewEventType will be supported by this instance\n */\nclass EventListenerManager {\n constructor() {\n this._eventListenerManagers = {};\n }\n addEventListener(eventType, handler) {\n if (!this._eventListenerManagers.hasOwnProperty(eventType)) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedEventName, `Cannot add event, unsupported event type: ${eventType}`);\n }\n return this._eventListenerManagers[eventType].addEventListener(handler);\n }\n removeEventListener(eventType, handler) {\n if (!this._eventListenerManagers.hasOwnProperty(eventType)) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedEventName, `Cannot remove event, unsupported event type: ${eventType}`);\n }\n return this._eventListenerManagers[eventType].removeEventListener(handler);\n }\n addNewEventType(eventManager) {\n this._eventListenerManagers[eventManager.eventType] = eventManager;\n }\n}\nexports.EventListenerManager = EventListenerManager;\n//# sourceMappingURL=EventListenerManager.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nclass Field {\n constructor(_fieldImpl) {\n this._fieldImpl = _fieldImpl;\n }\n get name() {\n return this._fieldImpl.name;\n }\n get id() {\n return this._fieldImpl.id;\n }\n get description() {\n return this._fieldImpl.description;\n }\n get dataType() {\n return this._fieldImpl.dataType;\n }\n get aggregation() {\n return this._fieldImpl.aggregation;\n }\n get dataSource() {\n return this._fieldImpl.dataSource;\n }\n get role() {\n return this._fieldImpl.role;\n }\n get columnType() {\n return this._fieldImpl.columnType;\n }\n get isCalculatedField() {\n return this._fieldImpl.isCalculatedField;\n }\n get isCombinedField() {\n return this._fieldImpl.isCombinedField;\n }\n get isGenerated() {\n return this._fieldImpl.isGenerated;\n }\n get isGeospatial() {\n return this._fieldImpl.isGeospatial;\n }\n get isHidden() {\n return this._fieldImpl.isHidden;\n }\n get isPresentOnPublishedDatasource() {\n return this._fieldImpl.isPresentOnPublishedDatasource;\n }\n}\nexports.Field = Field;\n//# sourceMappingURL=Field.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst ApiShared_1 = require(\"../../ApiShared\");\nclass CustomViewImpl {\n constructor(customViewModel, _registryId) {\n this._registryId = _registryId;\n this._luid = customViewModel.luid;\n this._name = customViewModel.name;\n this._shared = customViewModel.shared;\n this._isDefault = customViewModel.isDefault;\n this._ownerName = customViewModel.owner.userFriendlyName;\n this._url = customViewModel.url;\n }\n get luid() {\n return this._luid;\n }\n get name() {\n return this._name;\n }\n set name(name) {\n this._name = name;\n }\n get shared() {\n return this._shared;\n }\n set shared(shared) {\n this._shared = shared;\n }\n get isDefault() {\n return this._isDefault;\n }\n set isDefault(isDefault) {\n this._isDefault = isDefault;\n }\n get ownerName() {\n return this._ownerName;\n }\n get url() {\n return this._url;\n }\n saveAsync() {\n const service = ApiShared_1.ApiServiceRegistry.get(this._registryId).getService(\"viz-service\" /* Viz */);\n return service.saveAsync(this);\n }\n}\nexports.CustomViewImpl = CustomViewImpl;\n//# sourceMappingURL=CustomViewImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst InternalToExternalEnumMappings_1 = require(\"../EnumMappings/InternalToExternalEnumMappings\");\nconst Point_1 = require(\"../Point\");\nconst ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nconst TableauError_1 = require(\"../TableauError\");\nconst ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nconst DashboardObjectImpl_1 = require(\"./DashboardObjectImpl\");\nconst SheetImpl_1 = require(\"./SheetImpl\");\nconst SheetInfoImpl_1 = require(\"./SheetInfoImpl\");\nconst WorksheetImpl_1 = require(\"./WorksheetImpl\");\nclass DashboardImpl extends SheetImpl_1.SheetImpl {\n constructor(_sheetInfo, _zones, _sheetPath, _registryId, _parentStoryPointImpl, _activeDashboardObjectId = 0) {\n super(_sheetInfo, _registryId);\n this._zones = _zones;\n this._sheetPath = _sheetPath;\n this._parentStoryPointImpl = _parentStoryPointImpl;\n this._activeDashboardObjectId = _activeDashboardObjectId;\n }\n get worksheetsImpl() {\n return this._worksheetsImpl;\n }\n get objects() {\n return this._objects;\n }\n get parentStoryPoint() {\n return this._parentStoryPointImpl;\n }\n get activeDashboardObjectId() {\n return this._activeDashboardObjectId;\n }\n get activeDashboardName() {\n return this._sheetPath.sheetName;\n }\n initializeWithPublicInterfaces() {\n this._worksheetsImpl = new Array();\n this._objects = new Array();\n this.zoneMap = new Map();\n // Process all the zones which are contained in this dashboard\n for (const zone of this._zones) {\n let worksheetImpl = undefined;\n const zoneSize = { width: zone.width, height: zone.height };\n // As the dashboard is active, all other zones in the dashboard are inactive.\n const isActive = false;\n if (zone.zoneType === api_internal_contract_js_1.DashboardObjectType.Worksheet || zone.zoneType === api_internal_contract_js_1.DashboardObjectType.QuickFilter) {\n let worksheetName = '';\n let worksheetUrl = '';\n let isHidden = false;\n if (zone.sheetInfo) {\n // zone.sheetInfo was not initialized prior to internal-contract 1.6.0\n worksheetName = zone.sheetInfo.name;\n // worksheetUrl & isHidden is for Embedding only\n worksheetUrl = zone.sheetInfo.url || '';\n // If there's a url, then it's not hidden\n isHidden = worksheetUrl === '';\n }\n else {\n worksheetName = zone.name;\n }\n // Indexes, isActive and some more properties in sheetInfoImpl are embedding specific.\n // But we init them for both extensions and embedding as the Models will only use what is relevant.\n const sheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(worksheetName, api_external_contract_js_1.SheetType.Worksheet, zoneSize, this._worksheetsImpl.length, isActive, isHidden, worksheetUrl);\n const vizId = {\n worksheet: worksheetName,\n dashboard: this._sheetInfoImpl.name,\n storyboard: this._sheetPath.storyboard,\n flipboardZoneID: this._sheetPath.flipboardZoneID,\n storyPointID: this._sheetPath.storyPointID,\n };\n worksheetImpl = new WorksheetImpl_1.WorksheetImpl(sheetInfoImpl, this._registryId, vizId, this, this._parentStoryPointImpl);\n if (zone.zoneType === api_internal_contract_js_1.DashboardObjectType.Worksheet) {\n this._worksheetsImpl.push(worksheetImpl);\n }\n }\n const zonePoint = new Point_1.Point(zone.x, zone.y);\n const dashboardObjectImpl = new DashboardObjectImpl_1.DashboardObjectImpl(this, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dashboardObjectType.convert(zone.zoneType), zonePoint, zoneSize, worksheetImpl, zone.name, zone.isFloating !== undefined ? zone.isFloating : false, // before 1.6.0 we didn't have isFloating, so we assume false\n zone.isVisible !== undefined ? zone.isVisible : true, // before 1.6.0 we didn't have isVisible, so we assume true\n zone.zoneId, zone.fieldId);\n this._objects.push(dashboardObjectImpl);\n this.zoneMap.set(zone.zoneId, dashboardObjectImpl);\n }\n }\n setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap) {\n const zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"zone-service\" /* Zone */);\n return zoneService.setVisibilityAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectVisibilityMap);\n }\n getDashboardObjectById(dashboardObjectId) {\n return this.zoneMap.get(dashboardObjectId);\n }\n updateZones(newZones, newActiveZoneId = 0, newActiveDashboardName = '') {\n // getting previous dashboard objects, active zone ID and active dashboard name\n const oldDashboardObjects = this._objects;\n const oldZoneMap = this.zoneMap;\n const oldActiveZoneId = this._activeDashboardObjectId;\n const oldActiveDashboardName = this._sheetPath.sheetName;\n // updating zones and reinitializing instance variables\n this._zones = newZones;\n this._activeDashboardObjectId = newActiveZoneId;\n if (newActiveDashboardName) {\n this._sheetPath.sheetName = newActiveDashboardName;\n this._sheetInfoImpl.name = newActiveDashboardName;\n }\n this.initializeWithPublicInterfaces();\n // getting new dashboard objects\n const newDashboardObjects = this._objects;\n const newZoneMap = this.zoneMap;\n // initializing map for changes\n const zoneChanges = new Map();\n // comparing old dashboard objects with new ones\n oldDashboardObjects.forEach((oldObject) => {\n const oldId = oldObject.id;\n // checking if zone was removed\n if (!newZoneMap.has(oldId)) {\n this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Removed);\n return;\n }\n const newObject = newZoneMap.get(oldId);\n if (oldObject.isFloating !== newObject.isFloating) {\n this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.IsFloatingChanged);\n }\n if (oldObject.isVisible !== newObject.isVisible) {\n this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.IsVisibleChanged);\n }\n if (oldObject.name !== newObject.name) {\n this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.NameChanged);\n }\n if (oldObject.position.x !== newObject.position.x || oldObject.position.y !== newObject.position.y) {\n this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.PositionChanged);\n }\n if (oldObject.size.width !== newObject.size.width || oldObject.size.height !== newObject.size.height) {\n this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.SizeChanged);\n }\n });\n // Checking for any added zones\n newDashboardObjects.forEach((newObject) => {\n if (!oldZoneMap.has(newObject.id)) {\n this.addChange(newObject.id, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Added);\n }\n });\n // Checking if zone selection has changed\n if (oldActiveZoneId !== newActiveZoneId) {\n if (newActiveZoneId !== 0) {\n this.addChange(newActiveZoneId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Selected);\n }\n if (oldActiveZoneId !== 0) {\n this.addChange(oldActiveZoneId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Deselected);\n }\n }\n // Checking if switched to another dashboard\n if (newActiveDashboardName && oldActiveDashboardName !== newActiveDashboardName) {\n this.addChange(0, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.DashboardChanged);\n }\n return zoneChanges;\n }\n addChange(zoneId, zoneChanges, change) {\n if (!zoneChanges.has(zoneId)) {\n zoneChanges.set(zoneId, []);\n }\n zoneChanges.get(zoneId).push(change);\n }\n moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray) {\n const zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"zone-service\" /* Zone */);\n return zoneService.moveAndResizeAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectPositionAndSizeUpdateArray);\n }\n replayAnimationAsync(replaySpeed) {\n const animationService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"animation-service\" /* Animation */);\n return animationService.replayAsync(replaySpeed);\n }\n getFiltersAsync() {\n this.verifyActiveSheetOrEmbeddedInActiveStoryPoint();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.getDashboardFiltersAsync();\n }\n applyFilterAsync(fieldName, values, updateType, options) {\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'FilterUpdateType');\n ErrorHelpers_1.ErrorHelpers.verifyStringParameter(fieldName, 'fieldName');\n if (!Array.isArray(values)) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'values parameter for applyDashboardFilterAsync must be an array');\n }\n this.verifyActiveSheetOrEmbeddedInActiveStoryPoint();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.applyDashboardFilterAsync(fieldName, values, updateType, options);\n }\n // @W-12986439: remove once initializeWithPublicInterfaces is moved to the constructor for this class\n // This method only exists since worksheetsImpl can be undefined, but we need the worksheet names in the Export APIs\n getWorksheetNamesFromZones() {\n const worksheetNames = [];\n for (const zone of this._zones) {\n if (zone.zoneType !== api_internal_contract_js_1.DashboardObjectType.Worksheet) {\n continue;\n }\n // zone.sheetInfo was not initialized prior to internal-contract 1.6.0\n const worksheetName = zone.sheetInfo ? zone.sheetInfo.name : zone.name;\n worksheetNames.push(worksheetName);\n }\n return worksheetNames;\n }\n verifyActiveSheetOrEmbeddedInActiveStoryPoint() {\n const isRootAndActiveDashboard = this.active;\n const isWithinActiveStoryPoint = this.parentStoryPoint != null && this.parentStoryPoint.active;\n if (!isRootAndActiveDashboard && !isWithinActiveStoryPoint) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.NotActiveSheet, 'Operation not allowed on non-active sheet');\n }\n }\n}\nexports.DashboardImpl = DashboardImpl;\n//# sourceMappingURL=DashboardImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Implementation of the dashboard objects - the zones in a dashboard.\n * This does not follow the Impl pattern as it is just a property bag.\n */\nclass DashboardObjectImpl {\n constructor(_dashboardImpl, _type, _position, _size, _worksheetImpl, _name, _isFloating, _isVisible, _id, _fieldId) {\n this._dashboardImpl = _dashboardImpl;\n this._type = _type;\n this._position = _position;\n this._size = _size;\n this._worksheetImpl = _worksheetImpl;\n this._name = _name;\n this._isFloating = _isFloating;\n this._isVisible = _isVisible;\n this._id = _id;\n this._fieldId = _fieldId;\n }\n get dashboardImpl() {\n return this._dashboardImpl;\n }\n get type() {\n return this._type;\n }\n get position() {\n return this._position;\n }\n get size() {\n return this._size;\n }\n get worksheetImpl() {\n return this._worksheetImpl;\n }\n get name() {\n return this._name;\n }\n get isFloating() {\n return this._isFloating;\n }\n get isVisible() {\n return this._isVisible;\n }\n get id() {\n return this._id;\n }\n get fieldId() {\n return this._fieldId;\n }\n}\nexports.DashboardObjectImpl = DashboardObjectImpl;\n//# sourceMappingURL=DashboardObjectImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst ConnectionSummary_1 = require(\"../ConnectionSummary\");\nconst Field_1 = require(\"../Field\");\nconst LogicalTable_1 = require(\"../LogicalTable\");\nconst ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nconst TableSummary_1 = require(\"../TableSummary\");\nconst ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nconst FieldImpl_1 = require(\"./FieldImpl\");\nclass DataSourceImpl {\n constructor(_dataSourceInfo, _registryId) {\n this._dataSourceInfo = _dataSourceInfo;\n this._registryId = _registryId;\n this._fields = _dataSourceInfo.fields.map((fieldModel) => {\n const fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, this);\n return new Field_1.Field(fieldImpl);\n });\n }\n get name() {\n return this._dataSourceInfo.name;\n }\n get id() {\n return this._dataSourceInfo.id;\n }\n get extractUpdateTime() {\n return this._dataSourceInfo.extractUpdateTime;\n }\n get fields() {\n return this._fields;\n }\n get isExtract() {\n return this._dataSourceInfo.isExtract;\n }\n get isPublished() {\n return this._dataSourceInfo.isPublished;\n }\n publishedUrl() {\n return this._dataSourceInfo.publishedUrl;\n }\n getMaxPageRowLimit() {\n return 10000;\n }\n refreshAsync() {\n const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* DataSourceService */);\n return dataSourceService.refreshAsync(this._dataSourceInfo.id);\n }\n getConnectionSummariesAsync() {\n const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* DataSourceService */);\n return dataSourceService.getConnectionSummariesAsync(this._dataSourceInfo.id).then((summaries) => {\n return summaries.map((summary) => new ConnectionSummary_1.ConnectionSummary(summary));\n });\n }\n getActiveTablesAsync() {\n const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* DataSourceService */);\n return dataSourceService.getActiveTablesAsync(this._dataSourceInfo.id).then((tableInfos) => {\n return tableInfos.map((tableInfo) => new TableSummary_1.TableSummary(tableInfo));\n });\n }\n getUnderlyingDataAsync(options) {\n const getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n options = options || {};\n return getDataService.getDataSourceDataAsync(this.id, !!options.ignoreAliases, options.maxRows || 0, // 0 and [] are defaults\n options.columnsToInclude || [], options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues);\n }\n getLogicalTableDataAsync(logicalTableId, options) {\n const getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n options = options || {};\n return getDataService.getLogicalTableDataAsync(this.id, logicalTableId, !!options.ignoreAliases, options.maxRows || 0, // 0 and [] are defaults\n options.columnsToInclude || [], options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues);\n }\n getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options) {\n const getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n options = options || {};\n return getDataService.getLogicalTableDataReaderAsync(this.id, logicalTableId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues);\n }\n initializeWithPublicInterfaces(dataSource) {\n ErrorHelpers_1.ErrorHelpers.verifyInternalValue(dataSource, 'dataSource');\n this._fields = this._dataSourceInfo.fields.map((fieldModel) => {\n const fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, dataSource);\n return new Field_1.Field(fieldImpl);\n });\n }\n getLogicalTablesAsync() {\n const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* DataSourceService */);\n return dataSourceService.getLogicalTablesAsync(this.id).then((logicalTableInfos) => {\n return logicalTableInfos.map((logicalTableInfo) => new LogicalTable_1.LogicalTable(logicalTableInfo));\n });\n }\n}\nexports.DataSourceImpl = DataSourceImpl;\n//# sourceMappingURL=DataSourceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst InternalContract = require(\"@tableau/api-internal-contract-js\");\nconst InternalToExternalEnumMappings_1 = require(\"../EnumMappings/InternalToExternalEnumMappings\");\nclass FieldImpl {\n constructor(_fieldInfo, _parentDataSource) {\n this._fieldInfo = _fieldInfo;\n this._parentDataSource = _parentDataSource;\n }\n get name() {\n return this._fieldInfo.name;\n }\n get id() {\n return this._fieldInfo.id;\n }\n get description() {\n return this._fieldInfo.description;\n }\n get dataType() {\n var _a;\n return _a = this._fieldInfo.dataType, (_a !== null && _a !== void 0 ? _a : Contract.DataType.Unknown);\n }\n get aggregation() {\n return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation);\n }\n get dataSource() {\n if (!this._parentDataSource)\n throw new Error(`Data source information is not available for this field. Please use getFieldAsync method to get field's data source information`);\n return this._parentDataSource;\n }\n get role() {\n return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldRoleType.convert(this._fieldInfo.role);\n }\n get columnType() {\n let definedValue = this._fieldInfo.columnType || InternalContract.ColumnType.Unknown;\n return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.columnType.convert(definedValue);\n }\n get isCalculatedField() {\n return this._fieldInfo.isCalculatedField;\n }\n get isCombinedField() {\n return this._fieldInfo.isCombinedField;\n }\n get isGenerated() {\n return this._fieldInfo.isGenerated;\n }\n get isGeospatial() {\n return this._fieldInfo.isGeospatial;\n }\n get isHidden() {\n return this._fieldInfo.isHidden;\n }\n get isPresentOnPublishedDatasource() {\n return this._fieldInfo.isPresentOnPublishedDatasource;\n }\n}\nexports.FieldImpl = FieldImpl;\n//# sourceMappingURL=FieldImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst InternalToExternalEnumMappings_1 = require(\"../EnumMappings/InternalToExternalEnumMappings\");\nconst ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nconst DataValueFactory_1 = require(\"../Utils/DataValueFactory\");\nconst ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nconst Param_1 = require(\"../Utils/Param\");\nclass ParameterImpl {\n constructor(parameterInfo, _registryId) {\n this._registryId = _registryId;\n this.setParameterInfo(parameterInfo);\n }\n get name() {\n return this._parameterInfo.name;\n }\n get currentValue() {\n return DataValueFactory_1.DataValueFactory.MakeParameterDataValue(this._parameterInfo.currentValue, this._parameterInfo.dataType);\n }\n get dataType() {\n return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dataType.convert(this._parameterInfo.dataType);\n }\n get id() {\n return this._globalFieldName;\n }\n get allowableValues() {\n return this._allowableValues;\n }\n changeValueAsync(newValue) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(newValue, 'newValue');\n const coercedValue = Param_1.Param.serializeParameterValue(newValue);\n const parametersService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"parameters-service\" /* Parameters */);\n return parametersService.changeParameterValueAsync(this._globalFieldName, coercedValue).then((parameterInfo) => {\n this.setParameterInfo(parameterInfo);\n return this.currentValue;\n });\n }\n setParameterInfo(parameterInfo) {\n this._parameterInfo = parameterInfo;\n this._globalFieldName = parameterInfo.fieldName;\n const type = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.allowableValues.convert(parameterInfo.allowableValuesType);\n let listValues;\n let minValue;\n let maxValue;\n let stepSize;\n let dateStepPeriod;\n if (type === api_external_contract_js_1.ParameterValueType.List) {\n const values = parameterInfo.allowableValues || [];\n listValues = values.map((val) => DataValueFactory_1.DataValueFactory.MakeParameterDataValue(val, parameterInfo.dataType));\n }\n else if (type === api_external_contract_js_1.ParameterValueType.Range) {\n minValue = parameterInfo.minValue && DataValueFactory_1.DataValueFactory.MakeParameterDataValue(parameterInfo.minValue, parameterInfo.dataType);\n maxValue = parameterInfo.maxValue && DataValueFactory_1.DataValueFactory.MakeParameterDataValue(parameterInfo.maxValue, parameterInfo.dataType);\n stepSize = parameterInfo.stepSize;\n dateStepPeriod = parameterInfo.dateStepPeriod && InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateStepPeriod.convert(parameterInfo.dateStepPeriod);\n }\n this._allowableValues = {\n type: type,\n allowableValues: listValues,\n minValue: minValue,\n maxValue: maxValue,\n stepSize: stepSize,\n dateStepPeriod: dateStepPeriod,\n };\n }\n}\nexports.ParameterImpl = ParameterImpl;\n//# sourceMappingURL=ParameterImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nconst TableauError_1 = require(\"../TableauError\");\nconst ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nconst Param_1 = require(\"../Utils/Param\");\nconst SheetUtils_1 = require(\"../Utils/SheetUtils\");\nclass SheetImpl {\n constructor(_sheetInfoImpl, _registryId) {\n this._sheetInfoImpl = _sheetInfoImpl;\n this._registryId = _registryId;\n }\n get name() {\n return this._sheetInfoImpl.name;\n }\n get sheetType() {\n return this._sheetInfoImpl.sheetType;\n }\n get sheetPath() {\n return this._sheetInfoImpl.sheetPath;\n }\n get size() {\n return this._sheetInfoImpl.sheetSize;\n }\n get hidden() {\n if (this._sheetInfoImpl.isHidden !== undefined) {\n return this._sheetInfoImpl.isHidden;\n }\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `isHidden not implemented`);\n }\n get active() {\n if (this._sheetInfoImpl.isActive !== undefined) {\n return this._sheetInfoImpl.isActive;\n }\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `active not implemented`);\n }\n set active(active) {\n if (this._sheetInfoImpl.isActive !== undefined) {\n this._sheetInfoImpl.active = active;\n }\n }\n get index() {\n if (this._sheetInfoImpl.index !== undefined) {\n return this._sheetInfoImpl.index;\n }\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `index not implemented`);\n }\n get url() {\n if (this._sheetInfoImpl.url !== undefined) {\n return this._sheetInfoImpl.url;\n }\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `url not implemented`);\n }\n getSheetSize() {\n if (!SheetUtils_1.SheetUtils.isValidSheetSize(this.size)) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InternalError, 'size is not of type SheetSize');\n }\n return this.size;\n }\n findParameterAsync(parameterName) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(parameterName, 'parameterName');\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"parameters-service\" /* Parameters */);\n return service.findParameterByNameAsync(parameterName);\n }\n getParametersAsync() {\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"parameters-service\" /* Parameters */);\n return service.getParametersForSheetAsync(this.sheetPath);\n }\n changeSizeAsync(newSize) {\n const invalidSizeError = new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Invalid sheet size parameter');\n if (!newSize || !newSize.behavior) {\n throw invalidSizeError;\n }\n const partialSheetSize = this.normalizeSheetSize(newSize);\n const isAutomatic = partialSheetSize.behavior === Contract.SheetSizeBehavior.Automatic;\n if (!isAutomatic && !partialSheetSize.minSize && !partialSheetSize.maxSize) {\n throw invalidSizeError;\n }\n if (!isAutomatic && this.sheetType === Contract.SheetType.Worksheet) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSizeBehaviorOnWorksheet, 'Only SheetSizeBehavior.Automatic is allowed on Worksheets');\n }\n if (isAutomatic && this.getSheetSize().behavior === partialSheetSize.behavior) {\n return Promise.resolve(newSize);\n }\n const processedNewSize = this.processNewSize(partialSheetSize);\n const sizeService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"size-service\" /* Size */);\n return sizeService.changeSizeAsync(this.name, processedNewSize).then(() => {\n const clientInfoService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"client-info-service\" /* ClientInfo */);\n return clientInfoService.getClientInfoAsync().then((bootstrapInfo) => {\n const sheet = bootstrapInfo.publishedSheets.find((s) => s.name === this.name);\n if (!sheet) {\n throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InternalError, `Can't find sheet with name ${this.name}`);\n }\n const sheetSize = SheetUtils_1.SheetUtils.getSheetSizeFromSizeConstraints(sheet.sizeConstraint);\n this._sheetInfoImpl.sheetSize = sheetSize;\n return sheetSize;\n });\n });\n }\n normalizeSheetSize(newSize) {\n const { behavior } = newSize;\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(behavior, Contract.SheetSizeBehavior, 'SheetSizeBehavior');\n const minSize = SheetImpl.parseDimensions(newSize.minSize);\n const maxSize = SheetImpl.parseDimensions(newSize.maxSize);\n return { behavior, minSize, maxSize };\n }\n processNewSize(newSize) {\n var _a, _b, _c, _d;\n const { behavior, minSize: minSizeMaybe, maxSize: maxSizeMaybe } = newSize;\n const hasMinWidth = !Param_1.Param.isNullOrUndefined((_a = minSizeMaybe) === null || _a === void 0 ? void 0 : _a.width);\n const hasMinHeight = !Param_1.Param.isNullOrUndefined((_b = minSizeMaybe) === null || _b === void 0 ? void 0 : _b.height);\n const hasMaxWidth = !Param_1.Param.isNullOrUndefined((_c = maxSizeMaybe) === null || _c === void 0 ? void 0 : _c.width);\n const hasMaxHeight = !Param_1.Param.isNullOrUndefined((_d = maxSizeMaybe) === null || _d === void 0 ? void 0 : _d.height);\n const hasValidMinSize = hasMinWidth && hasMinHeight;\n const hasValidMaxSize = hasMaxWidth && hasMaxHeight;\n switch (behavior) {\n case Contract.SheetSizeBehavior.Automatic: {\n return { behavior };\n }\n case Contract.SheetSizeBehavior.AtMost: {\n if (!maxSizeMaybe || !hasValidMaxSize) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMaxSize, 'Missing maxSize for SheetSizeBehavior.AtMost');\n }\n const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height };\n if (maxSize.width < 0 || maxSize.height < 0) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Size value cannot be less than zero');\n }\n return { behavior, maxSize };\n }\n case Contract.SheetSizeBehavior.AtLeast: {\n if (!minSizeMaybe || !hasValidMinSize) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMinSize, 'Missing minSize for SheetSizeBehavior.AtLeast');\n }\n const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height };\n if (minSize.width < 0 || minSize.height < 0) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Size value cannot be less than zero');\n }\n return { behavior, minSize };\n }\n case Contract.SheetSizeBehavior.Range: {\n if (!minSizeMaybe || !maxSizeMaybe || !hasValidMinSize || !hasValidMaxSize) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMinMaxSize, 'Missing minSize or maxSize for SheetSizeBehavior.Range');\n }\n const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height };\n const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height };\n if (minSize.width < 0 ||\n minSize.height < 0 ||\n maxSize.width < 0 ||\n maxSize.height < 0 ||\n minSize.width > maxSize.width ||\n minSize.height > maxSize.height) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Missing minSize or maxSize for SheetSizeBehavior.Range');\n }\n return { behavior, minSize, maxSize };\n }\n case Contract.SheetSizeBehavior.Exactly: {\n if (minSizeMaybe && maxSizeMaybe) {\n if (hasValidMinSize && hasValidMaxSize) {\n const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height };\n const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height };\n if (minSize.width !== maxSize.width || minSize.height !== maxSize.height) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Conflicting size values for SheetSizeBehavior.Exactly');\n }\n return { behavior, minSize, maxSize };\n }\n if (hasValidMinSize) {\n const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height };\n return { behavior, minSize, maxSize: minSize };\n }\n if (hasValidMaxSize) {\n const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height };\n return { behavior, minSize: maxSize, maxSize };\n }\n }\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Invalid sheet size parameter');\n }\n default: {\n throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InternalError, `Unsupported sheet size behavior: ${behavior}`);\n }\n }\n }\n}\nexports.SheetImpl = SheetImpl;\nSheetImpl.parseDimensions = (size) => {\n const empty = { width: undefined, height: undefined };\n if (!size) {\n return empty;\n }\n const { success: widthParsed, parsed: parsedWidth } = Param_1.Param.tryParseNumber(size.width);\n const { success: heightParsed, parsed: parsedHeight } = Param_1.Param.tryParseNumber(size.height);\n if (widthParsed && heightParsed) {\n return { width: parsedWidth, height: parsedHeight };\n }\n if (widthParsed) {\n return { width: parsedWidth };\n }\n if (heightParsed) {\n return { height: parsedHeight };\n }\n return empty;\n};\n//# sourceMappingURL=SheetImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nclass SheetInfoImpl {\n constructor(_name, _sheetType, _sheetSize, _index, _isActive, _isHidden, _url) {\n this._name = _name;\n this._sheetType = _sheetType;\n this._sheetSize = _sheetSize;\n this._index = _index;\n this._isActive = _isActive;\n this._isHidden = _isHidden;\n this._url = _url;\n }\n get name() {\n return this._name;\n }\n set name(sheetName) {\n this._name = sheetName;\n }\n get sheetSize() {\n return this._sheetSize;\n }\n set sheetSize(value) {\n this._sheetSize = value;\n }\n get sheetType() {\n return this._sheetType;\n }\n get sheetPath() {\n return {\n sheetName: this.name,\n isDashboard: this.sheetType === api_external_contract_js_1.SheetType.Dashboard,\n };\n }\n get index() {\n return this._index;\n }\n get isActive() {\n return this._isActive;\n }\n set active(active) {\n this._isActive = active;\n }\n get isHidden() {\n return this._isHidden;\n }\n get url() {\n return this._url;\n }\n}\nexports.SheetInfoImpl = SheetInfoImpl;\n//# sourceMappingURL=SheetInfoImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * This class implements the SingleEventManager interface for a single type of Tableau event\n *\n * @template TEventType The Tableau event type this class specializes\n */\nclass SingleEventManagerImpl {\n constructor(eventType) {\n this._eventType = eventType;\n this._handlers = [];\n }\n get eventType() {\n return this._eventType;\n }\n addEventListener(handler) {\n this._handlers.push(handler);\n return () => this.removeEventListener(handler);\n }\n removeEventListener(handler) {\n const beforeCount = this._handlers.length;\n this._handlers = this._handlers.filter((h) => h !== handler);\n return beforeCount > this._handlers.length;\n }\n triggerEvent(eventGenerator) {\n for (const handler of this._handlers) {\n try {\n const eventModel = eventGenerator();\n handler(eventModel);\n }\n catch (e) {\n // Since this handler could be outside our control, just catch anything it throws and continue on\n continue;\n }\n }\n }\n}\nexports.SingleEventManagerImpl = SingleEventManagerImpl;\n//# sourceMappingURL=SingleEventManagerImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nconst TableauError_1 = require(\"../TableauError\");\nconst ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nconst ShortLivedDeferred_1 = require(\"../Utils/ShortLivedDeferred\");\nconst SheetImpl_1 = require(\"./SheetImpl\");\nconst StoryPointImpl_1 = require(\"./StoryPointImpl\");\nconst StoryPointInfoImpl_1 = require(\"./StoryPointInfoImpl\");\nclass StoryImpl extends SheetImpl_1.SheetImpl {\n constructor(_sheetInfoImpl, storyModel, _publishedSheetInfos, _registryId) {\n super(_sheetInfoImpl, _registryId);\n this._sheetInfoImpl = _sheetInfoImpl;\n this._publishedSheetInfos = _publishedSheetInfos;\n this._registryId = _registryId;\n this._storyPointInfoImpls = [];\n this._deferred = new ShortLivedDeferred_1.ShortLivedDeferred();\n this.initializeStory(storyModel);\n }\n initializeStory(storyModel) {\n storyModel.storyPoints.forEach((storyPointModel) => {\n const isActive = storyPointModel.index === storyModel.activeStoryPointIndex;\n const storyPointInfoImpl = new StoryPointInfoImpl_1.StoryPointInfoImpl(storyPointModel.caption, storyPointModel.index, storyPointModel.storyPointId, isActive, storyPointModel.updated, this);\n this._storyPointInfoImpls.push(storyPointInfoImpl);\n if (isActive) {\n this._activeStoryPointImpl = new StoryPointImpl_1.StoryPointImpl(storyPointInfoImpl, this._publishedSheetInfos, this._registryId, storyPointModel.containedSheetInfo);\n }\n });\n }\n updateStoryInfo(index, storyPointModel) {\n if (!this._storyPointInfoImpls) {\n return;\n }\n let storyInfoImpl = this._storyPointInfoImpls[index];\n if (storyInfoImpl.storyPointId !== storyPointModel.storyPointId) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.StoryPointIdMismatch, `We should not be updating a story point when the IDs don't match. Existing storyPointID=${storyInfoImpl.storyPointId}, newStoryPointID=${storyPointModel.storyPointId}`);\n }\n storyInfoImpl.caption = storyPointModel.caption;\n storyInfoImpl.updated = storyPointModel.updated;\n if (this._activeStoryPointImpl.storyPointId === storyPointModel.storyPointId) {\n this._activeStoryPointImpl.updated = storyInfoImpl.updated;\n }\n }\n updateStory(storyPointModel) {\n if (!this._storyPointInfoImpls) {\n return;\n }\n this._storyPointInfoImpls.forEach((storyPointInfoImpl) => {\n const isActive = storyPointInfoImpl.storyPointId === storyPointModel.storyPointId;\n if (isActive) {\n // update the state\n storyPointInfoImpl.caption = storyPointModel.caption;\n storyPointInfoImpl.index = storyPointModel.index;\n storyPointInfoImpl.active = true;\n storyPointInfoImpl.updated = storyPointModel.updated;\n // re-initialize activeStoryPointImpl\n this._activeStoryPointImpl = new StoryPointImpl_1.StoryPointImpl(storyPointInfoImpl, this._publishedSheetInfos, this._registryId, storyPointModel.containedSheetInfo);\n }\n else {\n // set old ones to false\n storyPointInfoImpl.active = false;\n }\n });\n if (this.activeStoryPoint) {\n this._deferred.resolve(this.activeStoryPoint);\n }\n }\n get activeStoryPoint() {\n return this._activeStoryPointImpl;\n }\n get storyPointsInfo() {\n return this._storyPointInfoImpls;\n }\n get isActive() {\n return this._sheetInfoImpl.active;\n }\n get isHidden() {\n return !!this._sheetInfoImpl.isHidden;\n }\n activateNextStoryPointAsync() {\n if (this._activeStoryPointImpl.index === this._storyPointInfoImpls.length - 1) {\n return Promise.resolve(this._activeStoryPointImpl);\n }\n let promise = this._deferred.getNewPromiseOrThrowIfBusy();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"story-activation-service\" /* StoryActivation */);\n service.activateNextStoryPointAsync();\n return promise;\n }\n activatePreviousStoryPointAsync() {\n if (this._activeStoryPointImpl.index === 0) {\n return Promise.resolve(this._activeStoryPointImpl);\n }\n let promise = this._deferred.getNewPromiseOrThrowIfBusy();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"story-activation-service\" /* StoryActivation */);\n service.activatePreviousStoryPointAsync();\n return promise;\n }\n activateStoryPointAsync(index) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(index, 'index');\n ErrorHelpers_1.ErrorHelpers.verifyParameterType(index, 'number', 'index');\n if (index < 0 || index >= this._storyPointInfoImpls.length) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.IndexOutOfRange, 'The index passed to this command is out of range.');\n }\n if (index === this._activeStoryPointImpl.index) {\n return Promise.resolve(this._activeStoryPointImpl);\n }\n let promise = this._deferred.getNewPromiseOrThrowIfBusy();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"story-activation-service\" /* StoryActivation */);\n service.activateStoryPointAsync(index);\n return promise;\n }\n revertStoryPointAsync(index) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(index, 'index');\n ErrorHelpers_1.ErrorHelpers.verifyParameterType(index, 'number', 'index');\n if (index < 0 || index >= this._storyPointInfoImpls.length) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.IndexOutOfRange, 'The index passed to this command is out of range.');\n }\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"story-activation-service\" /* StoryActivation */);\n return service.revertStoryPointAsync(index).then((response) => {\n this.updateStoryInfo(response.index, response);\n const storyPointInfoImpl = new StoryPointInfoImpl_1.StoryPointInfoImpl(response.caption, response.index, response.storyPointId, false, response.updated, this);\n return storyPointInfoImpl;\n });\n }\n clearPendingPromises() {\n if (this._deferred) {\n this._deferred.reject('All pending promises cleared');\n }\n }\n}\nexports.StoryImpl = StoryImpl;\n//# sourceMappingURL=StoryImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst TableauError_1 = require(\"../TableauError\");\nconst SheetUtils_1 = require(\"../Utils/SheetUtils\");\nconst DashboardImpl_1 = require(\"./DashboardImpl\");\nconst SheetInfoImpl_1 = require(\"./SheetInfoImpl\");\nconst WorksheetImpl_1 = require(\"./WorksheetImpl\");\nclass StoryPointImpl {\n constructor(_storyPointInfoImpl, sheetInfos, registryId, containedSheetInfo) {\n this._storyPointInfoImpl = _storyPointInfoImpl;\n if (containedSheetInfo) {\n this._containedSheetImpl = this.createContainedSheet(containedSheetInfo, sheetInfos, registryId);\n }\n }\n get index() {\n return this._storyPointInfoImpl.index;\n }\n get caption() {\n return this._storyPointInfoImpl.caption;\n }\n get active() {\n return this._storyPointInfoImpl.active;\n }\n get updated() {\n return this._storyPointInfoImpl.updated;\n }\n set updated(updated) {\n this._storyPointInfoImpl.updated = updated;\n }\n get parentStory() {\n return this._storyPointInfoImpl.parentStory;\n }\n get containedSheet() {\n return this._containedSheetImpl;\n }\n get storyPointId() {\n return this._storyPointInfoImpl.storyPointId;\n }\n createContainedSheet(containedSheetInfo, sheetInfos, registryId) {\n const containedSheetIdx = -1;\n const publishedSheetInfo = SheetUtils_1.SheetUtils.getPublishedSheetInfoByName(containedSheetInfo.name, sheetInfos);\n const containedSheetSize = SheetUtils_1.SheetUtils.createAutomaticSize();\n const isContainedSheetHidden = publishedSheetInfo === undefined;\n const containedSheetUrl = publishedSheetInfo ? publishedSheetInfo.url : '';\n // Contained sheets aren't active - the containing sheet is active.\n const containedSheetActive = false;\n const containedSheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(containedSheetInfo.name, SheetUtils_1.SheetUtils.getSheetTypeEnum(containedSheetInfo.sheetType), containedSheetSize, containedSheetIdx, containedSheetActive, isContainedSheetHidden, containedSheetUrl);\n let sheetImpl;\n switch (containedSheetInfoImpl.sheetType) {\n case Contract.SheetType.Worksheet: {\n const vizId = {\n worksheet: containedSheetInfoImpl.name,\n };\n sheetImpl = new WorksheetImpl_1.WorksheetImpl(containedSheetInfoImpl, registryId, vizId, null, this);\n break;\n }\n case Contract.SheetType.Dashboard: {\n const sheetPath = {\n sheetName: containedSheetInfoImpl.name,\n isDashboard: true,\n };\n sheetImpl = new DashboardImpl_1.DashboardImpl(containedSheetInfoImpl, containedSheetInfo.dashboardZones, sheetPath, registryId, this);\n break;\n }\n default: {\n throw new TableauError_1.TableauError(Contract.SharedErrorCodes.ServerError, 'Invalid SheetType');\n }\n }\n return sheetImpl;\n }\n}\nexports.StoryPointImpl = StoryPointImpl;\n//# sourceMappingURL=StoryPointImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nclass StoryPointInfoImpl {\n constructor(_caption, _index, _storyPointId, _active, _updated, _parentStoryImpl) {\n this._caption = _caption;\n this._index = _index;\n this._storyPointId = _storyPointId;\n this._active = _active;\n this._updated = _updated;\n this._parentStoryImpl = _parentStoryImpl;\n }\n get caption() {\n return this._caption;\n }\n set caption(caption) {\n this._caption = caption;\n }\n get index() {\n return this._index;\n }\n set index(index) {\n this._index = index;\n }\n get storyPointId() {\n return this._storyPointId;\n }\n get active() {\n return this._active;\n }\n set active(isActive) {\n this._active = isActive;\n }\n get updated() {\n return this._updated;\n }\n set updated(isUpdated) {\n this._updated = isUpdated;\n }\n get parentStory() {\n return this._parentStoryImpl;\n }\n}\nexports.StoryPointInfoImpl = StoryPointInfoImpl;\n//# sourceMappingURL=StoryPointInfoImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nclass WorkbookImpl {\n}\nexports.WorkbookImpl = WorkbookImpl;\n//# sourceMappingURL=WorkbookImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst DataSource_1 = require(\"../DataSource\");\nconst LogicalTable_1 = require(\"../LogicalTable\");\nconst GetDataService_1 = require(\"../Services/GetDataService\");\nconst ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nconst TableauError_1 = require(\"../TableauError\");\nconst ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nconst DataSourceImpl_1 = require(\"./DataSourceImpl\");\nconst SheetImpl_1 = require(\"./SheetImpl\");\nclass WorksheetImpl extends SheetImpl_1.SheetImpl {\n constructor(sheetInfoImpl, _registryId, _visualId, _parentDashboardImpl, _parentStoryPointImpl, _backgroundColor = null, _formatting = null) {\n super(sheetInfoImpl, _registryId);\n this._visualId = _visualId;\n this._parentDashboardImpl = _parentDashboardImpl;\n this._parentStoryPointImpl = _parentStoryPointImpl;\n this._backgroundColor = _backgroundColor;\n this._formatting = _formatting;\n }\n get parentDashboard() {\n return this._parentDashboardImpl;\n }\n get parentStoryPoint() {\n return this._parentStoryPointImpl;\n }\n get visualId() {\n return this._visualId;\n }\n getMaxPageRowLimit() {\n return 10000;\n }\n get backgroundColor() {\n return this._backgroundColor;\n }\n get formatting() {\n return this._formatting;\n }\n applyFilterAsync(fieldName, values, updateType, options) {\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'Contract.FilterUpdateType');\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.applyFilterAsync(this.visualId, fieldName, values, updateType, options);\n }\n applyRangeFilterAsync(fieldName, filterOptions) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName');\n ErrorHelpers_1.ErrorHelpers.verifyParameter(filterOptions, 'filterOptions');\n if (filterOptions.nullOption) {\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(filterOptions.nullOption, api_external_contract_js_1.FilterNullOption, 'FilterNullOption');\n }\n else {\n ErrorHelpers_1.ErrorHelpers.verifyRangeParamType(filterOptions.min, filterOptions.max);\n }\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.applyRangeFilterAsync(this.visualId, fieldName, filterOptions);\n }\n applyHierarchicalFilterAsync(fieldName, values, updateType, options) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName');\n ErrorHelpers_1.ErrorHelpers.verifyParameter(values, 'values');\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'Contract.FilterUpdateType');\n if (!Array.isArray(values) && !values.levels) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'values parameter for applyHierarchicalFilterAsync must be an array or contain a levels key');\n }\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.applyHierarchicalFilterAsync(this.visualId, fieldName, values, updateType, options);\n }\n clearFilterAsync(fieldName) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName');\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.clearFilterAsync(this.visualId, fieldName);\n }\n applyRelativeDateFilterAsync(fieldName, options) {\n ErrorHelpers_1.ErrorHelpers.verifyStringParameter(fieldName, 'fieldName');\n ErrorHelpers_1.ErrorHelpers.verifyParameter(options, 'options');\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(options.periodType, api_external_contract_js_1.PeriodType, 'PeriodType');\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(options.rangeType, api_external_contract_js_1.DateRangeType, 'DateRangeType');\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.applyRelativeDateFilterAsync(this.visualId, fieldName, options);\n }\n getDataSourcesAsync() {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* DataSourceService */);\n return service.getDataSourcesAsync(this.visualId).then((result) => {\n const dataSchema = result;\n const worksheetDataSourceInfo = dataSchema.worksheetDataSchemaMap[this.name];\n const dataSources = [];\n // First, add the primary datasource. By convention, it comes first in the returned array.\n const primaryId = worksheetDataSourceInfo.primaryDataSource;\n dataSources.push(this.createDataSourceFromInfo(dataSchema.dataSources[primaryId]));\n // Then, loop through any secondary data sources and add them.\n for (const secondaryId of worksheetDataSourceInfo.referencedDataSourceList) {\n if (secondaryId !== primaryId) {\n dataSources.push(this.createDataSourceFromInfo(dataSchema.dataSources[secondaryId]));\n }\n }\n return dataSources;\n });\n }\n getFiltersAsync() {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.getFiltersAsync(this.visualId);\n }\n getSelectedMarksAsync() {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n return service.getSelectedMarksAsync(this.visualId);\n }\n getHighlightedMarksAsync() {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n return service.getHighlightedMarksAsync(this.visualId);\n }\n getSummaryDataAsync(options) {\n var _a;\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n options = options || {};\n return service.getUnderlyingDataAsync(this.visualId, GetDataService_1.GetDataType.Summary, !!options.ignoreAliases, !!options.ignoreSelection, true, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false)));\n }\n getSummaryDataReaderAsync(pageRowCount, options) {\n var _a;\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n options = options || {};\n return service.getSummaryDataReaderAsync(this.visualId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, !!options.ignoreSelection, true, // includeAllColumns (can be overridden by columnsToIncludeById)\n options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false)));\n }\n getVisualSpecificationAsync() {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"visual-model-service\" /* VisualModel */);\n return service.getVisualSpecificationAsync(this.visualId);\n }\n addMarksCardFieldsAsync(marksCardIndex, encodingType, columns, startIndex) {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"visual-model-service\" /* VisualModel */);\n return service.addMarksCardFieldsAsync(this.visualId, marksCardIndex, encodingType, columns, startIndex);\n }\n moveMarksCardFieldAsync(marksCardIndex, fromIndex, toIndex, fieldCount) {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"visual-model-service\" /* VisualModel */);\n return service.moveMarksCardFieldAsync(this.visualId, marksCardIndex, fromIndex, toIndex, fieldCount);\n }\n spliceMarksCardFieldsAsync(marksCardIndex, encodingType, startIndex, deleteCount, columns) {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"visual-model-service\" /* VisualModel */);\n return service.spliceMarksCardFieldsAsync(this.visualId, marksCardIndex, encodingType, startIndex, deleteCount, columns);\n }\n getSummaryColumnsInfoAsync() {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n return service.getSummaryColumnsInfoAsync(this.visualId);\n }\n getUnderlyingDataAsync(options) {\n var _a;\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n options = options || {};\n return service.getUnderlyingDataAsync(this.visualId, GetDataService_1.GetDataType.Underlying, !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false)));\n }\n getUnderlyingTablesAsync() {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* DataSourceService */);\n return service.getUnderlyingTablesAsync(this.visualId).then((logicalTableInfos) => {\n return logicalTableInfos.map((logicalTableInfo) => new LogicalTable_1.LogicalTable(logicalTableInfo));\n });\n }\n getUnderlyingTableDataAsync(logicalTableId, options) {\n var _a;\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n options = options || {};\n return service.getUnderlyingTableDataAsync(this.visualId, logicalTableId, !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false)));\n }\n getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options) {\n var _a;\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n options = options || {};\n return service.getUnderlyingTableDataReaderAsync(this.visualId, logicalTableId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false)));\n }\n clearSelectedMarksAsync() {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"selection-service\" /* Selection */);\n return service.clearSelectedMarksAsync(this.visualId);\n }\n selectMarksByValueAsync(selections, selectionUpdateType) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(selections, 'fieldName');\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(selectionUpdateType, api_external_contract_js_1.SelectionUpdateType, 'SelectionUpdateType');\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"selection-service\" /* Selection */);\n return service.selectMarksByValueAsync(this.visualId, selections, selectionUpdateType);\n }\n selectMarksByIdAsync(selections, selectionUpdateType) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(selections, 'fieldName');\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(selectionUpdateType, api_external_contract_js_1.SelectionUpdateType, 'SelectionUpdateType');\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"selection-service\" /* Selection */);\n return service.selectMarksByIdAsync(this.visualId, selections, selectionUpdateType);\n }\n annotateMarkAsync(mark, annotationText) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(mark, 'mark');\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"annotation-service\" /* Annotation */);\n return service.annotateMarkAsync(this.visualId, mark, annotationText);\n }\n getAnnotationsAsync() {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"annotation-service\" /* Annotation */);\n return service.getAnnotationsAsync(this.visualId);\n }\n removeAnnotationAsync(annotation) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(annotation, 'annotation');\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"annotation-service\" /* Annotation */);\n return service.removeAnnotationAsync(this.visualId, annotation);\n }\n appendContextMenuAsync(targetMenu, config) {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"external-context-menu-service\" /* ExternalContextMenu */);\n return service.appendContextMenuAsync(this.visualId.worksheet, targetMenu, config);\n }\n removeContextMenuAsync(targetMenu, menuItemId) {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"external-context-menu-service\" /* ExternalContextMenu */);\n return service.removeContextMenuAsync(this.visualId.worksheet, targetMenu, menuItemId);\n }\n executeContextMenuAsync(targetMenu, menuItemId) {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"external-context-menu-service\" /* ExternalContextMenu */);\n return service.executeContextMenuAsync(this.visualId.worksheet, targetMenu, menuItemId);\n }\n renameContextMenuAsync(targetMenu, menuHeader, menuDescription) {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"external-context-menu-service\" /* ExternalContextMenu */);\n return service.renameContextMenuAsync(this.visualId.worksheet, targetMenu, menuHeader, menuDescription);\n }\n hoverTupleAsync(hoveredTuple, tooltip, allowHoverActions) {\n if (this.isInsideDashboardExtension()) {\n return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `hoverTupleAsync is not supported in dashboard extensions`));\n }\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"selection-service\" /* Selection */);\n return service.hoverTupleAsync(this.visualId, hoveredTuple, tooltip, allowHoverActions);\n }\n selectTuplesAsync(selectedTuples, selectOption, tooltip) {\n if (this.isInsideDashboardExtension()) {\n return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `selectTuplesAsync is not supported in dashboard extensions`));\n }\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"selection-service\" /* Selection */);\n return service.selectTuplesAsync(this.visualId, selectedTuples, selectOption, tooltip);\n }\n getTooltipTextAsync(tupleId) {\n if (this.isInsideDashboardExtension()) {\n return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `getTooltipTextAsync is not supported in dashboard extensions`));\n }\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"accessibility\" /* Accessibility */);\n return service.getTooltipTextAsync(this.visualId, tupleId);\n }\n leaveMarkNavigationAsync() {\n if (this.isInsideDashboardExtension()) {\n return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `leaveMarkNavigationAsync is not supported in dashboard extensions`));\n }\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"accessibility\" /* Accessibility */);\n return service.leaveMarkNavigationAsync(this.visualId);\n }\n editAliasesDialogAsync(fieldName) {\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"visual-model-service\" /* VisualModel */);\n return service.editAliasesDialogAsync(fieldName);\n }\n createDataSourceFromInfo(dataSourceInfo) {\n const dataSourceImpl = new DataSourceImpl_1.DataSourceImpl(dataSourceInfo, this._registryId);\n const dataSource = new DataSource_1.DataSource(dataSourceImpl);\n dataSourceImpl.initializeWithPublicInterfaces(dataSource);\n return dataSource;\n }\n verifyActiveSheet() {\n const isRootAndActiveWorksheet = this.active;\n const isInsideActiveDashboard = this.isInsideActiveDashboard();\n const isInsideActiveStoryPoint = this.isInsideActiveStoryPoint();\n if (!isRootAndActiveWorksheet && !isInsideActiveDashboard && !isInsideActiveStoryPoint) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.NotActiveSheet, 'Operation not allowed on non-active sheet');\n }\n }\n isInsideActiveStoryPoint() {\n return this._parentStoryPointImpl && this._parentStoryPointImpl.active;\n }\n isInsideActiveDashboard() {\n return this._parentDashboardImpl && this._parentDashboardImpl.active;\n }\n isInsideDashboardExtension() {\n return this._parentDashboardImpl !== null;\n }\n}\nexports.WorksheetImpl = WorksheetImpl;\n//# sourceMappingURL=WorksheetImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Implementation of a logical table.\n * This does not follow the Impl pattern as it is just a property bag.\n */\nclass LogicalTable {\n constructor(_logicalTable) {\n this._logicalTable = _logicalTable;\n }\n get id() {\n return this._logicalTable.id;\n }\n get caption() {\n return this._logicalTable.caption;\n }\n}\nexports.LogicalTable = LogicalTable;\n//# sourceMappingURL=LogicalTable.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nclass TooltipTextRequestModel {\n constructor(visualIdPresModel, tupleId) {\n this.visualIdPresModel = visualIdPresModel;\n this.tupleId = tupleId;\n }\n}\nexports.TooltipTextRequestModel = TooltipTextRequestModel;\n//# sourceMappingURL=AccessibilityModels.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nconst ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nclass Filter {\n constructor(_worksheetName, _fieldName, _filterType, _fieldId, _registryId) {\n this._worksheetName = _worksheetName;\n this._fieldName = _fieldName;\n this._filterType = _filterType;\n this._fieldId = _fieldId;\n this._registryId = _registryId;\n }\n get worksheetName() {\n return this._worksheetName;\n }\n get fieldName() {\n return this._fieldName;\n }\n get fieldId() {\n return this._fieldId;\n }\n get filterType() {\n return this._filterType;\n }\n getFieldAsync() {\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* DataSourceService */);\n return service.getFieldAsync(this._fieldId);\n }\n getAppliedWorksheetsAsync() {\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.getAppliedWorksheetsAsync(this._worksheetName, this._fieldId);\n }\n setAppliedWorksheetsAsync(applyToWorksheets) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(applyToWorksheets, 'applyToWorksheets');\n const uniqueWorksheets = new Set(applyToWorksheets);\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.setAppliedWorksheetsAsync(this._worksheetName, this._fieldName, this._fieldId, Array.from(uniqueWorksheets));\n }\n}\nexports.Filter = Filter;\nclass CategoricalFilter extends Filter {\n constructor(worksheetName, fieldName, fieldId, filterType, registryId, _appliedValues, _isExcludeMode, _isAllSelected) {\n super(worksheetName, fieldName, filterType, fieldId, registryId);\n this._appliedValues = _appliedValues;\n this._isExcludeMode = _isExcludeMode;\n this._isAllSelected = _isAllSelected;\n }\n get isAllSelected() {\n return this._isAllSelected;\n }\n get appliedValues() {\n return this._appliedValues;\n }\n get isExcludeMode() {\n return this._isExcludeMode;\n }\n getDomainAsync(domainType) {\n if (!domainType) {\n domainType = api_external_contract_js_1.FilterDomainType.Relevant;\n }\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(domainType, api_external_contract_js_1.FilterDomainType, 'FilterDomainType');\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.getCategoricalDomainAsync(this._worksheetName, this._fieldId, domainType);\n }\n}\nexports.CategoricalFilter = CategoricalFilter;\nclass HierarchicalDataValue {\n constructor(_value, _hierarchicalPath, _level) {\n this._value = _value;\n this._hierarchicalPath = _hierarchicalPath;\n this._level = _level;\n }\n get value() {\n return this._value;\n }\n get hierarchicalPath() {\n return this._hierarchicalPath;\n }\n get level() {\n return this._level;\n }\n}\nexports.HierarchicalDataValue = HierarchicalDataValue;\nclass HierarchicalLevelDetail {\n constructor(_name, _levelSelectionState) {\n this._name = _name;\n this._levelSelectionState = _levelSelectionState;\n }\n get name() {\n return this._name;\n }\n get levelSelectionState() {\n return this._levelSelectionState;\n }\n}\nexports.HierarchicalLevelDetail = HierarchicalLevelDetail;\nclass HierarchicalFilter extends Filter {\n constructor(worksheetName, fieldName, fieldId, filterType, registryId, _dimensionName, _hierarchyCaption, _numberOfLevels, _levelDetails, _appliedValues, _isAllSelected) {\n super(worksheetName, fieldName, filterType, fieldId, registryId);\n this._dimensionName = _dimensionName;\n this._hierarchyCaption = _hierarchyCaption;\n this._numberOfLevels = _numberOfLevels;\n this._levelDetails = _levelDetails;\n this._appliedValues = _appliedValues;\n this._isAllSelected = _isAllSelected;\n }\n getDomainAsync(domainType) {\n throw new Error('Method not implemented.');\n }\n get dimensionName() {\n return this._dimensionName;\n }\n get hierarchyCaption() {\n return this._hierarchyCaption;\n }\n get numberOfLevels() {\n return this._numberOfLevels;\n }\n get levelDetails() {\n return this._levelDetails;\n }\n get isAllSelected() {\n return this._isAllSelected;\n }\n get appliedValues() {\n return this._appliedValues;\n }\n}\nexports.HierarchicalFilter = HierarchicalFilter;\nclass RangeFilter extends Filter {\n constructor(worksheetName, fieldName, fieldId, filterType, registryId, _min, _max, _includeNullValues) {\n super(worksheetName, fieldName, filterType, fieldId, registryId);\n this._min = _min;\n this._max = _max;\n this._includeNullValues = _includeNullValues;\n }\n get minValue() {\n return this._min;\n }\n get maxValue() {\n return this._max;\n }\n get includeNullValues() {\n return this._includeNullValues;\n }\n getDomainAsync(domainType) {\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n if (!domainType) {\n domainType = api_external_contract_js_1.FilterDomainType.Relevant;\n }\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(domainType, api_external_contract_js_1.FilterDomainType, 'FilterDomainType');\n return service.getRangeDomainAsync(this._worksheetName, this._fieldId, domainType);\n }\n}\nexports.RangeFilter = RangeFilter;\nclass RelativeDateFilter extends Filter {\n constructor(worksheetName, fieldName, fieldId, filterType, registryId, _anchorDate, _periodType, _rangeType, _rangeN) {\n super(worksheetName, fieldName, filterType, fieldId, registryId);\n this._anchorDate = _anchorDate;\n this._periodType = _periodType;\n this._rangeType = _rangeType;\n this._rangeN = _rangeN;\n }\n get anchorDate() {\n return this._anchorDate;\n }\n get periodType() {\n return this._periodType;\n }\n get rangeType() {\n return this._rangeType;\n }\n get rangeN() {\n return this._rangeN;\n }\n}\nexports.RelativeDateFilter = RelativeDateFilter;\nclass CategoricalDomain {\n constructor(_values, _domainType) {\n this._values = _values;\n this._domainType = _domainType;\n }\n get values() {\n return this._values;\n }\n get type() {\n return this._domainType;\n }\n}\nexports.CategoricalDomain = CategoricalDomain;\nclass RangeDomain {\n constructor(_min, _max, _domainType) {\n this._min = _min;\n this._max = _max;\n this._domainType = _domainType;\n }\n get type() {\n return this._domainType;\n }\n get min() {\n return this._min;\n }\n get max() {\n return this._max;\n }\n}\nexports.RangeDomain = RangeDomain;\n//# sourceMappingURL=FilterModels.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nclass DataTable {\n constructor(_data, _columns, _totalRowCount, _isTotalRowCountLimited, _isSummaryData, _marksInfo) {\n this._data = _data;\n this._columns = _columns;\n this._totalRowCount = _totalRowCount;\n this._isTotalRowCountLimited = _isTotalRowCountLimited;\n this._isSummaryData = _isSummaryData;\n this._marksInfo = _marksInfo;\n this._name = _isSummaryData ? 'Summary Data Table' : 'Underlying Data Table';\n }\n get name() {\n return this._name;\n }\n get data() {\n return this._data;\n }\n get columns() {\n return this._columns;\n }\n get marksInfo() {\n return this._marksInfo;\n }\n get totalRowCount() {\n return this._totalRowCount;\n }\n get isTotalRowCountLimited() {\n return this._isTotalRowCountLimited;\n }\n get isSummaryData() {\n return this._isSummaryData;\n }\n}\nexports.DataTable = DataTable;\nclass MarkInfo {\n constructor(_type, _color, _tupleId) {\n this._type = _type;\n this._color = _color;\n this._tupleId = _tupleId;\n }\n get type() {\n return this._type;\n }\n get color() {\n return this._color;\n }\n get tupleId() {\n return this._tupleId;\n }\n}\nexports.MarkInfo = MarkInfo;\nclass Column {\n constructor(_fieldName, _fieldId, _dataType, _isReferenced, _index) {\n this._fieldName = _fieldName;\n this._fieldId = _fieldId;\n this._dataType = _dataType;\n this._isReferenced = _isReferenced;\n this._index = _index;\n }\n get fieldName() {\n return this._fieldName;\n }\n get fieldId() {\n return this._fieldId;\n }\n get dataType() {\n return this._dataType;\n }\n get isReferenced() {\n return this._isReferenced;\n }\n get index() {\n return this._index;\n }\n}\nexports.Column = Column;\nclass DataValue {\n /* tslint:disable:no-any */\n constructor(_value, _nativeValue, _formattedValue, _aliasValue, _hasAlias) {\n this._value = _value;\n this._nativeValue = _nativeValue;\n this._formattedValue = _formattedValue;\n this._aliasValue = _aliasValue;\n this._hasAlias = _hasAlias;\n }\n get value() {\n return this._value;\n }\n get nativeValue() {\n return this._nativeValue;\n }\n get formattedValue() {\n return this._formattedValue;\n }\n get aliasValue() {\n return this._aliasValue;\n }\n get hasAlias() {\n return this._hasAlias;\n }\n}\nexports.DataValue = DataValue;\n//# sourceMappingURL=GetDataModels.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nconst ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nclass DataTableReader {\n constructor(_id, _totalRowCount, _pageRowCount, _registryId) {\n this._id = _id;\n this._totalRowCount = _totalRowCount;\n this._pageRowCount = _pageRowCount;\n this._registryId = _registryId;\n this._pageCount = Math.ceil(_totalRowCount / _pageRowCount);\n }\n get totalRowCount() {\n return this._totalRowCount;\n }\n get pageCount() {\n return this._pageCount;\n }\n getPageAsync(pageNumber) {\n ErrorHelpers_1.ErrorHelpers.verifyRange(pageNumber, 0, this._pageCount);\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n return service.getPageAsync(this._id, pageNumber, this._pageRowCount);\n }\n getAllPagesAsync(maxRows) {\n return __awaiter(this, void 0, void 0, function* () {\n const firstPage = yield this.getPageAsync(0);\n maxRows = maxRows || this.totalRowCount;\n const rowsRequested = Math.min(maxRows, this.totalRowCount);\n const pagesRequested = Math.ceil(rowsRequested / this._pageRowCount);\n // Fetch up to 400 pages, with a default of 10,000 pageRowCount that gives us 4,000,000 rows\n const pagesToFetch = Math.min(pagesRequested, 400);\n const isDataLimited = pagesToFetch < pagesRequested;\n let remainingData = [];\n for (let i = 1; i < pagesToFetch; i++) {\n const page = yield this.getPageAsync(i);\n remainingData.push(page.data);\n }\n let fullData = firstPage.data.concat(...remainingData);\n // This slices the array only if maxRows has been set and is less than totalRowCount\n fullData.length = rowsRequested;\n return {\n name: firstPage.name,\n data: fullData,\n columns: firstPage.columns,\n totalRowCount: isDataLimited ? pagesToFetch * this._pageRowCount : rowsRequested,\n isTotalRowCountLimited: isDataLimited,\n isSummaryData: firstPage.isSummaryData,\n };\n });\n }\n releaseAsync() {\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n return service.releaseAsync(this._id);\n }\n}\nexports.DataTableReader = DataTableReader;\n//# sourceMappingURL=GetDataTableReaderModels.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Selection Model.\n */\nclass SelectionModel {\n}\nexports.SelectionModel = SelectionModel;\n/**\n * Value based selection model. Meant for hierarchical, range and categorical selections.\n */\nclass ValueSelectionModel extends SelectionModel {\n constructor() {\n super(...arguments);\n this.selectValues = [];\n }\n}\nexports.ValueSelectionModel = ValueSelectionModel;\n/**\n * Hierarchical value selection model\n */\nclass HierarchicalSelectionModel extends ValueSelectionModel {\n}\nexports.HierarchicalSelectionModel = HierarchicalSelectionModel;\n/**\n * Range based value selection model\n */\nclass RangeSelectionModel extends SelectionModel {\n}\nexports.RangeSelectionModel = RangeSelectionModel;\n/**\n * Dimension value selection model\n */\nclass DimensionSelectionModel extends ValueSelectionModel {\n}\nexports.DimensionSelectionModel = DimensionSelectionModel;\n/**\n * Tuple based selection model\n */\nclass TupleSelectionModel {\n constructor() {\n this.objectIds = [];\n }\n}\nexports.TupleSelectionModel = TupleSelectionModel;\n/**\n * Container class to populate all the selection models when parsing input\n */\nclass SelectionModelsContainer {\n constructor() {\n this.hierModelArr = [];\n this.dimModelArr = [];\n this.quantModelArr = [];\n }\n}\nexports.SelectionModelsContainer = SelectionModelsContainer;\nclass SelectTuplesInteractionModel {\n constructor(visualIdPresModel, tupleIds = [], selectOptions, tooltipContext) {\n this.visualIdPresModel = visualIdPresModel;\n this.tupleIds = tupleIds;\n this.selectOptions = selectOptions;\n this.tooltipContext = tooltipContext;\n }\n}\nexports.SelectTuplesInteractionModel = SelectTuplesInteractionModel;\nclass HoverTupleInteractionModel {\n constructor(visualIdPresModel, tupleId, tooltipContext, allowHoverActions) {\n this.visualIdPresModel = visualIdPresModel;\n this.tupleId = tupleId;\n this.tooltipContext = tooltipContext;\n this.allowHoverActions = allowHoverActions;\n }\n}\nexports.HoverTupleInteractionModel = HoverTupleInteractionModel;\n//# sourceMappingURL=SelectionModels.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nclass Point {\n constructor(_x, _y) {\n this._x = _x;\n this._y = _y;\n }\n get x() {\n return this._x;\n }\n get y() {\n return this._y;\n }\n}\nexports.Point = Point;\n//# sourceMappingURL=Point.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Defines which type of getData call to make.\n */\nvar GetDataType;\n(function (GetDataType) {\n GetDataType[\"Summary\"] = \"summary\";\n GetDataType[\"Underlying\"] = \"underlying\";\n})(GetDataType = exports.GetDataType || (exports.GetDataType = {}));\n//# sourceMappingURL=GetDataService.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst ServiceRegistry_1 = require(\"./ServiceRegistry\");\nconst AccessibilityServiceImpl_1 = require(\"./impl/AccessibilityServiceImpl\");\nconst AnimationServiceImpl_1 = require(\"./impl/AnimationServiceImpl\");\nconst AnnotationServiceImpl_1 = require(\"./impl/AnnotationServiceImpl\");\nconst DataSourceServiceImpl_1 = require(\"./impl/DataSourceServiceImpl\");\nconst ExportServiceImpl_1 = require(\"./impl/ExportServiceImpl\");\nconst ExternalContextMenuServiceImpl_1 = require(\"./impl/ExternalContextMenuServiceImpl\");\nconst FilterServiceImpl_1 = require(\"./impl/FilterServiceImpl\");\nconst GetDataServiceImpl_1 = require(\"./impl/GetDataServiceImpl\");\nconst NotificationServiceImpl_1 = require(\"./impl/NotificationServiceImpl\");\nconst ParametersServiceImpl_1 = require(\"./impl/ParametersServiceImpl\");\nconst SelectionServiceImpl_1 = require(\"./impl/SelectionServiceImpl\");\nconst SizeServiceImpl_1 = require(\"./impl/SizeServiceImpl\");\nconst VisualModelServiceImpl_1 = require(\"./impl/VisualModelServiceImpl\");\nconst VizServiceImpl_1 = require(\"./impl/VizServiceImpl\");\nconst ZoneServiceImpl_1 = require(\"./impl/ZoneServiceImpl\");\nfunction registerAllSharedServices(dispatcher, registryId) {\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new AnimationServiceImpl_1.AnimationServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new DataSourceServiceImpl_1.DataSourceServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ExportServiceImpl_1.ExportServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new GetDataServiceImpl_1.GetDataServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new FilterServiceImpl_1.FilterServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new NotificationServiceImpl_1.NotificationServiceImpl(dispatcher));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ParametersServiceImpl_1.ParametersServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new SelectionServiceImpl_1.SelectionServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new AnnotationServiceImpl_1.AnnotationServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ZoneServiceImpl_1.ZoneServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new SizeServiceImpl_1.SizeServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new VisualModelServiceImpl_1.VisualModelServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new VizServiceImpl_1.VizServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ExternalContextMenuServiceImpl_1.ExternalContextMenuServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new AccessibilityServiceImpl_1.AccessibilityServiceImpl(dispatcher, registryId));\n}\nexports.registerAllSharedServices = registerAllSharedServices;\n//# sourceMappingURL=RegisterAllSharedServices.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst TableauError_1 = require(\"../TableauError\");\nif (typeof window !== 'undefined') {\n window.__tableauApiServiceRegistry = window.__tableauApiServiceRegistry || {};\n}\nclass ServiceRegistryImpl {\n constructor() {\n this._services = {};\n }\n registerService(service) {\n this._services[service.serviceName] = service;\n }\n getService(serviceName) {\n if (!this._services.hasOwnProperty(serviceName)) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Service not registered: ${serviceName}`);\n }\n return this._services[serviceName];\n }\n}\n/**\n * Static class used for getting access to the single instance\n * of the ApiServiceRegistry associated with the registryId.\n *\n * Extensions by design don't need to store/access multiple service registries. Their single instance of ServiceRegistry is\n * stored/access with registryId = 0.\n *\n * Whereas Embedding needs to be aware of which ServiceRegistry to use when there are multiple vizzes embedded.\n * An example of how window.__tableauApiServiceRegistry will look when there are two vizzes: { 0 : ServiceRegistry, 1 : ServiceRegistry}\n * where registry ID of 0 & 1 refers to viz's internal identifier (which is generated by VizManager).\n */\nclass ApiServiceRegistry {\n /**\n * Gets the singleton instance of the ServiceRegistry\n */\n static get(registryId) {\n if (!window.__tableauApiServiceRegistry || !window.__tableauApiServiceRegistry[registryId]) {\n ApiServiceRegistry.setInstance(registryId, new ServiceRegistryImpl());\n }\n if (!window.__tableauApiServiceRegistry[registryId]) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Service registry failed');\n }\n return window.__tableauApiServiceRegistry[registryId];\n }\n /**\n * Helper method that sets the service registry instance for the corresponding registryId. Can be used by unit tests\n *\n * @param {ServiceRegistry} serviceRegistry The new registry\n */\n static setInstance(registryId, serviceRegistry) {\n if (!window.__tableauApiServiceRegistry) {\n window.__tableauApiServiceRegistry = {};\n }\n window.__tableauApiServiceRegistry[registryId] = serviceRegistry;\n }\n /**\n * Only used by unit tests\n */\n static clearRegistry() {\n window.__tableauApiServiceRegistry = {};\n }\n // Private to avoid anyone constructing this\n constructor() { }\n}\nexports.ApiServiceRegistry = ApiServiceRegistry;\n//# sourceMappingURL=ServiceRegistry.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst AccessibilityModels_1 = require(\"../../Models/AccessibilityModels\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass AccessibilityServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"accessibility\" /* Accessibility */;\n }\n getTooltipTextAsync(visualId, tupleId) {\n let tooltipTextRequest = new AccessibilityModels_1.TooltipTextRequestModel(visualId, tupleId);\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getTooltipTextAsync',\n [api_internal_contract_js_1.ParameterId.TooltipTextRequest]: tooltipTextRequest,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetTooltipText, parameters).then((response) => {\n return response.result;\n });\n }\n leaveMarkNavigationAsync(visualId) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'leaveMarkNavigationAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n };\n return this.execute(api_internal_contract_js_1.VerbId.RaiseLeaveMarkNavNotification, parameters).then((response) => {\n return;\n });\n }\n}\nexports.AccessibilityServiceImpl = AccessibilityServiceImpl;\n//# sourceMappingURL=AccessibilityServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst ExternalToInternalEnumMappings_1 = require(\"../../EnumMappings/ExternalToInternalEnumMappings\");\nconst ErrorHelpers_1 = require(\"../../Utils/ErrorHelpers\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass AnimationServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"animation-service\" /* Animation */;\n }\n replayAsync(replaySpeed) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.ReplaySpeed]: 1.0,\n };\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(replaySpeed, api_external_contract_js_1.ReplaySpeedType, 'ReplaySpeedType');\n parameters[api_internal_contract_js_1.ParameterId.ReplaySpeed] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.setReplaySpeedType.convert(replaySpeed);\n return this.execute(api_internal_contract_js_1.VerbId.ReplayAnimation, parameters).then((response) => {\n return;\n });\n }\n}\nexports.AnimationServiceImpl = AnimationServiceImpl;\n//# sourceMappingURL=AnimationServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst InternalToExternalEnumMappings_1 = require(\"../../EnumMappings/InternalToExternalEnumMappings\");\nconst SelectionModels_1 = require(\"../../Models/SelectionModels\");\nconst TableauError_1 = require(\"../../TableauError\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass AnnotationServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"annotation-service\" /* Annotation */;\n }\n /**\n * Method to annotate a mark on the given worksheet.\n *\n * @param visualId\n * @param mark\n * @param annotationText\n */\n annotateMarkAsync(visualId, mark, annotationText) {\n const selectionModelContainer = this.parseMarkSelectionIds([mark]);\n const dummyTargetPoint = { x: 0, y: 0 };\n const formattedText = `${annotationText}`;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'annotateMarkAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n [api_internal_contract_js_1.ParameterId.AnnotateEnum]: api_internal_contract_js_1.AnnotateEnum.Mark,\n [api_internal_contract_js_1.ParameterId.TargetPoint]: dummyTargetPoint,\n [api_internal_contract_js_1.ParameterId.SelectionList]: [selectionModelContainer.selection],\n [api_internal_contract_js_1.ParameterId.FormattedText]: formattedText,\n };\n return this.execute(api_internal_contract_js_1.VerbId.CreateAnnotation, parameters).then((response) => {\n // Expecting an empty model and hence the void response.\n return;\n });\n }\n /**\n * Method to retrieve annotations for the given worksheet.\n *\n * @param visualId\n * @returns {Promise>}\n */\n getAnnotationsAsync(visualId) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getAnnotationsAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetAnnotations, parameters).then((response) => {\n const annotationsList = response.result;\n return this.annotationFilterMap(annotationsList);\n });\n }\n /**\n * Method to remove an annotation from a given worksheet.\n *\n * @param visualId\n * @param annotation\n */\n removeAnnotationAsync(visualId, annotation) {\n const selectionModelContainer = this.parseAnnotationSelectionIds([annotation]);\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'removeAnnotationAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n [api_internal_contract_js_1.ParameterId.SelectionList]: [selectionModelContainer.selection],\n };\n return this.execute(api_internal_contract_js_1.VerbId.RemoveAnnotation, parameters).then((response) => {\n // Expecting an empty model and hence the void response.\n return;\n });\n }\n /**\n * Method to prepare the pres models for selection by MarksInfo\n * @param marks\n */\n parseMarkSelectionIds(marks) {\n const ids = [];\n const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer();\n marks.forEach((mark) => {\n const tupleId = mark.tupleId;\n if (tupleId !== undefined && tupleId !== null && tupleId > 0) {\n ids.push(tupleId.toString()); // collect the tuple ids\n }\n else {\n throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'invalid tupleId');\n }\n });\n if (ids.length !== 0) {\n // tuple ids based selection\n const tupleSelectionModel = new SelectionModels_1.TupleSelectionModel();\n tupleSelectionModel.selectionType = 'tuples';\n tupleSelectionModel.objectIds = ids;\n selectionModelContainer.selection = tupleSelectionModel;\n }\n return selectionModelContainer;\n }\n /**\n * Method to prepare the pres models for selection by MarkAnnotationInfo\n * @param marks\n */\n parseAnnotationSelectionIds(annotations) {\n const ids = [];\n const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer();\n annotations.forEach((annotation) => {\n const annotationId = annotation.annotationId;\n if (annotationId !== undefined && annotationId !== null && annotationId >= 0) {\n ids.push(annotationId.toString()); // collect the annotation ids\n }\n else {\n throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'invalid annotationId');\n }\n });\n if (ids.length !== 0) {\n // annotation ids based selection\n const tupleSelectionModel = new SelectionModels_1.TupleSelectionModel();\n tupleSelectionModel.selectionType = 'annotations';\n tupleSelectionModel.objectIds = ids;\n selectionModelContainer.selection = tupleSelectionModel;\n }\n return selectionModelContainer;\n }\n /**\n * Method to map Annotation to MarkAnnotationInfo\n * @param annotation\n * @returns {Annotation}\n */\n mapAnnotation(annotation) {\n return {\n annotationHTML: annotation.annotationText,\n annotationId: annotation.annotationId,\n annotationText: annotation.annotationPlainText,\n annotationType: InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.annotationType.convert(annotation.annotateEnum),\n tupleId: annotation.tupleId,\n };\n }\n /**\n * Filter the Annotations to Mark Annotations, and map them to MarkAnnotationInfo\n * @param annotations\n * @returns {Array}\n */\n annotationFilterMap(annotations) {\n const annotationInfos = annotations.map((annotation) => this.mapAnnotation(annotation));\n return annotationInfos;\n }\n}\nexports.AnnotationServiceImpl = AnnotationServiceImpl;\n//# sourceMappingURL=AnnotationServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass ClientInfoServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"client-info-service\" /* ClientInfo */;\n }\n getClientInfoAsync() {\n const verb = api_internal_contract_js_1.VerbId.GetEmbeddingClientInfo;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getClientInfoAsync',\n };\n return this.execute(verb, parameters).then((response) => {\n const clientInfo = response.result;\n return clientInfo;\n });\n }\n}\nexports.ClientInfoServiceImpl = ClientInfoServiceImpl;\n//# sourceMappingURL=ClientInfoServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst DataSource_1 = require(\"../../DataSource\");\nconst Field_1 = require(\"../../Field\");\nconst DataSourceImpl_1 = require(\"../../Impl/DataSourceImpl\");\nconst FieldImpl_1 = require(\"../../Impl/FieldImpl\");\nconst TableauError_1 = require(\"../../TableauError\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass DataSourceServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n // Since Object Model is supported since Tableau 2020.2, DataSourceServiceImpl can be initialized with the\n // platform version when OM was supported. Once we drop support for Tableau versions <= 2020.1, all additional\n // code in here for Object Model can be removed.\n constructor(dispatcher, registryId) {\n super(dispatcher, registryId);\n }\n get serviceName() {\n return \"data-source-service\" /* DataSourceService */;\n }\n refreshAsync(dataSourceId) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'refreshAsync',\n [api_internal_contract_js_1.ParameterId.DeltaTimeMs]: 0,\n [api_internal_contract_js_1.ParameterId.ShouldRefreshDS]: true,\n };\n // On server: Not passing the datasource id will refresh all datasources.\n if (dataSourceId) {\n parameters[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId;\n }\n return this.execute(api_internal_contract_js_1.VerbId.RefreshDataSource, parameters).then((response) => {\n return;\n });\n }\n getActiveTablesAsync(dataSourceId) {\n const joinParameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getActiveTablesAsync',\n [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId,\n };\n // Get the description of the tables used by this connection\n return this.execute(api_internal_contract_js_1.VerbId.GetActiveTables, joinParameters).then((joinResponse) => {\n const tableInfos = joinResponse.result;\n // getActiveTables is unsupported for cubes and GA. We do not have a connection type property\n // available from the platform (intentionally, to reduce code churn as new connections are added).\n // Instead,just check if any tables are returned. This array will be empty for any non-table based datasource.\n if (tableInfos.tables.length === 0) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedMethodForDataSourceType, `getActiveTables is not supported for: ${dataSourceId}`);\n }\n return tableInfos.tables;\n });\n }\n getDataSourcesAsync(visualId) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getDataSourcesAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetDataSources, parameters).then((response) => {\n const dataSchema = response.result;\n return dataSchema;\n });\n }\n getAllDataSourcesAsync() {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getAllDataSourcesAsync',\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetAllDataSources, parameters).then((response) => {\n const dataSchema = response.result;\n return dataSchema;\n });\n }\n getConnectionSummariesAsync(dataSourceId) {\n const params = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getConnectionSummariesAsync',\n [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId,\n };\n // Get the description of the tables used by this connection\n return this.execute(api_internal_contract_js_1.VerbId.GetConnectionDescriptionSummaries, params).then((response) => {\n const descriptionSummaries = response.result;\n return descriptionSummaries;\n });\n }\n getFieldAsync(globalfieldName) {\n const verb = api_internal_contract_js_1.VerbId.GetFieldAndDataSource;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getFieldAsync',\n [api_internal_contract_js_1.ParameterId.FieldId]: globalfieldName,\n };\n return this.execute(verb, parameters).then((response) => {\n const dataSource = response.result[api_internal_contract_js_1.ParameterId.DataSource];\n const field = response.result[api_internal_contract_js_1.ParameterId.Field];\n return this.convertField(field, this.convertDataSource(dataSource));\n });\n }\n getLogicalTablesAsync(dataSourceId) {\n const params = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getLogicalTablesAsync',\n [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTables, params).then((response) => {\n return response.result;\n });\n }\n getUnderlyingTablesAsync(visualId) {\n const params = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getUnderlyingTablesAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTables, params).then((response) => {\n return response.result;\n });\n }\n convertField(field, dataSource) {\n return new Field_1.Field(new FieldImpl_1.FieldImpl(field, dataSource));\n }\n convertDataSource(dataSource) {\n return new DataSource_1.DataSource(new DataSourceImpl_1.DataSourceImpl(dataSource, this._registryId));\n }\n}\nexports.DataSourceServiceImpl = DataSourceServiceImpl;\n//# sourceMappingURL=DataSourceServiceImpl.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst ExternalToInternalEnumMappings_1 = require(\"../../EnumMappings/ExternalToInternalEnumMappings\");\nconst ExportHelpers_1 = require(\"../../Utils/ExportHelpers\");\nconst ErrorHelpers_1 = require(\"../../Utils/ErrorHelpers\");\nconst TableauError_1 = require(\"../../TableauError\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass ExportServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"export-service\" /* Export */;\n }\n getExportCrosstabSheetMapAsync(currentSheetType) {\n const verb = api_internal_contract_js_1.VerbId.GetExportCrosstabSheetMap;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getExportCrosstabSheetMapAsync',\n [api_internal_contract_js_1.ParameterId.CurrentSheetType]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.sheetType.convert(currentSheetType),\n };\n return this.execute(verb, parameters).then((response) => {\n const result = response.result;\n return result;\n });\n }\n exportCrosstabAsync(sheetName, format, exportableWorksheetNames, currentSheetType) {\n return __awaiter(this, void 0, void 0, function* () {\n ErrorHelpers_1.ErrorHelpers.verifySheetName(exportableWorksheetNames, sheetName);\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(format, api_external_contract_js_1.CrosstabFileFormat, 'CrosstabFileFormat');\n // The pres layer command for exporting Crosstab uses SimpleSheetIdentifiers instead of sheet names.\n // The extensions-and-embedding-api current does not store references to the SimpleSheetIdentifiers of its sheets\n // so we call a pres layer command that gives us the SimpleSheetIdentifier for each sheet name that appears in the\n // export Crosstab dialog popup.\n const sheetNameToIdMap = yield this.getExportCrosstabSheetMapAsync(currentSheetType);\n if (!sheetNameToIdMap[sheetName]) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'missing sheet doc id from sheetMap');\n }\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportCrosstabAsync',\n [api_internal_contract_js_1.ParameterId.SheetIdentifier]: sheetNameToIdMap[sheetName],\n [api_internal_contract_js_1.ParameterId.SendNotifications]: true,\n };\n // pres layer command invoked depends on the crosstab file format\n let verb;\n switch (format) {\n case api_external_contract_js_1.CrosstabFileFormat.CSV:\n verb = api_internal_contract_js_1.VerbId.ExportCrosstabCsvDownload;\n // CSV only parameter: see browser-clients/export-crosstab-options-dialog repo\n parameters[api_internal_contract_js_1.ParameterId.UseTabDelimiters] = true;\n break;\n case api_external_contract_js_1.CrosstabFileFormat.Excel:\n verb = api_internal_contract_js_1.VerbId.ExportCrosstabExcelDownload;\n break;\n default:\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'unsupported Crosstab file format.');\n }\n return this.execute(verb, parameters)\n .then((response) => {\n const result = response.result;\n return result;\n })\n .catch(() => {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.CrosstabCreationError, 'An unexpected error occurred while generating the document.');\n });\n });\n }\n exportDataAsync(visualId, options) {\n var _a;\n ErrorHelpers_1.ErrorHelpers.verifyExportDataOptions(options);\n // Remove any duplicates from the input array\n const columnsAsSet = new Set(options.columnsToIncludeById);\n const columnsToIncludeById = Array.from(columnsAsSet);\n const verb = api_internal_contract_js_1.VerbId.ExportDataDownload;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportDataAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n [api_internal_contract_js_1.ParameterId.IgnoreAliases]: (_a = options.ignoreAliases, (_a !== null && _a !== void 0 ? _a : false)),\n [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: columnsToIncludeById,\n };\n return this.execute(verb, parameters)\n .then(() => { })\n .catch(() => {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.DataCreationError, 'An unexpected error occurred while generating the document.');\n });\n }\n exportPowerPointAsync(sheetNames, exportScenarios) {\n ErrorHelpers_1.ErrorHelpers.verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios);\n // Note: the ExportOriginUrl param is listed as optional for the pres layer command we are invoking; however,\n // recent changes were made that enforced the use of the empty string when invoking this command with no ExportOriginUrl.\n // see browser-clients/export-powerpoint-options-dialog repo.\n const verb = api_internal_contract_js_1.VerbId.ExportPowerpointDownload;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportPowerPointAsync',\n [api_internal_contract_js_1.ParameterId.ExportOriginUrl]: '',\n [api_internal_contract_js_1.ParameterId.SelectedSheetNames]: sheetNames,\n };\n return this.execute(verb, parameters)\n .then((response) => {\n const result = response.result;\n return result;\n })\n .catch(() => {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.PowerPointCreationError, 'An error occured while attempting to generate the PowerPoint file.');\n });\n }\n exportPDFAsync(sheetNames, externalExportPdfOptions, exportScenarios) {\n return __awaiter(this, void 0, void 0, function* () {\n ErrorHelpers_1.ErrorHelpers.verifyExportPDFOptions(externalExportPdfOptions);\n ErrorHelpers_1.ErrorHelpers.verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios);\n const internalExportPdfOptions = yield this.getExportPDFOptionsAsync();\n ExportHelpers_1.ExportHelpers.updateInternalExportPDFOptions(internalExportPdfOptions, externalExportPdfOptions, sheetNames);\n const verb = api_internal_contract_js_1.VerbId.ExportPdfDownload;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportPDFAsync',\n [api_internal_contract_js_1.ParameterId.ExportPdfOptions]: internalExportPdfOptions,\n };\n return this.execute(verb, parameters)\n .then((response) => {\n const result = response.result;\n return result;\n })\n .catch(() => {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.PDFCreationError, 'Unable to create PDF because something went wrong. Try again.');\n });\n });\n }\n getExportPDFOptionsAsync() {\n const verb = api_internal_contract_js_1.VerbId.GetExportPdfOptions;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getExportPdfOptionsAsync',\n };\n return this.execute(verb, parameters).then((response) => {\n const result = response.result;\n return result;\n });\n }\n}\nexports.ExportServiceImpl = ExportServiceImpl;\n//# sourceMappingURL=ExportServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass ExternalContextMenuServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"external-context-menu-service\" /* ExternalContextMenu */;\n }\n appendContextMenuAsync(sheetName, targetMenu, config) {\n const verb = api_internal_contract_js_1.VerbId.AppendExternalMenuItem;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'appendContextMenuAsync',\n [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName,\n [api_internal_contract_js_1.ParameterId.ExternalMenuItemDisplayName]: config.displayName,\n };\n return this.execute(verb, parameters).then((response) => {\n const newMenuItemId = response.result;\n return newMenuItemId;\n });\n }\n removeContextMenuAsync(sheetName, targetMenu, menuItemId) {\n const verb = api_internal_contract_js_1.VerbId.RemoveExternalMenuItem;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'removeContextMenuAsync',\n [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName,\n [api_internal_contract_js_1.ParameterId.ExternalMenuItemId]: menuItemId,\n };\n return this.execute(verb, parameters).then((response) => {\n return;\n });\n }\n executeContextMenuAsync(sheetName, targetMenu, menuItemId) {\n const verb = api_internal_contract_js_1.VerbId.ExecuteExternalMenuItem;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'executeContextMenuAsync',\n [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName,\n [api_internal_contract_js_1.ParameterId.ExternalMenuItemId]: menuItemId,\n };\n return this.execute(verb, parameters).then((response) => {\n return;\n });\n }\n renameContextMenuAsync(sheetName, targetMenu, menuHeader, menuDescription) {\n const verb = api_internal_contract_js_1.VerbId.RenameExternalMenu;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'renameContextMenuAsync',\n [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName,\n [api_internal_contract_js_1.ParameterId.ExternalMenuHeader]: menuHeader,\n [api_internal_contract_js_1.ParameterId.ExternalMenuDescription]: menuDescription,\n };\n return this.execute(verb, parameters).then((response) => {\n return;\n });\n }\n}\nexports.ExternalContextMenuServiceImpl = ExternalContextMenuServiceImpl;\n//# sourceMappingURL=ExternalContextMenuServiceImpl.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst InternalContract = require(\"@tableau/api-internal-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst ApiShared_1 = require(\"../../../ApiShared\");\nconst ExternalToInternalEnumMappings_1 = require(\"../../EnumMappings/ExternalToInternalEnumMappings\");\nconst InternalToExternalEnumMappings_1 = require(\"../../EnumMappings/InternalToExternalEnumMappings\");\nconst FilterModels_1 = require(\"../../Models/FilterModels\");\nconst DataValueFactory_1 = require(\"../../Utils/DataValueFactory\");\nconst Param_1 = require(\"../../Utils/Param\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass FilterServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"filter-service\" /* Filter */;\n }\n applyFilterAsync(visualId, fieldName, values, updateType, filterOptions) {\n const verb = api_internal_contract_js_1.VerbId.ApplyCategoricalFilter;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyFilterAsync',\n };\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId;\n parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName;\n if (!Array.isArray(values)) {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'values parameter for applyFilterAsync must be an array');\n }\n parameters[api_internal_contract_js_1.ParameterId.FilterValues] = values;\n parameters[api_internal_contract_js_1.ParameterId.FilterUpdateType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterUpdateType.convert(updateType);\n parameters[api_internal_contract_js_1.ParameterId.IsExcludeMode] =\n filterOptions === undefined || filterOptions.isExcludeMode === undefined ? false : filterOptions.isExcludeMode;\n return this.execute(verb, parameters).then((response) => {\n return fieldName;\n });\n }\n applyRangeFilterAsync(visualId, fieldName, filterOptions) {\n const verb = api_internal_contract_js_1.VerbId.ApplyRangeFilter;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyRangeFilterAsync',\n };\n if (filterOptions.min !== undefined && filterOptions.min !== null) {\n let min;\n if (filterOptions.min instanceof Date) {\n min = Param_1.Param.serializeDateForPlatform(filterOptions.min);\n }\n else {\n min = filterOptions.min;\n }\n parameters[api_internal_contract_js_1.ParameterId.FilterRangeMin] = min;\n }\n if (filterOptions.max !== undefined && filterOptions.max !== null) {\n let max;\n if (filterOptions.max instanceof Date) {\n max = Param_1.Param.serializeDateForPlatform(filterOptions.max);\n }\n else {\n max = filterOptions.max;\n }\n parameters[api_internal_contract_js_1.ParameterId.FilterRangeMax] = max;\n }\n // The null option is used with min+max for 'include-range' or 'include-range-or-null'\n if (filterOptions.nullOption) {\n parameters[api_internal_contract_js_1.ParameterId.FilterRangeNullOption] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.nullOptions.convert(filterOptions.nullOption);\n }\n parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName;\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId;\n return this.execute(verb, parameters).then((response) => {\n this.apiFilterHandlerCheckForCommandError(response.result);\n return fieldName;\n });\n }\n applyHierarchicalFilterAsync(visualId, fieldName, values, updateType, filterOptions) {\n const verb = api_internal_contract_js_1.VerbId.HierarchicalFilter;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyHierarchicalFilterAsync',\n };\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId;\n parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName;\n const hierarchicalLevels = values.levels;\n if (Array.isArray(hierarchicalLevels) && hierarchicalLevels.length > 0) {\n parameters[api_internal_contract_js_1.ParameterId.FilterLevels] = hierarchicalLevels;\n }\n else if (values.length > 0) {\n parameters[api_internal_contract_js_1.ParameterId.FilterValues] = values;\n }\n else {\n // the server command expects empty list for clearing the filter\n // it also expects eithers FilterLevels or FilterValues to be set\n parameters[api_internal_contract_js_1.ParameterId.FilterLevels] = [];\n }\n parameters[api_internal_contract_js_1.ParameterId.FilterUpdateType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterUpdateType.convert(updateType);\n parameters[api_internal_contract_js_1.ParameterId.IsExcludeMode] = filterOptions && !!filterOptions.isExcludeMode;\n return this.execute(verb, parameters).then((response) => {\n return fieldName;\n });\n }\n clearFilterAsync(visualId, fieldName) {\n const verb = api_internal_contract_js_1.VerbId.ClearFilter;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'clearFilterAsync',\n };\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId;\n parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName;\n return this.execute(verb, parameters).then((resposne) => {\n return fieldName;\n });\n }\n applyRelativeDateFilterAsync(visualId, fieldName, options) {\n const verb = api_internal_contract_js_1.VerbId.ApplyRelativeDateFilter;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyRelativeDateFilterAsync',\n };\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId;\n parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName;\n parameters[api_internal_contract_js_1.ParameterId.PeriodType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.periodType.convert(options.periodType);\n parameters[api_internal_contract_js_1.ParameterId.DateRangeType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.dateRangeType.convert(options.rangeType);\n if (options.rangeType === api_external_contract_js_1.DateRangeType.LastN || options.rangeType === api_external_contract_js_1.DateRangeType.NextN) {\n if (options.rangeN === undefined || options.rangeN === null) {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.EmbeddingErrorCodes.MissingRangeNForRelativeDateFilters, 'Missing rangeN field for a relative date filter of LASTN or NEXTN.');\n }\n parameters[api_internal_contract_js_1.ParameterId.RangeN] = options.rangeN;\n }\n if (options.anchorDate !== undefined && options.anchorDate !== null) {\n parameters[api_internal_contract_js_1.ParameterId.AnchorDate] = this.convertAnchorDate(options.anchorDate);\n }\n return this.execute(verb, parameters).then((response) => {\n return response.result;\n });\n }\n getFiltersAsync(visualId) {\n const verb = api_internal_contract_js_1.VerbId.GetFilters;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getFiltersAsync',\n };\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId;\n return this.execute(verb, parameters).then((response) => {\n const filters = response.result;\n return this.convertDomainFilters(filters);\n });\n }\n getCategoricalDomainAsync(worksheetName, fieldId, domainType) {\n const verb = api_internal_contract_js_1.VerbId.GetCategoricalDomain;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getCategoricalDomainAsync',\n };\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = {\n worksheet: worksheetName,\n };\n parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId;\n parameters[api_internal_contract_js_1.ParameterId.DomainType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterDomainType.convert(domainType);\n return this.execute(verb, parameters).then((response) => {\n const domain = response.result;\n return this.convertCategoricalDomain(domain, domainType);\n });\n }\n getRangeDomainAsync(worksheetName, fieldId, domainType) {\n const verb = api_internal_contract_js_1.VerbId.GetRangeDomain;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getRangeDomainAsync',\n };\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = {\n worksheet: worksheetName,\n };\n parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId;\n parameters[api_internal_contract_js_1.ParameterId.DomainType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterDomainType.convert(domainType);\n return this.execute(verb, parameters).then((response) => {\n const domain = response.result;\n return this.convertRangeDomain(domain, domainType);\n });\n }\n getDashboardFiltersAsync() {\n const verb = api_internal_contract_js_1.VerbId.GetDashboardFilters;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getDashboardFiltersAsync',\n };\n return this.execute(verb, parameters).then((response) => {\n const filters = response.result;\n return this.convertDomainFilters(filters);\n });\n }\n applyDashboardFilterAsync(fieldName, values, updateType, filterOptions) {\n const verb = api_internal_contract_js_1.VerbId.DashboardCategoricalFilter;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyDashboardFilterAsync',\n };\n parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName;\n parameters[api_internal_contract_js_1.ParameterId.FilterValues] = values;\n parameters[api_internal_contract_js_1.ParameterId.FilterUpdateType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterUpdateType.convert(updateType);\n parameters[api_internal_contract_js_1.ParameterId.IsExcludeMode] = filterOptions && !!filterOptions.isExcludeMode;\n return this.execute(verb, parameters).then((response) => {\n return response.result;\n });\n }\n getAppliedWorksheetsAsync(worksheetName, fieldId) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const sharedFilterModel = yield this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsync');\n const worksheetNames = [];\n (_a = sharedFilterModel.worksheets) === null || _a === void 0 ? void 0 : _a.map((worksheetInfo) => {\n if (worksheetInfo.isSelected) {\n worksheetNames.push(worksheetInfo.worksheetName);\n }\n });\n return worksheetNames;\n });\n }\n setAppliedWorksheetsAsync(worksheetName, fieldName, fieldId, applyToWorksheets) {\n return __awaiter(this, void 0, void 0, function* () {\n const sharedFilterModel = yield this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsyncInternal');\n if (!sharedFilterModel || !sharedFilterModel.worksheets) {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'This filter does not apply to multiple worksheets');\n }\n const allowedWorksheets = [];\n let activeWorksheet = '';\n sharedFilterModel.worksheets.forEach((worksheet) => {\n // Get active worksheet\n if (worksheet.isActive) {\n activeWorksheet = worksheet.worksheetName;\n }\n // Populate allowed worksheets\n if (worksheet.isSelected || worksheet.isEnabled) {\n allowedWorksheets.push(worksheet.worksheetName);\n }\n });\n if (activeWorksheet === '') {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'No active worksheet');\n }\n if (!applyToWorksheets.includes(activeWorksheet)) {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `${activeWorksheet} must be included in the applied worksheets`);\n }\n applyToWorksheets.forEach((sheet) => {\n // check if it's present within compatible sheets\n if (!allowedWorksheets.includes(sheet)) {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `The field ${fieldName} isn't applicable to the worksheet ${sheet}`);\n }\n });\n const verb = api_internal_contract_js_1.VerbId.ChangeSharedFilter;\n const parameters = {};\n parameters[api_internal_contract_js_1.ParameterId.FunctionName] = 'setAppliedWorksheetsAsync';\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = {\n worksheet: worksheetName,\n };\n parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId;\n parameters[api_internal_contract_js_1.ParameterId.SharedFilterSheets] = applyToWorksheets;\n return this.execute(verb, parameters).then((response) => {\n return applyToWorksheets;\n });\n });\n }\n // Helper Methods\n executeGetAppliedWorksheets(worksheetName, fieldId, telemetryFunctionName) {\n const verb = api_internal_contract_js_1.VerbId.GetSharedFilter;\n const parameters = {};\n parameters[api_internal_contract_js_1.ParameterId.FunctionName] = telemetryFunctionName;\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = {\n worksheet: worksheetName,\n };\n parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId;\n return this.execute(verb, parameters).then((response) => {\n const sharedFilterModel = response.result;\n return sharedFilterModel;\n });\n }\n convertDomainFilters(domainFilters) {\n const filters = [];\n domainFilters.forEach((domainFilter) => {\n switch (domainFilter.filterType) {\n case api_internal_contract_js_1.FilterType.Categorical: {\n const filter = domainFilter;\n if (filter) {\n filters.push(this.convertCategoricalFilter(filter));\n }\n else {\n throw new Error('Invalid Categorical Filter');\n }\n break;\n }\n case api_internal_contract_js_1.FilterType.Hierarchical: {\n const filter = domainFilter;\n if (filter) {\n filters.push(this.convertHierarchicalFilter(filter));\n }\n else {\n throw new Error('Invalid Hierarchical Filter');\n }\n break;\n }\n case api_internal_contract_js_1.FilterType.Range: {\n const filter = domainFilter;\n if (filter) {\n filters.push(this.convertRangeFilter(filter));\n }\n else {\n throw new Error('Invalid Range Filter');\n }\n break;\n }\n case api_internal_contract_js_1.FilterType.RelativeDate: {\n const filter = domainFilter;\n if (filter) {\n filters.push(this.convertRelativeDateFilter(filter));\n }\n else {\n throw new Error('Invalid Relative Date Filter');\n }\n break;\n }\n default: {\n break;\n }\n }\n });\n return filters;\n }\n convertCategoricalFilter(domainFilter) {\n const appliedValues = domainFilter.values.map((dv) => {\n return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(dv);\n });\n return new FilterModels_1.CategoricalFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Categorical, this._registryId, appliedValues, domainFilter.isExclude, domainFilter.isAllSelected);\n }\n convertHierarchicalFilter(domainFilter) {\n const appliedValues = domainFilter.values.map((hierarchicalDataValue) => {\n return new FilterModels_1.HierarchicalDataValue(DataValueFactory_1.DataValueFactory.MakeFilterDataValue(hierarchicalDataValue.value), hierarchicalDataValue.hierarchicalPath, hierarchicalDataValue.level);\n });\n const levelDetails = domainFilter.levelInfo.map((aLevel) => {\n return new FilterModels_1.HierarchicalLevelDetail(aLevel.name, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.hierarchicalLevelSelectionState.convert(aLevel.levelSelectionState));\n });\n return new FilterModels_1.HierarchicalFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Hierarchical, this._registryId, domainFilter.dimensionName, domainFilter.hierarchyCaption, domainFilter.levels, levelDetails, appliedValues, domainFilter.isAllSelected);\n }\n convertRangeFilter(domainFilter) {\n const minValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.min);\n const maxValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.max);\n return new FilterModels_1.RangeFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Range, this._registryId, minValue, maxValue, domainFilter.includeNullValues);\n }\n convertRelativeDateFilter(domainFilter) {\n const anchorDateValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.anchorDate);\n return new FilterModels_1.RelativeDateFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_external_contract_js_1.FilterType.RelativeDate, this._registryId, anchorDateValue, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateStepPeriod.convert(domainFilter.periodType), InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateRangeType.convert(domainFilter.rangeType), domainFilter.rangeN);\n }\n convertCategoricalDomain(domain, domainType) {\n const values = domain.values.map((domainDv) => {\n return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainDv);\n });\n return new FilterModels_1.CategoricalDomain(values, domainType);\n }\n convertRangeDomain(domain, domainType) {\n const min = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.min);\n const max = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.max);\n return new FilterModels_1.RangeDomain(min, max, domainType);\n }\n convertAnchorDate(anchorDate) {\n // Converts a Date object into a string format that the server expects for date/time values.\n // If anchorDate doesn't represent a valid Date object, any of these would be NaN.\n const year = anchorDate.getUTCFullYear();\n const month = anchorDate.getUTCMonth() + 1;\n const day = anchorDate.getUTCDate();\n const hh = anchorDate.getUTCHours();\n const mm = anchorDate.getUTCMinutes();\n const sec = anchorDate.getUTCSeconds();\n if (isNaN(year) || isNaN(month) || isNaN(day) || isNaN(hh) || isNaN(mm) || isNaN(sec)) {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.EmbeddingErrorCodes.InvalidDateParameter, 'Invalid date parameter: anchorDate');\n }\n const result = `${year}-${month}-${day} ${hh}:${mm}:${sec}`;\n return result;\n }\n apiFilterHandlerCheckForCommandError(serverPm) {\n if (!serverPm[InternalContract.ParameterId.ParameterError]) {\n return;\n }\n if (serverPm[InternalContract.ParameterId.InvalidFieldCaption]) {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidFilterFieldName, serverPm[InternalContract.ParameterId.InvalidFieldCaption]);\n }\n if (serverPm[InternalContract.ParameterId.InvalidValues]) {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidFilterFieldValue, serverPm[InternalContract.ParameterId.InvalidValues]);\n }\n if (serverPm[InternalContract.ParameterId.InvalidAggFieldName]) {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidAggregationFieldName, serverPm[InternalContract.ParameterId.InvalidAggFieldName]);\n }\n throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.ServerError, 'Server Error');\n }\n}\nexports.FilterServiceImpl = FilterServiceImpl;\n//# sourceMappingURL=FilterServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst uuid_1 = require(\"uuid\");\nconst ApiShared_1 = require(\"../../../ApiShared\");\nconst ExternalToInternalEnumMappings_1 = require(\"../../EnumMappings/ExternalToInternalEnumMappings\");\nconst GetDataModels_1 = require(\"../../Models/GetDataModels\");\nconst GetDataTableReaderModels_1 = require(\"../../Models/GetDataTableReaderModels\");\nconst DataValueFactory_1 = require(\"../../Utils/DataValueFactory\");\nconst GetDataService_1 = require(\"../GetDataService\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass GetDataServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n constructor() {\n super(...arguments);\n // The extension/embedding instance uses the same cache for all DataTableReaders.\n this.viewDataTableCacheId = uuid_1.v4();\n }\n get serviceName() {\n return \"get-data-service\" /* GetData */;\n }\n getMaxRowLimit() {\n return 10000;\n }\n getViewDataTableCacheId() {\n return this.viewDataTableCacheId;\n }\n getLimitedMaxRows(requestedRows, rowCountLimit) {\n return requestedRows > 0 && requestedRows < rowCountLimit ? requestedRows : rowCountLimit;\n }\n getUnderlyingDataAsync(visualId, getType, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption, applyWorksheetFormatting) {\n // Create all of our parameters\n const summaryData = getType === GetDataService_1.GetDataType.Summary;\n const functionName = summaryData ? 'getSummaryDataAsync' : 'getUnderlyingDataAsync';\n const verb = summaryData ? api_internal_contract_js_1.VerbId.GetDataSummaryData : api_internal_contract_js_1.VerbId.GetUnderlyingData;\n const requestMaxRows = verb === api_internal_contract_js_1.VerbId.GetUnderlyingData ? this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1) : maxRows;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: functionName,\n };\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId;\n parameters[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases;\n parameters[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection;\n parameters[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns;\n parameters[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById);\n parameters[api_internal_contract_js_1.ParameterId.MaxRows] = requestMaxRows;\n parameters[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption);\n parameters[api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting] = applyWorksheetFormatting;\n return this.execute(verb, parameters).then((response) => {\n const responseData = response.result;\n return this.processResultsTable(responseData.data, responseData.isSummary);\n });\n }\n getSummaryDataReaderAsync(visualId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption, applyWorksheetFormatting) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getSummaryDataReaderAsync',\n [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(),\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n [api_internal_contract_js_1.ParameterId.PageRowCount]: pageRowCount,\n [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases,\n [api_internal_contract_js_1.ParameterId.IgnoreSelection]: ignoreSelection,\n [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: includeAllColumns,\n [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById),\n [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n [api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting]: applyWorksheetFormatting,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetDataSummaryDataReader, parameters).then((response) => {\n const responseData = response.result;\n return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, this._registryId);\n });\n }\n getSummaryColumnsInfoAsync(visualId) {\n // Create all the parameters for GetDataType of Summary with 1 row, and only native values\n // Then return just the columns\n const verb = api_internal_contract_js_1.VerbId.GetDataSummaryData;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getSummaryColumnsInfoAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n [api_internal_contract_js_1.ParameterId.IgnoreAliases]: true,\n [api_internal_contract_js_1.ParameterId.IgnoreSelection]: true,\n [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: true,\n [api_internal_contract_js_1.ParameterId.MaxRows]: 1,\n [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly,\n };\n return this.execute(verb, parameters).then((response) => {\n const underlyingDataTable = response.result;\n const dataTable = underlyingDataTable.data;\n const columns = dataTable.headers.map((h) => new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index));\n return columns;\n });\n }\n getSelectedMarksAsync(visualId) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getSelectedMarksAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetSelectedMarks, parameters).then((response) => {\n const responseData = response.result;\n return {\n data: responseData.data.map((table) => this.processResultsTable(table, true)),\n };\n });\n }\n getHighlightedMarksAsync(visualId) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getHighlightedMarksAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetHighlightedMarks, parameters).then((response) => {\n const responseData = response.result;\n return {\n data: responseData.data.map((table) => this.processResultsTable(table, true)),\n };\n });\n }\n getDataSourceDataAsync(dataSourceId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getDataSourceDataAsync',\n [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId,\n [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases,\n [api_internal_contract_js_1.ParameterId.MaxRows]: this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1),\n [api_internal_contract_js_1.ParameterId.ColumnsToInclude]: this.verifyIncludeColumnArray(columnsToInclude),\n [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById),\n [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetDataSourceData, parameters).then((response) => {\n const responseData = response.result;\n return this.processResultsTable(responseData.data, false);\n });\n }\n getLogicalTableDataAsync(datasourceId, logicalTableId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getLogicalTableDataAsync',\n [api_internal_contract_js_1.ParameterId.ColumnsToInclude]: columnsToInclude,\n [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById),\n [api_internal_contract_js_1.ParameterId.DataSourceId]: datasourceId,\n [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases,\n [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId,\n [api_internal_contract_js_1.ParameterId.MaxRows]: this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1),\n [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableData, parameters).then((response) => {\n const responseData = response.result;\n return this.processResultsTable(responseData.data, false);\n });\n }\n getLogicalTableDataReaderAsync(datasourceId, logicalTableId, pageRowCount, ignoreAliases, columnsToIncludeById, includeDataValuesOption) {\n pageRowCount = this.getLimitedMaxRows(pageRowCount, this.getMaxRowLimit());\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getLogicalTableDataReaderAsync',\n [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(),\n [api_internal_contract_js_1.ParameterId.DataSourceId]: datasourceId,\n [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId,\n [api_internal_contract_js_1.ParameterId.PageRowCount]: pageRowCount,\n [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases,\n [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById),\n [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableDataReader, parameters).then((response) => {\n const responseData = response.result;\n return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, this._registryId);\n });\n }\n getUnderlyingTableDataAsync(visualId, logicalTableId, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption, applyWorksheetFormatting) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getUnderlyingTableDataAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId,\n [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases,\n [api_internal_contract_js_1.ParameterId.IgnoreSelection]: ignoreSelection,\n [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: includeAllColumns,\n [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById),\n [api_internal_contract_js_1.ParameterId.MaxRows]: this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1),\n [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n [api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting]: applyWorksheetFormatting,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableData, parameters).then((response) => {\n const responseData = response.result;\n return this.processResultsTable(responseData.data, false);\n });\n }\n getUnderlyingTableDataReaderAsync(visualId, logicalTableId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption, applyWorksheetFormatting) {\n pageRowCount = this.getLimitedMaxRows(pageRowCount, this.getMaxRowLimit());\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getUnderlyingTableDataReaderAsync',\n [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(),\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId,\n [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases,\n [api_internal_contract_js_1.ParameterId.IgnoreSelection]: ignoreSelection,\n [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: includeAllColumns,\n [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById),\n [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n [api_internal_contract_js_1.ParameterId.PageRowCount]: pageRowCount,\n [api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting]: applyWorksheetFormatting,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableDataReader, parameters).then((response) => {\n const responseData = response.result;\n return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, this._registryId);\n });\n }\n getPageAsync(tableId, pageNumber, pageSize) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getPageAsync',\n [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(),\n [api_internal_contract_js_1.ParameterId.ViewDataTableId]: tableId,\n [api_internal_contract_js_1.ParameterId.DataRowIndex]: pageNumber * pageSize,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetDataTableReaderPage, parameters).then((response) => {\n const responseData = response.result;\n return this.processResultsPage(responseData, tableId === GetDataServiceImpl.summaryTableId ? true : false);\n });\n }\n releaseAsync(tableId) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'release',\n [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(),\n [api_internal_contract_js_1.ParameterId.ViewDataTableId]: tableId,\n };\n return this.execute(api_internal_contract_js_1.VerbId.ReleaseDataTableReader, parameters).then((response) => {\n return;\n });\n }\n verifyIncludeColumnArray(columns) {\n // columns must be a valid array\n if (!Array.isArray(columns)) {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'columnsToInclude and columnsToIncludeById must be valid arrays');\n }\n // Remove any duplicates from the input array\n const columnsAsSet = new Set(columns);\n return Array.from(columnsAsSet);\n }\n processResultsTable(responseData, isSummary) {\n const headers = responseData.headers.map((h) => new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index));\n // TODO This should be controlled by a flag indicating whether this api will respond marks info or not\n let marks;\n if (responseData.marks) {\n marks = responseData.marks.map((h) => new GetDataModels_1.MarkInfo(h.type, h.color, h.tupleId));\n }\n // Limit+1 is our sentinal that underlying data contains more rows than user is allowed to fetch.\n // Remove the last element so we always return MaxRowLimit\n const isTotalRowCountLimited = isSummary === false && responseData.dataTable.length === this.getMaxRowLimit() + 1;\n if (isTotalRowCountLimited) {\n responseData.dataTable.length -= 1;\n }\n const table = responseData.dataTable.map((row) => {\n return row.map((cell, index) => {\n return DataValueFactory_1.DataValueFactory.MakeTableDataValue(cell, headers[index].dataType);\n });\n });\n if (marks) {\n return new GetDataModels_1.DataTable(table, headers, table.length, isTotalRowCountLimited, isSummary, marks);\n }\n return new GetDataModels_1.DataTable(table, headers, table.length, isTotalRowCountLimited, isSummary);\n }\n processResultsPage(responseData, isSummary) {\n const headers = responseData.headers.map((h) => new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index));\n let marks;\n if (responseData.marks) {\n marks = responseData.marks.map((h) => new GetDataModels_1.MarkInfo(h.type, h.color, h.tupleId));\n }\n const table = responseData.dataTable.map((row) => {\n return row.map((cell, index) => {\n return DataValueFactory_1.DataValueFactory.MakeTableDataValue(cell, headers[index].dataType);\n });\n });\n if (marks) {\n return new GetDataModels_1.DataTable(table, headers, table.length, false, isSummary, marks);\n }\n return new GetDataModels_1.DataTable(table, headers, table.length, false, isSummary);\n }\n}\nexports.GetDataServiceImpl = GetDataServiceImpl;\nGetDataServiceImpl.summaryTableId = '';\n//# sourceMappingURL=GetDataServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst NotificationServiceImplBase_1 = require(\"./NotificationServiceImplBase\");\nclass NotificationServiceImpl extends NotificationServiceImplBase_1.NotificationServiceImplBase {\n get serviceName() {\n return \"notification-service\" /* Notification */;\n }\n}\nexports.NotificationServiceImpl = NotificationServiceImpl;\n//# sourceMappingURL=NotificationServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nclass Registration {\n constructor(_filterFn, _callbackFn) {\n this._filterFn = _filterFn;\n this._callbackFn = _callbackFn;\n // Nothing Here\n }\n onNotification(notificationModel) {\n if (this._filterFn(notificationModel)) {\n this._callbackFn(notificationModel);\n }\n }\n}\nexports.Registration = Registration;\nclass NotificationServiceImplBase {\n constructor(dispatcher) {\n this.dispatcher = dispatcher;\n this._handlers = {};\n this.dispatcher.registerNotificationHandler(this.onNotification.bind(this));\n }\n registerHandler(id, filterFn, handler) {\n const handlers = this._handlers[id] || new Array();\n const registration = new Registration(filterFn, handler);\n handlers.push(registration);\n this._handlers[id] = handlers;\n return () => this.removeRegistration(id, registration);\n }\n hasHandlersForNotificationType(id) {\n // eslint-disable-next-line no-prototype-builtins\n return this._handlers.hasOwnProperty(id);\n }\n onNotification(notification) {\n if (!this.hasHandlersForNotificationType(notification.notificationId)) {\n return;\n }\n // Go through and check for all the handlers of this particular notification\n this._handlers[notification.notificationId].forEach((h) => h.onNotification(notification.data));\n }\n removeRegistration(id, registration) {\n if (!this.hasHandlersForNotificationType(id)) {\n return;\n }\n this._handlers[id] = this._handlers[id].filter((reg) => reg !== registration);\n }\n}\nexports.NotificationServiceImplBase = NotificationServiceImplBase;\n//# sourceMappingURL=NotificationServiceImplBase.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst ParameterImpl_1 = require(\"../../Impl/ParameterImpl\");\nconst TableauError_1 = require(\"../../TableauError\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass ParametersServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"parameters-service\" /* Parameters */;\n }\n getParametersForSheetAsync(sheetPath) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getParametersForSheetAsync',\n [api_internal_contract_js_1.ParameterId.SheetPath]: sheetPath,\n };\n return this.getParametersAsync(parameters);\n }\n getAllParametersAsync() {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getParametersForSheetAsync',\n };\n return this.getParametersAsync(parameters);\n }\n getParametersAsync(inputParameters) {\n return this.execute(api_internal_contract_js_1.VerbId.GetParametersForSheet, inputParameters).then((response) => {\n const result = response.result;\n return result.map((parameterInfo) => {\n return new ParameterImpl_1.ParameterImpl(parameterInfo, this._registryId);\n });\n });\n }\n changeParameterValueAsync(fieldName, newValue) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'changeParameterValueAsync',\n [api_internal_contract_js_1.ParameterId.ParameterFieldName]: fieldName,\n [api_internal_contract_js_1.ParameterId.ParameterValue]: newValue,\n };\n return this.execute(api_internal_contract_js_1.VerbId.ChangeParameterValue, parameters).then((response) => {\n const result = response.result;\n return result;\n });\n }\n findParameterByNameAsync(name) {\n return this.findParameterAsync(name, undefined);\n }\n findParameterByGlobalFieldNameAsync(fieldName) {\n return this.findParameterAsync(undefined, fieldName);\n }\n findParameterAsync(name, fieldName) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'findParameterAsync',\n };\n if (name !== undefined) {\n parameters[api_internal_contract_js_1.ParameterId.ParameterCaption] = name;\n }\n else if (fieldName !== undefined) {\n parameters[api_internal_contract_js_1.ParameterId.ParameterFieldName] = fieldName;\n }\n else {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'name or fieldName must be provided to find parameter');\n }\n return this.execute(api_internal_contract_js_1.VerbId.FindParameter, parameters).then((response) => {\n const instanceOfParameterInfo = (object) => {\n return 'fieldName' in object;\n };\n // We need to check to see if we got a valid response back again\n if (instanceOfParameterInfo(response.result)) {\n const result = response.result;\n return new ParameterImpl_1.ParameterImpl(result, this._registryId);\n }\n else {\n return undefined;\n }\n });\n }\n}\nexports.ParametersServiceImpl = ParametersServiceImpl;\n//# sourceMappingURL=ParametersServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst SelectionModels_1 = require(\"../../Models/SelectionModels\");\nconst TableauError_1 = require(\"../../TableauError\");\nconst Param_1 = require(\"../../Utils/Param\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass SelectionServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"selection-service\" /* Selection */;\n }\n /**\n * Method to clear all the selected marks for the given worksheet.\n *\n * @param visualId\n */\n clearSelectedMarksAsync(visualId) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'clearSelectedMarksAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n };\n return this.execute(api_internal_contract_js_1.VerbId.ClearSelectedMarks, parameters).then((response) => {\n return; // Expecting an empty model and hence the void response.\n });\n }\n /**\n * Method to select marks for the given worksheet.\n *\n * @param visualId\n * @param selectionCriteria\n * @param selectionUpdateType\n */\n selectMarksByValueAsync(visualId, selectionCriterias, selectionUpdateType) {\n if (selectionCriterias.length === 0) {\n throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Selection criteria missing for selecting marks by value');\n }\n const selectionType = this.validateSelectionUpdateType(selectionUpdateType);\n const selectionModelContainer = this.parseSelectionMarks(selectionCriterias);\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'selectMarksByValueAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n [api_internal_contract_js_1.ParameterId.SelectionUpdateType]: selectionType,\n };\n if (selectionModelContainer.hierModelArr && selectionModelContainer.hierModelArr.length) {\n parameters[api_internal_contract_js_1.ParameterId.HierValSelectionModels] = selectionModelContainer.hierModelArr;\n }\n if (selectionModelContainer.quantModelArr && selectionModelContainer.quantModelArr.length) {\n parameters[api_internal_contract_js_1.ParameterId.QuantRangeSelectionModels] = selectionModelContainer.quantModelArr;\n }\n if (selectionModelContainer.dimModelArr && selectionModelContainer.dimModelArr.length) {\n parameters[api_internal_contract_js_1.ParameterId.DimValSelectionModels] = selectionModelContainer.dimModelArr;\n }\n return this.execute(api_internal_contract_js_1.VerbId.SelectByValue, parameters).then((response) => {\n this.apiFilterHandlerCheckForCommandError(response.result);\n return;\n });\n }\n /**\n * Method to execute hover actions and render tooltip for a given tuple representing a mark in the visualization.\n * If the tooltip parameter is included it will show the tooltip on hover. If not, no tooltip is shown.\n *\n * @param visualId\n * @param hoveredTuple\n * @param tooltip\n * @returns empty promise that resolves when the extension host has successfully been informed of the request and rejects on error\n */\n hoverTupleAsync(visualId, hoveredTuple, tooltip, allowHoverActions) {\n let interactionModel = new SelectionModels_1.HoverTupleInteractionModel(visualId, this.ensureTupleIDIsNonNegative(hoveredTuple), tooltip, allowHoverActions);\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'hoverTupleAsync',\n [api_internal_contract_js_1.ParameterId.HoverTupleInteraction]: interactionModel,\n };\n return this.execute(api_internal_contract_js_1.VerbId.RaiseHoverTupleNotification, parameters).then((response) => {\n return;\n });\n }\n /**\n * Method to modify selection, execute select actions and render tooltip for a given list of tuples representing a mark or marks in the visualization.\n * If the tooltip parameter is included it will show the tooltip on select. If not, no tooltip is shown.\n *\n * @param visualId\n * @param selectedTuples\n * @param selectOption\n * @param tooltip\n * @returns empty promise that resolves when the extension host has successfully been informed of the request and rejects on error\n */\n selectTuplesAsync(visualId, selectedTuples, selectOption, tooltip) {\n let interactionModel = new SelectionModels_1.SelectTuplesInteractionModel(visualId, selectedTuples, selectOption, tooltip);\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'selectTuplesAsync',\n [api_internal_contract_js_1.ParameterId.SelectTuplesInteraction]: interactionModel,\n };\n return this.execute(api_internal_contract_js_1.VerbId.RaiseSelectTuplesNotification, parameters).then((response) => {\n return;\n });\n }\n apiFilterHandlerCheckForCommandError(serverPm) {\n if (!serverPm[api_internal_contract_js_1.ParameterId.ParameterError]) {\n return;\n }\n if (serverPm[api_internal_contract_js_1.ParameterId.InvalidFields]) {\n throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InvalidSelectionFieldName, serverPm[api_internal_contract_js_1.ParameterId.InvalidFields]);\n }\n if (serverPm[api_internal_contract_js_1.ParameterId.InvalidValues]) {\n throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InvalidSelectionValue, serverPm[api_internal_contract_js_1.ParameterId.InvalidValues]);\n }\n if (serverPm[api_internal_contract_js_1.ParameterId.InvalidDates]) {\n throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InvalidSelectionDate, serverPm[api_internal_contract_js_1.ParameterId.InvalidDates]);\n }\n }\n /**\n * Method to select marks for the given worksheet.\n *\n * @param visualId\n * @param MarkInfo\n * @param selectionUpdateType\n */\n selectMarksByIdAsync(visualId, marks, selectionUpdateType) {\n if (marks.length === 0) {\n throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Marks info missing for selecting marks by Id');\n }\n const selectionType = this.validateSelectionUpdateType(selectionUpdateType);\n const selectionModelContainer = this.parseSelectionIds(marks);\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'selectMarksByIdAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n [api_internal_contract_js_1.ParameterId.SelectionUpdateType]: selectionType,\n [api_internal_contract_js_1.ParameterId.Selection]: selectionModelContainer.selection,\n };\n return this.execute(api_internal_contract_js_1.VerbId.SelectByValue, parameters).then((response) => {\n // Expecting an empty model and hence the void response.\n return;\n // TODO Investigate the error response with multiple output params and throw error accordingly.\n });\n }\n /**\n * Method to prepare the pres models for selection by MarksInfo\n * @param marks\n */\n parseSelectionIds(marks) {\n const ids = [];\n const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer();\n for (let i = 0; i < marks.length; i++) {\n const tupleId = marks[i].tupleId;\n if (tupleId !== undefined && tupleId !== null) {\n // If tuple id is provided use that instead of pair\n ids.push(tupleId.toString()); // collect the tuple ids\n }\n else {\n throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'tupleId parsing error');\n }\n }\n if (ids.length !== 0) {\n // tuple ids based selection\n const tupleSelectionModel = new SelectionModels_1.TupleSelectionModel();\n tupleSelectionModel.selectionType = 'tuples';\n tupleSelectionModel.objectIds = ids;\n selectionModelContainer.selection = tupleSelectionModel;\n }\n return selectionModelContainer;\n }\n /**\n * Method to prepare the pres models for selection by values.\n *\n * Supports 3 types for selection:\n * 1) Hierarchical value based selection\n * 2) Range value based selection\n * 3) Dimension value based selection\n *\n * @param marks\n */\n parseSelectionMarks(selectionCriterias) {\n const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer();\n for (let i = 0; i < selectionCriterias.length; i++) {\n const st = selectionCriterias[i];\n if (!(st.fieldName && st.value !== undefined && st.value !== null)) {\n throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'Selection Criteria parsing error');\n }\n const catRegex = new RegExp('([[A-Za-z0-9]+]).*', 'g');\n const rangeOption = st.value;\n if (catRegex.test(st.fieldName)) {\n // Hierarchical value selection\n const hierModel = this.addToParamsList(st.fieldName, st.value);\n selectionModelContainer.hierModelArr.push(hierModel);\n }\n else if (rangeOption.min !== undefined && rangeOption.max !== undefined) {\n // Range value selection\n const quantModel = this.addToRangeParamsList(st.fieldName, rangeOption);\n selectionModelContainer.quantModelArr.push(quantModel);\n }\n else {\n // Dimension value selection\n const dimModel = this.addToParamsList(st.fieldName, st.value);\n selectionModelContainer.dimModelArr.push(dimModel);\n }\n }\n return selectionModelContainer;\n }\n /**\n * Method to transform the key value pair into value based pres model object.\n *\n * @param valueSelectionModel\n * @param fieldName\n * @param value\n */\n addToParamsList(fieldName, value) {\n const valueSelectionModel = new SelectionModels_1.ValueSelectionModel();\n const markValues = [];\n if (value instanceof Array) {\n const valueArr = value;\n for (let i = 0; i < valueArr.length; i++) {\n markValues.push(Param_1.Param.serializeParameterValue(valueArr[i]));\n }\n }\n else {\n markValues.push(Param_1.Param.serializeParameterValue(value));\n }\n valueSelectionModel.qualifiedFieldCaption = fieldName;\n valueSelectionModel.selectValues = markValues;\n return valueSelectionModel;\n }\n /**\n * Method to transform the key value pair into range based selection pres model.\n *\n * TODO: Need to handle the parsing of date type values.\n *\n * @param valueSelectionModel\n * @param fieldName\n * @param value\n */\n addToRangeParamsList(fieldName, value) {\n const rangeSelectionModel = new SelectionModels_1.RangeSelectionModel();\n rangeSelectionModel.qualifiedFieldCaption = fieldName;\n if (value.max !== undefined && value.max !== null) {\n rangeSelectionModel.maxValue = Param_1.Param.serializeParameterValue(value.max);\n }\n if (value.min !== undefined && value.min !== null) {\n rangeSelectionModel.minValue = Param_1.Param.serializeParameterValue(value.min);\n }\n rangeSelectionModel.included = this.validateNullOptionType(value.nullOption);\n return rangeSelectionModel;\n }\n /**\n * Method to validate the selection update type.\n *\n * @param selectionUpdateType\n */\n validateSelectionUpdateType(selectionUpdateType) {\n if (selectionUpdateType === Contract.SelectionUpdateType.Replace) {\n return api_internal_contract_js_1.SelectionUpdateType.Replace;\n }\n else if (selectionUpdateType === Contract.SelectionUpdateType.Add) {\n return api_internal_contract_js_1.SelectionUpdateType.Add;\n }\n else if (selectionUpdateType === Contract.SelectionUpdateType.Remove) {\n return api_internal_contract_js_1.SelectionUpdateType.Remove;\n }\n return api_internal_contract_js_1.SelectionUpdateType.Replace;\n }\n /**\n * Method to validate the include type for range selection.\n *\n * @param nullOption\n */\n validateNullOptionType(nullOption) {\n if (nullOption) {\n if (nullOption === Contract.FilterNullOption.NullValues) {\n return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeNull;\n }\n else if (nullOption === Contract.FilterNullOption.NonNullValues) {\n return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeNonNull;\n }\n else if (nullOption === Contract.FilterNullOption.AllValues) {\n return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeAll;\n }\n }\n return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeAll;\n }\n ensureTupleIDIsNonNegative(tupleId) {\n if (tupleId && tupleId > 0) {\n return tupleId;\n }\n // 0 will not refer to a valid tuple (since tuple ids are 1-based),\n // but can be used for clearing the current hover or selection\n return 0;\n }\n}\nexports.SelectionServiceImpl = SelectionServiceImpl;\n//# sourceMappingURL=SelectionServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst InternalToExternalEnumMappings_1 = require(\"../../EnumMappings/InternalToExternalEnumMappings\");\nconst TableauError_1 = require(\"../../TableauError\");\nconst EnumConverter_1 = require(\"../../Utils/EnumConverter\");\n/**\n * Each ServceImpl should extend this base class for the sake of\n * proper error handling. This base handles the conversion\n * from internal errors to external errors that we throw to developers\n */\nclass ServiceImplBase {\n constructor(_dispatcher, _registryId) {\n this._dispatcher = _dispatcher;\n this._registryId = _registryId;\n }\n execute(verb, params) {\n return this._dispatcher.execute(verb, params).catch((error) => {\n // Any internal error that comes from the dispatcher should be converted\n // to an external error using the enum mapper for error codes.\n const internalError = error;\n const externalErrorCode = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.errorCode.convert(internalError.errorCode, EnumConverter_1.ShouldThrow.No);\n throw new TableauError_1.TableauError(externalErrorCode, internalError.message);\n });\n }\n}\nexports.ServiceImplBase = ServiceImplBase;\n//# sourceMappingURL=ServiceImplBase.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass SizeServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"size-service\" /* Size */;\n }\n changeSizeAsync(name, newSize) {\n var _a, _b, _c, _d;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'changeSizeAsync',\n [api_internal_contract_js_1.ParameterId.SheetName]: name,\n [api_internal_contract_js_1.ParameterId.MinHeight]: ((_a = newSize.minSize) === null || _a === void 0 ? void 0 : _a.height) || 0,\n [api_internal_contract_js_1.ParameterId.MinWidth]: ((_b = newSize.minSize) === null || _b === void 0 ? void 0 : _b.width) || 0,\n [api_internal_contract_js_1.ParameterId.MaxHeight]: ((_c = newSize.maxSize) === null || _c === void 0 ? void 0 : _c.height) || 0,\n [api_internal_contract_js_1.ParameterId.MaxWidth]: ((_d = newSize.maxSize) === null || _d === void 0 ? void 0 : _d.width) || 0,\n };\n return this.execute(api_internal_contract_js_1.VerbId.SetSheetSize, parameters).then((_response) => {\n return;\n });\n }\n}\nexports.SizeServiceImpl = SizeServiceImpl;\n//# sourceMappingURL=SizeServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass StoryActivationServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"story-activation-service\" /* StoryActivation */;\n }\n activateNextStoryPointAsync() {\n const verb = api_internal_contract_js_1.VerbId.ActivateNextStoryPoint;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'activateNextStoryPointAsync',\n };\n return this.execute(verb, parameters).then((response) => {\n return;\n });\n }\n activatePreviousStoryPointAsync() {\n const verb = api_internal_contract_js_1.VerbId.ActivatePreviousStoryPoint;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'activatePreviousStoryPointAsync',\n };\n return this.execute(verb, parameters).then((response) => {\n return;\n });\n }\n activateStoryPointAsync(index) {\n const verb = api_internal_contract_js_1.VerbId.ActivateStoryPoint;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'activateStoryPointAsync',\n };\n parameters[api_internal_contract_js_1.ParameterId.StoryPointIndex] = index;\n return this.execute(verb, parameters).then((response) => {\n return;\n });\n }\n revertStoryPointAsync(index) {\n const verb = api_internal_contract_js_1.VerbId.RevertStoryPoint;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'revertStoryPointAsync',\n };\n parameters[api_internal_contract_js_1.ParameterId.StoryPointIndex] = index;\n return this.execute(verb, parameters).then((response) => {\n return response.result;\n });\n }\n}\nexports.StoryActivationServiceImpl = StoryActivationServiceImpl;\n//# sourceMappingURL=StoryActivationServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass VisualModelServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"visual-model-service\" /* VisualModel */;\n }\n getVisualSpecificationAsync(visualId) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getVisualSpecificationAsync',\n [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetVisualSpecification, parameters).then((response) => {\n const result = response.result;\n return result;\n });\n }\n addMarksCardFieldsAsync(visualId, marksCardIndex, encodingType, columns, startIndex) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'addMarksCardFieldsAsync',\n [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet,\n [api_internal_contract_js_1.ParameterId.MarksCardIndex]: marksCardIndex,\n [api_internal_contract_js_1.ParameterId.EncodingType]: encodingType,\n [api_internal_contract_js_1.ParameterId.Columns]: columns,\n [api_internal_contract_js_1.ParameterId.StartIndex]: startIndex,\n };\n return this.execute(api_internal_contract_js_1.VerbId.AddMarksCardFields, parameters).then(() => {\n return;\n });\n }\n moveMarksCardFieldAsync(visualId, marksCardIndex, fromIndex, toIndex, fieldCount = 1) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'addMarksCardFieldsAsync',\n [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet,\n [api_internal_contract_js_1.ParameterId.MarksCardIndex]: marksCardIndex,\n [api_internal_contract_js_1.ParameterId.FromIndex]: fromIndex,\n [api_internal_contract_js_1.ParameterId.ToIndex]: toIndex,\n [api_internal_contract_js_1.ParameterId.FieldCount]: fieldCount,\n };\n return this.execute(api_internal_contract_js_1.VerbId.MoveMarksCardField, parameters).then(() => {\n return;\n });\n }\n spliceMarksCardFieldsAsync(visualId, marksCardIndex, encodingType, startIndex, deleteCount, columns) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'spliceMarksCardFieldsAsync',\n [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet,\n [api_internal_contract_js_1.ParameterId.MarksCardIndex]: marksCardIndex,\n [api_internal_contract_js_1.ParameterId.EncodingType]: encodingType,\n [api_internal_contract_js_1.ParameterId.StartIndex]: startIndex,\n [api_internal_contract_js_1.ParameterId.DeleteCount]: deleteCount,\n [api_internal_contract_js_1.ParameterId.Columns]: columns,\n };\n return this.execute(api_internal_contract_js_1.VerbId.SpliceMarksCardFields, parameters).then(() => {\n return;\n });\n }\n editAliasesDialogAsync(fieldName) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'editAliasesDialogAsync',\n [api_internal_contract_js_1.ParameterId.FieldId]: fieldName,\n };\n return this.execute(api_internal_contract_js_1.VerbId.EditAliasesDialog, parameters).then(() => {\n return;\n });\n }\n}\nexports.VisualModelServiceImpl = VisualModelServiceImpl;\n//# sourceMappingURL=VisualModelServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst CustomViewImpl_1 = require(\"../../Impl/CustomViewImpl\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass VizServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"viz-service\" /* Viz */;\n }\n createVizImageAsync(inputSpec) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'createVizImageAsync',\n [api_internal_contract_js_1.ParameterId.VizAPIInputJson]: JSON.stringify(inputSpec),\n };\n return this.execute(api_internal_contract_js_1.VerbId.VizAPI, parameters).then((response) => {\n const result = response.result;\n return result;\n });\n }\n activateSheetAsync(name) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'activateSheetAsync',\n [api_internal_contract_js_1.ParameterId.SwitchToSheetName]: name,\n };\n return this.execute(api_internal_contract_js_1.VerbId.ActivateSheet, parameters).then(() => {\n return;\n });\n }\n getCustomViewsAsync() {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getCustomViewsAsync',\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetCustomViews, parameters).then((response) => {\n const customViews = response.result;\n return customViews.map((customView) => {\n return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId);\n });\n });\n }\n showCustomViewAsync(customViewName) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'showCustomViewAsync',\n [api_internal_contract_js_1.ParameterId.CustomViewName]: customViewName || '',\n };\n return this.execute(api_internal_contract_js_1.VerbId.ShowCustomView, parameters).then((response) => {\n var _a;\n const customView = response.result;\n return ((_a = customView) === null || _a === void 0 ? void 0 : _a.luid) ? new CustomViewImpl_1.CustomViewImpl(customView, this._registryId) : undefined;\n });\n }\n removeCustomViewAsync(customViewName) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'removeCustomViewAsync',\n [api_internal_contract_js_1.ParameterId.CustomViewName]: customViewName,\n };\n return this.execute(api_internal_contract_js_1.VerbId.RemoveCustomView, parameters).then((response) => {\n const customView = response.result;\n return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId);\n });\n }\n saveCustomViewAsync(customViewName) {\n // CustomViewIsDefault is a required parameter, but our API has not been updated to allow it to be specified yet.\n // We should add a 'default' parameter to the interface.\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'saveCustomViewAsync',\n [api_internal_contract_js_1.ParameterId.CustomViewName]: customViewName,\n [api_internal_contract_js_1.ParameterId.CustomViewIsDefault]: false,\n };\n return this.execute(api_internal_contract_js_1.VerbId.SaveWorkbookAsCustomView, parameters).then((response) => {\n const customView = response.result;\n return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId);\n });\n }\n setActiveCustomViewAsDefaultAsync() {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'setActiveCustomViewAsDefaultAsync',\n };\n return this.execute(api_internal_contract_js_1.VerbId.SetActiveCustomViewAsDefault, parameters).then(() => {\n return;\n });\n }\n saveAsync(customView) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'saveAsync',\n [api_internal_contract_js_1.ParameterId.CustomViewLuid]: customView.luid,\n [api_internal_contract_js_1.ParameterId.CustomViewName]: customView.name,\n [api_internal_contract_js_1.ParameterId.CustomViewIsDefault]: customView.isDefault,\n [api_internal_contract_js_1.ParameterId.CustomViewIsPublic]: customView.shared,\n };\n return this.execute(api_internal_contract_js_1.VerbId.UpdateCustomView, parameters).then((response) => {\n const customView = response.result;\n return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId);\n });\n }\n getCurrentSrcAsync() {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getCurrentSrcAsync',\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetCurrentSrc, parameters).then((response) => response.result);\n }\n}\nexports.VizServiceImpl = VizServiceImpl;\n//# sourceMappingURL=VizServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst ExternalToInternalEnumMappings_1 = require(\"../../EnumMappings/ExternalToInternalEnumMappings\");\nconst ErrorHelpers_1 = require(\"../../Utils/ErrorHelpers\");\nconst Param_1 = require(\"../../Utils/Param\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass ZoneServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"zone-service\" /* Zone */;\n }\n setVisibilityAsync(dashboard, dashboardZoneMap, zoneVisibilityMap) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'setVisibilityAsync',\n [api_internal_contract_js_1.ParameterId.Dashboard]: dashboard,\n [api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap]: {},\n };\n // zoneVisibilityMap can be either an object or a Map - convert it to a Map\n const parameterAsMap = Param_1.Param.convertParameterToMap(zoneVisibilityMap, 'zoneVisibilityMap');\n parameterAsMap.forEach((value, key) => {\n ErrorHelpers_1.ErrorHelpers.verifyZoneIsValid(dashboardZoneMap, Number.parseInt(key, 10));\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(value, api_external_contract_js_1.DashboardObjectVisibilityType, 'DashboardObjectVisibilityType');\n parameters[api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap][key] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.setVisibilityType.convert(value);\n });\n return this.execute(api_internal_contract_js_1.VerbId.SetZoneVisibility, parameters).then((response) => {\n return;\n });\n }\n moveAndResizeAsync(dashboard, dashboardZoneMap, dashboardObjectPositionAndSizeUpdateArray) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.Dashboard]: dashboard,\n [api_internal_contract_js_1.ParameterId.DashboardObjectPositionAndSizeUpdateList]: dashboardObjectPositionAndSizeUpdateArray,\n };\n dashboardObjectPositionAndSizeUpdateArray.forEach((dashboardObject) => {\n ErrorHelpers_1.ErrorHelpers.verifyZoneIsValidAndFloating(dashboardZoneMap, dashboardObject.dashboardObjectID);\n ErrorHelpers_1.ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(dashboardObject);\n });\n return this.execute(api_internal_contract_js_1.VerbId.MoveAndResizeZones, parameters).then((response) => {\n return;\n });\n }\n}\nexports.ZoneServiceImpl = ZoneServiceImpl;\n//# sourceMappingURL=ZoneServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Implementation of a table summary.\n * This does not follow the Impl pattern as it is just a property bag.\n */\nclass TableSummary {\n constructor(_tableInfo) {\n this._tableInfo = _tableInfo;\n }\n get name() {\n return this._tableInfo.name;\n }\n get id() {\n return this._tableInfo.id;\n }\n get connectionId() {\n return this._tableInfo.connectionId;\n }\n get customSQL() {\n return this._tableInfo.customSQL;\n }\n}\nexports.TableSummary = TableSummary;\n//# sourceMappingURL=TableSummary.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Custom error class that extends the default JavaScript Error object.\n * This allows us to provide a field with a specific error code\n * so that developers can more easily programmatically respond\n * to error scenarios.\n */\nclass TableauError extends Error {\n constructor(_errorCode, message) {\n super(`${_errorCode}: ${message}`);\n this._errorCode = _errorCode;\n /*tslint:disable-next-line */\n // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\n // Error inheritance does not work propertly when compiling to ES5, this is a workaround to force\n // the proto chain to be built correctly. See the github link above for details.\n Object.setPrototypeOf(this, TableauError.prototype);\n }\n get errorCode() {\n return this._errorCode;\n }\n}\nexports.TableauError = TableauError;\n//# sourceMappingURL=TableauError.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst InternalContract = require(\"@tableau/api-internal-contract-js\");\nconst GetDataModels_1 = require(\"../Models/GetDataModels\");\n/**\n * In version 2 of the interface, we should collapse value into nativeValue, and do all this work over\n * in the platform.\n */\nclass DataValueFactory {\n static MakeParameterDataValue(internalDataValue, dataType) {\n // Parameter values are all strings, convert from string to value\n return new GetDataModels_1.DataValue(internalDataValue.value, InternalContract.DataTypeConverter.convertStringValueToNativeValue(internalDataValue.value, dataType), internalDataValue.formattedValue, internalDataValue.aliasedValue, internalDataValue.hasAlias);\n }\n static MakeFilterDataValue(internalDataValue) {\n // Filters already have native type in value, just use that for nativeValue also\n return new GetDataModels_1.DataValue(internalDataValue.value, internalDataValue.value, internalDataValue.formattedValue);\n }\n static MakeTableDataValue(internalDataValue, dataType) {\n // DataTables contain boolean | number | string | date as string | '%null%\n // convertValueToNativeValue converts dates as string to dates, and any special to null\n // (boolean, numbers, strings are passed through)\n // Because of IncludeDataValuesOption - we can have undefined values, which are different than any special\n return new GetDataModels_1.DataValue(internalDataValue.value, internalDataValue.value !== undefined\n ? InternalContract.DataTypeConverter.convertValueToNativeValue(internalDataValue.value, dataType)\n : undefined, internalDataValue.formattedValue);\n }\n}\nexports.DataValueFactory = DataValueFactory;\n//# sourceMappingURL=DataValueFactory.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * A Promise wrapper class allowing for resolving/rejecting the Promise outside the context of its constructor.\n *\n * @export\n * @class Deferred\n * @template TResolve The type used to resolve the promise.\n * @template TReject The type used to reject the promise. Defaults to any.\n * @link https://stackoverflow.com/a/34637436\n */\nclass Deferred {\n /**\n * Creates an instance of Deferred.\n */\n constructor() {\n this._promise = new Promise((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n }\n /**\n * Gets the Promise.\n *\n * @readonly\n * @type {Promise}\n */\n get promise() {\n return this._promise;\n }\n /**\n * Resolves the wrapped Promise.\n *\n * @param {(TResolve | PromiseLike)} response The argument to be resolved by the Promise.\n * @returns {*} {void}\n */\n resolve(response) {\n if (!this._resolve) {\n return;\n }\n this._resolve(response);\n }\n /**\n *\n *\n * @param {TReject} [reason] The reason why the Promise rejected.\n * @returns {*} {void}\n */\n reject(reason) {\n if (!this._reject) {\n return;\n }\n this._reject(reason);\n }\n}\nexports.Deferred = Deferred;\nexports.UnregisterTimeoutInMilliseconds = 30000;\n//# sourceMappingURL=Deferred.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst TableauError_1 = require(\"../TableauError\");\n/**\n * This class converts from a source enum value to destination enum\n * value given a mapping from source to destination when constructed.\n *\n * Note: This exact same class is defined in api-core. Given its small\n * nature, it is not worth having in a separate project to share this between\n * api-core and api-shared. If more utility functionality is added that is used by api-core\n * and api-shared but has no other dependecies, a utiltity project might be merited,\n * and this class could be moved.\n */\nclass EnumConverter {\n constructor(_mappings, _defaultVal) {\n this._mappings = _mappings;\n this._defaultVal = _defaultVal;\n }\n convert(enumVal, throwIfMissing = ShouldThrow.Yes) {\n if (this._mappings.hasOwnProperty(enumVal)) {\n return this._mappings[enumVal];\n }\n if (this._defaultVal !== undefined && throwIfMissing !== ShouldThrow.Yes) {\n return this._defaultVal;\n }\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Enum Mapping not found for: ${enumVal}`);\n }\n}\nexports.EnumConverter = EnumConverter;\nvar ShouldThrow;\n(function (ShouldThrow) {\n ShouldThrow[\"Yes\"] = \"yes\";\n ShouldThrow[\"No\"] = \"no\";\n})(ShouldThrow = exports.ShouldThrow || (exports.ShouldThrow = {}));\n//# sourceMappingURL=EnumConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst TableauError_1 = require(\"../TableauError\");\nconst Param_1 = require(\"./Param\");\n/**\n * This class is used to construct common errors throughout the external\n * projects (api-shared, extensions-api, etc.). It has some duplication with\n * the ErrorHelpers class in api-core, but is separate due to the need to throw\n * an external TableauError vs. an InternalTableauError.\n */\nclass ErrorHelpers {\n /**\n * Throws with code InternalError.\n *\n * @param apiName name of api that was called.\n */\n static apiNotImplemented(apiName) {\n return new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `${apiName} API not yet implemented.`);\n }\n /**\n * Throws an internal error if argument is null or undefined.\n *\n * @param argumentValue value to verify\n * @param argumentName name of argument to verify\n */\n /*tslint:disable-next-line */\n static verifyInternalValue(argumentValue, argumentName) {\n if (argumentValue === null || argumentValue === undefined) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `${argumentValue} is invalid value for: ${argumentName}`);\n }\n }\n /**\n * Throws an InvalidParameter error if argument is null or undefined.\n *\n * @param argumentValue value to verify\n * @param argumentName name of argument to verify\n */\n /*tslint:disable-next-line */\n static verifyParameter(argumentValue, argumentName) {\n if (argumentValue === null || argumentValue === undefined) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${argumentValue} is invalid value for parameter: ${argumentName}`);\n }\n }\n /**\n * Throws an InvalidParameter error if argument is not the specified type.\n * For objects, it just tests that it is an object\n *\n * @param argumentValue value to verify\n * @param expectedType expected result of typeof\n * @param argumentName name of argument to verify\n */\n /*tslint:disable-next-line */\n static verifyParameterType(argumentValue, expectedType, argumentName) {\n if (typeof argumentValue !== expectedType) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${argumentValue} has invalid type for parameter: ${argumentName}.`);\n }\n }\n /**\n * Throws an InvalidParameter error if argument is empty string, null or undefined.\n *\n * @param argumentValue value to verify\n * @param argumentName name of argument to verify\n */\n /*tslint:disable-next-line */\n static verifyStringParameter(argumentValue, argumentName) {\n if (argumentValue === null || argumentValue === undefined || argumentValue === '') {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${argumentValue} is invalid value for paramter: ${argumentName}`);\n }\n }\n /**\n * Verifies passed value is a valid value for that enum.\n *\n * String enums are {string : string} dictionaries which are not reverse mappable\n * This is an ugly workaround\n *\n * @param enumValue value to verify\n * @param enumType enum to verify against\n */\n /*tslint:disable-next-line */\n static isValidEnumValue(enumValue, enumType) {\n let isValid = false;\n Object.keys(enumType).forEach((enumKey) => {\n if (enumType[enumKey] === enumValue.toString()) {\n isValid = true;\n }\n });\n return isValid;\n }\n /**\n * Verifies passed value is a valid value for that enum.\n * Throws an InvalidParameter error if the enum value is not valid.\n *\n * String enums are {string : string} dictionaries which are not reverse mappable\n * This is an ugly workaround\n *\n * @param enumValue value to verify\n * @param enumType enum to verify against\n * @param enumName enum name for clear error message\n */\n /*tslint:disable-next-line */\n static verifyEnumValue(enumValue, enumType, enumName) {\n if (!ErrorHelpers.isValidEnumValue(enumValue, enumType)) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${enumValue} is invalid value for enum: ${enumName}.`);\n }\n }\n /**\n * Verifies passed value is between [min, max) ... min <= value < max\n * Throws an InvalidParameter error if the value is not valid.\n *\n *\n * @param value value to verify\n * @param min value must be >= min\n * @param max value must be < max\n */\n static verifyRange(value, min, max) {\n let isValid = min <= value && value < max;\n if (!isValid) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${value} is invalid value for range: [${min}..${max})`);\n }\n }\n /**\n * Verifies the params min and max for applying range filter.\n * Throws with error code InvalidParameter if range is invalid.\n *\n * @param min range min\n * @param max range max\n */\n static verifyRangeParamType(min, max) {\n const isMinDefined = min !== undefined;\n const isMaxDefined = max !== undefined;\n if (!isMinDefined && !isMaxDefined) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'Unexpected invalid param value, at least one of min or max is required.');\n }\n if (isMinDefined && !Param_1.Param.isTypeNumber(min) && !Param_1.Param.isTypeDate(min)) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'Unexpected invalid param value, only Date and number are allowed for parameter min.');\n }\n if (isMaxDefined && !Param_1.Param.isTypeNumber(max) && !Param_1.Param.isTypeDate(max)) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'Unexpected invalid param value, only Date and number are allowed for parameter max.');\n }\n if (isMinDefined && isMaxDefined && typeof min !== typeof max) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'Unexpected invalid param value, parameters min and max should be of the same type.');\n }\n }\n /**\n * Verifies that the zoneId is present in the current dashboard.\n * Throws with error code InvalidParameter if either condition is false.\n *\n * @param dashboardZoneMap A map of zoneId's to the corresponding dashboard object.\n * @param zoneID ZoneId to be validated\n */\n static verifyZoneIsValid(dashboardZoneMap, zoneID) {\n if (dashboardZoneMap.has(zoneID)) {\n return;\n }\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `Unexpected invalid param value, Dashboard Object Id: ${zoneID} is not present in dashboard.`);\n }\n /**\n * Verifies that the zone is present and floating in the current dashboard.\n * Throws with error code InvalidParameter if either condition is false.\n *\n * @param dashboardZoneMap A map of zoneId's to the corresponding dashboard object.\n * @param zoneID ZoneId to be validated\n */\n static verifyZoneIsValidAndFloating(dashboardZoneMap, zoneID) {\n if (dashboardZoneMap.has(zoneID) && dashboardZoneMap.get(zoneID).isFloating) {\n return;\n }\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `Unexpected invalid param value, Dashboard Object Id: ${zoneID} is not present or is a fixed zone in the dashboard.`);\n }\n /**\n * Verifies that width and height are > 0 for each DashboardObjectPositionAndSizeUpdate object.\n * Throws with error code InvalidParameter if either condition is false.\n *\n * @param dashboardObjectPositionAndSizeUpdate DashboardObjectPositionAndSizeUpdate object for which width and height will be validated\n */\n static verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(dashboardObjectPositionAndSizeUpdate) {\n if (dashboardObjectPositionAndSizeUpdate.width < 0 || dashboardObjectPositionAndSizeUpdate.height < 0) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `Unexpected invalid param value for dashboard object ID ${dashboardObjectPositionAndSizeUpdate.dashboardObjectID}:` +\n ` negative widths and heights are not allowed.`);\n }\n }\n /**\n * Verifies is the given sheet name is in the list of sheets names allowed for exporting.\n * Throws with error code InvalidParameter if the condition above is false.\n *\n * @param exportableSheetNames A list of sheet names allowed for exporting\n * @param sheetName the name of the sheet selected for export\n */\n static verifySheetName(exportableSheetNames, sheetName) {\n if (!exportableSheetNames.includes(sheetName)) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidSelectionSheet, 'sheetName parameter must belong to a worksheet within the current view');\n }\n }\n /**\n * Verifies the ExportDataOptions object\n * Throws with error code InvalidParameter if the parameter is not of ExportDataOptions type.\n *\n * @param options The ExportDataOptions object used to configure the output CSV file for exportDataAsync.\n */\n static verifyExportDataOptions(options) {\n if ((!Param_1.Param.isNullOrUndefined(options.ignoreAliases) && !Param_1.Param.isTypeBool(options.ignoreAliases)) ||\n (!Param_1.Param.isNullOrUndefined(options.columnsToIncludeById) && !Array.isArray(options.columnsToIncludeById)))\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'options paramater must be of type ExportDataOptions');\n }\n /**\n * Verifies if the sheet names are included in any of the export scenarios.\n * Throws with error code InvalidParameter if the parameter is not an array.\n * Throws with error code InvalidSelectionSheet if there are array entries that dont exist or if there is mixing between sheets from the dashboard and sheet from the workbook.\n *\n * @param sheetNames List of sheet names selected for exporting.\n * @param exportScenarios an object containing the current sheet name, exportable sheets from the dashboard, and exportable sheets from the workbook.\n */\n static verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios) {\n if (!Array.isArray(sheetNames))\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'sheetNames parameter must be an array');\n if (sheetNames.length === 0)\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'sheetNames should not be empty');\n const isIncludedInDashboard = sheetNames.every((sheetName) => exportScenarios.exportableSheetNamesFromDashboard.includes(sheetName));\n if (isIncludedInDashboard) {\n return;\n }\n const isIncludedInWorkbook = sheetNames.every((sheetName) => exportScenarios.exportableSheetNamesFromWorkbook.includes(sheetName));\n if (isIncludedInWorkbook) {\n return;\n }\n const isCurrentSheet = sheetNames.length === 1 && sheetNames[0] === exportScenarios.currentSheetName;\n if (isCurrentSheet) {\n return;\n }\n // Export requirement: all sheet names must be included in the list of exportable sheets in the dashboard or\n // all sheet names must be included in the list of exportable sheets in the workbook, or the sheet name is the current sheet\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidSelectionSheet, 'sheetNames parameter must have all its entries be exportable sheet names from the dashboard or all its entries be exportable sheet names from the workbook');\n }\n /**\n * Verifies the external ExportPDFOptions object's properties.\n * Throws with error code InvalidParameter if the parameter is not of external ExportPDFOptions type.\n *\n * @param options The external user-facing ExportPDFOptions object used to configure the output PDF file for exportPDFAsync.\n */\n static verifyExportPDFOptions(options) {\n try {\n this.verifyEnumValue(options.orientation, api_external_contract_js_1.PrintOrientation, 'PrintOrientation');\n this.verifyEnumValue(options.pageSize, api_external_contract_js_1.PrintPageSize, 'PrintPageSize');\n this.verifyEnumValue(options.scaling, api_external_contract_js_1.PrintScaling, 'PrintScaling');\n }\n catch (_a) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'options parameter must be of type ExportPDFOptions');\n }\n }\n}\nexports.ErrorHelpers = ErrorHelpers;\n//# sourceMappingURL=ErrorHelpers.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst TableauError_1 = require(\"../TableauError\");\n/**\n * Helper methods for Export APIs.\n *\n * @class ExportHelpers\n */\nclass ExportHelpers {\n /**\n * Modifies the internal ExportPDFOptions' properties based on the given PDF export configuration.\n * This method will construct the internal ExportPDFOptions identically to how the 'Export PDF' dialog constructs the ExportPdfOptionsPresModel.\n * See the handleExportClick method in @browser-clients/export-pdf-options-dialog for reference.\n *\n * @param internalExportPdfOptions The internal ExportPDFOptions pres model used to configure the output PDF file.\n * @param externalExportPdfOptions The external ExportPDFOptions user-facing object passed to exportPDFAsync.\n * @param sheetNames The list of sheets selected for export.\n */\n static updateInternalExportPDFOptions(internalExportPdfOptions, externalExportPdfOptions, sheetNames) {\n internalExportPdfOptions.currentSheet = sheetNames[0];\n this.updateExportLayoutOptions(internalExportPdfOptions, externalExportPdfOptions);\n this.updateSheetOptions(internalExportPdfOptions, sheetNames);\n }\n /**\n * Helper method for updateInternalExportPDFOptions.\n * Modifies the exportLayoutOptions property of the internal ExportPDFOptions based on the external ExportPDFOptions.\n * See the getExportLayoutOptions method in @browser-clients/export-pdf-options-dialog for reference.\n *\n * @param internalExportPdfOptions The internal ExportPDFOptions pres model used to configure the output PDF file.\n * @param externalExportPdfOptions The external ExportPDFOptions user-facing object passed to exportPDFAsync.\n */\n static updateExportLayoutOptions(internalExportPdfOptions, externalExportPdfOptions) {\n const exportLayoutOptions = internalExportPdfOptions.exportLayoutOptions;\n // setting the image height and width properties to their default values\n exportLayoutOptions.imageHeight = this.DefaultLayoutOptions.imageHeight;\n exportLayoutOptions.imageWidth = this.DefaultLayoutOptions.imageWidth;\n // setting the orientation value for the exportLayoutOptions\n switch (externalExportPdfOptions.orientation) {\n case api_external_contract_js_1.PrintOrientation.Landscape:\n exportLayoutOptions.pageOrientationOption = api_internal_contract_js_1.PageOrientation.Landscape;\n break;\n case api_external_contract_js_1.PrintOrientation.Portrait:\n exportLayoutOptions.pageOrientationOption = api_internal_contract_js_1.PageOrientation.Portrait;\n break;\n default:\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'invalid orientation for ExportPDFOption');\n }\n // setting the page size value for the exportLayoutOptions\n switch (externalExportPdfOptions.pageSize) {\n case api_external_contract_js_1.PrintPageSize.A3:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.A3;\n break;\n case api_external_contract_js_1.PrintPageSize.A4:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.A4;\n break;\n case api_external_contract_js_1.PrintPageSize.A5:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.A5;\n break;\n case api_external_contract_js_1.PrintPageSize.B4:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.B4;\n break;\n case api_external_contract_js_1.PrintPageSize.B5:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.B5;\n break;\n case api_external_contract_js_1.PrintPageSize.Executive:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Executive;\n break;\n case api_external_contract_js_1.PrintPageSize.Folio:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Folio;\n break;\n case api_external_contract_js_1.PrintPageSize.Ledger:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Ledger;\n break;\n case api_external_contract_js_1.PrintPageSize.Legal:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Legal;\n break;\n case api_external_contract_js_1.PrintPageSize.Letter:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Letter;\n break;\n case api_external_contract_js_1.PrintPageSize.Note:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Note;\n break;\n case api_external_contract_js_1.PrintPageSize.Quarto:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Quarto;\n break;\n case api_external_contract_js_1.PrintPageSize.Statement:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Statement;\n break;\n case api_external_contract_js_1.PrintPageSize.Tabloid:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Tabloid;\n break;\n case api_external_contract_js_1.PrintPageSize.Unspecified:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Unspecified;\n break;\n default:\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'invalid pageSize for ExportPDFOption');\n }\n // setting the scaling values for the exportLayoutOptions\n switch (externalExportPdfOptions.scaling) {\n case api_external_contract_js_1.PrintScaling.AtMost1PageHigh:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.FitPages.FitOneHigh);\n break;\n case api_external_contract_js_1.PrintScaling.AtMost1PageWide:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.FitPages.FitOneWide);\n break;\n case api_external_contract_js_1.PrintScaling.AtMost2PagesHigh:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.FitPages.FitTwoHigh);\n break;\n case api_external_contract_js_1.PrintScaling.AtMost2PagesWide:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.FitPages.FitTwoWide);\n break;\n case api_external_contract_js_1.PrintScaling.Automatic:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePctAuto);\n break;\n case api_external_contract_js_1.PrintScaling.Perc100:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct100);\n break;\n case api_external_contract_js_1.PrintScaling.Perc200:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct200);\n break;\n case api_external_contract_js_1.PrintScaling.Perc25:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct25);\n break;\n case api_external_contract_js_1.PrintScaling.Perc400:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct400);\n break;\n case api_external_contract_js_1.PrintScaling.Perc50:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct50);\n break;\n case api_external_contract_js_1.PrintScaling.Perc60:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct60);\n break;\n case api_external_contract_js_1.PrintScaling.Perc75:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct75);\n break;\n case api_external_contract_js_1.PrintScaling.Perc80:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct80);\n break;\n case api_external_contract_js_1.PrintScaling.Perc90:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct90);\n break;\n default:\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'invalid scaling for ExportPDFOption');\n }\n }\n /**\n * Helper method for updateInternalExportPDFOptions.\n * Modifies the sheetOptions property of the internal ExportPDFOptions based on the sheets selected for export.\n * See the handleExportClick method in @browser-clients/export-pdf-options-dialog for reference.\n *\n * @param internalExportPdfOptions The internal ExportPDFOptions pres model used to configure the output PDF file.\n * @param sheetNames The list of sheets selected for export.\n */\n static updateSheetOptions(internalExportPdfOptions, sheetNames) {\n const { exportLayoutOptions, sheetOptions } = internalExportPdfOptions;\n // updating the export layouts options for each sheet and selecting sheet for export if included in list\n for (const sheetOption of sheetOptions) {\n sheetOption.exportLayoutOptions = exportLayoutOptions;\n sheetOption.isSelected = sheetNames.includes(sheetOption.sheet);\n }\n }\n /**\n * Helper method for updateExportLayoutOptons.\n * This method is a spoof of the getFitAndScaleValues method used in @browser-clients/export-pdf-options to set the exportLayoutOptions' scaling properties.\n * In the future, this file should be refactored to import the method directly from @browser-clients/export-pdf-options.\n *\n * @param scalingSelection string used for setting the exportLayoutOptions based on the PrintScaling property from the ExternalExportPDFOptions.\n * @param exportLayoutOptions the ExportLayoutOptions used by the internal ExportPDFOptions pres model.\n */\n static setFitAndScaleValues(exportLayoutOptions, scalingSelection) {\n let { pageFitHorizontal, pageFitVertical, pageScaleMode, pageScalePercent } = this.DefaultLayoutOptions;\n const fitMatch = this.fitRegex.exec(scalingSelection);\n const percentMatch = this.pctRegex.exec(scalingSelection);\n if (fitMatch) {\n [pageFitHorizontal, pageFitVertical] = fitMatch.slice(1).map((value) => Number(value));\n pageScaleMode = api_internal_contract_js_1.ScaleMode.ScaleFitPages;\n }\n else if (percentMatch) {\n [pageScalePercent] = percentMatch.slice(1).map((value) => Number(value));\n pageScaleMode = api_internal_contract_js_1.ScaleMode.ScalePercentage;\n }\n // getFitAndScaleValues returns the properties below, but instead this method will set them.\n exportLayoutOptions.pageFitHorizontal = pageFitHorizontal;\n exportLayoutOptions.pageFitVertical = pageFitVertical;\n exportLayoutOptions.pageScaleMode = pageScaleMode;\n exportLayoutOptions.pageScalePercent = pageScalePercent;\n }\n}\nexports.ExportHelpers = ExportHelpers;\nExportHelpers.DefaultDataOptions = {\n ignoreAliases: false,\n columnsToIncludeById: [],\n};\nExportHelpers.DefaultPDFOptions = {\n scaling: api_external_contract_js_1.PrintScaling.Automatic,\n pageSize: api_external_contract_js_1.PrintPageSize.Letter,\n orientation: api_external_contract_js_1.PrintOrientation.Portrait,\n};\nExportHelpers.DefaultLayoutOptions = {\n imageHeight: 0,\n imageWidth: 0,\n pageFitHorizontal: 1,\n pageFitVertical: 1,\n pageOrientationOption: api_internal_contract_js_1.PageOrientation.Portrait,\n pageScaleMode: api_internal_contract_js_1.ScaleMode.ScaleAuto,\n pageScalePercent: 100,\n pageSizeOption: api_internal_contract_js_1.PageSizeOption.Letter,\n};\nExportHelpers.fitRegex = new RegExp('fit([0-9]+)x([0-9]+)');\nExportHelpers.pctRegex = new RegExp('pct([0-9]+)');\n//# sourceMappingURL=ExportHelpers.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst TableauError_1 = require(\"../TableauError\");\nconst ErrorHelpers_1 = require(\"./ErrorHelpers\");\nclass Param {\n /**\n * serializes the date into the format that the server expects.\n * @param date the date to serialize\n */\n static serializeDateForPlatform(date) {\n const year = date.getUTCFullYear();\n const month = date.getUTCMonth() + 1;\n const day = date.getUTCDate();\n const hh = date.getUTCHours();\n const mm = date.getUTCMinutes();\n const sec = date.getUTCSeconds();\n return `${year}-${month}-${day} ${hh}:${mm}:${sec}`;\n }\n static serializeBooleanForPlatform(bool) {\n return bool ? 'true' : 'false';\n }\n static serializeNumberForPlatform(num) {\n return num.toString(10);\n }\n /**\n * Verifies the input is a number\n */\n /* tslint:disable-next-line:no-any */\n static isTypeNumber(input) {\n return typeof input === 'number' || input instanceof Number;\n }\n /**\n * Verifies the input is a Date\n */\n /* tslint:disable-next-line:no-any */\n static isTypeDate(input) {\n return input instanceof Date;\n }\n /* tslint:disable-next-line:no-any */\n static isTypeString(input) {\n return typeof input === 'string' || input instanceof String;\n }\n /* tslint:disable-next-line:no-any */\n static isTypeBool(input) {\n return typeof input === 'boolean' || input instanceof Boolean;\n }\n /**\n * Determines if the input is null or undefined\n */\n /* tslint:disable-next-line:no-any */\n static isNullOrUndefined(input) {\n return input === null || input === undefined;\n }\n /* tslint:disable-next-line:no-any */\n static serializeParameterValue(value) {\n if (Param.isTypeNumber(value)) {\n return Param.serializeNumberForPlatform(value);\n }\n else if (Param.isTypeDate(value)) {\n return Param.serializeDateForPlatform(value);\n }\n else if (Param.isTypeBool(value)) {\n return Param.serializeBooleanForPlatform(value);\n }\n else if (Param.isTypeString(value)) {\n return value;\n }\n else {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Unexpected invalid value for: ${value}`);\n }\n }\n /**\n * Verifies that the parameter is already a Map, or converts an object to a Map.\n * If the parameter is an object, we convert it to a Map using Object.entries.\n * @throws if the parameter is not an object or Map\n */\n // tslint:disable-next-line:no-any\n static convertParameterToMap(param, paramName) {\n ErrorHelpers_1.ErrorHelpers.verifyParameterType(param, 'object', paramName);\n if (Array.isArray(param)) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, `Expecting object or Map for: ${paramName}.`);\n }\n return param instanceof Map ? param : new Map(Object.entries(param));\n }\n /* tslint:disable-next-line:no-any */\n static tryParseNumber(value) {\n if (Param.isNullOrUndefined(value)) {\n return { success: false };\n }\n if (Param.isTypeNumber(value)) {\n return { parsed: value, success: true };\n }\n const valueString = value.toString();\n if (valueString === 'NaN') {\n // 'NaN' parses as NaN which is indistinguishable from a failed parse.\n return { parsed: NaN, success: true };\n }\n const parsed = parseFloat(valueString);\n if (isNaN(parsed)) {\n return { success: false };\n }\n return { parsed, success: true };\n }\n}\nexports.Param = Param;\n//# sourceMappingURL=Param.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst TableauError_1 = require(\"../TableauError\");\nclass SheetUtils {\n // This is a direct port from SheetSize.cs - SheetSizeFactory\n static getSheetSizeFromSizeConstraints(sizeConstraint) {\n const { minWidth, minHeight, maxWidth, maxHeight } = sizeConstraint;\n if (minHeight === 0 && minWidth === 0) {\n if (maxHeight === 0 && maxWidth === 0) {\n return {\n behavior: Contract.SheetSizeBehavior.Automatic,\n };\n }\n return {\n behavior: Contract.SheetSizeBehavior.AtMost,\n maxSize: { width: maxWidth, height: maxHeight },\n };\n }\n if (maxHeight === 0 && maxWidth === 0) {\n return {\n behavior: Contract.SheetSizeBehavior.AtLeast,\n minSize: { width: minWidth, height: minHeight },\n };\n }\n if (maxHeight === minHeight && maxWidth === minWidth && minWidth > 0) {\n return {\n behavior: Contract.SheetSizeBehavior.Exactly,\n minSize: { width: minWidth, height: minHeight },\n maxSize: { width: minWidth, height: minHeight },\n };\n }\n // 'Fit Width' for a DSD layout\n const isDsdLayout = minWidth === 0 && maxWidth === 0;\n return {\n behavior: Contract.SheetSizeBehavior.Range,\n minSize: { width: minWidth, height: minHeight },\n maxSize: { width: isDsdLayout ? 2147483647 : maxWidth, height: maxHeight },\n };\n }\n static createAutomaticSize() {\n let behavior = Contract.SheetSizeBehavior.Automatic;\n let minSize = { width: 0, height: 0 };\n let maxSize = { width: 0, height: 0 };\n return { behavior, minSize, maxSize };\n }\n static getPublishedSheetInfoByName(name, sheetInfos) {\n const sheetInfo = sheetInfos.find((sheet) => sheet.name === name);\n return sheetInfo;\n }\n static getSheetTypeEnum(internalSheetType) {\n let sheetType;\n switch (internalSheetType) {\n case api_internal_contract_js_1.SheetType.Worksheet: {\n sheetType = Contract.SheetType.Worksheet;\n break;\n }\n case api_internal_contract_js_1.SheetType.Dashboard: {\n sheetType = Contract.SheetType.Dashboard;\n break;\n }\n case api_internal_contract_js_1.SheetType.Story: {\n sheetType = Contract.SheetType.Story;\n break;\n }\n default: {\n throw new TableauError_1.TableauError(Contract.SharedErrorCodes.ServerError, 'Invalid SheetType');\n }\n }\n return sheetType;\n }\n static isValidSheetSize(sizeObject) {\n return sizeObject.behavior !== undefined;\n }\n}\nexports.SheetUtils = SheetUtils;\n//# sourceMappingURL=SheetUtils.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst TableauError_1 = require(\"../TableauError\");\nconst Deferred_1 = require(\"./Deferred\");\n/**\n * A Deferred wrapper class adding functionality to reject unresponsive promises after timeout\n *\n * this class handles two things:\n\n * 1. Adds timeout logic for deferred\n * 2. It blocks multiple calls from executing at the same time.\n *\n * @export\n * @class ShortLivedDeferred\n * @template TResolve The type used to resolve the promise.\n * @template TReject The type used to reject the promise. Defaults to any.\n *\n */\nclass ShortLivedDeferred {\n constructor(_timeoutInMilliseconds = Deferred_1.UnregisterTimeoutInMilliseconds) {\n this._timeoutInMilliseconds = _timeoutInMilliseconds;\n }\n getNewPromiseOrThrowIfBusy() {\n if (this._deferred) {\n throw new TableauError_1.TableauError(Contract.SharedErrorCodes.ApiExecutionError, 'This api cannot be executed till previous call is resolved.');\n }\n this._deferred = new Deferred_1.Deferred();\n this._timeoutId = setTimeout(() => {\n const error = new TableauError_1.TableauError(Contract.SharedErrorCodes.Timeout, `Api failed to complete in ${this._timeoutInMilliseconds / 1000} seconds`);\n this.reject(error);\n }, this._timeoutInMilliseconds);\n return this._deferred.promise;\n }\n resolve(response) {\n if (this._deferred) {\n clearTimeout(this._timeoutId);\n this._deferred.resolve(response);\n this._deferred = undefined;\n }\n }\n reject(error) {\n if (this._deferred) {\n clearTimeout(this._timeoutId);\n this._deferred.reject(error);\n this._deferred = undefined;\n }\n }\n}\nexports.ShortLivedDeferred = ShortLivedDeferred;\n//# sourceMappingURL=ShortLivedDeferred.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst TableauError_1 = require(\"./TableauError\");\n/**\n * Represents the current version of the extensions, embedding\n * and extensions-api-types library\n */\nclass VersionNumber {\n // private constructor so everyone uses the singleton instance\n // build numbers have this form: M.m.f-pre.N\n constructor(versionString, isAlpha) {\n const partStr = versionString.split('-');\n this.build = this.getBuildNumber(partStr[1]);\n versionString = partStr[0];\n const parts = versionString.split('.').map((p) => parseInt(p, 10));\n if (parts.length !== 3) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Invalid version number: ${versionString}`);\n }\n this.major = parts[0];\n this.minor = parts[1];\n this.fix = parts[2];\n this.isAlpha = isAlpha;\n }\n getBuildNumber(preReleaseString) {\n const noBuildNumber = -1;\n if (!preReleaseString) {\n return noBuildNumber;\n }\n // The preRelease string has this form: pre.N, but we don't depend on the actual string being 'pre'\n const partStr = preReleaseString.split('.');\n return partStr[1] ? parseInt(partStr[1], 10) : noBuildNumber;\n }\n get formattedValue() {\n return `${this.major}.${this.minor}.${this.fix}`;\n }\n get fullFormattedValue() {\n return `${this.major}.${this.minor}.${this.fix}-pre.${this.build}`;\n }\n}\nexports.VersionNumber = VersionNumber;\n//# sourceMappingURL=VersionNumber.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\n/**\n * Implementation of the InternalApiDispatcher which supports upgrading and downgrading the input\n * internal contract to the version that this module is built against\n *\n * @class VersionedExternalApiDispatcher\n * @implements {InternalApiDispatcher}\n */\nclass VersionedExternalApiDispatcher {\n /**\n * Creates a new instance of the VersionedExternalApiDispatcher\n * We have multiple version converting dispatchers that work together.\n * If needed, the VersionedExternalApiDispatcher wraps either the InternalApiDispatcher (desktop)\n * or the CrossFrameDispatcher (server).\n * The Internal/CrossFrame dispatchers handle an updated platform with an older external library.\n * (The CrossFrameDispatcher sends messages across the frame, and it is handled by the PresLayerHandler.)\n * Meanwhile, the VersionedExternalApiDispatcher handles an updated external library with an older platform.\n \n * @param _apiDelegateDispatcher The delegate that does the actual work.\n * @param platformVersionNumber The version of the internal contract which the platform module is using.\n * This number will be used to figure out how to downgrade incoming commands and upgrade the results\n */\n constructor(_apiDelegateDispatcher, platformVersionNumber) {\n this._apiDelegateDispatcher = _apiDelegateDispatcher;\n this._versionConverter = api_internal_contract_js_1.CreateExternalCompatibleVersionConverter(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION, platformVersionNumber);\n this._notificationHandlers = [];\n _apiDelegateDispatcher.registerNotificationHandler((notification) => {\n if (this._notificationHandlers.length === 0) {\n return;\n }\n const upgradedNotification = this._versionConverter.upgradeNotification(notification);\n this._notificationHandlers.forEach((handler) => {\n handler(upgradedNotification);\n });\n });\n }\n static needsVersionConverter(platformVersion) {\n // If our platform is less than external library version, then we need a converter\n return api_internal_contract_js_1.VersionLessThan(platformVersion, api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION);\n }\n execute(verb, parameters) {\n try {\n const downgradeParameters = this._versionConverter.downgradeExecuteCall(verb, parameters);\n return this._apiDelegateDispatcher.execute(downgradeParameters.verb, downgradeParameters.parameters).then((response) => {\n const upgradeResponse = this._versionConverter.upgradeExecuteReturn(response, verb, parameters);\n return upgradeResponse;\n });\n }\n catch (e) {\n return Promise.reject(e);\n }\n }\n registerNotificationHandler(handler) {\n this._notificationHandlers.push(handler);\n }\n unregisterNotificationHandler(handler) {\n this._notificationHandlers = this._notificationHandlers.filter((h) => h !== handler);\n }\n}\nexports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher;\n//# sourceMappingURL=VersionedExternalApiDispatcher.js.map","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\n\nvar _clockseq; // Previous uuid creation time\n\n\nvar _lastMSecs = 0;\nvar _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details\n\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || new Array(16);\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n\n if (node == null || clockseq == null) {\n var seedBytes = options.random || (options.rng || rng)();\n\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];\n }\n\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n } // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n\n\n var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)\n\n var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression\n\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n\n\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n } // Per 4.2.1.2 Throw error if too many uuids are requested\n\n\n if (nsecs >= 10000) {\n throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n\n msecs += 12219292800000; // `time_low`\n\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff; // `time_mid`\n\n var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff; // `time_high_and_version`\n\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n\n b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n\n b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`\n\n b[i++] = clockseq & 0xff; // `node`\n\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf || stringify(b);\n}\n\nexport default v1;","import validate from './validate.js';\n\nfunction parse(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n var v;\n var arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n arr[1] = v >>> 16 & 0xff;\n arr[2] = v >>> 8 & 0xff;\n arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n arr[9] = v & 0xff; // Parse ........-....-....-....-############\n // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n arr[11] = v / 0x100000000 & 0xff;\n arr[12] = v >>> 24 & 0xff;\n arr[13] = v >>> 16 & 0xff;\n arr[14] = v >>> 8 & 0xff;\n arr[15] = v & 0xff;\n return arr;\n}\n\nexport default parse;","import stringify from './stringify.js';\nimport parse from './parse.js';\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n var bytes = [];\n\n for (var i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nexport var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function (name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\n if (typeof value === 'string') {\n value = stringToBytes(value);\n }\n\n if (typeof namespace === 'string') {\n namespace = parse(namespace);\n }\n\n if (namespace.length !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n } // Compute hash of namespace and value, Per 4.3\n // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n // hashfunc([...namespace, ... value])`\n\n\n var bytes = new Uint8Array(16 + value.length);\n bytes.set(namespace);\n bytes.set(value, namespace.length);\n bytes = hashfunc(bytes);\n bytes[6] = bytes[6] & 0x0f | version;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return stringify(bytes);\n } // Function#name is not settable on some platforms (#270)\n\n\n try {\n generateUUID.name = name; // eslint-disable-next-line no-empty\n } catch (err) {} // For CommonJS default export support\n\n\n generateUUID.DNS = DNS;\n generateUUID.URL = URL;\n return generateUUID;\n}","/*\n * Browser-compatible JavaScript MD5\n *\n * Modification of JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\nfunction md5(bytes) {\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = new Uint8Array(msg.length);\n\n for (var i = 0; i < msg.length; ++i) {\n bytes[i] = msg.charCodeAt(i);\n }\n }\n\n return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));\n}\n/*\n * Convert an array of little-endian words to an array of bytes\n */\n\n\nfunction md5ToHexEncodedArray(input) {\n var output = [];\n var length32 = input.length * 32;\n var hexTab = '0123456789abcdef';\n\n for (var i = 0; i < length32; i += 8) {\n var x = input[i >> 5] >>> i % 32 & 0xff;\n var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);\n output.push(hex);\n }\n\n return output;\n}\n/**\n * Calculate output length with padding and bit length\n */\n\n\nfunction getOutputLength(inputLength8) {\n return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;\n}\n/*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\n\n\nfunction wordsToMd5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << len % 32;\n x[getOutputLength(len) - 1] = len;\n var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (var i = 0; i < x.length; i += 16) {\n var olda = a;\n var oldb = b;\n var oldc = c;\n var oldd = d;\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n\n return [a, b, c, d];\n}\n/*\n * Convert an array bytes to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\n\n\nfunction bytesToWords(input) {\n if (input.length === 0) {\n return [];\n }\n\n var length8 = input.length * 8;\n var output = new Uint32Array(getOutputLength(length8));\n\n for (var i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;\n }\n\n return output;\n}\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\n\n\nfunction safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff);\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return msw << 16 | lsw & 0xffff;\n}\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\n\n\nfunction bitRotateLeft(num, cnt) {\n return num << cnt | num >>> 32 - cnt;\n}\n/*\n * These functions implement the four basic operations the algorithm uses.\n */\n\n\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\n\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn(b & c | ~b & d, a, b, x, s, t);\n}\n\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn(b & d | c & ~d, a, b, x, s, t);\n}\n\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\n\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\nexport default md5;","import v35 from './v35.js';\nimport md5 from './md5.js';\nvar v3 = v35('v3', 0x30, md5);\nexport default v3;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","// Adapted from Chris Veness' SHA1 code at\n// http://www.movable-type.co.uk/scripts/sha1.html\nfunction f(s, x, y, z) {\n switch (s) {\n case 0:\n return x & y ^ ~x & z;\n\n case 1:\n return x ^ y ^ z;\n\n case 2:\n return x & y ^ x & z ^ y & z;\n\n case 3:\n return x ^ y ^ z;\n }\n}\n\nfunction ROTL(x, n) {\n return x << n | x >>> 32 - n;\n}\n\nfunction sha1(bytes) {\n var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = [];\n\n for (var i = 0; i < msg.length; ++i) {\n bytes.push(msg.charCodeAt(i));\n }\n } else if (!Array.isArray(bytes)) {\n // Convert Array-like to Array\n bytes = Array.prototype.slice.call(bytes);\n }\n\n bytes.push(0x80);\n var l = bytes.length / 4 + 2;\n var N = Math.ceil(l / 16);\n var M = new Array(N);\n\n for (var _i = 0; _i < N; ++_i) {\n var arr = new Uint32Array(16);\n\n for (var j = 0; j < 16; ++j) {\n arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3];\n }\n\n M[_i] = arr;\n }\n\n M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);\n M[N - 1][14] = Math.floor(M[N - 1][14]);\n M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;\n\n for (var _i2 = 0; _i2 < N; ++_i2) {\n var W = new Uint32Array(80);\n\n for (var t = 0; t < 16; ++t) {\n W[t] = M[_i2][t];\n }\n\n for (var _t = 16; _t < 80; ++_t) {\n W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1);\n }\n\n var a = H[0];\n var b = H[1];\n var c = H[2];\n var d = H[3];\n var e = H[4];\n\n for (var _t2 = 0; _t2 < 80; ++_t2) {\n var s = Math.floor(_t2 / 20);\n var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0;\n e = d;\n d = c;\n c = ROTL(b, 30) >>> 0;\n b = a;\n a = T;\n }\n\n H[0] = H[0] + a >>> 0;\n H[1] = H[1] + b >>> 0;\n H[2] = H[2] + c >>> 0;\n H[3] = H[3] + d >>> 0;\n H[4] = H[4] + e >>> 0;\n }\n\n return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];\n}\n\nexport default sha1;","import v35 from './v35.js';\nimport sha1 from './sha1.js';\nvar v5 = v35('v5', 0x50, sha1);\nexport default v5;","export default '00000000-0000-0000-0000-000000000000';","import validate from './validate.js';\n\nfunction version(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n return parseInt(uuid.substr(14, 1), 16);\n}\n\nexport default version;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","\"use strict\";\n/**\n * This is your main. This is where you re-export everything you want to be publicly available.\n *\n * The build enforces that the file has the same name as the global variable that is exported.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\n// Due to the way we configured webpack, we should be exporting things which will be under\n// a global variable called \"tableau\". Export everything we want to be visible under tableau\n// from this file.\nconst ExtensionsImpl_1 = require(\"./ExtensionsApi/Impl/ExtensionsImpl\");\nconst Extensions_1 = require(\"./ExtensionsApi/Namespaces/Extensions\");\nconst isAlpha = typeof VERSION_IS_ALPHA !== 'undefined' ? VERSION_IS_ALPHA : false;\napi_shared_js_1.ApiVersion.SetVersionNumber(typeof API_VERSION_NUMBER !== 'undefined' ? API_VERSION_NUMBER : '0.0.0', isAlpha);\nconst extensionImpl = new ExtensionsImpl_1.ExtensionsImpl();\nexports.extensions = new Extensions_1.Extensions(extensionImpl);\n// Export Enums\n// These show up under the tableau object. I.e. tableau.ExtensionContext.Server\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nexports.AnalyticsObjectType = api_external_contract_js_1.AnalyticsObjectType;\nexports.AnnotationType = api_external_contract_js_1.AnnotationType;\nexports.ClassNameKey = api_external_contract_js_1.ClassNameKey;\nexports.ColumnType = api_external_contract_js_1.ColumnType;\nexports.DashboardLayoutChange = api_external_contract_js_1.DashboardLayoutChange;\nexports.DashboardObjectType = api_external_contract_js_1.DashboardObjectType;\nexports.DashboardObjectVisibilityType = api_external_contract_js_1.DashboardObjectVisibilityType;\nexports.DataType = api_external_contract_js_1.DataType;\nexports.DateRangeType = api_external_contract_js_1.DateRangeType;\nexports.DialogStyle = api_external_contract_js_1.DialogStyle;\nexports.EncodingType = api_external_contract_js_1.EncodingType;\nexports.ErrorCodes = api_external_contract_js_1.ErrorCodes;\nexports.ExtensionContext = api_external_contract_js_1.ExtensionContext;\nexports.ExtensionMode = api_external_contract_js_1.ExtensionMode;\nexports.FieldAggregationType = api_external_contract_js_1.FieldAggregationType;\nexports.FieldRoleType = api_external_contract_js_1.FieldRoleType;\nexports.FilterDomainType = api_external_contract_js_1.FilterDomainType;\nexports.FilterNullOption = api_external_contract_js_1.FilterNullOption;\nexports.FilterType = api_external_contract_js_1.FilterType;\nexports.FilterUpdateType = api_external_contract_js_1.FilterUpdateType;\nexports.HierarchicalLevelSelectionState = api_external_contract_js_1.HierarchicalLevelSelectionState;\nexports.IncludeDataValuesOption = api_external_contract_js_1.IncludeDataValuesOption;\nexports.MarkType = api_external_contract_js_1.MarkType;\nexports.ParameterValueType = api_external_contract_js_1.ParameterValueType;\nexports.PeriodType = api_external_contract_js_1.PeriodType;\nexports.QuickTableCalcType = api_external_contract_js_1.QuickTableCalcType;\nexports.ReplaySpeedType = api_external_contract_js_1.ReplaySpeedType;\nexports.SelectionUpdateType = api_external_contract_js_1.SelectionUpdateType;\nexports.SelectOptions = api_external_contract_js_1.SelectOptions;\nexports.SheetType = api_external_contract_js_1.SheetType;\nexports.SortDirection = api_external_contract_js_1.SortDirection;\nexports.TableauEventType = api_external_contract_js_1.TableauEventType;\nexports.TrendLineModelType = api_external_contract_js_1.TrendLineModelType;\nexports.VizImageEncodingType = api_external_contract_js_1.VizImageEncodingType;\nexports.VizImagePaletteType = api_external_contract_js_1.VizImagePaletteType;\nexports.VizImageSizeSettingAlignmentType = api_external_contract_js_1.VizImageSizeSettingAlignmentType;\nexports.VizImageSizeSettingType = api_external_contract_js_1.VizImageSizeSettingType;\nexports.VizImageSortDirectionType = api_external_contract_js_1.VizImageSortDirectionType;\nexports.ZoneVisibilityType = api_external_contract_js_1.ZoneVisibilityType;\n//# sourceMappingURL=ExtensionsApi.js.map"],"names":["validator","RegExp","gen","count","out","i","Math","random","toString","substring","Guid","guid","TypeError","this","value","EMPTY","Object","prototype","call","isGuid","equals","other","isEmpty","toJSON","test","create","join","raw","module","exports","window","defineProperty","Contract","TableauEvent_1","DashboardLayoutChangedEvent","TableauEvent","constructor","_dashboardLayoutChangeDetails","super","TableauEventType","DashboardLayoutChanged","dashboardLayoutChangeDetails","api_external_contract_js_1","api_shared_js_1","TableauWorksheetEvent_1","FilterChangedEvent","TableauWorksheetEvent","worksheet","_fieldName","_fieldId","FilterChanged","fieldName","fieldId","getFilterAsync","_worksheet","getFiltersAsync","then","filters","eventedFilter","find","filter","TableauError","ErrorCodes","MissingFilter","MarksSelectedEvent","MarkSelectionChanged","getMarksAsync","getSelectedMarksAsync","Parameter_1","ServiceRegistryUtil_1","TableauSheetEvent_1","ParameterChangedEvent","TableauSheetEvent","_globalFieldName","sheet","ParameterChanged","getParameterAsync","ApiServiceRegistry","get","ExtensionsRegistryId","getService","findParameterByGlobalFieldNameAsync","parameterImpl","undefined","MissingParameter","Parameter","SummaryDataChangedEvent","SummaryDataChanged","type","_type","_sheet","WorkbookFormattingChangedEvent","_formatting","WorkbookFormattingChanged","formatting","WorksheetFormattingChangedEvent","WorksheetFormattingChanged","BentonSansFontFamilyName","BentonSansLowDPIFontFamilyName","BentonSansBookFontFaceName","BentonSansBookItalicFontFaceName","BentonSansSemiDemiFontFaceName","BentonSansSemiDemiItalicFontFaceName","BentonSansLightFontFaceName","BentonSansMediumFontFaceName","SupportedBentonSansFontFaces","ConnectedServer","_userId","_siteId","_siteNamespace","_workbookId","userId","siteId","siteNamespace","workbookId","ExtensionWorkbookImpl","WorkbookImpl","getAllDataSourcesAsync","result","dataSchema","dataSources","values","forEach","ds","push","createDataSourceFromInfo","dataSourceInfo","dataSourceImpl","DataSourceImpl","dataSource","DataSource","initializeWithPublicInterfaces","api_internal_contract_js_1","Dashboard_1","Workbook_1","Worksheet_1","DashboardContent_1","Environment_1","Settings_1","UI_1","WorkbookFormattingEnvUtil_1","WorksheetContent_1","RegisterAllExtensionsServices_1","BentonSansFontNameConstants_1","ExtensionWorkbookImpl_1","LegacyInternalApiDispatcherHolder_1","SettingsImpl_1","TableauBookFontNameConstants_1","UIImpl_1","ExtensionsImpl","initializeAsync","isExtensionDialog","contextMenuCallbacks","_initializationPromise","Promise","resolve","reject","_a","initOptions","isAlpha","ApiVersion","Instance","LegacyInternalApiDispatcherHolder","hasDesktopApiDispatcherPromise","getDesktopDispatcherPromise","dispatcherFactory","onDispatcherReceived","openPayload","catch","error","onDispatcherReceivedCallback","bind","doCrossFrameBootstrap","INTERNAL_CONTRACT_VERSION","factory","createVizImageAsync","inputSpec","setClickThroughAsync","clickThroughEnabled","extensionZoneId","isDashboardExtensionLocator","locator","dashboardPath","InternalError","contextMenuFunctions","dispatcher","registerInitializationExtensionsServices","initializationService","callbackMapKeys","keys","initializeDashboardExtensionsAsync","platformVersion","extensionEnvironment","major","minor","fix","VersionedExternalApiDispatcher","needsVersionConverter","registerAllSharedServices","registerAllExtensionsServices","extensionDashboardInfo","extensionInstance","dashboardContent","initializeDashboardContent","extensionWorksheetInfo","worksheetContent","initializeWorksheetContent","environment","Environment","settings","initializeSettings","extensionSettingsInfo","ui","UI","UIImpl","workbook","Workbook","workbookFormatting","initializeTableauFonts","applyAllFormatting","initializeContextMenuCallbacks","initializeWorkbookFormattingChangedEventCallback","extensionDialogPayload","formattingModel","_styleElement","document","createElement","id","head","appendChild","stylesheet","cssRules","length","deleteRule","formattingSheets","map","currentFormattingSheet","applyFormattingSheetToStyleSheet","styleInfo","cssProperties","fontFamily","fontSize","fontWeight","fontStyle","textDecoration","color","rule","classNameKey","insertRule","registerHandler","NotificationId","eventFormatting","fontNames","SupportedTableauFontFaces","formattingSheet","parameters","ParameterId","FontNameListItems","execute","VerbId","GetFonts","response","loadFonts","fonts","fontNameAndInfo","includes","fontName","loadTableauFonts","loadBentonSansFonts","add","FontFace","fontBinaryInfo","info","sheetPath","sheetInfoImpl","SheetInfoImpl","name","SheetType","Dashboard","width","size","w","height","h","dashboardImpl","DashboardImpl","zones","activeDashboardObjectId","dashboard","DashboardContent","visualId","Worksheet","worksheetImpl","WorksheetImpl","backgroundColor","WorkbookFormattingEnvUtil","convertToWorkbookFormatting","WorksheetContent","settingsInfo","settingsImpl","SettingsImpl","Settings","ContextMenuClick","event","TableauBookFontFaceName","TableauBookFontFamilyName","weight","style","TableauLightFontFaceName","TableauLightFontFamilyName","TableauRegularFontFaceName","TableauRegularFontFamilyName","TableauSemiBoldFontFaceName","TableauSemiboldFontFamilyName","TableauBoldFontFaceName","TableauBoldFontFamilyName","TableauMediumFontFamilyName","TableauMediumFontFaceName","options","__warningIssued","__platformIsOfficialRelease","__tableauDesktopDispatcher","BlockExtension","console","warn","SettingsChangedEvent","_newSettings","SettingsChanged","newSettings","_saveInProgress","erase","key","ErrorHelpers","verifyParameter","_currentSettings","verifySettingsAreUnlocked","_isModified","getAll","assign","isModified","saveAsync","saveSettingsAsync","reason","set","verifyStringParameter","initializeEvents","results","Array","notificationService","e","settingsChangedEvent","SingleEventManagerImpl","triggerEvent","settingsValues","SettingSaveInProgress","ASYNC_SAVE_IN_PROGRESS","DialogMessageEvent","message","DialogMessageReceived","displayDialogAsync","url","payload","uiService","unregisterFn","ExtensionDialogUpdate","isCloseEvent","closePayload","DialogClosedByUser","sendDialogMessageAsync","targetDialogUrl","closeDialog","dialogMessageEvent","ExtensionDialogMessage","DashboardLayoutChangedEvent_1","WorkbookFormattingChangedEvent_1","DashboardObject_1","Sheet_1","Sheet","_dashboardImpl","addNewEventType","worksheets","worksheetsImpl","objects","dashboardObjectImpl","DashboardObject","activeDashboardName","setZoneVisibilityAsync","zoneVisibilityMap","setDashboardObjectVisibilityAsync","dashboardObjectVisibilityMap","getDashboardObjectById","dashboardObjectId","zone","dashboardLayoutChangedEvent","dashboardObjectChanges","updateZones","activeZoneId","workbookFormattingChangedEvent","moveAndResizeDashboardObjectsAsync","dashboardObjectPositionAndSizeUpdateArray","replayAnimationAsync","replaySpeed","applyFilterAsync","updateType","_dashboardObjectImpl","position","isFloating","isVisible","ParameterChangedEvent_1","EventListenerManager","currentValue","dataType","allowableValues","changeValueAsync","newValue","verifyInternalValue","parameterEvent","model","_sheetImpl","sheetType","isValidSize","EmbeddingErrorCodes","ImplementationError","testSize","findParameterAsync","parameterName","getParametersAsync","parametersImpl","_workbookImpl","FilterChangedEvent_1","MarksSelectedEvent_1","SummaryDataChangedEvent_1","WorksheetFormattingChangedEvent_1","_worksheetImpl","parentDashboard","SharedErrorCodes","marksEvent","SelectedMarksChanged","visualIdsAreEqual","filterEvent","filterEventResponse","summaryDataEvent","summaryDataEventResponse","worksheetFormattingChangedEvent","applyRangeFilterAsync","filterOptions","applyHierarchicalFilterAsync","applyRelativeDateFilterAsync","clearFilterAsync","getDataSourcesAsync","getHighlightedMarksAsync","getSummaryDataAsync","getSummaryDataReaderAsync","pageRowCount","getSummaryColumnsInfoAsync","getUnderlyingDataAsync","getUnderlyingTablesAsync","getUnderlyingTableDataAsync","logicalTableId","getUnderlyingTableDataReaderAsync","getVisualSpecificationAsync","addMarksCardFieldsAsync","marksCardIndex","encodingType","columns","startIndex","moveMarksCardFieldAsync","fromIndex","toIndex","fieldCount","spliceMarksCardFieldsAsync","deleteCount","clearSelectedMarksAsync","selectMarksByIDAsync","marksInfo","selectMarksByIdAsync","selectMarksByValueAsync","selections","selectionUpdateType","annotateMarkAsync","mark","annotationText","getAnnotationsAsync","removeAnnotationAsync","annotation","hoverTupleAsync","hoveredTuple","tooltip","allowHoverActions","selectTuplesAsync","selectedTuples","selectOption","getTooltipTextAsync","tupleId","leaveMarkNavigationAsync","editAliasesDialogAsync","a","b","storyboard","storyPointID","_dashboard","ConnectedServer_1","_apiVersion","formattedValue","_context","InternalToExternalEnumMappings","extensionContext","convert","_language","extensionLanguage","_country","extensionCountry","_locale","extensionLocale","_mode","extensionMode","_operatingSystem","operatingSystem","_tableauVersion","tableauVersion","_uniqueUserId","uniqueUserId","connectedServer","featureFlags","apiVersion","context","language","country","locale","mode","Extensions","extensionImpl","initializeDialogAsync","_settingsImpl","_impl","workbookFormattingModel","borderColor","borderStyle","borderWidth","InitializationServiceImpl","ServiceImplBase","serviceName","contextMenuIds","params","FunctionName","ExtensionContextMenuIds","IsExtensionDialog","InitializeExtension","SettingsServiceImpl","SettingsValues","SaveExtensionSettings","DEFAULT_DIALOG_STYLE","DialogStyle","Window","UIServiceImpl","ExtensionDialogUrl","ExtensionDialogPayload","dialogStyle","InvalidParameter","ExtensionDialogH","ExtensionDialogW","verifyEnumValue","ExtensionDialogStyle","ExternalToInternalEnumMappings","dialogStyles","DisplayDialog","ExtensionDialogResult","DialogAlreadyOpen","InvalidDomain","InvalidDomainDialog","CloseDialog","SendDialogMessage","verifyParameterType","ExtensionZoneId","ClickThroughEnabled","SetClickThrough","InitializationServiceImpl_1","SettingsServiceImpl_1","UIServiceImpl_1","registerService","__export","m","p","hasOwnProperty","Enums_1","ApiMenuType","CrosstabFileFormat","DeviceType","EmbeddingTableauEventType","FileFormats","PrintOrientation","PrintPageSize","PrintScaling","PulseErrorMessageVisibility","PulseLayout","PulseTimeDimension","SheetSizeBehavior","TableauDialogType","Toolbar","Tableau_1","ExtensionContext","ExtensionMode","VizImageEncodingType","VizImagePaletteType","VizImageSizeSettingAlignmentType","VizImageSizeSettingType","VizImageSortDirectionType","AskDataAttributes","ToolbarButtons","RevertVizSelection","PulseChildElementAttributes","PulseChildElements","PulseAttributes","VizChildElementAttributes","VizChildElements","VizAuthoringAttributes","VizAttributes","VizSharedAttributes","WebComponentChildElementAttributes","WebComponentChildElements","EmbeddedIframeAttributes","WebComponentAttributes","Tableau","AnalyticsObjectType","AnnotationType","ColumnType","ClassNameKey","DashboardObjectType","DashboardObjectVisibilityType","DataType","DashboardLayoutChange","DateRangeType","EncodingType","FieldAggregationType","FieldRoleType","FilterType","FilterUpdateType","FilterDomainType","FilterNullOption","IncludeDataValuesOption","MarkType","ParameterValueType","PeriodType","QuickTableCalcType","SelectionUpdateType","SelectOptions","SortDirection","TrendLineModelType","ReplaySpeedType","HierarchicalLevelSelectionState","ZoneVisibilityType","internalContractVersion","MESSAGING_VERSION","DataTypeConverter","isSpecial","valueAsString","parseBoolean","booleanString","normalizedBoolean","toLowerCase","specialValueIndicator","parseNumber","Number","isNaN","parseDate","dateAsString","Date","getTime","parseDateTime","formattedDateString","replace","concat","convertValueAsStringToValue","Bool","Int","Float","DateTime","Spatial","String","convertValueToNativeValue","convertStringValueToNativeValue","FitPages","PageScalingOption","ScaleMode","PageOrientation","PageSizeOption","ApiShowDataTableFormat","QuantitativeIncludedValues","DateStepPeriod","DomainRestrictionType","EncodedDataType","AnnotateEnum","AskDataOptionNames","PulseOptionNames","VqlParameterNames","PublicParameterNames","VizOptionNames","JsApiInternalContract_1","CrossFramePreparedMessage_1","MessageTypeChecks_1","MessageTypes_1","CrossFrameMessenger","thisWindow","otherWindow","otherWindowOrigin","startListening","unregisterFunction","boundHandler","onMessageReceived","addEventListener","removeEventListener","stopListening","setInitializeMessageHandler","handler","initializeMessageHandler","setCommandResponseMessageHandler","commandResponseMessageHandler","setCommandMessageHandler","commandMessageHandler","setNotificationMessageHandler","notificationMessageHandler","setHandshakeMessageHandler","handshakeMessageHandler","prepareInitializationMessage","crossFrameVersion","msgGuid","msgType","MessageType","Initialize","prepareMessage","prepareCommandMessage","verbId","Command","prepareCommandResponseMessage","commandGuid","data","CommandResponse","JSON","parse","stringify","prepareNotificationMessage","notificationId","Notification","prepareAckMessage","Ack","msg","CrossFramePreparedMessage","source","isMessage","isInitMessage","isCommandResponseMessage","isCommandMessage","isNotificationMessage","Handshake","isHandshakeMessage","setOtherWindow","setOtherWindowOrigin","origin","_message","_target","_origin","messageGuid","send","postMessage","Notifications_1","expectedEmptyNotifications","Set","EditButtonClicked","EditInDesktopButtonClicked","WorkbookPublished","WorkbookReadyToClose","ReadyToReceiveAuthToken","indexOf","isVersion","versionNumber","v","initMessage","crMessage","commandMessage","notificationMessage","has","IdentityVersionConverter","upgradeExecuteCall","verb","downgradeExecuteReturn","executeResponse","downgradeNotification","notification","StackingVersionConverter","_externalMajorVersion","_platformMajorVersion","_upgradeExecuteTranslations","_downgradeExecuteTranslations","_downgradeNotificationTranslations","Error","fromData","externalVersion","upgradeExecuteTranslations","downgradeExecuteTranslations","downgradeNotificationTranslations","upgraded","upgradeTranslation","downgraded","downgradeTranslation","IdentityVersionConverter_1","StackingVersionConverter_1","VersionTranslations_1","VersionEqualTo","lhs","rhs","CreateVersionConverterWithTranslators","upgrades","downgrades","notificationDowngrades","externalMajorVersion","externalMinorVersion","platformMajorVersion","neededExecuteUpgrades","GetNeededTranslations","neededExecuteDowngrades","neededNotificationDowngrades","reverse","majorMinorTranslators","neededTranslations","start","maximumMinorVersion","GetMaximumMinorIndex","minorVersions","reduce","VersionLessThan","ExecuteMinorUpgrades","ExecuteMinorDowngrades","DowngradeWorksheetNames","DowngradeWorksheetFomatting175","DowngradeExtensionEnvironmentContext","NotificationMinorDowngrades","DowngradeFlipboardZoneID","DowngradeWorksheetFomattingNotification175","CreateVersionConverter","bootstrapInfo","sheetInfo","visualModel","flipboardZoneID","ClassNameKeysToFilter175","classNames","_b","x","DowngradeWorksheetFormatting","DowngradeWorksheetFormattingNotification","PublicWeb","Cloud","Server","PublicDesktop","Desktop","ExternalIdentityVersionConverter","downgradeExecuteCall","upgradeExecuteReturn","upgradeNotification","ExternalStackingVersionConverter","_externalVersion","_platformVersion","_downgradeExecuteCallTranslations","_upgradeExecuteReturnTranslations","_upgradeNotificationTranslations","VersionConverterFactory_1","ExternalIdentityVersionConverter_1","ExternalStackingVersionConverter_1","CreateExternalCompatibleVersionConverterWithTranslators","upgradeNotifications","platformMinorVersion","neededExecuteCallDowngrade","GetNeededExternalTranslations","neededExecuteReturnUpgrades","neededNotificationUpgrades","ExecuteMinorDowngradeCallExternal","ExecuteMinorUpgradeReturnExternal","ExecuteMinorUpgradeNotification","CreateExternalCompatibleVersionConverter","ApiVersion_1","CrossFrameDispatcher_1","CrossFrameDispatcher","DataSource_1","ExternalToInternalEnumMappings_1","InternalToExternalEnumMappings_1","EventListenerManager_1","Field_1","Field","CustomViewImpl_1","CustomViewImpl","DashboardImpl_1","DashboardObjectImpl_1","DashboardObjectImpl","DataSourceImpl_1","ParameterImpl_1","ParameterImpl","SheetImpl_1","SheetImpl","SheetInfoImpl_1","SingleEventManagerImpl_1","StoryImpl_1","StoryImpl","StoryPointImpl_1","StoryPointImpl","StoryPointInfoImpl_1","StoryPointInfoImpl","WorkbookImpl_1","WorksheetImpl_1","Point_1","Point","ClientInfoServiceImpl_1","ClientInfoServiceImpl","NotificationServiceImpl_1","NotificationServiceImpl","NotificationServiceImplBase_1","NotificationServiceImplBase","Registration","ServiceImplBase_1","SizeServiceImpl_1","SizeServiceImpl","StoryActivationServiceImpl_1","StoryActivationServiceImpl","TableauError_1","Deferred_1","Deferred","ErrorHelpers_1","ExportHelpers_1","ExportHelpers","SheetUtils_1","SheetUtils","VersionNumber_1","VersionNumber","VersionedExternalApiDispatcher_1","_instance","SetVersionNumber","numString","ConnectionSummary","_connectionInfo","serverURI","parent","self","inIframe","opener","messenger","initializationMessage","_messenger","_pendingPromises","_notificationHandlers","onCommandResponse","onNotification","preparedMessage","promise","registerNotificationHandler","unregisterNotificationHandler","pendingPromise","errorCode","IncompatibleVersionError","_dataSourceImpl","fields","extractUpdateTime","isExtract","isPublished","publishedUrl","refreshAsync","getActiveTablesAsync","getConnectionSummariesAsync","getLogicalTablesAsync","getLogicalTableDataAsync","getLogicalTableDataReaderAsync","EnumConverter_1","filterDomainType","EnumConverter","Relevant","Database","nullOptions","AllValues","NonNullValues","NullValues","filterUpdateType","Add","All","Remove","Replace","setVisibilityType","Show","Hide","setReplaySpeedType","Slow","Normal","Fast","Story","showDataTableFormatType","NativeAndFormattedValues","OnlyNativeValues","NativeValuesOnly","OnlyFormattedValues","FormattedValuesOnly","periodType","Years","Quarters","Months","Weeks","Days","Hours","Minutes","Seconds","dateRangeType","Last","LastN","Next","NextN","Current","ToDate","Modal","Modeless","Authoring","Viewing","columnType","Continuous","Discrete","Unknown","fieldAggregationType","Attr","Avg","Collect","Count","Countd","Day","End","Hour","InOut","Kurtosis","Max","Mdy","Median","Min","Minute","MonthYear","None","Qtr","Quart1","Quart3","Second","Skewness","Stdev","Stdevp","Sum","TruncDay","TruncHour","TruncMinute","TruncMonth","TruncQtr","TruncSecond","TruncWeek","TruncYear","User","Var","Varp","Week","Weekday","Year","fieldRoleType","Dimension","Measure","dashboardObjectType","Extension","Blank","Image","Legend","PageFilter","ParameterControl","QuickFilter","Text","Title","WebPage","List","Range","dateStepPeriod","INITIALIZATION_ERROR","INTERNAL_ERROR","MISSING_ENUM_MAPPING","MISSING_PARAMETER","PERMISSION_DENIED","PRES_MODEL_PARSING_ERROR","UNKNOWN_VERB_ID","VERSION_NOT_CONFIGURED","APINotInitialized","VISIBILITY_ERROR","VisibilityError","filterType","Categorical","RelativeDate","Hierarchical","DashboardTitle","StoryTitle","Tooltip","WorksheetTitle","Pane","RowDividers","ColumnDividers","hierarchicalLevelSelectionState","AllSelected","NoneSelected","SomeSelected","UnknownSelected","annotationType","Area","Mark","markType","Bar","Circle","GanttBar","Heatmap","Line","Map","Pie","Polygon","Shape","Square","VizExtension","_eventListenerManagers","eventType","UnsupportedEventName","eventManager","_fieldImpl","description","aggregation","role","isCalculatedField","isCombinedField","isGenerated","isGeospatial","isHidden","isPresentOnPublishedDatasource","ApiShared_1","customViewModel","_registryId","_luid","luid","_name","_shared","shared","_isDefault","isDefault","_ownerName","owner","userFriendlyName","_url","ownerName","ServiceRegistry_1","_sheetInfo","_zones","_sheetPath","_parentStoryPointImpl","_activeDashboardObjectId","_worksheetsImpl","_objects","parentStoryPoint","sheetName","zoneMap","zoneSize","isActive","zoneType","worksheetName","worksheetUrl","vizId","_sheetInfoImpl","zonePoint","y","zoneId","setVisibilityAsync","newZones","newActiveZoneId","newActiveDashboardName","oldDashboardObjects","oldZoneMap","oldActiveZoneId","oldActiveDashboardName","newDashboardObjects","newZoneMap","zoneChanges","oldObject","oldId","addChange","Removed","newObject","IsFloatingChanged","IsVisibleChanged","NameChanged","PositionChanged","SizeChanged","Added","Selected","Deselected","DashboardChanged","change","moveAndResizeAsync","replayAsync","verifyActiveSheetOrEmbeddedInActiveStoryPoint","getDashboardFiltersAsync","isArray","applyDashboardFilterAsync","getWorksheetNamesFromZones","worksheetNames","isRootAndActiveDashboard","active","isWithinActiveStoryPoint","NotActiveSheet","_position","_size","_isFloating","_isVisible","_id","ConnectionSummary_1","LogicalTable_1","TableSummary_1","FieldImpl_1","_dataSourceInfo","_fields","fieldModel","fieldImpl","FieldImpl","getMaxPageRowLimit","summaries","summary","tableInfos","tableInfo","TableSummary","getDataSourceDataAsync","ignoreAliases","maxRows","columnsToInclude","columnsToIncludeById","includeDataValuesOption","logicalTableInfos","logicalTableInfo","LogicalTable","InternalContract","_fieldInfo","_parentDataSource","definedValue","DataValueFactory_1","Param_1","parameterInfo","setParameterInfo","_parameterInfo","DataValueFactory","MakeParameterDataValue","_allowableValues","coercedValue","Param","serializeParameterValue","changeParameterValueAsync","allowableValuesType","listValues","minValue","maxValue","stepSize","val","sheetSize","hidden","index","getSheetSize","isValidSheetSize","findParameterByNameAsync","getParametersForSheetAsync","changeSizeAsync","newSize","invalidSizeError","InvalidSize","behavior","partialSheetSize","normalizeSheetSize","isAutomatic","Automatic","minSize","maxSize","InvalidSizeBehaviorOnWorksheet","processedNewSize","processNewSize","getClientInfoAsync","publishedSheets","s","getSheetSizeFromSizeConstraints","sizeConstraint","parseDimensions","_c","_d","minSizeMaybe","maxSizeMaybe","hasMinWidth","isNullOrUndefined","hasMinHeight","hasMaxWidth","hasMaxHeight","hasValidMinSize","hasValidMaxSize","AtMost","MissingMaxSize","AtLeast","MissingMinSize","MissingMinMaxSize","Exactly","empty","success","widthParsed","parsed","parsedWidth","tryParseNumber","heightParsed","parsedHeight","_sheetType","_sheetSize","_index","_isActive","_isHidden","isDashboard","_eventType","_handlers","beforeCount","eventGenerator","ShortLivedDeferred_1","storyModel","_publishedSheetInfos","_storyPointInfoImpls","_deferred","ShortLivedDeferred","initializeStory","storyPoints","storyPointModel","activeStoryPointIndex","storyPointInfoImpl","caption","storyPointId","updated","_activeStoryPointImpl","containedSheetInfo","updateStoryInfo","storyInfoImpl","StoryPointIdMismatch","updateStory","activeStoryPoint","storyPointsInfo","activateNextStoryPointAsync","getNewPromiseOrThrowIfBusy","activatePreviousStoryPointAsync","activateStoryPointAsync","IndexOutOfRange","revertStoryPointAsync","clearPendingPromises","_storyPointInfoImpl","sheetInfos","registryId","_containedSheetImpl","createContainedSheet","parentStory","containedSheet","publishedSheetInfo","getPublishedSheetInfoByName","containedSheetSize","createAutomaticSize","isContainedSheetHidden","containedSheetUrl","containedSheetInfoImpl","getSheetTypeEnum","sheetImpl","dashboardZones","ServerError","_caption","_storyPointId","_active","_updated","_parentStoryImpl","isUpdated","GetDataService_1","_visualId","_parentDashboardImpl","_backgroundColor","verifyActiveSheet","nullOption","verifyRangeParamType","min","max","levels","rangeType","worksheetDataSourceInfo","worksheetDataSchemaMap","primaryId","primaryDataSource","secondaryId","referencedDataSourceList","GetDataType","Summary","ignoreSelection","applyWorksheetFormatting","Underlying","includeAllColumns","appendContextMenuAsync","targetMenu","config","removeContextMenuAsync","menuItemId","executeContextMenuAsync","renameContextMenuAsync","menuHeader","menuDescription","isInsideDashboardExtension","isRootAndActiveWorksheet","isInsideActiveDashboard","isInsideActiveStoryPoint","_logicalTable","TooltipTextRequestModel","visualIdPresModel","Filter","_worksheetName","_filterType","getFieldAsync","getAppliedWorksheetsAsync","setAppliedWorksheetsAsync","applyToWorksheets","uniqueWorksheets","from","CategoricalFilter","_appliedValues","_isExcludeMode","_isAllSelected","isAllSelected","appliedValues","isExcludeMode","getDomainAsync","domainType","getCategoricalDomainAsync","HierarchicalDataValue","_value","_hierarchicalPath","_level","hierarchicalPath","level","HierarchicalLevelDetail","_levelSelectionState","levelSelectionState","HierarchicalFilter","_dimensionName","_hierarchyCaption","_numberOfLevels","_levelDetails","dimensionName","hierarchyCaption","numberOfLevels","levelDetails","RangeFilter","_min","_max","_includeNullValues","includeNullValues","service","getRangeDomainAsync","RelativeDateFilter","_anchorDate","_periodType","_rangeType","_rangeN","anchorDate","rangeN","CategoricalDomain","_values","_domainType","RangeDomain","DataTable","_data","_columns","_totalRowCount","_isTotalRowCountLimited","_isSummaryData","_marksInfo","totalRowCount","isTotalRowCountLimited","isSummaryData","MarkInfo","_color","_tupleId","Column","_dataType","_isReferenced","isReferenced","DataValue","_nativeValue","_formattedValue","_aliasValue","_hasAlias","nativeValue","aliasValue","hasAlias","__awaiter","thisArg","_arguments","P","generator","fulfilled","step","next","rejected","done","apply","DataTableReader","_pageRowCount","_pageCount","ceil","pageCount","getPageAsync","pageNumber","verifyRange","getAllPagesAsync","firstPage","rowsRequested","pagesRequested","pagesToFetch","isDataLimited","remainingData","page","fullData","releaseAsync","SelectionModel","ValueSelectionModel","arguments","selectValues","HierarchicalSelectionModel","RangeSelectionModel","DimensionSelectionModel","TupleSelectionModel","objectIds","SelectionModelsContainer","hierModelArr","dimModelArr","quantModelArr","SelectTuplesInteractionModel","tupleIds","selectOptions","tooltipContext","HoverTupleInteractionModel","_x","_y","AccessibilityServiceImpl_1","AnimationServiceImpl_1","AnnotationServiceImpl_1","DataSourceServiceImpl_1","ExportServiceImpl_1","ExternalContextMenuServiceImpl_1","FilterServiceImpl_1","GetDataServiceImpl_1","ParametersServiceImpl_1","SelectionServiceImpl_1","VisualModelServiceImpl_1","VizServiceImpl_1","ZoneServiceImpl_1","AnimationServiceImpl","DataSourceServiceImpl","ExportServiceImpl","GetDataServiceImpl","FilterServiceImpl","ParametersServiceImpl","SelectionServiceImpl","AnnotationServiceImpl","ZoneServiceImpl","VisualModelServiceImpl","VizServiceImpl","ExternalContextMenuServiceImpl","AccessibilityServiceImpl","__tableauApiServiceRegistry","ServiceRegistryImpl","_services","setInstance","serviceRegistry","clearRegistry","AccessibilityModels_1","tooltipTextRequest","TooltipTextRequest","GetTooltipText","VisualId","RaiseLeaveMarkNavNotification","ReplaySpeed","ReplayAnimation","SelectionModels_1","selectionModelContainer","parseMarkSelectionIds","formattedText","TargetPoint","SelectionList","selection","FormattedText","CreateAnnotation","GetAnnotations","annotationsList","annotationFilterMap","parseAnnotationSelectionIds","RemoveAnnotation","marks","ids","tupleSelectionModel","selectionType","annotations","annotationId","mapAnnotation","annotationHTML","annotationPlainText","annotateEnum","GetEmbeddingClientInfo","dataSourceId","DeltaTimeMs","ShouldRefreshDS","DataSourceId","RefreshDataSource","joinParameters","GetActiveTables","joinResponse","tables","UnsupportedMethodForDataSourceType","GetDataSources","GetAllDataSources","GetConnectionDescriptionSummaries","globalfieldName","GetFieldAndDataSource","FieldId","field","convertField","convertDataSource","GetLogicalTables","GetUnderlyingTables","getExportCrosstabSheetMapAsync","currentSheetType","GetExportCrosstabSheetMap","CurrentSheetType","exportCrosstabAsync","format","exportableWorksheetNames","verifySheetName","sheetNameToIdMap","SheetIdentifier","SendNotifications","CSV","ExportCrosstabCsvDownload","UseTabDelimiters","Excel","ExportCrosstabExcelDownload","CrosstabCreationError","exportDataAsync","verifyExportDataOptions","columnsAsSet","ExportDataDownload","IgnoreAliases","ColumnsToIncludeById","DataCreationError","exportPowerPointAsync","sheetNames","exportScenarios","verifySheetNamesForPDFAndPPT","ExportPowerpointDownload","ExportOriginUrl","SelectedSheetNames","PowerPointCreationError","exportPDFAsync","externalExportPdfOptions","verifyExportPDFOptions","internalExportPdfOptions","getExportPDFOptionsAsync","updateInternalExportPDFOptions","ExportPdfDownload","ExportPdfOptions","PDFCreationError","GetExportPdfOptions","AppendExternalMenuItem","WorksheetName","ExternalMenuItemDisplayName","displayName","RemoveExternalMenuItem","ExternalMenuItemId","ExecuteExternalMenuItem","RenameExternalMenu","ExternalMenuHeader","ExternalMenuDescription","FilterModels_1","ApplyCategoricalFilter","FieldName","FilterValues","IsExcludeMode","ApplyRangeFilter","serializeDateForPlatform","FilterRangeMin","FilterRangeMax","FilterRangeNullOption","apiFilterHandlerCheckForCommandError","hierarchicalLevels","FilterLevels","ClearFilter","resposne","ApplyRelativeDateFilter","MissingRangeNForRelativeDateFilters","RangeN","AnchorDate","convertAnchorDate","GetFilters","convertDomainFilters","GetCategoricalDomain","DomainType","domain","convertCategoricalDomain","GetRangeDomain","convertRangeDomain","GetDashboardFilters","DashboardCategoricalFilter","sharedFilterModel","executeGetAppliedWorksheets","worksheetInfo","isSelected","allowedWorksheets","activeWorksheet","isEnabled","ChangeSharedFilter","SharedFilterSheets","telemetryFunctionName","GetSharedFilter","domainFilters","domainFilter","convertCategoricalFilter","convertHierarchicalFilter","convertRangeFilter","convertRelativeDateFilter","dv","MakeFilterDataValue","fieldCaption","isExclude","hierarchicalDataValue","levelInfo","aLevel","anchorDateValue","domainDv","year","getUTCFullYear","month","getUTCMonth","day","getUTCDate","hh","getUTCHours","mm","getUTCMinutes","sec","getUTCSeconds","InvalidDateParameter","serverPm","ParameterError","InvalidFieldCaption","InvalidFilterFieldName","InvalidValues","InvalidFilterFieldValue","InvalidAggFieldName","InvalidAggregationFieldName","uuid_1","GetDataModels_1","GetDataTableReaderModels_1","viewDataTableCacheId","v4","getMaxRowLimit","getViewDataTableCacheId","getLimitedMaxRows","requestedRows","rowCountLimit","getType","summaryData","functionName","GetDataSummaryData","GetUnderlyingData","requestMaxRows","IgnoreSelection","IncludeAllColumns","verifyIncludeColumnArray","MaxRows","ShowDataTableFormat","ApplyWorksheetFormatting","responseData","processResultsTable","isSummary","ViewDataTableCacheId","PageRowCount","GetDataSummaryDataReader","headers","GetSelectedMarks","table","GetHighlightedMarks","ColumnsToInclude","GetDataSourceData","datasourceId","LogicalTableId","GetLogicalTableData","GetLogicalTableDataReader","GetUnderlyingTableData","GetUnderlyingTableDataReader","tableId","pageSize","ViewDataTableId","DataRowIndex","GetDataTableReaderPage","processResultsPage","summaryTableId","ReleaseDataTableReader","dataTable","row","cell","MakeTableDataValue","_filterFn","_callbackFn","notificationModel","filterFn","handlers","registration","removeRegistration","hasHandlersForNotificationType","reg","SheetPath","getAllParametersAsync","inputParameters","GetParametersForSheet","ParameterFieldName","ParameterValue","ChangeParameterValue","ParameterCaption","FindParameter","ClearSelectedMarks","selectionCriterias","validateSelectionUpdateType","parseSelectionMarks","HierValSelectionModels","QuantRangeSelectionModels","DimValSelectionModels","SelectByValue","interactionModel","ensureTupleIDIsNonNegative","HoverTupleInteraction","RaiseHoverTupleNotification","SelectTuplesInteraction","RaiseSelectTuplesNotification","InvalidFields","InvalidSelectionFieldName","InvalidSelectionValue","InvalidDates","InvalidSelectionDate","parseSelectionIds","Selection","st","catRegex","rangeOption","hierModel","addToParamsList","quantModel","addToRangeParamsList","dimModel","valueSelectionModel","markValues","valueArr","qualifiedFieldCaption","rangeSelectionModel","included","validateNullOptionType","IncludeNull","IncludeNonNull","IncludeAll","_dispatcher","internalError","externalErrorCode","ShouldThrow","No","SheetName","MinHeight","MinWidth","MaxHeight","MaxWidth","SetSheetSize","_response","ActivateNextStoryPoint","ActivatePreviousStoryPoint","ActivateStoryPoint","StoryPointIndex","RevertStoryPoint","GetVisualSpecification","MarksCardIndex","Columns","StartIndex","AddMarksCardFields","FromIndex","ToIndex","FieldCount","MoveMarksCardField","DeleteCount","SpliceMarksCardFields","EditAliasesDialog","VizAPIInputJson","VizAPI","activateSheetAsync","SwitchToSheetName","ActivateSheet","getCustomViewsAsync","GetCustomViews","customView","showCustomViewAsync","customViewName","CustomViewName","ShowCustomView","removeCustomViewAsync","RemoveCustomView","saveCustomViewAsync","CustomViewIsDefault","SaveWorkbookAsCustomView","setActiveCustomViewAsDefaultAsync","SetActiveCustomViewAsDefault","CustomViewLuid","CustomViewIsPublic","UpdateCustomView","getCurrentSrcAsync","GetCurrentSrc","dashboardZoneMap","ZoneIdsVisibilityMap","convertParameterToMap","verifyZoneIsValid","parseInt","SetZoneVisibility","DashboardObjectPositionAndSizeUpdateList","dashboardObject","verifyZoneIsValidAndFloating","dashboardObjectID","verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate","MoveAndResizeZones","_tableInfo","connectionId","customSQL","_errorCode","setPrototypeOf","internalDataValue","aliasedValue","_promise","_resolve","_reject","UnregisterTimeoutInMilliseconds","_mappings","_defaultVal","enumVal","throwIfMissing","Yes","apiNotImplemented","apiName","argumentValue","argumentName","expectedType","isValidEnumValue","enumValue","enumType","isValid","enumKey","enumName","isMinDefined","isMaxDefined","isTypeNumber","isTypeDate","zoneID","dashboardObjectPositionAndSizeUpdate","exportableSheetNames","InvalidSelectionSheet","isTypeBool","every","exportableSheetNamesFromDashboard","exportableSheetNamesFromWorkbook","currentSheetName","orientation","scaling","currentSheet","updateExportLayoutOptions","updateSheetOptions","exportLayoutOptions","imageHeight","DefaultLayoutOptions","imageWidth","Landscape","pageOrientationOption","Portrait","A3","pageSizeOption","A4","A5","B4","B5","Executive","Folio","Ledger","Legal","Letter","Note","Quarto","Statement","Tabloid","Unspecified","AtMost1PageHigh","setFitAndScaleValues","FitOneHigh","AtMost1PageWide","FitOneWide","AtMost2PagesHigh","FitTwoHigh","AtMost2PagesWide","FitTwoWide","ScalePctAuto","Perc100","ScalePct100","Perc200","ScalePct200","Perc25","ScalePct25","Perc400","ScalePct400","Perc50","ScalePct50","Perc60","ScalePct60","Perc75","ScalePct75","Perc80","ScalePct80","Perc90","ScalePct90","sheetOptions","sheetOption","scalingSelection","pageFitHorizontal","pageFitVertical","pageScaleMode","pageScalePercent","fitMatch","fitRegex","exec","percentMatch","pctRegex","slice","ScaleFitPages","ScalePercentage","DefaultDataOptions","DefaultPDFOptions","ScaleAuto","date","serializeBooleanForPlatform","bool","serializeNumberForPlatform","num","input","isTypeString","Boolean","param","paramName","entries","valueString","NaN","parseFloat","minWidth","minHeight","maxWidth","maxHeight","isDsdLayout","internalSheetType","sizeObject","_timeoutInMilliseconds","ApiExecutionError","_timeoutId","setTimeout","Timeout","clearTimeout","versionString","partStr","split","build","getBuildNumber","parts","preReleaseString","fullFormattedValue","_apiDelegateDispatcher","platformVersionNumber","_versionConverter","upgradedNotification","downgradeParameters","getRandomValues","rnds8","Uint8Array","rng","crypto","msCrypto","uuid","byteToHex","substr","arr","offset","_nodeId","_clockseq","_lastMSecs","_lastNSecs","buf","node","clockseq","seedBytes","msecs","now","nsecs","dt","tl","tmh","n","version","hashfunc","generateUUID","namespace","str","unescape","encodeURIComponent","bytes","charCodeAt","stringToBytes","err","DNS","URL","getOutputLength","inputLength8","safeAdd","lsw","md5cmn","q","t","cnt","md5ff","c","d","md5gg","md5hh","md5ii","v35","output","length32","hexTab","hex","charAt","md5ToHexEncodedArray","len","olda","oldb","oldc","oldd","wordsToMd5","length8","Uint32Array","bytesToWords","rnds","f","z","ROTL","K","H","l","N","M","_i","j","pow","floor","_i2","W","_t","_t2","T","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","definition","o","enumerable","obj","prop","r","Symbol","toStringTag","ExtensionsImpl_1","Extensions_1","extensions"],"sourceRoot":""} \ No newline at end of file diff --git a/lib/beta/tableau.extensions.1.15.0.beta.js b/lib/beta/tableau.extensions.1.15.0.beta.js new file mode 100644 index 00000000..01521a26 --- /dev/null +++ b/lib/beta/tableau.extensions.1.15.0.beta.js @@ -0,0 +1,13130 @@ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "../../node_modules/guid/guid.js": +/*!***************************************!*\ + !*** ../../node_modules/guid/guid.js ***! + \***************************************/ +/***/ ((module) => { + +(function () { + var validator = new RegExp("^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$", "i"); + + function gen(count) { + var out = ""; + for (var i=0; i { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +class DashboardLayoutChangedEvent extends TableauEvent_1.TableauEvent { + constructor(_dashboardLayoutChangeDetails) { + super(Contract.TableauEventType.DashboardLayoutChanged); + this._dashboardLayoutChangeDetails = _dashboardLayoutChangeDetails; + } + get dashboardLayoutChangeDetails() { + return this._dashboardLayoutChangeDetails; + } +} +exports.DashboardLayoutChangedEvent = DashboardLayoutChangedEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/FilterChangedEvent.js": +/*!************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/FilterChangedEvent.js ***! + \************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js"); +class FilterChangedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent { + constructor(worksheet, _fieldName, _fieldId) { + super(api_external_contract_js_1.TableauEventType.FilterChanged, worksheet); + this._fieldName = _fieldName; + this._fieldId = _fieldId; + } + get fieldName() { + return this._fieldName; + } + get fieldId() { + return this._fieldId; + } + getFilterAsync() { + return this._worksheet.getFiltersAsync().then((filters) => { + // TODO: Filtering of the filters should eventually be done platform side. + const eventedFilter = this.fieldId + ? filters.find((filter) => filter.fieldId === this.fieldId, this) + : filters.find((filter) => filter.fieldName === this.fieldName, this); + if (!eventedFilter) { + // We shouldn't hit this unless the filter was removed from the worksheet + // after the event was raised. + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.MissingFilter, `cannot find filter: ${this._fieldName}`); + } + return eventedFilter; + }); + } +} +exports.FilterChangedEvent = FilterChangedEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/MarksSelectedEvent.js": +/*!************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/MarksSelectedEvent.js ***! + \************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js"); +class MarksSelectedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent { + constructor(worksheet) { + super(api_external_contract_js_1.TableauEventType.MarkSelectionChanged, worksheet); + } + getMarksAsync() { + return this.worksheet.getSelectedMarksAsync(); + } +} +exports.MarksSelectedEvent = MarksSelectedEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/ParameterChangedEvent.js": +/*!***************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/ParameterChangedEvent.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const Parameter_1 = __webpack_require__(/*! ../Models/Parameter */ "./lib/src/ExtensionsApi/Models/Parameter.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +const TableauSheetEvent_1 = __webpack_require__(/*! ./TableauSheetEvent */ "./lib/src/ExtensionsApi/Events/TableauSheetEvent.js"); +class ParameterChangedEvent extends TableauSheetEvent_1.TableauSheetEvent { + constructor(_globalFieldName, sheet) { + super(api_external_contract_js_1.TableauEventType.ParameterChanged, sheet); + this._globalFieldName = _globalFieldName; + } + getParameterAsync() { + // Call down to our service to get the parameter back via its field name + const service = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("parameters-service" /* Parameters */); + return service.findParameterByGlobalFieldNameAsync(this._globalFieldName).then((parameterImpl) => { + if (parameterImpl === undefined) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.MissingParameter, `Cannot find parameter: ${this._globalFieldName}`); + } + return new Parameter_1.Parameter(parameterImpl, this.sheet); + }); + } +} +exports.ParameterChangedEvent = ParameterChangedEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/SummaryDataChangedEvent.js": +/*!*****************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/SummaryDataChangedEvent.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js"); +class SummaryDataChangedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent { + constructor(worksheet) { + super(api_external_contract_js_1.TableauEventType.SummaryDataChanged, worksheet); + } +} +exports.SummaryDataChangedEvent = SummaryDataChangedEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/TableauEvent.js": +/*!******************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/TableauEvent.js ***! + \******************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class TableauEvent { + constructor(type) { + this._type = type; + } + get type() { + return this._type; + } +} +exports.TableauEvent = TableauEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/TableauSheetEvent.js": +/*!***********************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/TableauSheetEvent.js ***! + \***********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +class TableauSheetEvent extends TableauEvent_1.TableauEvent { + constructor(type, sheet) { + super(type); + this._sheet = sheet; + } + get sheet() { + return this._sheet; + } +} +exports.TableauSheetEvent = TableauSheetEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js": +/*!***************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const TableauSheetEvent_1 = __webpack_require__(/*! ./TableauSheetEvent */ "./lib/src/ExtensionsApi/Events/TableauSheetEvent.js"); +class TableauWorksheetEvent extends TableauSheetEvent_1.TableauSheetEvent { + constructor(type, _worksheet) { + super(type, _worksheet); + this._worksheet = _worksheet; + } + get worksheet() { + return this._worksheet; + } +} +exports.TableauWorksheetEvent = TableauWorksheetEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js": +/*!************************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +class WorkbookFormattingChangedEvent extends TableauEvent_1.TableauEvent { + constructor(_formatting) { + super(Contract.TableauEventType.WorkbookFormattingChanged); + this._formatting = _formatting; + } + get formatting() { + return this._formatting; + } +} +exports.WorkbookFormattingChangedEvent = WorkbookFormattingChangedEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/WorksheetFormattingChangedEvent.js": +/*!*************************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/WorksheetFormattingChangedEvent.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js"); +class WorksheetFormattingChangedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent { + constructor(worksheet, _formatting) { + super(Contract.TableauEventType.WorksheetFormattingChanged, worksheet); + this._formatting = _formatting; + } + get formatting() { + return this._formatting; + } +} +exports.WorksheetFormattingChangedEvent = WorksheetFormattingChangedEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js": +/*!*******************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js ***! + \*******************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.BentonSansFontFamilyName = 'Benton Sans'; +exports.BentonSansLowDPIFontFamilyName = 'Benton Sans Low-DPI'; +exports.BentonSansBookFontFaceName = 'Benton Sans Book'; +exports.BentonSansBookItalicFontFaceName = 'Benton Sans Book Italic'; +exports.BentonSansSemiDemiFontFaceName = 'Benton Sans SemiDemi'; +exports.BentonSansSemiDemiItalicFontFaceName = 'Benton Sans SemiDemi Italic'; +exports.BentonSansLightFontFaceName = 'Benton Sans Light'; +exports.BentonSansMediumFontFaceName = 'Benton Sans Medium'; +exports.SupportedBentonSansFontFaces = [ + exports.BentonSansBookFontFaceName, + exports.BentonSansBookItalicFontFaceName, + exports.BentonSansSemiDemiFontFaceName, + exports.BentonSansSemiDemiItalicFontFaceName, + exports.BentonSansLightFontFaceName, + exports.BentonSansMediumFontFaceName, +]; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/ConnectedServer.js": +/*!*******************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/ConnectedServer.js ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class ConnectedServer { + constructor(_userId, _siteId, _siteNamespace, _workbookId) { + this._userId = _userId; + this._siteId = _siteId; + this._siteNamespace = _siteNamespace; + this._workbookId = _workbookId; + } + get userId() { + return this._userId; + } + get siteId() { + return this._siteId; + } + get siteNamespace() { + return this._siteNamespace; + } + get workbookId() { + return this._workbookId; + } +} +exports.ConnectedServer = ConnectedServer; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js": +/*!*************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js ***! + \*************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +class ExtensionWorkbookImpl extends api_shared_js_1.WorkbookImpl { + getAllDataSourcesAsync() { + const service = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("data-source-service" /* DataSourceService */); + return service.getAllDataSourcesAsync().then((result) => { + const dataSchema = result; + const dataSources = []; + // Loop through all data sources and add them. + Object.values(dataSchema.dataSources).forEach((ds) => { + dataSources.push(this.createDataSourceFromInfo(ds)); + }); + return dataSources; + }); + } + createDataSourceFromInfo(dataSourceInfo) { + const dataSourceImpl = new api_shared_js_1.DataSourceImpl(dataSourceInfo, ServiceRegistryUtil_1.ExtensionsRegistryId); + const dataSource = new api_shared_js_1.DataSource(dataSourceImpl); + dataSourceImpl.initializeWithPublicInterfaces(dataSource); + return dataSource; + } +} +exports.ExtensionWorkbookImpl = ExtensionWorkbookImpl; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/ExtensionsImpl.js": +/*!******************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/ExtensionsImpl.js ***! + \******************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const Dashboard_1 = __webpack_require__(/*! ../Models/Dashboard */ "./lib/src/ExtensionsApi/Models/Dashboard.js"); +const Workbook_1 = __webpack_require__(/*! ../Models/Workbook */ "./lib/src/ExtensionsApi/Models/Workbook.js"); +const Worksheet_1 = __webpack_require__(/*! ../Models/Worksheet */ "./lib/src/ExtensionsApi/Models/Worksheet.js"); +const DashboardContent_1 = __webpack_require__(/*! ../Namespaces/DashboardContent */ "./lib/src/ExtensionsApi/Namespaces/DashboardContent.js"); +const Environment_1 = __webpack_require__(/*! ../Namespaces/Environment */ "./lib/src/ExtensionsApi/Namespaces/Environment.js"); +const Settings_1 = __webpack_require__(/*! ../Namespaces/Settings */ "./lib/src/ExtensionsApi/Namespaces/Settings.js"); +const UI_1 = __webpack_require__(/*! ../Namespaces/UI */ "./lib/src/ExtensionsApi/Namespaces/UI.js"); +const WorkbookFormattingEnvUtil_1 = __webpack_require__(/*! ../Namespaces/WorkbookFormattingEnvUtil */ "./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js"); +const WorksheetContent_1 = __webpack_require__(/*! ../Namespaces/WorksheetContent */ "./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js"); +const RegisterAllExtensionsServices_1 = __webpack_require__(/*! ../Services/RegisterAllExtensionsServices */ "./lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +const BentonSansFontNameConstants_1 = __webpack_require__(/*! ./BentonSansFontNameConstants */ "./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js"); +const ExtensionWorkbookImpl_1 = __webpack_require__(/*! ./ExtensionWorkbookImpl */ "./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js"); +const LegacyInternalApiDispatcherHolder_1 = __webpack_require__(/*! ./LegacyInternalApiDispatcherHolder */ "./lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js"); +const SettingsImpl_1 = __webpack_require__(/*! ./SettingsImpl */ "./lib/src/ExtensionsApi/Impl/SettingsImpl.js"); +const TableauBookFontNameConstants_1 = __webpack_require__(/*! ./TableauBookFontNameConstants */ "./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js"); +const UIImpl_1 = __webpack_require__(/*! ./UIImpl */ "./lib/src/ExtensionsApi/Impl/UIImpl.js"); +class ExtensionsImpl { + initializeAsync(isExtensionDialog, contextMenuCallbacks) { + if (!this._initializationPromise) { + this._initializationPromise = new Promise((resolve, reject) => { + var _a; + const initOptions = { isAlpha: api_shared_js_1.ApiVersion.Instance.isAlpha }; + // First thing we want to do is check to see if there is a desktop dispatcher already registered for us + if (LegacyInternalApiDispatcherHolder_1.LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise(initOptions)) { + // Running in a pre-2019.3 desktop, use our legacy dispatcher promise + const desktopDispatcherPromise = LegacyInternalApiDispatcherHolder_1.LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise(initOptions); + (_a = desktopDispatcherPromise) === null || _a === void 0 ? void 0 : _a.then((dispatcherFactory) => this.onDispatcherReceived(dispatcherFactory, isExtensionDialog, contextMenuCallbacks)).then((openPayload) => { + resolve(openPayload); + }).catch((error) => { + reject(error); + }); + } + else { + // We must be running in server, so we should try to kick of the server dispatcher bootstrapping + const onDispatcherReceivedCallback = this.onDispatcherReceived.bind(this); + api_shared_js_1.doCrossFrameBootstrap(window, api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION, initOptions) + .then((factory) => { + return onDispatcherReceivedCallback(factory, isExtensionDialog, contextMenuCallbacks); + }) + .then((openPayload) => { + resolve(openPayload); + }) + .catch((error) => { + reject(error); + }); + } + }); + } + return this._initializationPromise; + } + createVizImageAsync(inputSpec) { + const vizService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("viz-service" /* Viz */); + return vizService.createVizImageAsync(inputSpec); + } + setClickThroughAsync(clickThroughEnabled) { + const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); + return uiService.setClickThroughAsync(clickThroughEnabled, this.extensionZoneId); + } + isDashboardExtensionLocator(locator) { + const dashboardExtensionLocator = locator; + if (!dashboardExtensionLocator.dashboardPath) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Unexpected error during initialization.'); + } + return true; + } + onDispatcherReceived(dispatcherFactory, isExtensionDialog, contextMenuFunctions) { + let dispatcher = dispatcherFactory(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); + // Call to register all the services which will use the newly initialized dispatcher + RegisterAllExtensionsServices_1.registerInitializationExtensionsServices(dispatcher); + // Get the initialization service and initialize this extension + const initializationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("InitializationService" /* InitializationService */); + const callbackMapKeys = contextMenuFunctions ? Object.keys(contextMenuFunctions) : []; + return initializationService.initializeDashboardExtensionsAsync(isExtensionDialog, callbackMapKeys).then((result) => { + // If we receive an invalid plaform version, this means that platform is runnning 1.4 or 2.1 and + // doesn't pass the platform version to external. In this case we assume the platform version to be 1.9 + const platformVersion = result.extensionEnvironment.platformVersion + ? result.extensionEnvironment.platformVersion + : { major: 1, minor: 9, fix: 0 }; + // Wrap our existing dispatcher in a dispatcher that can downgrade/upgrade for an older platform. + if (api_shared_js_1.VersionedExternalApiDispatcher.needsVersionConverter(platformVersion)) { + dispatcher = new api_shared_js_1.VersionedExternalApiDispatcher(dispatcher, platformVersion); + } + // Registration of services must happen before initializing content and environment + // Extensions doesn't need to pass in a registryId. By default, the service registry instance is associated with registryId=0. + api_shared_js_1.registerAllSharedServices(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId); + RegisterAllExtensionsServices_1.registerAllExtensionsServices(dispatcher); + if (result.extensionDashboardInfo && this.isDashboardExtensionLocator(result.extensionInstance.locator)) { + this.dashboardContent = this.initializeDashboardContent(result.extensionDashboardInfo, result.extensionInstance.locator.dashboardPath); + this.extensionZoneId = result.extensionDashboardInfo.extensionZoneId; + } + if (result.extensionWorksheetInfo) { + this.worksheetContent = this.initializeWorksheetContent(result.extensionWorksheetInfo); + } + this.environment = new Environment_1.Environment(result.extensionEnvironment); + this.settings = this.initializeSettings(result.extensionSettingsInfo); + this.ui = new UI_1.UI(new UIImpl_1.UIImpl()); + this.workbook = new Workbook_1.Workbook(new ExtensionWorkbookImpl_1.ExtensionWorkbookImpl()); + if (result.extensionEnvironment.workbookFormatting) { + this.initializeTableauFonts(dispatcher, result.extensionEnvironment.workbookFormatting); + this.applyAllFormatting(result.extensionEnvironment.workbookFormatting); + } + // After initialization has completed, setup listeners for the callback functions that + // are meant to be triggered whenever a context menu item is clicked. + this.initializeContextMenuCallbacks(contextMenuFunctions); + // Also set up listeners for ExtensionStylesChangedEvent + this.initializeWorkbookFormattingChangedEventCallback(dispatcher); + // In the normal initialization case, this will be an empty string. When returning from initializeAsync to the + // developer, we just ingore that string. In the case of initializing from an extension dialog, this string + // is an optional payload sent from the parent extension. + return result.extensionDialogPayload; + }); + } + applyAllFormatting(formattingModel) { + if (!this._styleElement) { + this._styleElement = document.createElement('style'); + this._styleElement.id = 'Tableau-Extension-Formatting'; + document.head.appendChild(this._styleElement); + } + if (!this._styleElement.sheet || !formattingModel) { + return; + } + const stylesheet = this._styleElement.sheet; + while (stylesheet.cssRules.length > 0) { + stylesheet.deleteRule(stylesheet.cssRules.length - 1); + } + formattingModel.formattingSheets.map((currentFormattingSheet) => { + this.applyFormattingSheetToStyleSheet(currentFormattingSheet, stylesheet); + }); + } + applyFormattingSheetToStyleSheet(currentFormattingSheet, stylesheet) { + let styleInfo = ''; + const cssProperties = currentFormattingSheet.cssProperties; + if (cssProperties.fontFamily) { + styleInfo += 'font-family: ' + cssProperties.fontFamily.toString() + '; '; + } + if (cssProperties.fontSize) { + styleInfo += 'font-size: ' + cssProperties.fontSize.toString() + '; '; + } + if (cssProperties.fontWeight) { + styleInfo += 'font-weight: ' + cssProperties.fontWeight.toString() + '; '; + } + if (cssProperties.fontStyle) { + styleInfo += 'font-style: ' + cssProperties.fontStyle.toString() + '; '; + } + if (cssProperties.textDecoration) { + styleInfo += 'text-decoration: ' + cssProperties.textDecoration.toString() + '; '; + } + if (cssProperties.color) { + styleInfo += 'color: ' + cssProperties.color + '; '; + } + const selector = '.' + currentFormattingSheet.classNameKey; + const rule = selector + ' { ' + styleInfo + ' }'; + stylesheet.insertRule(rule, stylesheet.cssRules.length); + } + initializeWorkbookFormattingChangedEventCallback(dispatcher) { + const notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + // Unregister function not used since these notifications should be + // observed for the full lifetime of the extension. + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorkbookFormattingChanged, () => true, (eventFormatting) => { + if (eventFormatting) { + this.initializeTableauFonts(dispatcher, eventFormatting); + this.applyAllFormatting(eventFormatting); + } + }); + } + initializeTableauFonts(dispatcher, workbookFormatting) { + const fontNames = [...BentonSansFontNameConstants_1.SupportedBentonSansFontFaces, ...TableauBookFontNameConstants_1.SupportedTableauFontFaces]; + workbookFormatting.formattingSheets.forEach((formattingSheet) => { + if (formattingSheet.cssProperties.fontFamily) { + fontNames.push(formattingSheet.cssProperties.fontFamily); + } + }); + if (fontNames.length > 0) { + const parameters = { [api_internal_contract_js_1.ParameterId.FontNameListItems]: fontNames }; + dispatcher + .execute(api_internal_contract_js_1.VerbId.GetFonts, parameters) + .then((response) => { + this.loadFonts(response.result); + }) + .catch(); + } + } + loadFonts(fonts) { + fonts.forEach((fontNameAndInfo) => { + if (TableauBookFontNameConstants_1.SupportedTableauFontFaces.includes(fontNameAndInfo.fontName)) { + this.loadTableauFonts(fontNameAndInfo); + } + else if (BentonSansFontNameConstants_1.SupportedBentonSansFontFaces.includes(fontNameAndInfo.fontName)) { + this.loadBentonSansFonts(fontNameAndInfo); + } + else { + document.fonts.add(new FontFace(fontNameAndInfo.fontName, fontNameAndInfo.fontBinaryInfo)); + } + }); + } + initializeDashboardContent(info, sheetPath) { + // sheets are always active for Extensions + const sheetInfoImpl = new api_shared_js_1.SheetInfoImpl(info.name, api_external_contract_js_1.SheetType.Dashboard, { width: info.size.w, height: info.size.h }, undefined, true); + const dashboardImpl = new api_shared_js_1.DashboardImpl(sheetInfoImpl, info.zones, sheetPath, ServiceRegistryUtil_1.ExtensionsRegistryId, null, info.activeDashboardObjectId); + const dashboard = new Dashboard_1.Dashboard(dashboardImpl); + return new DashboardContent_1.DashboardContent(dashboard); + } + initializeWorksheetContent(info) { + const sheetInfoImpl = new api_shared_js_1.SheetInfoImpl(info.visualId.worksheet, api_external_contract_js_1.SheetType.Worksheet, { width: info.size.w, height: info.size.h }, undefined, // index property is embedding specific + true); + const worksheetImpl = new api_shared_js_1.WorksheetImpl(sheetInfoImpl, ServiceRegistryUtil_1.ExtensionsRegistryId, info.visualId, null, // parentDashboard is always null for worksheet in WorksheetContent + null, // parentStoryPoint is only used for embedding + info.backgroundColor, WorkbookFormattingEnvUtil_1.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(info.formatting)); + const worksheet = new Worksheet_1.Worksheet(worksheetImpl); + return new WorksheetContent_1.WorksheetContent(worksheet); + } + initializeSettings(settingsInfo) { + const settingsImpl = new SettingsImpl_1.SettingsImpl(settingsInfo); + return new Settings_1.Settings(settingsImpl); + } + initializeContextMenuCallbacks(contextMenuFunctions) { + const notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + // Unregister function not used since these notifications should be + // observed for the full lifetime of the extension. + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ContextMenuClick, () => { + // Let through any context menu event, these are already filtered on api-core + // based on the extension locator. + return true; + }, (event) => { + // Execute the function associated with this context menu ID + if (contextMenuFunctions) { + if (!contextMenuFunctions[event.id]) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Received unexpected context menu Id from event: ${event.id}`); + } + contextMenuFunctions[event.id](); + } + }); + } + loadTableauFonts(fontNameAndInfo) { + switch (fontNameAndInfo.fontName) { + case TableauBookFontNameConstants_1.TableauBookFontFaceName: + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBookFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); + break; + case TableauBookFontNameConstants_1.TableauLightFontFaceName: + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauLightFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); + break; + case TableauBookFontNameConstants_1.TableauRegularFontFaceName: + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauRegularFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); + break; + case TableauBookFontNameConstants_1.TableauSemiBoldFontFaceName: + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauSemiboldFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauRegularFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); + break; + case TableauBookFontNameConstants_1.TableauBoldFontFaceName: + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBoldFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBoldFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauMediumFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauSemiboldFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); + break; + case TableauBookFontNameConstants_1.TableauMediumFontFaceName: + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauMediumFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauLightFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBookFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); + break; + default: + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `'attempted to load unsupported font: ${fontNameAndInfo.fontName}.'`); + } + } + loadBentonSansFonts(fontNameAndInfo) { + switch (fontNameAndInfo.fontName) { + case BentonSansFontNameConstants_1.BentonSansBookFontFaceName: + document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); + document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansLowDPIFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: '100', style: 'normal' })); + break; + case BentonSansFontNameConstants_1.BentonSansLightFontFaceName: + document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: '100', style: 'normal' })); + break; + case BentonSansFontNameConstants_1.BentonSansMediumFontFaceName: + document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); + document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansLowDPIFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); + break; + case BentonSansFontNameConstants_1.BentonSansSemiDemiFontFaceName: + document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansLowDPIFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); + break; + case BentonSansFontNameConstants_1.BentonSansBookItalicFontFaceName: + document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansFontFamilyName, fontNameAndInfo.fontBinaryInfo, { style: 'italic' })); + break; + case BentonSansFontNameConstants_1.BentonSansSemiDemiItalicFontFaceName: + document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansLowDPIFontFamilyName, fontNameAndInfo.fontBinaryInfo, { style: 'italic' })); + break; + default: + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `'attempted to load unsupported font: ${fontNameAndInfo.fontName}.'`); + } + } +} +exports.ExtensionsImpl = ExtensionsImpl; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js": +/*!*************************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +/** + * LegacyInternalApiDispatcherHolder has been moved (and renamed) from api-internal-contract. + * It supports running a newer external library against a pre 2019.3 desktop. + * Starting in 2019.3, we have a merged bootstrap style for both desktop and server. + * In addition, the alpha checking that is happening here is not necessary in external-api-js + * after 2019.3 because that checking happens in api-platform-js (ApiDispatcherTest.ts) + * TFSID: 1091561 tracks an improvement to this system to make it less complex and tie it directly to + * tableau beta release versions. + * @deprecated + */ +// eslint-disable-next-line @typescript-eslint/no-namespace +var LegacyInternalApiDispatcherHolder; +(function (LegacyInternalApiDispatcherHolder) { + /** + * @param options + */ + function getDesktopDispatcherPromise(options) { + var _a; + if ((!options || typeof options.isAlpha === 'undefined') && !window.__warningIssued) { + // tslint:disable-next-line:no-console + console.warn('This is a beta version of the Extensions API. Please upgrade to an official release.'); + window.__warningIssued = true; + } + else if (((_a = options) === null || _a === void 0 ? void 0 : _a.isAlpha) && window.__platformIsOfficialRelease) { + window.__tableauDesktopDispatcher + .then((dispatcherFactory) => { + const dispatcher = dispatcherFactory(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); + dispatcher.execute(api_internal_contract_js_1.VerbId.BlockExtension, {}).catch(); + }) + .catch(); + } + // this will be undefined if promise is rejected or throws + return window.__tableauDesktopDispatcher; + } + LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise = getDesktopDispatcherPromise; + /** + * @param options + */ + function hasDesktopApiDispatcherPromise(options) { + return !!getDesktopDispatcherPromise(options); + } + LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise = hasDesktopApiDispatcherPromise; +})(LegacyInternalApiDispatcherHolder = exports.LegacyInternalApiDispatcherHolder || (exports.LegacyInternalApiDispatcherHolder = {})); + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/SettingsImpl.js": +/*!****************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/SettingsImpl.js ***! + \****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const TableauEvent_1 = __webpack_require__(/*! ../Events/TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +class SettingsChangedEvent extends TableauEvent_1.TableauEvent { + constructor(_newSettings) { + super(Contract.TableauEventType.SettingsChanged); + this._newSettings = _newSettings; + } + get newSettings() { + return this._newSettings; + } +} +class SettingsImpl { + constructor(settingsInfo) { + // Since promises can't be introspected for state, keep a variable that + // indicates a save is in progress, so that set/erase can't be called during a save. + this._saveInProgress = false; + this.initializeSettings(settingsInfo); + } + erase(key) { + api_shared_js_1.ErrorHelpers.verifyParameter(key, 'key'); + // Only make a modification if we have the key already + if (this._currentSettings[key]) { + this.verifySettingsAreUnlocked(); + delete this._currentSettings[key]; + this._isModified = true; + } + } + get(key) { + api_shared_js_1.ErrorHelpers.verifyParameter(key, 'key'); + return this._currentSettings[key]; + } + getAll() { + // Returns a mutable copy of the settings + return Object.assign({}, this._currentSettings); + } + get isModified() { + return this._isModified; + } + saveAsync() { + this.verifySettingsAreUnlocked(); + // Just resolve immediately if settings are unchanged + if (!this._isModified) { + return Promise.resolve(this._currentSettings); + } + this._saveInProgress = true; + // Use the settings service to save settings to twb + const settingsService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("SettingsService" /* SettingsService */); + return settingsService.saveSettingsAsync(this._currentSettings).then((newSettings) => { + this._saveInProgress = false; + this._isModified = false; + if (this._currentSettings === undefined) { + this._currentSettings = newSettings; + } + else { + Object.assign(this._currentSettings, newSettings); + } + return newSettings; + }, (reason) => { + this._saveInProgress = false; + return Promise.reject(reason); + }); + } + set(key, value) { + api_shared_js_1.ErrorHelpers.verifyStringParameter(key, 'key'); // Key shouldn't be an empty string. + api_shared_js_1.ErrorHelpers.verifyParameter(value, 'value'); // Empty string value is allowed. + this.verifySettingsAreUnlocked(); + this._currentSettings[key] = value; + this._isModified = true; + } + /** + * Initializes all events relevant to settings object. This is only a settingsUpdate event currently. + * + * @returns {Array} Collection of event managers to pass to an EventListenerManager. + */ + initializeEvents() { + const results = new Array(); + let notificationService; + try { + notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + } + catch (e) { + // If we don't have this service registered, just return + return results; + } + const settingsChangedEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.SettingsChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SettingsChanged, () => true, (event) => { + this._currentSettings = event.newSettings; + settingsChangedEvent.triggerEvent(() => new SettingsChangedEvent(event.newSettings)); + }); + results.push(settingsChangedEvent); + return results; + } + initializeSettings(settingsInfo) { + api_shared_js_1.ErrorHelpers.verifyParameter(settingsInfo, 'settingsInfo'); + api_shared_js_1.ErrorHelpers.verifyParameter(settingsInfo.settingsValues, 'settingsInfo.SettingsValues'); + this._currentSettings = settingsInfo.settingsValues; + // Reset the isModified flag + this._isModified = false; + } + /** + * This helper should be called before any local update to this.currentSettings. + * Checks if a current save call is still in progress and throws an error if so. + */ + verifySettingsAreUnlocked() { + if (this._saveInProgress) { + throw new api_shared_js_1.TableauError(Contract.ErrorCodes.SettingSaveInProgress, SettingsImpl.ASYNC_SAVE_IN_PROGRESS); + } + } +} +exports.SettingsImpl = SettingsImpl; +SettingsImpl.ASYNC_SAVE_IN_PROGRESS = 'Async Save is in progress, updating settings is not allowed.'; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js": +/*!********************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TableauBookFontFamilyName = 'Tableau Book'; +exports.TableauLightFontFamilyName = 'Tableau Light'; +exports.TableauRegularFontFamilyName = 'Tableau Regular'; +exports.TableauMediumFontFamilyName = 'Tableau Medium'; +exports.TableauSemiboldFontFamilyName = 'Tableau Semibold'; +exports.TableauBoldFontFamilyName = 'Tableau Bold'; +exports.TableauBookFontFaceName = 'Tableau Book'; +exports.TableauBoldFontFaceName = 'Tableau Bold'; +exports.TableauLightFontFaceName = 'Tableau Light'; +exports.TableauMediumFontFaceName = 'Tableau Medium'; +exports.TableauRegularFontFaceName = 'Tableau Regular'; +exports.TableauSemiBoldFontFaceName = 'Tableau Semi Bold'; +exports.SupportedTableauFontFaces = [ + exports.TableauBookFontFaceName, + exports.TableauBoldFontFaceName, + exports.TableauLightFontFaceName, + exports.TableauMediumFontFaceName, + exports.TableauRegularFontFaceName, + exports.TableauSemiBoldFontFaceName, +]; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/UIImpl.js": +/*!**********************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/UIImpl.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const TableauEvent_1 = __webpack_require__(/*! ../Events/TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +class DialogMessageEvent extends TableauEvent_1.TableauEvent { + constructor(message) { + super(Contract.TableauEventType.DialogMessageReceived); + this.message = message; + } +} +exports.DialogMessageEvent = DialogMessageEvent; +class UIImpl { + constructor() { } + displayDialogAsync(url, payload, options) { + const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); + const notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + return new Promise((resolve, reject) => { + uiService + .displayDialogAsync(url, payload || '', options) + .then(() => { + const unregisterFn = notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ExtensionDialogUpdate, () => { + // Let through any dialog update event + return true; + }, (event) => { + if (event.isCloseEvent) { + if (event.closePayload === undefined) { + throw new api_shared_js_1.TableauError(Contract.ErrorCodes.InternalError, 'closePayload is undefined'); + } + resolve(event.closePayload); + } + else { + reject(new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.DialogClosedByUser, 'Extension dialog closed by user.')); + } + unregisterFn(); + }); + }) + .catch((error) => { + reject(error); + }); + }); + } + sendDialogMessageAsync(message, targetDialogUrl) { + const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); + uiService.sendDialogMessageAsync(message, targetDialogUrl); + } + closeDialog(payload) { + const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); + uiService.closeDialog(payload); + } + /** + * Initializes all events relevant to UI object. + * + * @returns {Array} Collection of event managers to pass to an EventListenerManager. + */ + initializeEvents() { + const results = new Array(); + let notificationService; + try { + notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + } + catch (e) { + // If we don't have this service registered, just return + return results; + } + const dialogMessageEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.DialogMessageReceived); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ExtensionDialogMessage, () => true, (event) => { + dialogMessageEvent.triggerEvent(() => new DialogMessageEvent(event.message)); + }); + results.push(dialogMessageEvent); + return results; + } +} +exports.UIImpl = UIImpl; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Models/Dashboard.js": +/*!***************************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Dashboard.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const DashboardLayoutChangedEvent_1 = __webpack_require__(/*! ../Events/DashboardLayoutChangedEvent */ "./lib/src/ExtensionsApi/Events/DashboardLayoutChangedEvent.js"); +const WorkbookFormattingChangedEvent_1 = __webpack_require__(/*! ../Events/WorkbookFormattingChangedEvent */ "./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +const DashboardObject_1 = __webpack_require__(/*! ./DashboardObject */ "./lib/src/ExtensionsApi/Models/DashboardObject.js"); +const Sheet_1 = __webpack_require__(/*! ./Sheet */ "./lib/src/ExtensionsApi/Models/Sheet.js"); +const Worksheet_1 = __webpack_require__(/*! ./Worksheet */ "./lib/src/ExtensionsApi/Models/Worksheet.js"); +class Dashboard extends Sheet_1.Sheet { + constructor(_dashboardImpl) { + super(_dashboardImpl); + this._dashboardImpl = _dashboardImpl; + _dashboardImpl.initializeWithPublicInterfaces(); + this.initializeEvents().forEach((e) => this.addNewEventType(e)); + } + get worksheets() { + return this._dashboardImpl.worksheetsImpl.map((worksheetImpl) => { + return new Worksheet_1.Worksheet(worksheetImpl); + }); + } + get objects() { + return this._dashboardImpl.objects.map((dashboardObjectImpl) => { + return new DashboardObject_1.DashboardObject(dashboardObjectImpl); + }); + } + get activeDashboardObjectId() { + return this._dashboardImpl.activeDashboardObjectId; + } + get activeDashboardName() { + return this._dashboardImpl.activeDashboardName; + } + setZoneVisibilityAsync(zoneVisibilityMap) { + return this._dashboardImpl.setDashboardObjectVisibilityAsync(zoneVisibilityMap); + } + setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap) { + return this._dashboardImpl.setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap); + } + getDashboardObjectById(dashboardObjectId) { + const zone = this._dashboardImpl.getDashboardObjectById(dashboardObjectId); + return zone && new DashboardObject_1.DashboardObject(zone); + } + initializeEvents() { + const results = new Array(); + // Initializing events and registering notification service + let notificationService; + try { + notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + } + catch (e) { + // If we don't have this service registered, just return (allows unit testing without NotificationService mock) + return results; + } + const dashboardLayoutChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.DashboardLayoutChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.DashboardLayoutChanged, () => true, (event) => { + const dashboardObjectChanges = this._dashboardImpl.updateZones(event.zones, event.activeZoneId, event.activeDashboardName); + dashboardLayoutChangedEvent.triggerEvent(() => new DashboardLayoutChangedEvent_1.DashboardLayoutChangedEvent(dashboardObjectChanges)); + }); + results.push(dashboardLayoutChangedEvent); + const workbookFormattingChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.WorkbookFormattingChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorkbookFormattingChanged, () => true, (eventFormatting) => { + workbookFormattingChangedEvent.triggerEvent(() => new WorkbookFormattingChangedEvent_1.WorkbookFormattingChangedEvent(eventFormatting)); + }); + results.push(workbookFormattingChangedEvent); + return results; + } + moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray) { + return this._dashboardImpl.moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray); + } + replayAnimationAsync(replaySpeed) { + return this._dashboardImpl.replayAnimationAsync(replaySpeed); + } + getFiltersAsync() { + return this._dashboardImpl.getFiltersAsync(); + } + applyFilterAsync(fieldName, values, updateType, options) { + return this._dashboardImpl.applyFilterAsync(fieldName, values, updateType, options); + } +} +exports.Dashboard = Dashboard; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Models/DashboardObject.js": +/*!*********************************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/DashboardObject.js ***! + \*********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Dashboard_1 = __webpack_require__(/*! ./Dashboard */ "./lib/src/ExtensionsApi/Models/Dashboard.js"); +const Worksheet_1 = __webpack_require__(/*! ./Worksheet */ "./lib/src/ExtensionsApi/Models/Worksheet.js"); +/** + * Implementation of the dashboard objects - the zones in a dashboard. + */ +class DashboardObject { + constructor(_dashboardObjectImpl) { + this._dashboardObjectImpl = _dashboardObjectImpl; + } + get dashboard() { + return new Dashboard_1.Dashboard(this._dashboardObjectImpl.dashboardImpl); + } + get type() { + return this._dashboardObjectImpl.type; + } + get position() { + return this._dashboardObjectImpl.position; + } + get size() { + return this._dashboardObjectImpl.size; + } + get worksheet() { + if (this._dashboardObjectImpl.worksheetImpl) { + return new Worksheet_1.Worksheet(this._dashboardObjectImpl.worksheetImpl); + } + return undefined; + } + get name() { + return this._dashboardObjectImpl.name; + } + get isFloating() { + return this._dashboardObjectImpl.isFloating; + } + get isVisible() { + return this._dashboardObjectImpl.isVisible; + } + get id() { + return this._dashboardObjectImpl.id; + } + get fieldId() { + return this._dashboardObjectImpl.fieldId; + } +} +exports.DashboardObject = DashboardObject; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Models/Parameter.js": +/*!***************************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Parameter.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const ParameterChangedEvent_1 = __webpack_require__(/*! ../Events/ParameterChangedEvent */ "./lib/src/ExtensionsApi/Events/ParameterChangedEvent.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +/** + * Implementation of the Parameter contract. Calls down to the impl + * class for almost all of the work it does. + */ +class Parameter extends api_shared_js_1.EventListenerManager { + constructor(parameterImpl, sheet) { + super(); + this.parameterImpl = parameterImpl; + // Initialize our event handling for this class + this.initializeEvents(sheet).forEach((e) => this.addNewEventType(e)); + } + get name() { + return this.parameterImpl.name; + } + get currentValue() { + return this.parameterImpl.currentValue; + } + get dataType() { + return this.parameterImpl.dataType; + } + get allowableValues() { + return this.parameterImpl.allowableValues; + } + get id() { + return this.parameterImpl.id; + } + changeValueAsync(newValue) { + return this.parameterImpl.changeValueAsync(newValue); + } + /** + * Helper method which goes through and registers each event type this impl knows about + * with the NotificationService. It returns an array of SingleEventManager objects which + * can then be passed to an EventListenerManager to handle user registration / unregistration. + * + * @param sheet The sheet object which will be included with the event notifications + * @returns {Array} Collection of event managers to pass to an EventListenerManager + */ + initializeEvents(sheet) { + api_shared_js_1.ErrorHelpers.verifyInternalValue(sheet, 'sheet'); + const results = new Array(); + let notificationService; + try { + notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + } + catch (e) { + // If we don't have this service registered, just return + return results; + } + // Initialize all of the event managers we'll need (one for each event type) + const parameterEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.ParameterChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ParameterChanged, (model) => { + const fieldName = model; + return fieldName === this.parameterImpl.id; + }, (fieldName) => { + parameterEvent.triggerEvent(() => new ParameterChangedEvent_1.ParameterChangedEvent(fieldName, sheet)); + }); + results.push(parameterEvent); + return results; + } +} +exports.Parameter = Parameter; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Models/Sheet.js": +/*!***********************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Sheet.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const Parameter_1 = __webpack_require__(/*! ./Parameter */ "./lib/src/ExtensionsApi/Models/Parameter.js"); +class Sheet extends api_shared_js_1.EventListenerManager { + constructor(_sheetImpl) { + super(); + this._sheetImpl = _sheetImpl; + } + get name() { + return this._sheetImpl.name; + } + get sheetType() { + return this._sheetImpl.sheetType; + } + get size() { + if (this.isValidSize(this._sheetImpl.size)) { + return this._sheetImpl.size; + } + throw new api_shared_js_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, 'Size not implemented'); + } + isValidSize(size) { + const testSize = size; + if (testSize.width !== undefined && testSize.height !== undefined) { + return true; + } + return false; + } + findParameterAsync(parameterName) { + return this._sheetImpl.findParameterAsync(parameterName).then((parameterImpl) => { + if (parameterImpl) { + return new Promise((resolve) => resolve(new Parameter_1.Parameter(parameterImpl, this))); + } + else { + return new Promise((resolve) => resolve(undefined)); + } + }); + } + getParametersAsync() { + return this._sheetImpl.getParametersAsync().then((parametersImpl) => { + return parametersImpl.map((parameterImpl) => { + return new Parameter_1.Parameter(parameterImpl, this); + }); + }); + } +} +exports.Sheet = Sheet; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Models/Workbook.js": +/*!**************************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Workbook.js ***! + \**************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class Workbook { + constructor(_workbookImpl) { + this._workbookImpl = _workbookImpl; + } + getAllDataSourcesAsync() { + return this._workbookImpl.getAllDataSourcesAsync(); + } +} +exports.Workbook = Workbook; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Models/Worksheet.js": +/*!***************************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Worksheet.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const FilterChangedEvent_1 = __webpack_require__(/*! ../Events/FilterChangedEvent */ "./lib/src/ExtensionsApi/Events/FilterChangedEvent.js"); +const MarksSelectedEvent_1 = __webpack_require__(/*! ../Events/MarksSelectedEvent */ "./lib/src/ExtensionsApi/Events/MarksSelectedEvent.js"); +const SummaryDataChangedEvent_1 = __webpack_require__(/*! ../Events/SummaryDataChangedEvent */ "./lib/src/ExtensionsApi/Events/SummaryDataChangedEvent.js"); +const WorksheetFormattingChangedEvent_1 = __webpack_require__(/*! ../Events/WorksheetFormattingChangedEvent */ "./lib/src/ExtensionsApi/Events/WorksheetFormattingChangedEvent.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +const Dashboard_1 = __webpack_require__(/*! ./Dashboard */ "./lib/src/ExtensionsApi/Models/Dashboard.js"); +const Sheet_1 = __webpack_require__(/*! ./Sheet */ "./lib/src/ExtensionsApi/Models/Sheet.js"); +class Worksheet extends Sheet_1.Sheet { + constructor(_worksheetImpl) { + super(_worksheetImpl); + this._worksheetImpl = _worksheetImpl; + // Call to initialize events and then call down to the event listener manager to handle things + this.initializeEvents().forEach((e) => this.addNewEventType(e)); + } + get parentDashboard() { + // This should never happen for Extensions if the DashboardImpls are created correctly + if (this._worksheetImpl.parentDashboard == null) { + throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `Parent dashboard not implemented`); + } + return new Dashboard_1.Dashboard(this._worksheetImpl.parentDashboard); + } + get backgroundColor() { + if (this._worksheetImpl.backgroundColor == null) { + throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `Worksheet background color is not available`); + } + return this._worksheetImpl.backgroundColor; + } + get formatting() { + if (this._worksheetImpl.formatting == null) { + throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `Worksheet formatting information is not available`); + } + return this._worksheetImpl.formatting; + } + /** + * Helper method which goes through and registers each event type this impl knows about + * with the NotificationService. It returns an array of SingleEventManager objects which + * can then be passed to an EventListenerManager to handle user registration / unregistration. + * + * @param {Worksheet} worksheet The worksheet object which will be included with the event notifications + * @returns {Array} Collection of event managers to pass to an EventListenerManager + */ + initializeEvents() { + const results = new Array(); + let notificationService; + try { + notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + } + catch (e) { + // If we don't have this service registered, just return + return results; + } + // Initialize all of the event managers we'll need (one for each event type) + const marksEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.MarkSelectionChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SelectedMarksChanged, (model) => { + const visualId = model; + return this.visualIdsAreEqual(visualId, this._worksheetImpl.visualId); + }, () => marksEvent.triggerEvent(() => new MarksSelectedEvent_1.MarksSelectedEvent(this))); + const filterEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.FilterChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.FilterChanged, (model) => { + const filterEventResponse = model; + return this._worksheetImpl.visualId.worksheet === filterEventResponse.visualId.worksheet; + }, (event) => { + filterEvent.triggerEvent(() => new FilterChangedEvent_1.FilterChangedEvent(this, event.fieldName, event.fieldId)); + }); + const summaryDataEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.SummaryDataChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SummaryDataChanged, (model) => { + const summaryDataEventResponse = model; + return this._worksheetImpl.visualId.worksheet === summaryDataEventResponse.visualId.worksheet; + }, (event) => { + summaryDataEvent.triggerEvent(() => new SummaryDataChangedEvent_1.SummaryDataChangedEvent(this)); + }); + const worksheetFormattingChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.WorksheetFormattingChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorksheetFormattingChanged, (model) => { + const worksheetFormattingChangedEvent = model; + return this._worksheetImpl.visualId.worksheet === worksheetFormattingChangedEvent.visualId.worksheet; + }, (eventFormatting) => { + worksheetFormattingChangedEvent.triggerEvent(() => new WorksheetFormattingChangedEvent_1.WorksheetFormattingChangedEvent(this, eventFormatting)); + }); + results.push(marksEvent); + results.push(filterEvent); + results.push(summaryDataEvent); + results.push(worksheetFormattingChangedEvent); + return results; + } + applyFilterAsync(fieldName, values, updateType, options) { + return this._worksheetImpl.applyFilterAsync(fieldName, values, updateType, options); + } + applyRangeFilterAsync(fieldName, filterOptions) { + return this._worksheetImpl.applyRangeFilterAsync(fieldName, filterOptions); + } + applyHierarchicalFilterAsync(fieldName, values, updateType, options) { + return this._worksheetImpl.applyHierarchicalFilterAsync(fieldName, values, updateType, options); + } + applyRelativeDateFilterAsync(fieldName, options) { + return this._worksheetImpl.applyRelativeDateFilterAsync(fieldName, options); + } + clearFilterAsync(fieldName) { + return this._worksheetImpl.clearFilterAsync(fieldName); + } + getDataSourcesAsync() { + return this._worksheetImpl.getDataSourcesAsync(); + } + getFiltersAsync() { + return this._worksheetImpl.getFiltersAsync(); + } + getSelectedMarksAsync() { + return this._worksheetImpl.getSelectedMarksAsync(); + } + getHighlightedMarksAsync() { + return this._worksheetImpl.getHighlightedMarksAsync(); + } + getSummaryDataAsync(options) { + return this._worksheetImpl.getSummaryDataAsync(options); + } + getSummaryDataReaderAsync(pageRowCount, options) { + return this._worksheetImpl.getSummaryDataReaderAsync(pageRowCount, options); + } + getSummaryColumnsInfoAsync() { + return this._worksheetImpl.getSummaryColumnsInfoAsync(); + } + getUnderlyingDataAsync(options) { + console.warn('Worksheet.getUnderlyingDataAsync is deprecated. Please use ' + + 'Worksheet.getUnderlyingTablesAsync and Worksheet.getUnderlyingTableDataAsync'); + return this._worksheetImpl.getUnderlyingDataAsync(options); + } + getUnderlyingTablesAsync() { + return this._worksheetImpl.getUnderlyingTablesAsync(); + } + getUnderlyingTableDataAsync(logicalTableId, options) { + return this._worksheetImpl.getUnderlyingTableDataAsync(logicalTableId, options); + } + getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options) { + return this._worksheetImpl.getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options); + } + getVisualSpecificationAsync() { + return this._worksheetImpl.getVisualSpecificationAsync(); + } + addMarksCardFieldsAsync(marksCardIndex, encodingType, columns, startIndex) { + return this._worksheetImpl.addMarksCardFieldsAsync(marksCardIndex, encodingType, columns, startIndex); + } + moveMarksCardFieldAsync(marksCardIndex, fromIndex, toIndex, fieldCount = 1) { + return this._worksheetImpl.moveMarksCardFieldAsync(marksCardIndex, fromIndex, toIndex, fieldCount); + } + spliceMarksCardFieldsAsync(marksCardIndex, encodingType, startIndex, deleteCount, columns) { + return this._worksheetImpl.spliceMarksCardFieldsAsync(marksCardIndex, encodingType, startIndex, deleteCount, columns); + } + clearSelectedMarksAsync() { + return this._worksheetImpl.clearSelectedMarksAsync(); + } + selectMarksByIDAsync(marksInfo, updateType) { + return this._worksheetImpl.selectMarksByIdAsync(marksInfo, updateType); + } + selectMarksByValueAsync(selections, selectionUpdateType) { + return this._worksheetImpl.selectMarksByValueAsync(selections, selectionUpdateType); + } + selectMarksByIdAsync(selections, selectionUpdateType) { + return this._worksheetImpl.selectMarksByIdAsync(selections, selectionUpdateType); + } + annotateMarkAsync(mark, annotationText) { + return this._worksheetImpl.annotateMarkAsync(mark, annotationText); + } + getAnnotationsAsync() { + return this._worksheetImpl.getAnnotationsAsync(); + } + removeAnnotationAsync(annotation) { + return this._worksheetImpl.removeAnnotationAsync(annotation); + } + hoverTupleAsync(hoveredTuple, tooltip, allowHoverActions = true) { + return this._worksheetImpl.hoverTupleAsync(hoveredTuple, tooltip, allowHoverActions); + } + selectTuplesAsync(selectedTuples, selectOption, tooltip) { + return this._worksheetImpl.selectTuplesAsync(selectedTuples, selectOption, tooltip); + } + getTooltipTextAsync(tupleId) { + return this._worksheetImpl.getTooltipTextAsync(tupleId); + } + leaveMarkNavigationAsync() { + return this._worksheetImpl.leaveMarkNavigationAsync(); + } + editAliasesDialogAsync(fieldName) { + return this._worksheetImpl.editAliasesDialogAsync(fieldName); + } + visualIdsAreEqual(a, b) { + return (a && + b && + a.worksheet === b.worksheet && + a.dashboard === b.dashboard && + a.storyboard === b.storyboard && + a.storyPointID === b.storyPointID); + } +} +exports.Worksheet = Worksheet; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/DashboardContent.js": +/*!**************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/DashboardContent.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the external DashboardContent namespace. + * This does not follow the Impl pattern as DashboardContent is + * currently just a (single) property bag. + */ +class DashboardContent { + constructor(_dashboard) { + this._dashboard = _dashboard; + } + get dashboard() { + return this._dashboard; + } +} +exports.DashboardContent = DashboardContent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/Environment.js": +/*!*********************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/Environment.js ***! + \*********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const ConnectedServer_1 = __webpack_require__(/*! ../Impl/ConnectedServer */ "./lib/src/ExtensionsApi/Impl/ConnectedServer.js"); +const WorkbookFormattingEnvUtil_1 = __webpack_require__(/*! ./WorkbookFormattingEnvUtil */ "./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js"); +/** + * Implementation of the external environment namespace. + * Environment does not follow the Impl pattern as it is + * just a property bag. + * First class extensions can get to ConnectedServer with: environment['connectedServer'] + */ +class Environment { + constructor(extensionEnvironment) { + this._apiVersion = api_shared_js_1.ApiVersion.Instance && api_shared_js_1.ApiVersion.Instance.formattedValue; // maj.min.fix (no build) + this._context = api_shared_js_1.InternalToExternalEnumMappings.extensionContext.convert(extensionEnvironment.extensionContext); + this._formatting = WorkbookFormattingEnvUtil_1.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(extensionEnvironment.workbookFormatting); + this._language = extensionEnvironment.extensionLanguage; + this._country = extensionEnvironment.extensionCountry; + this._locale = extensionEnvironment.extensionLocale; + this._mode = api_shared_js_1.InternalToExternalEnumMappings.extensionMode.convert(extensionEnvironment.extensionMode); + this._operatingSystem = extensionEnvironment.operatingSystem; + this._tableauVersion = extensionEnvironment.tableauVersion; + this._uniqueUserId = extensionEnvironment.uniqueUserId; + // If we have a userId, then we are a first class extension + if (extensionEnvironment.userId) { + this.connectedServer = new ConnectedServer_1.ConnectedServer(extensionEnvironment.userId, extensionEnvironment.siteId, extensionEnvironment.siteNamespace, extensionEnvironment.workbookId); + this.featureFlags = extensionEnvironment.featureFlags; + } + } + get apiVersion() { + return this._apiVersion; + } + get context() { + return this._context; + } + get workbookFormatting() { + return this._formatting; + } + get language() { + return this._language; + } + get country() { + return this._country; + } + get locale() { + return this._locale; + } + get mode() { + return this._mode; + } + get operatingSystem() { + return this._operatingSystem; + } + get tableauVersion() { + return this._tableauVersion; + } + get uniqueUserId() { + return this._uniqueUserId; + } +} +exports.Environment = Environment; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/Extensions.js": +/*!********************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/Extensions.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the external Extensions namespace. + */ +class Extensions { + constructor(extensionImpl) { + this.extensionImpl = extensionImpl; + this.extensionImpl = extensionImpl; + } + get dashboardContent() { + return this.extensionImpl.dashboardContent; + } + get worksheetContent() { + return this.extensionImpl.worksheetContent; + } + get environment() { + return this.extensionImpl.environment; + } + get settings() { + return this.extensionImpl.settings; + } + get ui() { + return this.extensionImpl.ui; + } + get workbook() { + return this.extensionImpl.workbook; + } + get dashboardObjectId() { + return this.extensionImpl.extensionZoneId; + } + initializeAsync(contextMenuCallbacks) { + return this.extensionImpl.initializeAsync(false, contextMenuCallbacks).then(); + } + initializeDialogAsync() { + return this.extensionImpl.initializeAsync(true); + } + createVizImageAsync(inputSpec) { + return this.extensionImpl.createVizImageAsync(inputSpec); + } + setClickThroughAsync(clickThroughEnabled) { + return this.extensionImpl.setClickThroughAsync(clickThroughEnabled); + } +} +exports.Extensions = Extensions; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/Settings.js": +/*!******************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/Settings.js ***! + \******************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +/** + * Implementation of the external settings namespace. + */ +class Settings extends api_shared_js_1.EventListenerManager { + constructor(_settingsImpl) { + super(); + this._settingsImpl = _settingsImpl; + // Initialize our event handling for this class + this._settingsImpl.initializeEvents().forEach((e) => this.addNewEventType(e)); + } + erase(key) { + this._settingsImpl.erase(key); + } + get(key) { + return this._settingsImpl.get(key); + } + getAll() { + return this._settingsImpl.getAll(); + } + get isModified() { + return this._settingsImpl.isModified; + } + saveAsync() { + return this._settingsImpl.saveAsync(); + } + set(key, value) { + this._settingsImpl.set(key, value); + } +} +exports.Settings = Settings; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/UI.js": +/*!************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/UI.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +/** + * Implementation of the external UI namespace. + */ +class UI extends api_shared_js_1.EventListenerManager { + constructor(_impl) { + super(); + this._impl = _impl; + // Initialize our event handling for this class + this._impl.initializeEvents().forEach((e) => this.addNewEventType(e)); + } + displayDialogAsync(url, payload, options) { + return this._impl.displayDialogAsync(url, payload, options); + } + sendDialogMessageAsync(message, targetDialogUrl) { + return this._impl.sendDialogMessageAsync(message, targetDialogUrl); + } + closeDialog(payload) { + this._impl.closeDialog(payload); + } +} +exports.UI = UI; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js": +/*!***********************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js ***! + \***********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +class WorkbookFormattingEnvUtil { + static convertToWorkbookFormatting(workbookFormattingModel) { + if (!workbookFormattingModel) { + return undefined; + } + else { + const formattingMap = workbookFormattingModel.formattingSheets.map((currentFormattingSheet) => { + const formattingSheet = { + classNameKey: api_shared_js_1.InternalToExternalEnumMappings.classNameKey.convert(currentFormattingSheet.classNameKey), + cssProperties: getCssProperties(currentFormattingSheet.classNameKey, currentFormattingSheet.cssProperties), + }; + return formattingSheet; + }); + const result = { + formattingSheets: formattingMap, + }; + return result; + } + } +} +exports.WorkbookFormattingEnvUtil = WorkbookFormattingEnvUtil; +function getCssProperties(classNameKey, cssProperties) { + if (classNameKey === "tableau-row-dividers" /* RowDividers */ || classNameKey === "tableau-column-dividers" /* ColumnDividers */) { + return { + borderColor: cssProperties.borderColor, + borderStyle: cssProperties.borderStyle, + borderWidth: cssProperties.borderWidth, + }; + } + return { + fontFamily: cssProperties.fontFamily, + fontSize: cssProperties.fontSize, + fontWeight: cssProperties.fontWeight, + fontStyle: cssProperties.fontStyle, + textDecoration: cssProperties.textDecoration, + color: cssProperties.color, + }; +} + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js": +/*!**************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the external WorksheetContent namespace. + * This does not follow the Impl pattern as WorksheetContent is + * currently just a (single) property bag. + */ +class WorksheetContent { + constructor(_worksheet) { + this._worksheet = _worksheet; + } + get worksheet() { + return this._worksheet; + } +} +exports.WorksheetContent = WorksheetContent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js": +/*!**************************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js ***! + \**************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +class InitializationServiceImpl extends api_shared_js_1.ServiceImplBase { + get serviceName() { + return "InitializationService" /* InitializationService */; + } + initializeDashboardExtensionsAsync(isExtensionDialog, contextMenuIds) { + const params = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'initializeDashboardExtensionsAsync', + [api_internal_contract_js_1.ParameterId.ExtensionContextMenuIds]: contextMenuIds, + [api_internal_contract_js_1.ParameterId.IsExtensionDialog]: isExtensionDialog, + }; + return this.execute(api_internal_contract_js_1.VerbId.InitializeExtension, params).then((response) => { + // TODO - Validate return value + const result = response.result; + return result; + }); + } +} +exports.InitializationServiceImpl = InitializationServiceImpl; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js": +/*!********************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +class SettingsServiceImpl extends api_shared_js_1.ServiceImplBase { + get serviceName() { + return "SettingsService" /* SettingsService */; + } + saveSettingsAsync(settings) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'saveSettingsAsync', + [api_internal_contract_js_1.ParameterId.SettingsValues]: settings, + }; + return this.execute(api_internal_contract_js_1.VerbId.SaveExtensionSettings, parameters).then((value) => { + const result = value.result; + if (!result || !result.settingsValues) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Unexpected error savings settings.'); + } + return result.settingsValues; + }); + } +} +exports.SettingsServiceImpl = SettingsServiceImpl; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js": +/*!**************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const DEFAULT_DIALOG_HEIGHT = 400; // in pixels +const DEFAULT_DIALOG_WIDTH = 600; // in pixels +const DEFAULT_DIALOG_STYLE = api_external_contract_js_1.DialogStyle.Window; +class UIServiceImpl extends api_shared_js_1.ServiceImplBase { + get serviceName() { + return "UIService" /* UIService */; + } + displayDialogAsync(url, payload, options) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'displayDialogAsync', + [api_internal_contract_js_1.ParameterId.ExtensionDialogUrl]: url, + [api_internal_contract_js_1.ParameterId.ExtensionDialogPayload]: payload, + }; + const h = options && options.height ? options.height : DEFAULT_DIALOG_HEIGHT; + const w = options && options.width ? options.width : DEFAULT_DIALOG_WIDTH; + const dialogStyle = options && options.dialogStyle ? options.dialogStyle : DEFAULT_DIALOG_STYLE; + // On the platform side, we do something reasonable regardess of whether the passed + // height and width are too large or too small. But this likely indicates a developer error, + // so we throw an error here to help with debugging. + if (h <= 0 || w <= 0) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'Size parameters for displayDialogAsync must be positive'); + } + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogH] = h; + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogW] = w; + api_shared_js_1.ErrorHelpers.verifyEnumValue(dialogStyle, api_external_contract_js_1.DialogStyle, 'DialogStyle'); + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogStyle] = api_shared_js_1.ExternalToInternalEnumMappings.dialogStyles.convert(dialogStyle); + return this.execute(api_internal_contract_js_1.VerbId.DisplayDialog, parameters).then((response) => { + const dialogResult = response.result; + switch (dialogResult) { + case api_internal_contract_js_1.ExtensionDialogResult.DialogAlreadyOpen: + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.DialogAlreadyOpen, 'There already exists an open dialog for this extension.'); + case api_internal_contract_js_1.ExtensionDialogResult.InvalidDomain: + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidDomainDialog, 'The url of an extension dialog must match the domain of the parent extension.'); + default: + // Success case + return; + } + }); + } + closeDialog(payload) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'closeDialog', + }; + if (payload) { + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogPayload] = payload; + } + return this.execute(api_internal_contract_js_1.VerbId.CloseDialog, parameters).then(() => { + return; + }); + } + sendDialogMessageAsync(message, targetDialogUrl) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'sendDialogMessage', + [api_internal_contract_js_1.ParameterId.ExtensionDialogMessage]: message, + }; + if (targetDialogUrl) { + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogUrl] = targetDialogUrl; + } + return this.execute(api_internal_contract_js_1.VerbId.SendDialogMessage, parameters).then(() => { + return; + }); + } + setClickThroughAsync(clickThroughEnabled, extensionZoneId) { + api_shared_js_1.ErrorHelpers.verifyParameterType(clickThroughEnabled, 'boolean', 'clickThroughEnabled'); + if (extensionZoneId === undefined || extensionZoneId <= 0) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Extension Id is invalid.'); + } + const parameters = { + [api_internal_contract_js_1.ParameterId.ExtensionZoneId]: extensionZoneId, + [api_internal_contract_js_1.ParameterId.ClickThroughEnabled]: clickThroughEnabled, + }; + return this.execute(api_internal_contract_js_1.VerbId.SetClickThrough, parameters).then(() => { + return; + }); + } +} +exports.UIServiceImpl = UIServiceImpl; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js": +/*!*************************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const InitializationServiceImpl_1 = __webpack_require__(/*! ./Impl/InitializationServiceImpl */ "./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js"); +const SettingsServiceImpl_1 = __webpack_require__(/*! ./Impl/SettingsServiceImpl */ "./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js"); +const UIServiceImpl_1 = __webpack_require__(/*! ./Impl/UIServiceImpl */ "./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ./ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +function registerAllExtensionsServices(dispatcher) { + api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).registerService(new SettingsServiceImpl_1.SettingsServiceImpl(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId)); + api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).registerService(new UIServiceImpl_1.UIServiceImpl(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId)); +} +exports.registerAllExtensionsServices = registerAllExtensionsServices; +function registerInitializationExtensionsServices(dispatcher) { + api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).registerService(new InitializationServiceImpl_1.InitializationServiceImpl(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId)); +} +exports.registerInitializationExtensionsServices = registerInitializationExtensionsServices; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js": +/*!***************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ExtensionsRegistryId = 0; + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/EmbeddingApiExternalContract.js": +/*!***************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/EmbeddingApiExternalContract.js ***! + \***************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +// This file re-exports everything which is part of the extensions api public interface +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +__export(__webpack_require__(/*! ./ExternalContract/Embedding/AskDataInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/AskDataInterfaces.js")); +var Enums_1 = __webpack_require__(/*! ./ExternalContract/Embedding/Enums */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js"); +exports.ApiMenuType = Enums_1.ApiMenuType; +exports.CrosstabFileFormat = Enums_1.CrosstabFileFormat; +exports.DeviceType = Enums_1.DeviceType; +exports.EmbeddingErrorCodes = Enums_1.EmbeddingErrorCodes; +exports.EmbeddingTableauEventType = Enums_1.TableauEventType; +exports.FileFormats = Enums_1.FileFormats; +exports.PrintOrientation = Enums_1.PrintOrientation; +exports.PrintPageSize = Enums_1.PrintPageSize; +exports.PrintScaling = Enums_1.PrintScaling; +exports.PulseErrorMessageVisibility = Enums_1.PulseErrorMessageVisibility; +exports.PulseLayout = Enums_1.PulseLayout; +exports.PulseTimeDimension = Enums_1.PulseTimeDimension; +exports.SheetSizeBehavior = Enums_1.SheetSizeBehavior; +exports.TableauDialogType = Enums_1.TableauDialogType; +exports.Toolbar = Enums_1.Toolbar; +__export(__webpack_require__(/*! ./ExternalContract/Embedding/PulseInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/PulseInterfaces.js")); +__export(__webpack_require__(/*! ./ExternalContract/Embedding/VizInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js")); +__export(__webpack_require__(/*! ./ExternalContract/Embedding/WebComponentInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/WebComponentInterfaces.js")); +__export(__webpack_require__(/*! ./SharedApiExternalContract */ "../api-external-contract-js/lib/src/SharedApiExternalContract.js")); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js": +/*!****************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js ***! + \****************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +// This file re-exports everything which is part of the extensions api public interface +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Tableau_1 = __webpack_require__(/*! ./ExternalContract/Extensions/Namespaces/Tableau */ "../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js"); +exports.ErrorCodes = Tableau_1.ErrorCodes; +exports.ExtensionContext = Tableau_1.ExtensionContext; +exports.ExtensionMode = Tableau_1.ExtensionMode; +exports.TableauEventType = Tableau_1.TableauEventType; +exports.VizImageEncodingType = Tableau_1.VizImageEncodingType; +exports.VizImagePaletteType = Tableau_1.VizImagePaletteType; +exports.VizImageSizeSettingAlignmentType = Tableau_1.VizImageSizeSettingAlignmentType; +exports.VizImageSizeSettingType = Tableau_1.VizImageSizeSettingType; +exports.VizImageSortDirectionType = Tableau_1.VizImageSortDirectionType; +__export(__webpack_require__(/*! ./SharedApiExternalContract */ "../api-external-contract-js/lib/src/SharedApiExternalContract.js")); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract.js": +/*!***************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +/** + * This is your main. This is where you re-export everything you want to be publicly available. + * + * The build enforces that the file has the same name as the global variable that is exported. + */ +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +__export(__webpack_require__(/*! ./EmbeddingApiExternalContract */ "../api-external-contract-js/lib/src/EmbeddingApiExternalContract.js")); +__export(__webpack_require__(/*! ./ExtensionsApiExternalContract */ "../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js")); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/AskDataInterfaces.js": +/*!*******************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/AskDataInterfaces.js ***! + \*******************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * The names of the string constants you can use as HTML attributes for the web component. + * @ignore + * @deprecated + */ +var AskDataAttributes; +(function (AskDataAttributes) { + AskDataAttributes["Origin"] = "origin"; + AskDataAttributes["ShowEmbed"] = "show-embed"; + AskDataAttributes["ShowPin"] = "show-pin"; + AskDataAttributes["ShowSave"] = "show-save"; + AskDataAttributes["ShowShare"] = "show-share"; +})(AskDataAttributes = exports.AskDataAttributes || (exports.AskDataAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js": +/*!*******************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js ***! + \*******************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +// All enum values made available to Embedding developers. +// Enums should be kept in alphabetical order. +// Most of them should match an enum on the server defined at +// workgroup/vqlweb/scriptsharp/src/ApiShared/PublicEnums.cs#L398:17 +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Crosstab file formats available to use with {@link Viz.exportCrosstabAsync} + */ +var CrosstabFileFormat; +(function (CrosstabFileFormat) { + CrosstabFileFormat["CSV"] = "csv"; + CrosstabFileFormat["Excel"] = "xlsx"; +})(CrosstabFileFormat = exports.CrosstabFileFormat || (exports.CrosstabFileFormat = {})); +/** + * Device types available to use with {@link Viz.device} + */ +var DeviceType; +(function (DeviceType) { + DeviceType["Default"] = "default"; + DeviceType["Desktop"] = "desktop"; + DeviceType["Tablet"] = "tablet"; + DeviceType["Phone"] = "phone"; +})(DeviceType = exports.DeviceType || (exports.DeviceType = {})); +/** + * All error codes used by the Embedding API. + */ +var EmbeddingErrorCodes; +(function (EmbeddingErrorCodes) { + /** + * Raised when a request to the auth endpoint fails. + */ + EmbeddingErrorCodes["AuthFailed"] = "auth-failed"; + /** + * The browser is not capable of supporting the Tableau Embedding API + */ + EmbeddingErrorCodes["BrowserNotCapable"] = "browser-not-capable"; + /** + * The permissions on a workbook or a view do not allow downloading the workbook. + */ + EmbeddingErrorCodes["DownloadWorkbookNotAllowed"] = "download-workbook-not-allowed"; + /** + * Thrown when an error occurs while attempting to perform a filter operation. + */ + EmbeddingErrorCodes["FilterCannotBePerformed"] = "filter-cannot-be-performed"; + /** + * Thrown when attempting to switch to a sheet by index that does not exist in the workbook. + */ + EmbeddingErrorCodes["IndexOutOfRange"] = "index-out-of-range"; + /** + * Thrown when an error occurs within the Tableau Embedding API. Contact Tableau Support. + */ + EmbeddingErrorCodes["InternalError"] = "internal-error"; + /** + * An operation was attempted on a custom view that does not exist. + */ + EmbeddingErrorCodes["InvalidCustomViewName"] = "invalid-custom-view-name"; + /** + * An invalid date was specified in a method that required a date parameter. + */ + EmbeddingErrorCodes["InvalidDateParameter"] = "invalid-date-parameter"; + /** + * Either a filter operation was attempted on a field that does not exist in the data source, or the value supplied + * in the filter operation is the wrong data type or format. + */ + EmbeddingErrorCodes["invalidFilterFieldNameOrValue"] = "invalid-filter-field-name"; + /** + * A parameter is not the correct data type or format. The name of the parameter is specified in the Error.message + * field. + */ + EmbeddingErrorCodes["InvalidParameter"] = "invalid-parameter"; + /** + * The currently applied time dimension could not be determined or is invalid. + */ + EmbeddingErrorCodes["InvalidTimeDimension"] = "invalid-time-dimension"; + /** + * A negative size was specified or the maxSize value is less than minSize in Sheet.changeSizeAsync(). + */ + EmbeddingErrorCodes["InvalidSize"] = "invalid-size"; + /** + * Attempted to get an authoring worksheet when the current sheet is not a worksheet. + * @ignore + */ + EmbeddingErrorCodes["InvalidSheetType"] = "invalid-sheet-type"; + /** + * A behavior value was found that is not included in the SheetSizeBehavior enum. + */ + EmbeddingErrorCodes["InvalidSizeBehavior"] = "invalid-size-behavior"; + /** + * A behavior other than SheetSizeBehavior.Automatic was specified in Sheet.changeSizeAsync() when the sheet is a + * Worksheet instance. + */ + EmbeddingErrorCodes["InvalidSizeBehaviorOnWorksheet"] = "invalid-size-behavior-on-worksheet"; + /** + * The URL specified in the Viz class constructor is not valid. + */ + EmbeddingErrorCodes["InvalidUrl"] = "invalid-url"; + /** + * The maxSize field is missing in Sheet.changeSizeAsync() when specifying SheetSizeBehavior.AtMost. + */ + EmbeddingErrorCodes["MissingMaxSize"] = "missing-max-size"; + /** + * The minSize field is missing in Sheet.changeSizeAsync() when specifying SheetSizeBehavior.AtLeast. + */ + EmbeddingErrorCodes["MissingMinSize"] = "missing-min-size"; + /** + * The minSize or maxSize field is missing in Sheet.changeSizeAsync() when specifying SheetSizeBehavior.Range. + */ + EmbeddingErrorCodes["MissingMinMaxSize"] = "missing-min-max-size"; + /** + * Can occur if the embedding app interacts with a parameter that has been removed from the worksheet. + */ + EmbeddingErrorCodes["MissingParameter"] = "missing-parameter"; + /** + * The rangeN field is missing for a relative date filter of type LASTN or NEXTN. + */ + EmbeddingErrorCodes["MissingRangeNForRelativeDateFilters"] = "missing-range-n-for-relative-date-filters"; + /** + * An attempt was made to access Sheet.getUrl() on a hidden sheet. Hidden sheets do not have URLs. + */ + EmbeddingErrorCodes["NoUrlForHiddenWorksheet"] = "no-url-for-hidden-worksheet"; + /** + * One or both of the parentElement or the URL parameters is not specified in the Viz constructor. + */ + EmbeddingErrorCodes["NoUrlOrParentElementNotFound"] = "no-url-or-parent-element-not-found"; + /** + * An operation was attempted on a sheet that is not active or embedded within the active dashboard. + */ + EmbeddingErrorCodes["NotActiveSheet"] = "not-active-sheet"; + /** + * A required parameter was not specified, null, or an empty string/array. + */ + EmbeddingErrorCodes["NullOrEmptyParameter"] = "null-or-empty-parameter"; + /** + * An operation was attempted on a sheet that does not exist in the workbook. + */ + EmbeddingErrorCodes["SheetNotInWorkbook"] = "sheet-not-in-workbook"; + /** + * An operation is performed on a CustomView object that is no longer valid (it has been removed). + */ + EmbeddingErrorCodes["StaleDataReference"] = "stale-data-reference"; + /** + * Unknown error triggered during the auth flow. + */ + EmbeddingErrorCodes["UnknownAuthError"] = "unknown-auth-error"; + /** + * An unknown event name was specified in the call to Viz.addEventListener or Viz.removeEventListener. + */ + EmbeddingErrorCodes["UnsupportedEventName"] = "unsupported-event-name"; + /** + * A Viz object has already been created as a child of the parentElement specified in the Viz constructor. + */ + EmbeddingErrorCodes["VizAlreadyInManager"] = "viz-already-in-manager"; + /** + * Function is not supported in the embedding api. + */ + EmbeddingErrorCodes["ImplementationError"] = "wrong-implementation"; + /** + * @NotImplemented + */ + EmbeddingErrorCodes["NotImplemented"] = "not-implemented"; + /** + * Unknown error during event initialization + */ + EmbeddingErrorCodes["EventInitializationError"] = "event-initialization-error"; + /** + * Version of the embedding api not supported by the version of tableau + */ + EmbeddingErrorCodes["IncompatibleVersionError"] = "incompatible-version-error"; + /** + * Unknown {@link TableauDialogType} passed in to Viz.displayDialogAsync. + */ + EmbeddingErrorCodes["UnknownDialogType"] = "unknown-dialog-type"; + /** + * Can occur if the API interacts with a filter that has been removed from the worksheet. + * Can also occurs if a {@link FilterType} has not been implemented. + */ + EmbeddingErrorCodes["FilterMissingOrNotImplemented"] = "filter-missing-not-implemented"; + /** + * Can occur if story point ids no longer match. + */ + EmbeddingErrorCodes["StoryPointIdMismatch"] = "storypoint-id-mismatch"; +})(EmbeddingErrorCodes = exports.EmbeddingErrorCodes || (exports.EmbeddingErrorCodes = {})); +/** + * Formats available to use with displayStaticImage in @VizInterfaces + */ +var FileFormats; +(function (FileFormats) { + FileFormats["PDF"] = "pdf"; + FileFormats["PNG"] = "png"; +})(FileFormats = exports.FileFormats || (exports.FileFormats = {})); +var PrintOrientation; +(function (PrintOrientation) { + PrintOrientation["Portrait"] = "portrait"; + PrintOrientation["Landscape"] = "landscape"; +})(PrintOrientation = exports.PrintOrientation || (exports.PrintOrientation = {})); +var PrintPageSize; +(function (PrintPageSize) { + PrintPageSize["Letter"] = "letter"; + PrintPageSize["Legal"] = "legal"; + PrintPageSize["Note"] = "note"; + PrintPageSize["Folio"] = "folio"; + PrintPageSize["Tabloid"] = "tabloid"; + PrintPageSize["Ledger"] = "ledger"; + PrintPageSize["Statement"] = "statement"; + PrintPageSize["Executive"] = "executive"; + PrintPageSize["A3"] = "A3"; + PrintPageSize["A4"] = "A4"; + PrintPageSize["A5"] = "A5"; + PrintPageSize["B4"] = "B4"; + PrintPageSize["B5"] = "B5"; + PrintPageSize["Quarto"] = "quarto"; + PrintPageSize["Unspecified"] = "unspecified"; +})(PrintPageSize = exports.PrintPageSize || (exports.PrintPageSize = {})); +var PrintScaling; +(function (PrintScaling) { + PrintScaling["Automatic"] = "automatic"; + PrintScaling["Perc25"] = "25%"; + PrintScaling["Perc50"] = "50%"; + PrintScaling["Perc60"] = "60%"; + PrintScaling["Perc75"] = "75%"; + PrintScaling["Perc80"] = "80%"; + PrintScaling["Perc90"] = "90%"; + PrintScaling["Perc100"] = "100%"; + PrintScaling["Perc200"] = "200%"; + PrintScaling["Perc400"] = "400%"; + PrintScaling["AtMost1PageHigh"] = "at-most-1-page-high"; + PrintScaling["AtMost2PagesHigh"] = "at-most-2-pages-high"; + PrintScaling["AtMost1PageWide"] = "at-most-1-page-wide"; + PrintScaling["AtMost2PagesWide"] = "at-most-2-pages-wide"; +})(PrintScaling = exports.PrintScaling || (exports.PrintScaling = {})); +var RevertVizSelection; +(function (RevertVizSelection) { + RevertVizSelection["All"] = "all"; + RevertVizSelection["Axes"] = "axes"; + RevertVizSelection["Filters"] = "filters"; + RevertVizSelection["Sorts"] = "sorts"; + RevertVizSelection["Shelves"] = "shelves"; +})(RevertVizSelection = exports.RevertVizSelection || (exports.RevertVizSelection = {})); +var ToolbarButtons; +(function (ToolbarButtons) { + ToolbarButtons["Alerts"] = "alerts"; + ToolbarButtons["AskData"] = "askData"; + ToolbarButtons["CustomViews"] = "customViews"; + ToolbarButtons["DataDetails"] = "dataDetails"; + ToolbarButtons["Share"] = "share"; + ToolbarButtons["Subscribe"] = "subscribe"; +})(ToolbarButtons = exports.ToolbarButtons || (exports.ToolbarButtons = {})); +var Toolbar; +(function (Toolbar) { + Toolbar["Top"] = "top"; + Toolbar["Bottom"] = "bottom"; + Toolbar["Hidden"] = "hidden"; +})(Toolbar = exports.Toolbar || (exports.Toolbar = {})); +var SheetSizeBehavior; +(function (SheetSizeBehavior) { + SheetSizeBehavior["Automatic"] = "automatic"; + SheetSizeBehavior["Exactly"] = "exactly"; + SheetSizeBehavior["Range"] = "range"; + SheetSizeBehavior["AtLeast"] = "atleast"; + SheetSizeBehavior["AtMost"] = "atmost"; +})(SheetSizeBehavior = exports.SheetSizeBehavior || (exports.SheetSizeBehavior = {})); +var PulseLayout; +(function (PulseLayout) { + PulseLayout["Default"] = "default"; + PulseLayout["Card"] = "card"; + PulseLayout["Ban"] = "ban"; +})(PulseLayout = exports.PulseLayout || (exports.PulseLayout = {})); +var PulseTimeDimension; +(function (PulseTimeDimension) { + PulseTimeDimension["Today"] = "Today"; + PulseTimeDimension["Yesterday"] = "Yesterday"; + PulseTimeDimension["WeekToDate"] = "WeekToDate"; + PulseTimeDimension["LastWeek"] = "LastWeek"; + PulseTimeDimension["MonthToDate"] = "MonthToDate"; + PulseTimeDimension["LastMonth"] = "LastMonth"; + PulseTimeDimension["QuarterToDate"] = "QuarterToDate"; + PulseTimeDimension["LastQuarter"] = "LastQuarter"; + PulseTimeDimension["YearToDate"] = "YearToDate"; + PulseTimeDimension["LastYear"] = "LastYear"; +})(PulseTimeDimension = exports.PulseTimeDimension || (exports.PulseTimeDimension = {})); +var PulseErrorMessageVisibility; +(function (PulseErrorMessageVisibility) { + PulseErrorMessageVisibility["Visible"] = "visible"; + PulseErrorMessageVisibility["Hidden"] = "hidden"; + PulseErrorMessageVisibility["Suppressed"] = "suppressed"; +})(PulseErrorMessageVisibility = exports.PulseErrorMessageVisibility || (exports.PulseErrorMessageVisibility = {})); +/** + * Be careful when adding new event types. Extensions and embedding follow two different patterns on how events are named. + * Events should be all lower case and without hyphens or underscores. + */ +/** + * Represents the type of tableau embedding event that can be listened for. + */ +var TableauEventType; +(function (TableauEventType) { + /** + * Raised when a custom view has finished loading. This event is raised after the callback function for {@link FirstInteractive} (if any) has been called. + * + * @category Viewing + */ + TableauEventType["CustomViewLoaded"] = "customviewloaded"; + /** + * Raised when a custom view has been removed. + * + * @category Viewing + */ + TableauEventType["CustomViewRemoved"] = "customviewremoved"; + /** + * Raised when a custom view has been saved (newly created or updated). + * + * @category Viewing + */ + TableauEventType["CustomViewSaved"] = "customviewsaved"; + /** + * Raised when a custom view has been set as the default view for a workbook. + * + * @category Viewing + */ + TableauEventType["CustomViewSetDefault"] = "customviewsetdefault"; + /** Raised when the user clicks on the Edit Button. + * + * @category Viewing + */ + TableauEventType["EditButtonClicked"] = "editbuttonclicked"; + /** Raised when the user clicks on the Edit In Desktop Button. + * + * @category Authoring, Viewing + */ + TableauEventType["EditInDesktopButtonClicked"] = "editindesktopbuttonclicked"; + /** Raised when any filter has changed state. You can use this event type with TableauViz objects. + * + * @category Viewing + */ + TableauEventType["FilterChanged"] = "filterchanged"; + /** Fired when viz size is known + * + * @category Authoring, Viewing + */ + TableauEventType["FirstVizSizeKnown"] = "firstvizsizeknown"; + /** Fired when a viz first becomes interactive + * + * @category Authoring, Viewing, Pulse + */ + TableauEventType["FirstInteractive"] = "firstinteractive"; + /** Raised when a custom mark context menu is clicked. + * + * @category Viewing + */ + TableauEventType["CustomMarkContextMenuEvent"] = "custommarkcontextmenu"; + /** The selected marks on a visualization have changed. You can use this event type with TableauViz objects. + * + * @category Viewing + */ + TableauEventType["MarkSelectionChanged"] = "markselectionchanged"; + /** A parameter has had its value modified. You can use this event type with [[Parameter]] objects. + * + * @category Viewing + */ + TableauEventType["ParameterChanged"] = "parameterchanged"; + /** Raised when a toolbar button or control becomes available or becomes unavailable. + * + * @category Viewing + */ + TableauEventType["ToolbarStateChanged"] = "toolbarstatechanged"; + /** Raised when the workbook is ready to close. This notification is sent when using embedded web authoring functionality. + * + * @category Authoring + */ + TableauEventType["WorkbookReadyToClose"] = "workbookreadytoclose"; + /** Raised when the workbook has been published. This notification is sent when using embedded web authoring functionality. + * + * @category Authoring + */ + TableauEventType["WorkbookPublished"] = "workbookpublished"; + /** Raised when "publish as" is successful. This notification is sent when using embedded web authoring functionality. + * + * @category Authoring + */ + TableauEventType["WorkbookPublishedAs"] = "workbookpublishedas"; + /** + * Raised when a URL action occurs. See the {@link UrlActionEvent} class. + * + * @category Viewing + */ + TableauEventType["UrlAction"] = "urlaction"; + /** + * Raised after a tab switch occurs (the active sheet has changed). Guarantees the viz object will be interactive after this. + * + * @category Viewing + */ + TableauEventType["TabSwitched"] = "tabswitched"; + /** + * + * Raised after a new story point becomes active. + * + * @category Viewing + */ + TableauEventType["StoryPointSwitched"] = "storypointswitched"; + /** + * + * Raised when an error occurs while loading the contents of the webcomponent. + * + * @category Authoring, Viewing, AskData + */ + TableauEventType["VizLoadError"] = "vizloaderror"; + /** + * Raised after the iframe src attribute has been updated + * + * @category Authoring, Viewing, AskData + */ + TableauEventType["IframeSrcUpdated"] = "iframesrcupdated"; + /** + * Raised when changes are made to summary data. + * + * @category Viewing + */ + TableauEventType["SummaryDataChanged"] = "summarydatachanged"; + /** + * Raised when tableau (viz-client) is ready to receive an auth token. + * Used for authentication in salesforce native mode. + * + * @hidden + * @category Authoring, Viewing, + */ + TableauEventType["ReadyToReceiveAuthToken"] = "readytoreceiveauthtoken"; + /** + * Fired when the Pulse metric size is known + * + * @category Pulse + */ + TableauEventType["FirstPulseMetricSizeKnown"] = "firstpulsemetricsizeknown"; + /** + * Fired when an internal Pulse error is encountered. + * + * @category Pulse + */ + TableauEventType["PulseError"] = "pulseerror"; + /** + * Fired when the Pulse filters change + * + * @category Pulse + */ + TableauEventType["PulseFiltersChanged"] = "pulsefilterschanged"; + /** + * Fired when a Pulse insight is discovered + * + * @category Pulse + */ + TableauEventType["PulseInsightDiscovered"] = "pulseinsightdiscovered"; + /** + * Fired when the Pulse metric size changes + * + * @category Pulse + */ + TableauEventType["PulseMetricSizeChanged"] = "pulsemetricsizechanged"; + /** + * Fired when the Pulse metric time dimension changes + * + * @category Pulse + */ + TableauEventType["PulseTimeDimensionChanged"] = "pulsetimedimensionchanged"; + /** + * Fired when the Pulse URL changes + * + * @category Pulse + */ + TableauEventType["PulseUrlChanged"] = "pulseurlchanged"; +})(TableauEventType = exports.TableauEventType || (exports.TableauEventType = {})); +/** + * Represents the location of a context menu where users can add external menu items. + */ +var ApiMenuType; +(function (ApiMenuType) { + /** External menu item will be injected in ubertip dialog */ + ApiMenuType["Ubertip"] = "ubertip"; +})(ApiMenuType = exports.ApiMenuType || (exports.ApiMenuType = {})); +/** You can use this type with a {@link Viz} object. */ +var TableauDialogType; +(function (TableauDialogType) { + /** + * Used to display the download PDF dialog. + */ + TableauDialogType["ExportPDF"] = "export-pdf"; + /** + * Used to display the download PowerPoint dialog. + */ + TableauDialogType["ExportPowerPoint"] = "export-powerpoint"; + /** + * Used to display the download Data dialog. + */ + TableauDialogType["ExportData"] = "export-data"; + /** + * Used to display the download CrossTab dialog. + */ + TableauDialogType["ExportCrossTab"] = "export-cross-tab"; + /** + * Used to display the download Workbook dialog. + */ + TableauDialogType["ExportWorkbook"] = "export-workbook"; + /** + * Used to display the Share dialog. + */ + TableauDialogType["Share"] = "share"; +})(TableauDialogType = exports.TableauDialogType || (exports.TableauDialogType = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/PulseInterfaces.js": +/*!*****************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/PulseInterfaces.js ***! + \*****************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * The names of the string constants you can use as HTML attributes for the web component. + * @ignore + */ +var PulseAttributes; +(function (PulseAttributes) { + PulseAttributes["DisableExploreFilter"] = "disable-explore-filter"; + PulseAttributes["Layout"] = "layout"; + PulseAttributes["OnFirstInteractive"] = "onFirstInteractive"; + PulseAttributes["OnFirstPulseMetricSizeKnown"] = "onFirstPulseMetricSizeKnown"; + PulseAttributes["OnPulseUrlError"] = "onPulseError"; + PulseAttributes["OnPulseFiltersChanged"] = "onPulseFiltersChanged"; + PulseAttributes["OnPulseInsightDiscovered"] = "onPulseInsightDiscovered"; + PulseAttributes["OnPulseMetricSizeChanged"] = "onPulseMetricSizeChanged"; + PulseAttributes["OnPulseTimeDimensionChanged"] = "onPulseTimeDimensionChanged"; + PulseAttributes["OnPulseUrlChanged"] = "onPulseUrlChanged"; + PulseAttributes["TimeDimension"] = "time-dimension"; + PulseAttributes["TokenOptional"] = "token-optional"; +})(PulseAttributes = exports.PulseAttributes || (exports.PulseAttributes = {})); +/** + * The names of the string constants you can use as child tags for TableauPulse custom element. + */ +var PulseChildElements; +(function (PulseChildElements) { + /** + * Custom styles applicable to the embedded iframe element itself (not inside it). + */ + PulseChildElements["IframeStyle"] = "iframe-style"; + /** + * A parameter to be used in the Pulse theme. + */ + PulseChildElements["ThemeParameter"] = "theme-parameter"; + /** + * Contains a list of filter parameters. + */ + PulseChildElements["PulseFilter"] = "pulse-filter"; +})(PulseChildElements = exports.PulseChildElements || (exports.PulseChildElements = {})); +/** + * The attributes of the child elements of . + */ +var PulseChildElementAttributes; +(function (PulseChildElementAttributes) { + PulseChildElementAttributes["Name"] = "name"; + PulseChildElementAttributes["Field"] = "field"; + PulseChildElementAttributes["Value"] = "value"; + PulseChildElementAttributes["Type"] = "type"; +})(PulseChildElementAttributes = exports.PulseChildElementAttributes || (exports.PulseChildElementAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js": +/*!***************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js ***! + \***************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * The shared string constants you can use as HTML attributes for the and web component. + * @ignore + */ +var VizSharedAttributes; +(function (VizSharedAttributes) { + VizSharedAttributes["TouchOptimize"] = "touch-optimize"; + VizSharedAttributes["HideEditInDesktopButton"] = "hide-edit-in-desktop-button"; + VizSharedAttributes["SuppressDefaultEditBehavior"] = "suppress-default-edit-behavior"; + VizSharedAttributes["DisableVersionCheck"] = "disable-version-check"; + VizSharedAttributes["OnEditInDesktopButtonClicked"] = "onEditInDesktopButtonClicked"; + VizSharedAttributes["OnFirstVizSizeKnown"] = "onFirstVizSizeKnown"; + VizSharedAttributes["OnFirstInteractive"] = "onFirstInteractive"; +})(VizSharedAttributes = exports.VizSharedAttributes || (exports.VizSharedAttributes = {})); +/** + * The names of the string constants you can use as HTML attributes for the web component. + * @ignore + */ +var VizAttributes; +(function (VizAttributes) { + VizAttributes["DisableUrlActionsPopups"] = "disable-url-actions"; + VizAttributes["HideTabs"] = "hide-tabs"; + VizAttributes["Toolbar"] = "toolbar"; + VizAttributes["InstanceIdToClone"] = "instance-id-to-clone"; + VizAttributes["Device"] = "device"; + VizAttributes["HideEditButton"] = "hide-edit-button"; + VizAttributes["OnEditButtonClicked"] = "onEditButtonClicked"; + VizAttributes["OnFilterChanged"] = "onFilterChanged"; + VizAttributes["OnCustomMarkContextMenuEvent"] = "onCustomMarkContextMenuEvent"; + VizAttributes["OnMarkSelectionChanged"] = "onMarkSelectionChanged"; + VizAttributes["OnParameterChanged"] = "onParameterChanged"; + VizAttributes["OnToolbarStateChanged"] = "onToolbarStateChanged"; + VizAttributes["OnUrlAction"] = "onUrlAction"; + VizAttributes["OnTabSwitched"] = "onTabSwitched"; + VizAttributes["OnCustomViewLoaded"] = "onCustomViewLoaded"; + VizAttributes["OnCustomViewRemoved"] = "onCustomViewRemoved"; + VizAttributes["OnCustomViewSaved"] = "onCustomViewSaved"; + VizAttributes["OnCustomViewSetDefault"] = "onCustomViewSetDefault"; + VizAttributes["OnStoryPointSwitched"] = "onStoryPointSwitched"; + VizAttributes["OnSummaryDataChanged"] = "onSummaryDataChanged"; + VizAttributes["OnReadyToReceiveAuthToken"] = "onReadyToReceiveAuthToken"; +})(VizAttributes = exports.VizAttributes || (exports.VizAttributes = {})); +/** + * The names of the string constants you can use as HTML attributes for the web component. + * @ignore + */ +var VizAuthoringAttributes; +(function (VizAuthoringAttributes) { + VizAuthoringAttributes["OnWorkbookPublished"] = "onWorkbookPublished"; + VizAuthoringAttributes["OnWorkbookPublishedAs"] = "onWorkbookPublishedAs"; + VizAuthoringAttributes["OnWorkbookReadyToClose"] = "onWorkbookReadyToClose"; + VizAuthoringAttributes["HideCloseButton"] = "hide-close-button"; +})(VizAuthoringAttributes = exports.VizAuthoringAttributes || (exports.VizAuthoringAttributes = {})); +/** + * The names of the string constants you can use as child tags for TableauViz and TableauAuthoringViz custom elements. + */ +var VizChildElements; +(function (VizChildElements) { + /** + * Contains a list of filter parameters. Available only in viewing mode. + */ + VizChildElements["VizFilter"] = "viz-filter"; + /** + * Contains a name and value for a parameter. Available only in viewing mode. + */ + VizChildElements["VizParameter"] = "viz-parameter"; + /** + * Contains a list of custom parameters. Available in both viewing and authoring modes. + */ + VizChildElements["CustomParameter"] = "custom-parameter"; + /** + * Custom styles applicable to the embedded iframe element itself (not inside it). Available in both viewing and authoring modes. + */ + VizChildElements["IframeStyle"] = "iframe-style"; +})(VizChildElements = exports.VizChildElements || (exports.VizChildElements = {})); +var VizChildElementAttributes; +(function (VizChildElementAttributes) { + VizChildElementAttributes["Field"] = "field"; + VizChildElementAttributes["Value"] = "value"; + VizChildElementAttributes["Name"] = "name"; +})(VizChildElementAttributes = exports.VizChildElementAttributes || (exports.VizChildElementAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/WebComponentInterfaces.js": +/*!************************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/WebComponentInterfaces.js ***! + \************************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * The names of the common string constants you can use as HTML attributes for the tableau web component. + * @ignore + */ +var WebComponentAttributes; +(function (WebComponentAttributes) { + WebComponentAttributes["Src"] = "src"; + WebComponentAttributes["Width"] = "width"; + WebComponentAttributes["Height"] = "height"; + WebComponentAttributes["Token"] = "token"; + WebComponentAttributes["Debug"] = "debug"; + WebComponentAttributes["IframeAuth"] = "iframe-auth"; + WebComponentAttributes["OnVizLoadError"] = "onvizloaderror"; + WebComponentAttributes["ForceTokenSync"] = "force-token-sync"; +})(WebComponentAttributes = exports.WebComponentAttributes || (exports.WebComponentAttributes = {})); +/** + * The names of the embedded iframe attributes whose values can be controlled. + * @ignore + */ +var EmbeddedIframeAttributes; +(function (EmbeddedIframeAttributes) { + EmbeddedIframeAttributes["Loading"] = "iframe-attr-loading"; + EmbeddedIframeAttributes["Style"] = "iframe-attr-style"; + EmbeddedIframeAttributes["Class"] = "iframe-attr-class"; +})(EmbeddedIframeAttributes = exports.EmbeddedIframeAttributes || (exports.EmbeddedIframeAttributes = {})); +/** + * The names of the string constants you can use as child tags for TableauViz, TableauAuthoringViz and TableauAskData custom elements. + * @ignore + */ +var WebComponentChildElements; +(function (WebComponentChildElements) { + /** + * Contains a list of custom parameters. Available in viz viewing, viz authoring and askdata. + */ + WebComponentChildElements["CustomParameter"] = "custom-parameter"; + /** + * Custom styles applicable to the embedded iframe element itself (not inside it). + */ + WebComponentChildElements["IframeStyle"] = "iframe-style"; +})(WebComponentChildElements = exports.WebComponentChildElements || (exports.WebComponentChildElements = {})); +var WebComponentChildElementAttributes; +(function (WebComponentChildElementAttributes) { + WebComponentChildElementAttributes["Field"] = "field"; + WebComponentChildElementAttributes["Value"] = "value"; + WebComponentChildElementAttributes["Name"] = "name"; +})(WebComponentChildElementAttributes = exports.WebComponentChildElementAttributes || (exports.WebComponentChildElementAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js": +/*!*********************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js ***! + \*********************************************************************************************/ +/***/ ((module) => { + +"use strict"; + +// All enum values made available to Extensions developers. +// Enums should be kept in alphabetical order. +var Tableau; +(function (Tableau) { + /** + * All error codes used by the Extensions API. + */ + let ErrorCodes; + (function (ErrorCodes) { + /** + * Thrown when caller attempts to execute command before initialization has completed. + */ + ErrorCodes["APINotInitialized"] = "api-not-initialized"; + /** + * Thrown when caller attempts to execute command while extension is not visible. + */ + ErrorCodes["VisibilityError"] = "visibility-error"; + /** + * Only one dialog can be opened at time with the UI namespace functionality. + */ + ErrorCodes["DialogAlreadyOpen"] = "dialog-already-open"; + /** + * The open dialog was closed by the user. + */ + ErrorCodes["DialogClosedByUser"] = "dialog-closed-by-user"; + /** + * An error occurred within the Tableau Extensions API. Contact Tableau Support. + */ + ErrorCodes["InternalError"] = "internal-error"; + /** + * A dialog must start on the same domain as the parent extenion. + */ + ErrorCodes["InvalidDomainDialog"] = "invalid-dialog-domain"; + /** + * A parameter is not the correct data type or format. The name of the parameter is specified in the Error.message field. + */ + ErrorCodes["InvalidParameter"] = "invalid-parameter"; + /** + * Can occur if the extension interacts with a filter that has been removed from the worksheet. + */ + ErrorCodes["MissingFilter"] = "missing-filter"; + /** + * Can occur if the extension interacts with a parameter that has been removed from the worksheet. + */ + ErrorCodes["MissingParameter"] = "missing-parameter"; + /** + * Internal Server Error + */ + ErrorCodes["ServerError"] = "server-error"; + /** + * Developer cannot save settings while another save is still in progress. + */ + ErrorCodes["SettingSaveInProgress"] = "setting-save-in-progress"; + /** + * An unknown event name was specified in the call to `addEventListener` or `removeEventListener`. + */ + ErrorCodes["UnsupportedEventName"] = "unsupported-event-name"; + /** + * A method was used for a type of data source that doesn't support that method (see getActiveTablesAsync for an example) + */ + ErrorCodes["UnsupportedMethodForDataSourceType"] = "unsupported-method-for-data-source-type"; + })(ErrorCodes = Tableau.ErrorCodes || (Tableau.ErrorCodes = {})); + /** + * The context in which the Extensions is currently running. + */ + let ExtensionContext; + (function (ExtensionContext) { + ExtensionContext["Desktop"] = "desktop"; + ExtensionContext["Server"] = "server"; + ExtensionContext["Cloud"] = "cloud"; + ExtensionContext["PublicWeb"] = "public-web"; + ExtensionContext["PublicDesktop"] = "public-desktop"; + })(ExtensionContext = Tableau.ExtensionContext || (Tableau.ExtensionContext = {})); + /** + * The mode in which the Extensions is currently running. + */ + let ExtensionMode; + (function (ExtensionMode) { + ExtensionMode["Authoring"] = "authoring"; + ExtensionMode["Viewing"] = "viewing"; + })(ExtensionMode = Tableau.ExtensionMode || (Tableau.ExtensionMode = {})); + /** + * Represents the type of event that can be listened for. + */ + let TableauEventType; + (function (TableauEventType) { + /** + * @experimental + * Raised when a message is received that was sent by a dialog or extension via `sendDialogMessageAsync`.*/ + TableauEventType["DialogMessageReceived"] = "dialog-message-received"; + /** Raised when any filter has changed state. You can use this event type with [Worksheet](../interfaces/worksheet.html) objects.*/ + TableauEventType["FilterChanged"] = "filter-changed"; + /** The selected marks on a visualization has changed. + * You can use this event type with [Worksheet](../interfaces/worksheet.html) objects. */ + TableauEventType["MarkSelectionChanged"] = "mark-selection-changed"; + /** The summary data backing a worksheet has changed + * You can use this event type with [Worksheet](../interfaces/worksheet.html) objects.*/ + TableauEventType["SummaryDataChanged"] = "summary-data-changed"; + /** A parameter has had its value modified. You can use this event type with [[Parameter]] objects. */ + TableauEventType["ParameterChanged"] = "parameter-changed"; + /** Settings have been changed for this extension. You can use this event type with [[Settings]] objects. */ + TableauEventType["SettingsChanged"] = "settings-changed"; + /** The dashboard layout has changed + * @category Dashboard Extensions + */ + TableauEventType["DashboardLayoutChanged"] = "dashboard-layout-changed"; + /** The workbook formatting has changed + * @category Dashboard Extensions + */ + TableauEventType["WorkbookFormattingChanged"] = "workbook-formatting-changed"; + /** The worksheet formatting has changed + * @category Viz Extensions + */ + TableauEventType["WorksheetFormattingChanged"] = "worksheet-formatting-changed"; + })(TableauEventType = Tableau.TableauEventType || (Tableau.TableauEventType = {})); + /** + * Enum that represents the data type of encodings for createVizImageAsync. + * @since 1.6.0 + */ + let VizImageEncodingType; + (function (VizImageEncodingType) { + VizImageEncodingType["Discrete"] = "discrete"; + VizImageEncodingType["Continuous"] = "continuous"; + })(VizImageEncodingType = Tableau.VizImageEncodingType || (Tableau.VizImageEncodingType = {})); + /** + * Enum that represents the sort direction for createVizImageAsync. + * @since 1.8.0 and Tableau 2021.4 + */ + let VizImageSortDirectionType; + (function (VizImageSortDirectionType) { + VizImageSortDirectionType["Ascending"] = "ascending"; + VizImageSortDirectionType["Descending"] = "descending"; + })(VizImageSortDirectionType = Tableau.VizImageSortDirectionType || (Tableau.VizImageSortDirectionType = {})); + /** + * Enum that represents the palette type for createVizImageAsync. + * @since 1.8.0 and Tableau 2021.4 + */ + let VizImagePaletteType; + (function (VizImagePaletteType) { + VizImagePaletteType["CustomDiverging"] = "custom-diverging"; + VizImagePaletteType["CustomSequential"] = "custom-sequential"; + })(VizImagePaletteType = Tableau.VizImagePaletteType || (Tableau.VizImagePaletteType = {})); + /** + * Enum that represents the Size Setting type for createVizImageAsync. + * @since 1.8.0 and Tableau 2021.4 + */ + let VizImageSizeSettingType; + (function (VizImageSizeSettingType) { + VizImageSizeSettingType["Fixed"] = "fixed"; + VizImageSizeSettingType["Manual"] = "manual"; + })(VizImageSizeSettingType = Tableau.VizImageSizeSettingType || (Tableau.VizImageSizeSettingType = {})); + /** + * Enum that represents the Size Setting alignment type for createVizImageAsync. + * @since 1.8.0 and Tableau 2021.4 + */ + let VizImageSizeSettingAlignmentType; + (function (VizImageSizeSettingAlignmentType) { + VizImageSizeSettingAlignmentType["Right"] = "right"; + VizImageSizeSettingAlignmentType["Left"] = "left"; + VizImageSizeSettingAlignmentType["Center"] = "center"; + })(VizImageSizeSettingAlignmentType = Tableau.VizImageSizeSettingAlignmentType || (Tableau.VizImageSizeSettingAlignmentType = {})); +})(Tableau || (Tableau = {})); +module.exports = Tableau; + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/Enums.js": +/*!****************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/Enums.js ***! + \****************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var SharedErrorCodes; +(function (SharedErrorCodes) { + /** + * A CSV or Excel file failed to be created in Viz.exportCrosstabAsync(). + */ + SharedErrorCodes["CrosstabCreationError"] = "crosstab-creation-error"; + /** + * A CSV file failed to be created in Viz.exportDataAsync(). + */ + SharedErrorCodes["DataCreationError"] = "data-creation-error"; + /** + * An invalid aggregation was specified for the filter, such as setting a range filter to "SUM(Sales)" instead of + * "Sales". + */ + SharedErrorCodes["InvalidAggregationFieldName"] = "invalid-aggregation-field-name"; + /** + * A filter operation was attempted on a field that does not exist in the data source. + */ + SharedErrorCodes["InvalidFilterFieldName"] = "invalid-filter-name"; + /** + * A filter operation was attempted using a value that is the wrong data type or format. + */ + SharedErrorCodes["InvalidFilterFieldValue"] = "invalid-filter-fieldValue"; + /** + * An invalid date value was specified in a Sheet.selectMarksAsync() call for a date field. + */ + SharedErrorCodes["InvalidSelectionDate"] = "invalid-selection-date"; + /** + * A field was specified in a Sheet.selectMarksAsync() call that does not exist in the data source. + */ + SharedErrorCodes["InvalidSelectionFieldName"] = "invalid-selection-fieldName"; + /** + * An invalid value was specified in a Sheet.selectMarksAsync() call. + */ + SharedErrorCodes["InvalidSelectionValue"] = "invalid-selection-value"; + /** + * A parameter did not include a valid sheet selection for exporting. + */ + SharedErrorCodes["InvalidSelectionSheet"] = "invalid-selection-sheet"; + /** + * An error occurred within the Tableau API. Contact Tableau Support. + */ + SharedErrorCodes["InternalError"] = "internal-error"; + /** + * A parameter is not the correct data type or format. The name of the parameter is specified in the Error.message field. + */ + SharedErrorCodes["InvalidParameter"] = "invalid-parameter"; + /** + * A PDF file failed to be created in Viz.exportPDFAsync(). + */ + SharedErrorCodes["PDFCreationError"] = "pdf-creation-error"; + /** + * A PowerPoint file failed to be created in Viz.exportPowerPointAsync(). + */ + SharedErrorCodes["PowerPointCreationError"] = "powerpoint-creation-error"; + /** + * An operation was attempted on a sheet that is not active or embedded within the active dashboard. + */ + SharedErrorCodes["NotActiveSheet"] = "not-active-sheet"; + /** + * Property or Function is not supported within the Tableau API. + */ + SharedErrorCodes["ImplementationError"] = "wrong-implementation"; + /** + * Can occur when two incompatible calls are triggered together. + */ + SharedErrorCodes["ApiExecutionError"] = "api-execution-error"; + /** + * A general-purpose server error occurred. Details are contained in the Error object. + */ + SharedErrorCodes["ServerError"] = "server-error"; + /** + * Can occur when an api call times out. + */ + SharedErrorCodes["Timeout"] = "timeout"; +})(SharedErrorCodes = exports.SharedErrorCodes || (exports.SharedErrorCodes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js": +/*!*****************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js ***! + \*****************************************************************************************/ +/***/ ((module) => { + +"use strict"; + +/** + * The tableau namespace exists for organization and to avoid polluting + * the global namespace. It contains no constructs other than sub-namespaces and the Tableau enumerations. + */ +var Tableau; +(function (Tableau) { + let AnalyticsObjectType; + (function (AnalyticsObjectType) { + AnalyticsObjectType["Cluster"] = "cluster"; + AnalyticsObjectType["Forecast"] = "forecast"; + AnalyticsObjectType["TrendLine"] = "trend-line"; + })(AnalyticsObjectType = Tableau.AnalyticsObjectType || (Tableau.AnalyticsObjectType = {})); + let AnnotationType; + (function (AnnotationType) { + AnnotationType["Mark"] = "mark"; + AnnotationType["Point"] = "point"; + AnnotationType["Area"] = "area"; + })(AnnotationType = Tableau.AnnotationType || (Tableau.AnnotationType = {})); + let ColumnType; + (function (ColumnType) { + ColumnType["Discrete"] = "discrete"; + ColumnType["Continuous"] = "continuous"; + ColumnType["Unknown"] = "unknown"; + })(ColumnType = Tableau.ColumnType || (Tableau.ColumnType = {})); + let ClassNameKey; + (function (ClassNameKey) { + ClassNameKey["WorksheetTitle"] = "tableau-worksheet-title"; + ClassNameKey["Worksheet"] = "tableau-worksheet"; + ClassNameKey["Tooltip"] = "tableau-tooltip"; + ClassNameKey["StoryTitle"] = "tableau-story-title"; + ClassNameKey["DashboardTitle"] = "tableau-dashboard-title"; + ClassNameKey["Pane"] = "tableau-pane"; + ClassNameKey["RowDividers"] = "tableau-row-dividers"; + ClassNameKey["ColumnDividers"] = "tableau-column-dividers"; + })(ClassNameKey = Tableau.ClassNameKey || (Tableau.ClassNameKey = {})); + /** + * What the object represents in a dashboard. + */ + let DashboardObjectType; + (function (DashboardObjectType) { + DashboardObjectType["Blank"] = "blank"; + DashboardObjectType["Worksheet"] = "worksheet"; + DashboardObjectType["QuickFilter"] = "quick-filter"; + DashboardObjectType["ParameterControl"] = "parameter-control"; + DashboardObjectType["PageFilter"] = "page-filter"; + DashboardObjectType["Legend"] = "legend"; + DashboardObjectType["Title"] = "title"; + DashboardObjectType["Text"] = "text"; + DashboardObjectType["Image"] = "image"; + DashboardObjectType["WebPage"] = "web-page"; + DashboardObjectType["Extension"] = "extension"; + })(DashboardObjectType = Tableau.DashboardObjectType || (Tableau.DashboardObjectType = {})); + /** + * Enum that represents the visibility state of a dashboard object. + * @since 1.7.0 + */ + let DashboardObjectVisibilityType; + (function (DashboardObjectVisibilityType) { + /** Used for turning on the visibility of a dashboard object.*/ + DashboardObjectVisibilityType["Show"] = "show"; + /** Used for turning off the visibility of a dashboard object.*/ + DashboardObjectVisibilityType["Hide"] = "hide"; + })(DashboardObjectVisibilityType = Tableau.DashboardObjectVisibilityType || (Tableau.DashboardObjectVisibilityType = {})); + /** + * The different types of data a value can have + */ + let DataType; + (function (DataType) { + DataType["String"] = "string"; + DataType["Int"] = "int"; + DataType["Float"] = "float"; + DataType["Bool"] = "bool"; + DataType["Date"] = "date"; + DataType["DateTime"] = "date-time"; + DataType["Spatial"] = "spatial"; + DataType["Unknown"] = "unknown"; + })(DataType = Tableau.DataType || (Tableau.DataType = {})); + /** + * Enum that represents the changes that occur to a dashboard object. + */ + let DashboardLayoutChange; + (function (DashboardLayoutChange) { + /** A dashboard object was added */ + DashboardLayoutChange["Added"] = "added"; + /** A dashboard object was removed */ + DashboardLayoutChange["Removed"] = "removed"; + /** A dashboard object's floating state changed */ + DashboardLayoutChange["IsFloatingChanged"] = "is-floating-changed"; + /** A dashboard object's visibility changed */ + DashboardLayoutChange["IsVisibleChanged"] = "is-visible-changed"; + /** A dashboard object's position changed */ + DashboardLayoutChange["PositionChanged"] = "position-changed"; + /** A dashboard object's size changed */ + DashboardLayoutChange["SizeChanged"] = "size-changed"; + /** A dashboard object was renamed */ + DashboardLayoutChange["NameChanged"] = "name-changed"; + /** A dashboard object is selected */ + DashboardLayoutChange["Selected"] = "selected"; + /** A dashboard object is deselected */ + DashboardLayoutChange["Deselected"] = "deselected"; + /** Navigate to another dashboard */ + DashboardLayoutChange["DashboardChanged"] = "dashboard-changed"; + })(DashboardLayoutChange = Tableau.DashboardLayoutChange || (Tableau.DashboardLayoutChange = {})); + /** + * Valid date ranges for a relative date filter. + */ + let DateRangeType; + (function (DateRangeType) { + DateRangeType["Last"] = "last"; + DateRangeType["LastN"] = "last-n"; + DateRangeType["Next"] = "next"; + DateRangeType["NextN"] = "next-n"; + DateRangeType["Current"] = "current"; + DateRangeType["ToDate"] = "to-date"; + })(DateRangeType = Tableau.DateRangeType || (Tableau.DateRangeType = {})); + /** + * Enum that represents the types of dialog popup styles. + */ + let DialogStyle; + (function (DialogStyle) { + DialogStyle["Window"] = "window"; + DialogStyle["Modal"] = "modal"; + DialogStyle["Modeless"] = "modeless"; + })(DialogStyle = Tableau.DialogStyle || (Tableau.DialogStyle = {})); + let EncodingType; + (function (EncodingType) { + EncodingType["Column"] = "column"; + EncodingType["Row"] = "row"; + EncodingType["Page"] = "page"; + EncodingType["Filter"] = "filter"; + EncodingType["MarksType"] = "marks-type"; + EncodingType["MeasureValues"] = "measure-values"; + EncodingType["Color"] = "color"; + EncodingType["Size"] = "size"; + EncodingType["Label"] = "label"; + EncodingType["Detail"] = "detail"; + EncodingType["Tooltip"] = "tooltip"; + EncodingType["Shape"] = "shape"; + EncodingType["Path"] = "path"; + EncodingType["Angle"] = "angle"; + EncodingType["Geometry"] = "geometry"; + EncodingType["Custom"] = "custom"; + })(EncodingType = Tableau.EncodingType || (Tableau.EncodingType = {})); + /** + * Type of aggregation on a field. + */ + let FieldAggregationType; + (function (FieldAggregationType) { + FieldAggregationType["Sum"] = "sum"; + FieldAggregationType["Avg"] = "avg"; + FieldAggregationType["Min"] = "min"; + FieldAggregationType["Max"] = "max"; + FieldAggregationType["Stdev"] = "stdev"; + FieldAggregationType["Stdevp"] = "stdevp"; + FieldAggregationType["Var"] = "var"; + FieldAggregationType["Varp"] = "varp"; + FieldAggregationType["Collect"] = "collect"; + FieldAggregationType["Count"] = "count"; + FieldAggregationType["Countd"] = "countd"; + FieldAggregationType["Median"] = "median"; + FieldAggregationType["Attr"] = "attr"; + FieldAggregationType["None"] = "none"; + FieldAggregationType["Year"] = "year"; + FieldAggregationType["Qtr"] = "qtr"; + FieldAggregationType["Month"] = "month"; + FieldAggregationType["Day"] = "day"; + FieldAggregationType["Hour"] = "hour"; + FieldAggregationType["Minute"] = "minute"; + FieldAggregationType["Second"] = "second"; + FieldAggregationType["Week"] = "week"; + FieldAggregationType["Weekday"] = "weekday"; + FieldAggregationType["MonthYear"] = "month-year"; + FieldAggregationType["Mdy"] = "mdy"; + FieldAggregationType["End"] = "end"; + FieldAggregationType["TruncYear"] = "trunc-year"; + FieldAggregationType["TruncQtr"] = "trunc-qtr"; + FieldAggregationType["TruncMonth"] = "trunc-month"; + FieldAggregationType["TruncWeek"] = "trunc-week"; + FieldAggregationType["TruncDay"] = "trunc-day"; + FieldAggregationType["TruncHour"] = "trunc-hour"; + FieldAggregationType["TruncMinute"] = "trunc-minute"; + FieldAggregationType["TruncSecond"] = "trunc-second"; + FieldAggregationType["Quart1"] = "quart1"; + FieldAggregationType["Quart3"] = "quart3"; + FieldAggregationType["Skewness"] = "skewness"; + FieldAggregationType["Kurtosis"] = "kurtosis"; + FieldAggregationType["InOut"] = "in-out"; + FieldAggregationType["User"] = "user"; + })(FieldAggregationType = Tableau.FieldAggregationType || (Tableau.FieldAggregationType = {})); + /** + * Role of a field. + */ + let FieldRoleType; + (function (FieldRoleType) { + FieldRoleType["Dimension"] = "dimension"; + FieldRoleType["Measure"] = "measure"; + FieldRoleType["Unknown"] = "unknown"; + })(FieldRoleType = Tableau.FieldRoleType || (Tableau.FieldRoleType = {})); + /** + * An enumeration of the valid types of filters that can be applied. + */ + let FilterType; + (function (FilterType) { + FilterType["Categorical"] = "categorical"; + FilterType["Range"] = "range"; + FilterType["Hierarchical"] = "hierarchical"; + FilterType["RelativeDate"] = "relative-date"; + })(FilterType = Tableau.FilterType || (Tableau.FilterType = {})); + /** + * The different update types for applying filter + */ + let FilterUpdateType; + (function (FilterUpdateType) { + FilterUpdateType["Add"] = "add"; + FilterUpdateType["All"] = "all"; + FilterUpdateType["Replace"] = "replace"; + FilterUpdateType["Remove"] = "remove"; + })(FilterUpdateType = Tableau.FilterUpdateType || (Tableau.FilterUpdateType = {})); + /** + * The domain type for a filter + */ + let FilterDomainType; + (function (FilterDomainType) { + /** + * The domain values that are relevant to the specified filter + * i.e. the domain is restricted by a previous filter + */ + FilterDomainType["Relevant"] = "relevant"; + /** + * list of all possible domain values from database + */ + FilterDomainType["Database"] = "database"; + })(FilterDomainType = Tableau.FilterDomainType || (Tableau.FilterDomainType = {})); + /** + * The option for specifying which values to include for filtering + * Indicates what to do with null values for a given filter or mark selection call. + */ + let FilterNullOption; + (function (FilterNullOption) { + FilterNullOption["NullValues"] = "null-values"; + FilterNullOption["NonNullValues"] = "non-null-values"; + FilterNullOption["AllValues"] = "all-values"; + })(FilterNullOption = Tableau.FilterNullOption || (Tableau.FilterNullOption = {})); + /** + * Enum that serves as a filter on the DataValues returned from `getSummaryDataReaderAsync`, + * `getUnderlyingTableDataReaderAsync` and `getLogicalTableDataReaderAsync`. + * This is an optimization of returned data values only. Tableau versions prior to 2021.2 + * will pass the data across and populate the DataValue properties. + * Please note that all properties not requested will be `undefined` in the DataValue results. + * @since 1.5.0 + */ + let IncludeDataValuesOption; + (function (IncludeDataValuesOption) { + /** DataValues will include all properties.*/ + IncludeDataValuesOption["AllValues"] = "all-values"; + /** DataValues will only include value and nativeValue properties.*/ + IncludeDataValuesOption["OnlyNativeValues"] = "only-native-values"; + /** DataValues will only include formattedValue properties. */ + IncludeDataValuesOption["OnlyFormattedValues"] = "only-formatted-values"; + })(IncludeDataValuesOption = Tableau.IncludeDataValuesOption || (Tableau.IncludeDataValuesOption = {})); + /** + * Type of mark for a given marks card in a viz. + */ + let MarkType; + (function (MarkType) { + MarkType["Bar"] = "bar"; + MarkType["Line"] = "line"; + MarkType["Area"] = "area"; + MarkType["Square"] = "square"; + MarkType["Circle"] = "circle"; + MarkType["Shape"] = "shape"; + MarkType["Text"] = "text"; + MarkType["Map"] = "map"; + MarkType["Pie"] = "pie"; + MarkType["GanttBar"] = "gantt-bar"; + MarkType["Polygon"] = "polygon"; + MarkType["Heatmap"] = "heatmap"; + MarkType["VizExtension"] = "viz-extension"; + })(MarkType = Tableau.MarkType || (Tableau.MarkType = {})); + /** + * An enumeration describing the different types of allowable values. + * This is used for restricting the domain of a parameter + */ + let ParameterValueType; + (function (ParameterValueType) { + ParameterValueType["All"] = "all"; + ParameterValueType["List"] = "list"; + ParameterValueType["Range"] = "range"; + })(ParameterValueType = Tableau.ParameterValueType || (Tableau.ParameterValueType = {})); + /** + * Date period used in filters and in parameters. + */ + let PeriodType; + (function (PeriodType) { + PeriodType["Years"] = "years"; + PeriodType["Quarters"] = "quarters"; + PeriodType["Months"] = "months"; + PeriodType["Weeks"] = "weeks"; + PeriodType["Days"] = "days"; + PeriodType["Hours"] = "hours"; + PeriodType["Minutes"] = "minutes"; + PeriodType["Seconds"] = "seconds"; + })(PeriodType = Tableau.PeriodType || (Tableau.PeriodType = {})); + let QuickTableCalcType; + (function (QuickTableCalcType) { + QuickTableCalcType["RunningTotal"] = "running-total"; + QuickTableCalcType["Difference"] = "difference"; + QuickTableCalcType["PercentDifference"] = "percent-difference"; + QuickTableCalcType["PercentOfTotal"] = "percent-of-total"; + QuickTableCalcType["Rank"] = "rank"; + QuickTableCalcType["Percentile"] = "percentile"; + QuickTableCalcType["MovingAverage"] = "moving-average"; + QuickTableCalcType["YTDTotal"] = "ytd-total"; + QuickTableCalcType["CompoundGrowthRate"] = "compound-growth-rate"; + QuickTableCalcType["YearOverYearGrowth"] = "year-over-year-growth"; + QuickTableCalcType["YTDGrowth"] = "ytd-growth"; + QuickTableCalcType["Undefined"] = "undefined"; + })(QuickTableCalcType = Tableau.QuickTableCalcType || (Tableau.QuickTableCalcType = {})); + /** + * Enum for specifying the selection type for select marks api. + */ + let SelectionUpdateType; + (function (SelectionUpdateType) { + SelectionUpdateType["Replace"] = "select-replace"; + SelectionUpdateType["Add"] = "select-add"; + SelectionUpdateType["Remove"] = "select-remove"; + })(SelectionUpdateType = Tableau.SelectionUpdateType || (Tableau.SelectionUpdateType = {})); + /** + * Enum for specifying the select option for the `extensions.Worksheet.selectTuplesAsync` method. + */ + let SelectOptions; + (function (SelectOptions) { + /** + * Clears existing selection before selecting the tuples specified + */ + SelectOptions["Simple"] = "select-options-simple"; + /** + * Adds specified tuples to the existing selection + */ + SelectOptions["Toggle"] = "select-options-toggle"; + })(SelectOptions = Tableau.SelectOptions || (Tableau.SelectOptions = {})); + /** + * The type of sheet a [[Sheet]] object represents + */ + let SheetType; + (function (SheetType) { + SheetType["Dashboard"] = "dashboard"; + SheetType["Story"] = "story"; + SheetType["Worksheet"] = "worksheet"; + })(SheetType = Tableau.SheetType || (Tableau.SheetType = {})); + let SortDirection; + (function (SortDirection) { + SortDirection["Increasing"] = "increasing"; + SortDirection["Decreasing"] = "decreasing"; + })(SortDirection = Tableau.SortDirection || (Tableau.SortDirection = {})); + let TrendLineModelType; + (function (TrendLineModelType) { + TrendLineModelType["Linear"] = "linear"; + TrendLineModelType["Logarithmic"] = "logarithmic"; + TrendLineModelType["Exponential"] = "exponential"; + TrendLineModelType["Polynomial"] = "polynomial"; + })(TrendLineModelType = Tableau.TrendLineModelType || (Tableau.TrendLineModelType = {})); + /** + * Enum that represents the replay speed of an animation. + * @since 1.7.0 + */ + let ReplaySpeedType; + (function (ReplaySpeedType) { + /** Used for setting the replay speed of an animation to 0.5x.*/ + ReplaySpeedType["Slow"] = "slow"; + /** Used for setting the replay speed of an animation to 1.0x.*/ + ReplaySpeedType["Normal"] = "normal"; + /** Used for setting the replay speed of an animation to 2.0x.*/ + ReplaySpeedType["Fast"] = "fast"; + })(ReplaySpeedType = Tableau.ReplaySpeedType || (Tableau.ReplaySpeedType = {})); + /** + * Enum that represents the selection state of a level in a hierarchical filter + * @since Extensions 1.10.0 + */ + let HierarchicalLevelSelectionState; + (function (HierarchicalLevelSelectionState) { + HierarchicalLevelSelectionState["AllSelected"] = "all-selected"; + HierarchicalLevelSelectionState["NoneSelected"] = "none-selected"; + HierarchicalLevelSelectionState["SomeSelected"] = "some-selected"; + HierarchicalLevelSelectionState["UnknownSelected"] = "unknown-selected"; + })(HierarchicalLevelSelectionState = Tableau.HierarchicalLevelSelectionState || (Tableau.HierarchicalLevelSelectionState = {})); + Tableau.ZoneVisibilityType = Object.assign({}, DashboardObjectVisibilityType); +})(Tableau || (Tableau = {})); +module.exports = Tableau; + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/SharedApiExternalContract.js": +/*!************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/SharedApiExternalContract.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +// This file re-exports everything which is part of the shared api public interface +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +__export(__webpack_require__(/*! ./ExternalContract/Shared/Enums */ "../api-external-contract-js/lib/src/ExternalContract/Shared/Enums.js")); +var Tableau_1 = __webpack_require__(/*! ./ExternalContract/Shared/Namespaces/Tableau */ "../api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js"); +exports.AnalyticsObjectType = Tableau_1.AnalyticsObjectType; +exports.AnnotationType = Tableau_1.AnnotationType; +exports.ClassNameKey = Tableau_1.ClassNameKey; +exports.ColumnType = Tableau_1.ColumnType; +exports.DashboardLayoutChange = Tableau_1.DashboardLayoutChange; +exports.DashboardObjectType = Tableau_1.DashboardObjectType; +exports.DashboardObjectVisibilityType = Tableau_1.DashboardObjectVisibilityType; +exports.DataType = Tableau_1.DataType; +exports.DateRangeType = Tableau_1.DateRangeType; +exports.DialogStyle = Tableau_1.DialogStyle; +exports.EncodingType = Tableau_1.EncodingType; +exports.FieldAggregationType = Tableau_1.FieldAggregationType; +exports.FieldRoleType = Tableau_1.FieldRoleType; +exports.FilterDomainType = Tableau_1.FilterDomainType; +exports.FilterNullOption = Tableau_1.FilterNullOption; +exports.FilterType = Tableau_1.FilterType; +exports.FilterUpdateType = Tableau_1.FilterUpdateType; +exports.HierarchicalLevelSelectionState = Tableau_1.HierarchicalLevelSelectionState; +exports.IncludeDataValuesOption = Tableau_1.IncludeDataValuesOption; +exports.MarkType = Tableau_1.MarkType; +exports.ParameterValueType = Tableau_1.ParameterValueType; +exports.PeriodType = Tableau_1.PeriodType; +exports.QuickTableCalcType = Tableau_1.QuickTableCalcType; +exports.ReplaySpeedType = Tableau_1.ReplaySpeedType; +exports.SelectOptions = Tableau_1.SelectOptions; +exports.SelectionUpdateType = Tableau_1.SelectionUpdateType; +exports.SheetType = Tableau_1.SheetType; +exports.SortDirection = Tableau_1.SortDirection; +exports.TrendLineModelType = Tableau_1.TrendLineModelType; +exports.ZoneVisibilityType = Tableau_1.ZoneVisibilityType; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/JsApiInternalContract.js": +/*!********************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/JsApiInternalContract.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +/** + * This is your main. This is where you re-export everything you want to be publicly available. + * + * The build enforces that the file has the same name as the global variable that is exported. + */ +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +// Export the version of the internal contract to be available at runtime +// This file is generated by yarn publish:bump via scripts/publish-check.ts +// updateInternalContractRuntimeVersion in the monorepo root. +const internalContractVersion = __webpack_require__(/*! ../internal-contract-version.json */ "../api-internal-contract-js/lib/internal-contract-version.json"); +exports.INTERNAL_CONTRACT_VERSION = internalContractVersion; +__export(__webpack_require__(/*! ./contract/DataTypeConverter */ "../api-internal-contract-js/lib/src/contract/DataTypeConverter.js")); +__export(__webpack_require__(/*! ./contract/Enums */ "../api-internal-contract-js/lib/src/contract/Enums.js")); +__export(__webpack_require__(/*! ./contract/Notifications */ "../api-internal-contract-js/lib/src/contract/Notifications.js")); +__export(__webpack_require__(/*! ./contract/Parameters */ "../api-internal-contract-js/lib/src/contract/Parameters.js")); +__export(__webpack_require__(/*! ./contract/Verbs */ "../api-internal-contract-js/lib/src/contract/Verbs.js")); +__export(__webpack_require__(/*! ./interface/AskDataInterface */ "../api-internal-contract-js/lib/src/interface/AskDataInterface.js")); +__export(__webpack_require__(/*! ./interface/PulseInterface */ "../api-internal-contract-js/lib/src/interface/PulseInterface.js")); +__export(__webpack_require__(/*! ./interface/VqlInterface */ "../api-internal-contract-js/lib/src/interface/VqlInterface.js")); +__export(__webpack_require__(/*! ./messaging/CrossFrameMessenger */ "../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js")); +__export(__webpack_require__(/*! ./messaging/interface/MessageTypes */ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js")); +__export(__webpack_require__(/*! ./versioning/external/ExternalIdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js")); +__export(__webpack_require__(/*! ./versioning/external/ExternalVersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js")); +__export(__webpack_require__(/*! ./versioning/VersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js")); +// Export the version number of messaging for consumers to use. +// Be very careful making any updates to this contract which break version compatibility. +exports.MESSAGING_VERSION = { + major: 1, + minor: 0, + fix: 0, +}; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/contract/DataTypeConverter.js": +/*!*************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/contract/DataTypeConverter.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Enums_1 = __webpack_require__(/*! ./Enums */ "../api-internal-contract-js/lib/src/contract/Enums.js"); +class DataTypeConverter { + static isSpecial(valueAsString) { + // Prior to ShowDataTablePresModel, special values come to us as + // '%null%', '%all%', '%wildcard%', '%missing%'... + // While this function will never return true for ShowDataTablePresModel conversion, + // it is as cheap as passing around a version and checking that. + // (See DataValueFormatter.cpp) + if (valueAsString.length > 2 && valueAsString[0] === '%' && valueAsString[valueAsString.length - 1] === '%') { + return true; + } + return false; + } + // tslint:disable-next-line:no-any + static parseBoolean(booleanString) { + // boolean values come to us as 'true'|'false' + const normalizedBoolean = booleanString.toLowerCase(); + return normalizedBoolean !== 'true' && normalizedBoolean !== 'false' ? this.specialValueIndicator : normalizedBoolean === 'true'; + } + // tslint:disable-next-line:no-any + static parseNumber(valueAsString) { + const value = Number(valueAsString); + return isNaN(value) ? this.specialValueIndicator : value; + } + static parseDate(dateAsString) { + // Note that without a time, the date is assumed to be UTC + // Input of 2020-03-25 is printed as: Mar 24 2020 17:00:00 GMT-0700 + // This matches style used in existing convertFilterValuePresModel + const value = new Date(dateAsString); + return Number.isNaN(value.getTime()) ? null : value; + } + static parseDateTime(dateAsString) { + // With a time, the date is assumed to be UTC. + // Our date format is always: yyyy-mm-dd hh:mm:ss + // Unfortunately, IE11 can't parse that format so we add a T between the day and time. + // We also add a Z so that it is UTC. (Without the Z, some browsers assume local, and others UTC) + // Even though we've dropped support for IE11, it's riskier/costlier to make updates here. + const formattedDateString = dateAsString.replace(' ', 'T').concat('Z'); + const value = new Date(formattedDateString); + return Number.isNaN(value.getTime()) ? null : value; + } + // It would be nice to merge this and the method FilterConverter::convertFilterValuePresModel in api-platform-js + static convertValueAsStringToValue(valueAsString, type) { + // This is both DataDictionary and ShowDataTablePresModel compatible. + // In the DataDictionary, valueAsString can be '%null%' or '%missing%', while in + // ShowDataTablePresModel, we can get 'null' or 'missing', or '%null%' for string special values. + // For either of these cases, we return specialValueIndicator (or the original special string). + // To maintain backwards compatibilty, this converter: + // 1. returns a string for any special values + // 2. returns a string for any date + // Parameter min/max values can be undefined, so result is also undefined + if (valueAsString === undefined || valueAsString === null) { + return undefined; + } + if (this.isSpecial(valueAsString)) { + return valueAsString; + } + switch (type) { + case Enums_1.DataType.Bool: + return this.parseBoolean(valueAsString); + case Enums_1.DataType.Int: + case Enums_1.DataType.Float: + // Return special value '%null%' for any failure in parsing. + // We need to do that because ShowDataTablePresModel will give us strings like 'null' + // for special values. + return this.parseNumber(valueAsString); + case Enums_1.DataType.Date: + // For ShowDataTablePresModel, special values will be "null" which will fail to parse. + // In that case, we return '%null%'. + return this.parseDate(valueAsString) === null ? this.specialValueIndicator : valueAsString; + case Enums_1.DataType.DateTime: + // For ShowDataTablePresModel, special values will be "null" which will fail to parse. + // In that case, we return '%null%' + return this.parseDateTime(valueAsString) === null ? this.specialValueIndicator : valueAsString; + case Enums_1.DataType.Spatial: + case Enums_1.DataType.String: + default: + return valueAsString; + } + } + // tslint:disable-next-line:no-any + static convertValueToNativeValue(value, type) { + // This converts from our 1.2 API that returns strings for specials, and dates as strings. + // It takes the special case of '%null%' and returns a null. + // For dates, it returns a Date object rather than a string. + // convertValueToNativeValue should be used to build a DataValue.nativeValue field. + // Parameter min/max can be undefined. If that is the case, nativeValue is treated like a special + if (value === undefined || value === null) { + return null; + } + switch (type) { + case Enums_1.DataType.Bool: + return typeof value === 'string' ? null : value; + case Enums_1.DataType.Int: + case Enums_1.DataType.Float: + return typeof value === 'string' ? null : value; + case Enums_1.DataType.Date: + // Convert the string to Date object (or null if parsing fails ... we assume special) + return this.parseDate(value); + case Enums_1.DataType.DateTime: + // Convert the string to Date object (or null if parsing fails ... we assume special) + return this.parseDateTime(value); + case Enums_1.DataType.String: + return this.isSpecial(value) ? null : value; + case Enums_1.DataType.Spatial: + default: + return value; + } + } + // tslint:disable-next-line:no-any + static convertStringValueToNativeValue(value, type) { + // This handles the conversion from string directly to native value for all types + return this.convertValueToNativeValue(this.convertValueAsStringToValue(value, type), type); + } +} +exports.DataTypeConverter = DataTypeConverter; +DataTypeConverter.specialValueIndicator = '%null%'; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/contract/Enums.js": +/*!*************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/contract/Enums.js ***! + \*************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var ExtensionContext; +(function (ExtensionContext) { + ExtensionContext["Desktop"] = "desktop"; + ExtensionContext["Server"] = "server"; + ExtensionContext["Unknown"] = "unknown"; + ExtensionContext["Cloud"] = "cloud"; + ExtensionContext["PublicWeb"] = "public-web"; + ExtensionContext["PublicDesktop"] = "public-desktop"; +})(ExtensionContext = exports.ExtensionContext || (exports.ExtensionContext = {})); +var ExtensionMode; +(function (ExtensionMode) { + ExtensionMode["Authoring"] = "authoring"; + ExtensionMode["Viewing"] = "viewing"; + ExtensionMode["Unknown"] = "unknown"; +})(ExtensionMode = exports.ExtensionMode || (exports.ExtensionMode = {})); +var AnnotateEnum; +(function (AnnotateEnum) { + AnnotateEnum["Mark"] = "mark"; + AnnotateEnum["Point"] = "point"; + AnnotateEnum["Area"] = "area"; +})(AnnotateEnum = exports.AnnotateEnum || (exports.AnnotateEnum = {})); +var ColumnType; +(function (ColumnType) { + ColumnType["Discrete"] = "discrete"; + ColumnType["Continuous"] = "continuous"; + ColumnType["Unknown"] = "unknown"; +})(ColumnType = exports.ColumnType || (exports.ColumnType = {})); +var DashboardObjectType; +(function (DashboardObjectType) { + DashboardObjectType["Blank"] = "blank"; + DashboardObjectType["Worksheet"] = "worksheet"; + DashboardObjectType["QuickFilter"] = "quick-filter"; + DashboardObjectType["ParameterControl"] = "parameter-control"; + DashboardObjectType["PageFilter"] = "page-filter"; + DashboardObjectType["Legend"] = "legend"; + DashboardObjectType["Title"] = "title"; + DashboardObjectType["Text"] = "text"; + DashboardObjectType["Image"] = "image"; + DashboardObjectType["WebPage"] = "web-page"; + DashboardObjectType["Extension"] = "extension"; +})(DashboardObjectType = exports.DashboardObjectType || (exports.DashboardObjectType = {})); +var DataType; +(function (DataType) { + DataType["String"] = "string"; + DataType["Int"] = "int"; + DataType["Float"] = "float"; + DataType["Bool"] = "bool"; + DataType["Date"] = "date"; + DataType["DateTime"] = "date-time"; + DataType["Spatial"] = "spatial"; + DataType["Unknown"] = "unknown"; +})(DataType = exports.DataType || (exports.DataType = {})); +var DialogStyle; +(function (DialogStyle) { + DialogStyle["Window"] = "window"; + DialogStyle["Modal"] = "modal"; + DialogStyle["Modeless"] = "modeless"; +})(DialogStyle = exports.DialogStyle || (exports.DialogStyle = {})); +var EncodedDataType; +(function (EncodedDataType) { + EncodedDataType["Number"] = "number"; + EncodedDataType["String"] = "string"; + EncodedDataType["Date"] = "date"; + EncodedDataType["Boolean"] = "boolean"; +})(EncodedDataType = exports.EncodedDataType || (exports.EncodedDataType = {})); +var ErrorCodes; +(function (ErrorCodes) { + ErrorCodes["INITIALIZATION_ERROR"] = "initialization-error"; + ErrorCodes["INTERNAL_ERROR"] = "internal-error"; + ErrorCodes["MISSING_ENUM_MAPPING"] = "missing-enum-mapping"; + ErrorCodes["MISSING_PARAMETER"] = "missing-parameter"; + ErrorCodes["PERMISSION_DENIED"] = "permission-denied"; + ErrorCodes["PRES_MODEL_PARSING_ERROR"] = "pres-model-parsing-error"; + ErrorCodes["VERSION_NOT_CONFIGURED"] = "version-not-configured"; + ErrorCodes["VISIBILITY_ERROR"] = "visibility-error"; + ErrorCodes["UNKNOWN_VERB_ID"] = "unknown-verb-id"; +})(ErrorCodes = exports.ErrorCodes || (exports.ErrorCodes = {})); +var FieldAggregationType; +(function (FieldAggregationType) { + FieldAggregationType["Sum"] = "sum"; + FieldAggregationType["Avg"] = "avg"; + FieldAggregationType["Min"] = "min"; + FieldAggregationType["Max"] = "max"; + FieldAggregationType["Stdev"] = "stdev"; + FieldAggregationType["Stdevp"] = "stdevp"; + FieldAggregationType["Var"] = "var"; + FieldAggregationType["Varp"] = "varp"; + FieldAggregationType["Collect"] = "collect"; + FieldAggregationType["Count"] = "count"; + FieldAggregationType["Countd"] = "countd"; + FieldAggregationType["Median"] = "median"; + FieldAggregationType["Attr"] = "attr"; + FieldAggregationType["None"] = "none"; + FieldAggregationType["Year"] = "year"; + FieldAggregationType["Qtr"] = "qtr"; + FieldAggregationType["Month"] = "month"; + FieldAggregationType["Day"] = "day"; + FieldAggregationType["Hour"] = "hour"; + FieldAggregationType["Minute"] = "minute"; + FieldAggregationType["Second"] = "second"; + FieldAggregationType["Week"] = "week"; + FieldAggregationType["Weekday"] = "weekday"; + FieldAggregationType["MonthYear"] = "month-year"; + FieldAggregationType["Mdy"] = "mdy"; + FieldAggregationType["End"] = "end"; + FieldAggregationType["TruncYear"] = "trunc-year"; + FieldAggregationType["TruncQtr"] = "trunc-qtr"; + FieldAggregationType["TruncMonth"] = "trunc-month"; + FieldAggregationType["TruncWeek"] = "trunc-week"; + FieldAggregationType["TruncDay"] = "trunc-day"; + FieldAggregationType["TruncHour"] = "trunc-hour"; + FieldAggregationType["TruncMinute"] = "trunc-minute"; + FieldAggregationType["TruncSecond"] = "trunc-second"; + FieldAggregationType["Quart1"] = "quart1"; + FieldAggregationType["Quart3"] = "quart3"; + FieldAggregationType["Skewness"] = "skewness"; + FieldAggregationType["Kurtosis"] = "kurtosis"; + FieldAggregationType["InOut"] = "in-out"; + FieldAggregationType["User"] = "user"; +})(FieldAggregationType = exports.FieldAggregationType || (exports.FieldAggregationType = {})); +var FieldRoleType; +(function (FieldRoleType) { + FieldRoleType["Dimension"] = "dimension"; + FieldRoleType["Measure"] = "measure"; + FieldRoleType["Unknown"] = "unknown"; +})(FieldRoleType = exports.FieldRoleType || (exports.FieldRoleType = {})); +/** + * The different update types for applying filter. + */ +var FilterUpdateType; +(function (FilterUpdateType) { + FilterUpdateType["Add"] = "add"; + FilterUpdateType["All"] = "all"; + FilterUpdateType["Replace"] = "replace"; + FilterUpdateType["Remove"] = "remove"; +})(FilterUpdateType = exports.FilterUpdateType || (exports.FilterUpdateType = {})); +var SheetType; +(function (SheetType) { + SheetType["Dashboard"] = "dashboard"; + SheetType["Story"] = "story"; + SheetType["Worksheet"] = "worksheet"; +})(SheetType = exports.SheetType || (exports.SheetType = {})); +var DomainRestrictionType; +(function (DomainRestrictionType) { + DomainRestrictionType["All"] = "all"; + DomainRestrictionType["List"] = "list"; + DomainRestrictionType["Range"] = "range"; +})(DomainRestrictionType = exports.DomainRestrictionType || (exports.DomainRestrictionType = {})); +var DateStepPeriod; +(function (DateStepPeriod) { + DateStepPeriod["Years"] = "years"; + DateStepPeriod["Quarters"] = "quarters"; + DateStepPeriod["Months"] = "months"; + DateStepPeriod["Weeks"] = "weeks"; + DateStepPeriod["Days"] = "days"; + DateStepPeriod["Hours"] = "hours"; + DateStepPeriod["Minutes"] = "minutes"; + DateStepPeriod["Seconds"] = "seconds"; +})(DateStepPeriod = exports.DateStepPeriod || (exports.DateStepPeriod = {})); +/** + * The option for specifying which values to include for filtering. + */ +var FilterNullOption; +(function (FilterNullOption) { + FilterNullOption["NullValues"] = "nullvalues"; + FilterNullOption["NonNullValues"] = "nonnullvalues"; + FilterNullOption["AllValues"] = "allvalues"; +})(FilterNullOption = exports.FilterNullOption || (exports.FilterNullOption = {})); +/** + * The type of filter domain + */ +var FilterDomainType; +(function (FilterDomainType) { + FilterDomainType["Relevant"] = "relevant"; + FilterDomainType["Database"] = "database"; +})(FilterDomainType = exports.FilterDomainType || (exports.FilterDomainType = {})); +/** + * Internal enum for specifying the selection type for select marks api. + */ +var SelectionUpdateType; +(function (SelectionUpdateType) { + SelectionUpdateType["Replace"] = "select-replace"; + SelectionUpdateType["Add"] = "select-add"; + SelectionUpdateType["Remove"] = "select-remove"; +})(SelectionUpdateType = exports.SelectionUpdateType || (exports.SelectionUpdateType = {})); +/** + * Internal enum for specifying the select option for the select tuples api. + */ +var SelectOptions; +(function (SelectOptions) { + SelectOptions["Simple"] = "select-options-simple"; + SelectOptions["Toggle"] = "select-options-toggle"; + SelectOptions["Menu"] = "select-options-menu"; + SelectOptions["Range"] = "select-options-range"; + SelectOptions["Search"] = "select-options-search"; +})(SelectOptions = exports.SelectOptions || (exports.SelectOptions = {})); +/** + * Internal enum for specifying the included values type for range selection. + */ +var QuantitativeIncludedValues; +(function (QuantitativeIncludedValues) { + QuantitativeIncludedValues["IncludeNull"] = "include-null"; + QuantitativeIncludedValues["IncludeNonNull"] = "include-non-null"; + QuantitativeIncludedValues["IncludeAll"] = "include-all"; +})(QuantitativeIncludedValues = exports.QuantitativeIncludedValues || (exports.QuantitativeIncludedValues = {})); +/** + * Internal enum for specifying a hierarchical level selection state. + */ +var HierarchicalLevelSelectionState; +(function (HierarchicalLevelSelectionState) { + HierarchicalLevelSelectionState["AllSelected"] = "all-selected"; + HierarchicalLevelSelectionState["NoneSelected"] = "none-selected"; + HierarchicalLevelSelectionState["SomeSelected"] = "some-selected"; + HierarchicalLevelSelectionState["UnknownSelected"] = "unknown-selected"; +})(HierarchicalLevelSelectionState = exports.HierarchicalLevelSelectionState || (exports.HierarchicalLevelSelectionState = {})); +/** + * Type of mark for a given marks card in a viz. + */ +var MarkType; +(function (MarkType) { + MarkType["Bar"] = "bar"; + MarkType["Line"] = "line"; + MarkType["Area"] = "area"; + MarkType["Square"] = "square"; + MarkType["Circle"] = "circle"; + MarkType["Shape"] = "shape"; + MarkType["Text"] = "text"; + MarkType["Map"] = "map"; + MarkType["Pie"] = "pie"; + MarkType["GanttBar"] = "gantt-bar"; + MarkType["Polygon"] = "polygon"; + MarkType["Heatmap"] = "heatmap"; + MarkType["VizExtension"] = "viz-extension"; +})(MarkType = exports.MarkType || (exports.MarkType = {})); +/** + * Internal enum for specifying the type of filter + */ +var FilterType; +(function (FilterType) { + FilterType["Categorical"] = "categorical"; + FilterType["Range"] = "range"; + FilterType["RelativeDate"] = "relativeDate"; + FilterType["Hierarchical"] = "hierarchical"; +})(FilterType = exports.FilterType || (exports.FilterType = {})); +/** + * Internal enum for specifying the DateRangeType of a relative date filter + */ +var DateRangeType; +(function (DateRangeType) { + /** + * Refers to the last day, week, month, etc. of the date period. + */ + DateRangeType["Last"] = "last"; + /** + * Refers to the last N days, weeks, months, etc. of the date period. + */ + DateRangeType["LastN"] = "lastN"; + /** + * Refers to the next day, week, month, etc. of the date period. + */ + DateRangeType["Next"] = "next"; + /** + * Refers to the next N days, weeks, months, etc. of the date period. + */ + DateRangeType["NextN"] = "nextN"; + /** + * Refers to the current day, week, month, etc. of the date period. + */ + DateRangeType["Current"] = "current"; + /** + * Refers to everything up to and including the current day, week, month, etc. of the date period. + */ + DateRangeType["ToDate"] = "toDate"; +})(DateRangeType = exports.DateRangeType || (exports.DateRangeType = {})); +/** + * Used to determine if the launching of an extension dialog succeeded or failed. + */ +var ExtensionDialogResult; +(function (ExtensionDialogResult) { + ExtensionDialogResult["DialogAlreadyOpen"] = "dialog-already-open"; + ExtensionDialogResult["InvalidDomain"] = "invalid-domain"; + ExtensionDialogResult["Success"] = "success"; +})(ExtensionDialogResult = exports.ExtensionDialogResult || (exports.ExtensionDialogResult = {})); +/** + * Used to optimize the getSummaryData/getUnderlyingTableData results + * Mapped from external IncludeDataValuesOption + */ +var ApiShowDataTableFormat; +(function (ApiShowDataTableFormat) { + ApiShowDataTableFormat["NativeValuesOnly"] = "native-values-only"; + ApiShowDataTableFormat["FormattedValuesOnly"] = "formatted-values-only"; + ApiShowDataTableFormat["NativeAndFormattedValues"] = "native-and-formatted-values"; +})(ApiShowDataTableFormat = exports.ApiShowDataTableFormat || (exports.ApiShowDataTableFormat = {})); +/** + * Used to set page size for export layout options. + */ +var PageSizeOption; +(function (PageSizeOption) { + PageSizeOption["Letter"] = "letter"; + PageSizeOption["Legal"] = "legal"; + PageSizeOption["Note"] = "note"; + PageSizeOption["Folio"] = "folio"; + PageSizeOption["Tabloid"] = "tabloid"; + PageSizeOption["Ledger"] = "ledger"; + PageSizeOption["Statement"] = "statement"; + PageSizeOption["Executive"] = "executive"; + PageSizeOption["A3"] = "a3"; + PageSizeOption["A4"] = "a4"; + PageSizeOption["A5"] = "a5"; + PageSizeOption["B4"] = "b4"; + PageSizeOption["B5"] = "b5"; + PageSizeOption["Quarto"] = "quarto"; + PageSizeOption["Unspecified"] = "unspecified"; +})(PageSizeOption = exports.PageSizeOption || (exports.PageSizeOption = {})); +/** + * Used to set the page orientation mode for export layout options. + */ +var PageOrientation; +(function (PageOrientation) { + PageOrientation["Printer"] = "printer"; + PageOrientation["Portrait"] = "portrait"; + PageOrientation["Landscape"] = "landscape"; +})(PageOrientation = exports.PageOrientation || (exports.PageOrientation = {})); +/** + * Used to set scale mode for export layout options. + */ +var ScaleMode; +(function (ScaleMode) { + ScaleMode["ScaleAuto"] = "auto"; + ScaleMode["ScalePercentage"] = "percent"; + ScaleMode["ScaleFitPages"] = "fit-pages"; +})(ScaleMode = exports.ScaleMode || (exports.ScaleMode = {})); +/** + * Used by setFitAndScaleValues to scale percent values + */ +var PageScalingOption; +(function (PageScalingOption) { + PageScalingOption["ScalePctAuto"] = "auto"; + PageScalingOption["ScalePct400"] = "pct400"; + PageScalingOption["ScalePct200"] = "pct200"; + PageScalingOption["ScalePct100"] = "pct100"; + PageScalingOption["ScalePct90"] = "pct90"; + PageScalingOption["ScalePct80"] = "pct80"; + PageScalingOption["ScalePct75"] = "pct75"; + PageScalingOption["ScalePct60"] = "pct60"; + PageScalingOption["ScalePct50"] = "pct50"; + PageScalingOption["ScalePct25"] = "pct25"; +})(PageScalingOption = exports.PageScalingOption || (exports.PageScalingOption = {})); +/** + * Used by setFitAndScaleValues to scale fit page values + */ +var FitPages; +(function (FitPages) { + FitPages["FitOneHigh"] = "fit0x1"; + FitPages["FitTwoHigh"] = "fit0x2"; + FitPages["FitOneWide"] = "fit1x0"; + FitPages["FitTwoWide"] = "fit2x0"; +})(FitPages = exports.FitPages || (exports.FitPages = {})); +/** + * Used by getVisualSpecificationAsync + */ +var EncodingType; +(function (EncodingType) { + EncodingType["Color"] = "color"; + EncodingType["Size"] = "size"; + EncodingType["Label"] = "label"; + EncodingType["Detail"] = "detail"; + EncodingType["Tooltip"] = "tooltip"; + EncodingType["Shape"] = "shape"; + EncodingType["Path"] = "path"; + EncodingType["Angle"] = "angle"; + EncodingType["Geometry"] = "geometry"; + EncodingType["Custom"] = "custom"; +})(EncodingType = exports.EncodingType || (exports.EncodingType = {})); +var PulseTimeDimension; +(function (PulseTimeDimension) { + PulseTimeDimension["Today"] = "Today"; + PulseTimeDimension["Yesterday"] = "Yesterday"; + PulseTimeDimension["WeekToDate"] = "WeekToDate"; + PulseTimeDimension["LastWeek"] = "LastWeek"; + PulseTimeDimension["MonthToDate"] = "MonthToDate"; + PulseTimeDimension["LastMonth"] = "LastMonth"; + PulseTimeDimension["QuarterToDate"] = "QuarterToDate"; + PulseTimeDimension["LastQuarter"] = "LastQuarter"; + PulseTimeDimension["YearToDate"] = "YearToDate"; + PulseTimeDimension["LastYear"] = "LastYear"; +})(PulseTimeDimension = exports.PulseTimeDimension || (exports.PulseTimeDimension = {})); +var PulseErrorMessageVisibility; +(function (PulseErrorMessageVisibility) { + PulseErrorMessageVisibility["Visible"] = "visible"; + PulseErrorMessageVisibility["Hidden"] = "hidden"; + PulseErrorMessageVisibility["Suppressed"] = "suppressed"; +})(PulseErrorMessageVisibility = exports.PulseErrorMessageVisibility || (exports.PulseErrorMessageVisibility = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/contract/Notifications.js": +/*!*********************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/contract/Notifications.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var NotificationId; +(function (NotificationId) { + NotificationId["CustomMarkContextMenuClicked"] = "custom-mark-context-menu-clicked"; + NotificationId["ContextMenuClick"] = "context-menu-click"; + NotificationId["CustomViewRemoved"] = "custom-view-removed"; + NotificationId["CustomViewSaved"] = "custom-view-saved"; + NotificationId["CustomViewSetDefault"] = "custom-view-set-default"; + NotificationId["CustomViewsLoaded"] = "custom-views-loaded"; + NotificationId["DashboardLayoutChanged"] = "dashboard-layout-changed"; + NotificationId["EditButtonClicked"] = "edit-button-clicked"; + NotificationId["EditInDesktopButtonClicked"] = "edit-in-desktop-button-clicked"; + NotificationId["ExtensionDialogUpdate"] = "extension-dialog-update"; + NotificationId["ExtensionDialogMessage"] = "extension-dialog-message"; + NotificationId["FilterChanged"] = "filter-changed"; + NotificationId["FirstVizSizeKnown"] = "first-viz-size-known"; + NotificationId["FirstPulseMetricSizeKnown"] = "first-pulse-metric-size-known"; + NotificationId["ParameterChanged"] = "parameter-changed"; + NotificationId["PulseError"] = "pulse-error"; + NotificationId["PulseFiltersChanged"] = "pulse-filters-changed"; + NotificationId["PulseMetricSizeChanged"] = "pulse-metric-size-changed"; + NotificationId["PulseInsightDiscovered"] = "pulse-insight-discovered"; + NotificationId["PulseInteractive"] = "pulse-interactive"; + NotificationId["PulseTimeDimensionChanged"] = "pulse-time-dimension-changed"; + NotificationId["PulseUrlChanged"] = "pulse-url-changed"; + NotificationId["SelectedMarksChanged"] = "selected-marks-changed"; + NotificationId["SettingsChanged"] = "settings-changed"; + NotificationId["SummaryDataChanged"] = "summary-data-changed"; + NotificationId["TestConversionNotification"] = "test-conversion-notification"; + NotificationId["ToolbarStateChanged"] = "toolbar-state-changed"; + NotificationId["VizInteractive"] = "viz-interactive"; + NotificationId["AskDataInteractive"] = "ask-data-interactive"; + NotificationId["WorkbookReadyToClose"] = "workbook-ready-to-close"; + NotificationId["WorkbookFormattingChanged"] = "workbook-formatting-changed"; + NotificationId["WorkbookPublished"] = "workbook-published"; + NotificationId["WorkbookPublishedAs"] = "workbook-published-as"; + NotificationId["WorksheetFormattingChanged"] = "worksheet-formatting-changed"; + NotificationId["UrlAction"] = "url-action"; + NotificationId["TabSwitched"] = "tab-switched"; + NotificationId["StoryPointSwitched"] = "story-point-switched"; + NotificationId["ReadyToReceiveAuthToken"] = "ready-to-receive-auth-token"; +})(NotificationId = exports.NotificationId || (exports.NotificationId = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/contract/Parameters.js": +/*!******************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/contract/Parameters.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// PLEASE KEEP IN ALPHABETICAL ORDER. This helps with visually finding entries, knowing where to put +// new ones, and merge conflicts. +var ParameterId; +(function (ParameterId) { + ParameterId["ActiveTablesInfo"] = "active-tables-info"; + ParameterId["AnchorDate"] = "anchor-date"; + ParameterId["AnnotateEnum"] = "annotate-enum"; + ParameterId["AnnotationList"] = "annotation-list"; + ParameterId["ApplyWorksheetFormatting"] = "apply-worksheet-formatting"; + ParameterId["CategoricalDomain"] = "categorical-domain"; + ParameterId["ClickThroughEnabled"] = "click-through-enabled"; + ParameterId["Columns"] = "columns"; + ParameterId["ColumnsToInclude"] = "columns-to-include"; + ParameterId["ColumnsToIncludeById"] = "columns-to-include-by-id"; + ParameterId["ConnectionDescriptionSummaries"] = "connection-description-summaries"; + ParameterId["CurrentSheetType"] = "current-sheet-type"; + ParameterId["CustomView"] = "custom-view"; + ParameterId["CustomViewIsDefault"] = "custom-view-is-default"; + ParameterId["CustomViewIsPublic"] = "custom-view-is-public"; + ParameterId["CustomViewLuid"] = "custom-view-luid"; + ParameterId["CustomViewName"] = "custom-view-name"; + ParameterId["CustomViews"] = "custom-views"; + ParameterId["Dashboard"] = "dashboard"; + ParameterId["DashboardFilters"] = "dashboard-filters"; + ParameterId["DashboardName"] = "dashboard"; + ParameterId["DashboardObjectPositionAndSizeUpdate"] = "dashboard-object-position-and-size-update"; + ParameterId["DashboardObjectPositionAndSizeUpdateList"] = "dashboard-object-position-and-size-update-list"; + ParameterId["DataRowIndex"] = "data-row-index"; + ParameterId["DataSchema"] = "data-schema"; + ParameterId["DataSource"] = "data-source"; + ParameterId["DataSourceDataTable"] = "data-source-data-table"; + ParameterId["DataSourceId"] = "data-source-id"; + ParameterId["DataSourceName"] = "data-source-name"; + ParameterId["DataTable"] = "data-table"; + ParameterId["DataTableReader"] = "data-table-reader"; + ParameterId["DateRangeType"] = "date-range-type"; + ParameterId["DeleteCount"] = "delete-count"; + ParameterId["DeltaTimeMs"] = "delta-time-ms"; + ParameterId["DimValSelectionModels"] = "dimensionValueSelectionModels"; + ParameterId["DomainType"] = "domain-type"; + ParameterId["EmbeddingAbstractQuery"] = "embedding-abstract-query"; + ParameterId["EmbeddingBootstrapInfo"] = "embedding-bootstrap-info"; + ParameterId["EncodingType"] = "encoding-type"; + ParameterId["ExportCrosstabSheetMap"] = "export-crosstab-sheet-map"; + ParameterId["ExportFile"] = "export-file"; + ParameterId["ExportOriginUrl"] = "export-origin-url"; + ParameterId["ExportPdfOptions"] = "export-pdf-options"; + ParameterId["ExtensionBootstrapInfo"] = "extension-bootstrap-info"; + ParameterId["ExtensionContextMenuIds"] = "extension-context-menu-ids"; + ParameterId["ExtensionDialogH"] = "extension-dialog-height"; + ParameterId["ExtensionDialogMessage"] = "extension-dialog-message"; + ParameterId["ExtensionDialogPayload"] = "extension-dialog-payload"; + ParameterId["ExtensionDialogResult"] = "extension-dialog-result"; + ParameterId["ExtensionDialogStyle"] = "extension-dialog-style"; + ParameterId["ExtensionDialogUrl"] = "extension-dialog-url"; + ParameterId["ExtensionDialogW"] = "extension-dialog-width"; + ParameterId["ExtensionLocator"] = "extension-locator"; + ParameterId["ExtensionSettingsInfo"] = "extension-settings-info"; + ParameterId["ExtensionZoneId"] = "extension-zone-id"; + ParameterId["ExternalMenuDescription"] = "external-menu-description"; + ParameterId["ExternalMenuHeader"] = "external-menu-header"; + ParameterId["ExternalMenuItemDisplayName"] = "external-menu-item-display-name"; + ParameterId["ExternalMenuItemId"] = "external-menu-item-id"; + ParameterId["Field"] = "field"; + ParameterId["FieldCount"] = "field-count"; + ParameterId["FieldId"] = "field-id"; + ParameterId["FieldName"] = "field-name"; + ParameterId["FilterLevels"] = "filter-levels"; + ParameterId["FilterRangeMax"] = "filter-range-max"; + ParameterId["FilterRangeMin"] = "filter-range-min"; + ParameterId["FilterRangeNullOption"] = "filter-range-null-option"; + ParameterId["FilterUpdateType"] = "filter-update-type"; + ParameterId["FilterValues"] = "filter-values"; + ParameterId["FontNameListItems"] = "font-name-list-items"; + ParameterId["FormattedText"] = "formatted-text"; + ParameterId["FunctionName"] = "function-name"; + ParameterId["FromIndex"] = "from-index"; + ParameterId["HierValSelectionModels"] = "hierarchicalValueSelectionModels"; + ParameterId["HighlightedData"] = "highlighted-data"; + ParameterId["HoverTupleInteraction"] = "hover-tuple-interaction"; + ParameterId["IgnoreAliases"] = "ignore-aliases"; + ParameterId["IgnoreSelection"] = "ignore-selection"; + ParameterId["IncludeAllColumns"] = "include-all-columns"; + ParameterId["InvalidAggFieldName"] = "invalid-agg-field-name"; + ParameterId["InvalidDates"] = "invalid-dates"; + ParameterId["InvalidFieldCaption"] = "invalid-field-caption"; + ParameterId["InvalidFields"] = "invalid-fields"; + ParameterId["InvalidValues"] = "invalid-values"; + ParameterId["IsAnalyticsAssistantAvailable"] = "is-analytics-assistant-available"; + ParameterId["IsExcludeMode"] = "is-exclude"; + ParameterId["IsExtensionDialog"] = "is-extension-dialog"; + ParameterId["IsFromCalcDialog"] = "is-from-calc-dialog"; + ParameterId["JoinDescription"] = "join-description"; + ParameterId["LogicalTableId"] = "logical-table-id"; + ParameterId["LogicalTableInfoList"] = "logical-table-info-list"; + ParameterId["MarksCardIndex"] = "marks-card-index"; + ParameterId["MaxHeight"] = "max-height"; + ParameterId["MaxRows"] = "max-rows"; + ParameterId["MaxWidth"] = "max-width"; + ParameterId["MinHeight"] = "min-height"; + ParameterId["MinWidth"] = "min-width"; + ParameterId["PageRowCount"] = "page-row-count"; + ParameterId["ParameterCaption"] = "paremeter-caption"; + ParameterId["ParameterError"] = "parameter-error"; + ParameterId["ParameterFieldName"] = "parameter-field-name"; + ParameterId["ParameterInfo"] = "parameter-info"; + ParameterId["ParameterInfos"] = "parameter-infos"; + ParameterId["ParameterValue"] = "parameter-value"; + ParameterId["PeriodType"] = "period-type"; + ParameterId["PulseFieldName"] = "fieldName"; + ParameterId["PulseFieldNames"] = "fieldNames"; + ParameterId["PulseFilterDomainType"] = "domainType"; + ParameterId["PulseFilterDomainSearchTerm"] = "searchTerm"; + ParameterId["PulsePageSize"] = "pageSize"; + ParameterId["PulseNextPageToken"] = "nextPageToken"; + ParameterId["PulseFilters"] = "filters"; + ParameterId["PulseTimeDimension"] = "timeDimension"; + ParameterId["QuantitativeDomain"] = "quantitative-dmain"; + ParameterId["QuantRangeSelectionModels"] = "quantativeRangeSelectionModels"; + ParameterId["RangeN"] = "range-n"; + ParameterId["ReplaySpeed"] = "replay-speed"; + ParameterId["SelectedData"] = "selected-data"; + ParameterId["SelectedSheetNames"] = "selected-sheet-names"; + ParameterId["Selection"] = "selection"; + ParameterId["SelectionList"] = "selection-list"; + ParameterId["SelectionUpdateType"] = "selectionUpdateType"; + ParameterId["SelectTuplesInteraction"] = "select-tuples-interaction"; + ParameterId["SendNotifications"] = "send-notifications"; + ParameterId["SettingsValues"] = "settings-values"; + ParameterId["SharedFilterSheets"] = "shared-filter-sheets"; + ParameterId["SharedFiltersInfo"] = "shared-filters-info"; + ParameterId["SheetIdentifier"] = "sheet-identifier"; + ParameterId["SheetName"] = "sheet-name"; + ParameterId["SheetPath"] = "sheet-path"; + ParameterId["ShouldRefreshDS"] = "should-refresh-ds"; + ParameterId["ShowDataTableFormat"] = "show-data-table-format"; + ParameterId["StartIndex"] = "start-index"; + ParameterId["State"] = "state"; + ParameterId["StoryPointIndex"] = "story-point-index"; + ParameterId["StoryPointInfo"] = "story-point-info"; + ParameterId["SwitchToSheetName"] = "switch-to-sheet-name"; + ParameterId["TargetPoint"] = "target-point"; + ParameterId["TestConversionParameter"] = "test-conversion-parameter"; + ParameterId["Text"] = "formatted-text"; + ParameterId["ToIndex"] = "to-index"; + ParameterId["TooltipContext"] = "tooltip-context"; + ParameterId["TooltipTextRequest"] = "tooltip-text-request"; + ParameterId["TooltipText"] = "tooltip-text"; + ParameterId["UnderlyingDataTable"] = "underlying-data-table"; + ParameterId["UnderlyingSummaryDataTable"] = "underlying-summary-data-table"; + ParameterId["Url"] = "url"; + ParameterId["UseTabDelimiters"] = "use-tab-delimiters"; + ParameterId["ViewDataTableCacheId"] = "view-data-table-cache-id"; + ParameterId["ViewDataTableId"] = "view-data-table-id"; + ParameterId["VisualId"] = "visual-id"; + ParameterId["VisualSpecification"] = "visual-specification"; + ParameterId["VizAPIInputJson"] = "vizapi-input-json"; + ParameterId["VizAPIStateWithDataModel"] = "vizapi-state-with-data-model"; + ParameterId["VizAPIStateWarningMsg"] = "vizapi-state-warning-msg"; + ParameterId["VizAPISVG"] = "vizapi-svg"; + ParameterId["WorksheetName"] = "worksheet-name"; + ParameterId["WorksheetFilters"] = "worksheet-filters"; + ParameterId["ZoneIdsVisibilityMap"] = "zone-ids-visibility-map"; +})(ParameterId = exports.ParameterId || (exports.ParameterId = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/contract/Verbs.js": +/*!*************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/contract/Verbs.js ***! + \*************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// Declare this key type and export the NotificationId to make this behave like a string enum. +// +// PLEASE KEEP IN ALPHABETICAL ORDER. This helps with visually finding entries, knowing where to put +// new ones, and merge conflicts. +var VerbId; +(function (VerbId) { + VerbId["ActivateNextStoryPoint"] = "activate-next-story-point"; + VerbId["ActivatePreviousStoryPoint"] = "activate-previous-story-point"; + VerbId["ActivateSheet"] = "activateSheet"; + VerbId["ActivateStoryPoint"] = "activate-story-point"; + VerbId["AddMarksCardFields"] = "add-marks-card-fields"; + VerbId["AppendExternalMenuItem"] = "append-external-menu-item"; + VerbId["ApplyCategoricalFilter"] = "categorical-filter"; + VerbId["ApplyPulseFilters"] = "apply-pulse-filters"; + VerbId["ApplyPulseTimeDimension"] = "apply-pulse-time-dimension"; + VerbId["ApplyRangeFilter"] = "range-filter"; + VerbId["ApplyRelativeDateFilter"] = "apply-relative-date-Filter"; + VerbId["Authenticate"] = "authenticate"; + VerbId["BlockExtension"] = "block-extension"; + VerbId["ChangeParameterValue"] = "change-parameter-value"; + VerbId["ChangeSharedFilter"] = "change-shared-filter"; + VerbId["ClearAllPulseFilters"] = "clear-all-pulse-filters"; + VerbId["ClearFilter"] = "clear-filter"; + VerbId["ClearPulseFilters"] = "clear-pulse-filters"; + VerbId["ClearSelectedMarks"] = "clear-selected-marks"; + VerbId["CloseDialog"] = "close-dialog"; + VerbId["CreateAnnotation"] = "create-annotation"; + VerbId["DashboardCategoricalFilter"] = "dashboard-categorical-filter"; + VerbId["DisplayDialog"] = "display-dialog"; + VerbId["DownloadWorkbook"] = "download-workbook"; + VerbId["EditAliasesDialog"] = "edit-aliases-dialog"; + VerbId["ExecuteExternalMenuItem"] = "execute-external-menu-item"; + VerbId["ExportCrosstab"] = "export-crosstab"; + VerbId["ExportCrosstabCsvDownload"] = "export-crosstab-csv-download"; + VerbId["ExportCrosstabExcelDownload"] = "export-crosstab-excel-download"; + VerbId["ExportData"] = "export-data"; + VerbId["ExportDataDownload"] = "export-data-download"; + VerbId["ExportImage"] = "export-image"; + VerbId["ExportPdf"] = "export-pdf"; + VerbId["ExportPdfDownload"] = "export-pdf-download"; + VerbId["ExportPowerpoint"] = "export-powerpoint"; + VerbId["ExportPowerpointDownload"] = "export-powerpoint-download"; + VerbId["FindParameter"] = "find-parameter"; + VerbId["GetActiveTables"] = "get-active-tables"; + VerbId["GetAllDataSources"] = "get-all-data-sources"; + VerbId["GetAnnotations"] = "get-annotations"; + VerbId["GetCategoricalDomain"] = "get-categorical-domain"; + VerbId["GetConnectionDescriptionSummaries"] = "get-connection-description-summaries"; + VerbId["GetCurrentSrc"] = "get-current-src"; + VerbId["GetCustomViews"] = "get-custom-views"; + VerbId["GetDashboardFilters"] = "get-dashboard-filters"; + VerbId["GetDataSource"] = "get-datasource"; + VerbId["GetDataSourceData"] = "get-datasource-data"; + VerbId["GetDataSources"] = "get-data-sources"; + VerbId["GetDataSummaryData"] = "get-summary-data"; + VerbId["GetDataSummaryDataReader"] = "get-summary-data-reader"; + VerbId["GetDataTableReaderPage"] = "get-data-table-reader-page"; + VerbId["GetEmbeddingAbstractQueryWithDataModel"] = "get-embedding-abstract-query-with-data-model"; + VerbId["GetEmbeddingClientInfo"] = "get-embedding-client-info"; + VerbId["GetVizStateWithDataModel"] = "get-viz-state-with-data-model"; + VerbId["GetExportCrosstabSheetMap"] = "get-export-crosstab-sheet-map"; + VerbId["GetExportPdfOptions"] = "get-export-pdf-options"; + VerbId["GetField"] = "get-field"; + VerbId["GetFieldAndDataSource"] = "get-field-and-datasource"; + VerbId["GetVisualSpecification"] = "get-visual-specification"; + VerbId["GetFilters"] = "get-filters"; + VerbId["GetFonts"] = "get-fonts"; + VerbId["GetHighlightedMarks"] = "get-highlighted-marks"; + VerbId["GetJoinDescription"] = "get-join-description"; + VerbId["GetLogicalTableData"] = "get-logical-table-data"; + VerbId["GetLogicalTableDataReader"] = "get-logical-table-data-reader"; + VerbId["GetLogicalTables"] = "get-logical-tables"; + VerbId["GetParametersForSheet"] = "get-parameters-for-sheet"; + VerbId["GetPulseCategoricalDomain"] = "get-pulse-categorical-domain"; + VerbId["GetPulseFilters"] = "get-pulse-filters"; + VerbId["GetPulseTimeDimension"] = "get-pulse-time-dimension"; + VerbId["GetRangeDomain"] = "get-range-domain"; + VerbId["GetSelectedMarks"] = "get-selected-marks"; + VerbId["GetSharedFilter"] = "get-shared-filter"; + VerbId["GetTooltipText"] = "get-tooltip-text"; + VerbId["GetUnderlyingData"] = "get-underlying-data"; + VerbId["GetUnderlyingTableData"] = "get-underlying-table-data"; + VerbId["GetUnderlyingTableDataReader"] = "get-underlying-table-data-reader"; + VerbId["GetUnderlyingTables"] = "get-underlying-tables"; + VerbId["HierarchicalFilter"] = "hierachical-filter"; + VerbId["InitializeExtension"] = "initialize-extension"; + VerbId["IsAnalyticsAssistantAvailable"] = "is-analytics-assistant-available"; + VerbId["LaunchAnalyticsAssistant"] = "launch-analytics-assistant"; + VerbId["MoveAndResizeZones"] = "move-and-resize-zones"; + VerbId["MoveMarksCardField"] = "move-marks-card-field"; + VerbId["RaiseLeaveMarkNavNotification"] = "raise-leave-mark-nav-notification"; + VerbId["RaiseHoverTupleNotification"] = "raise-hover-tuple-notification"; + VerbId["RaiseSelectTuplesNotification"] = "raise-select-tuples-notification"; + VerbId["Redo"] = "redo"; + VerbId["RefreshDataSource"] = "refresh-data-source"; + VerbId["ReleaseDataTableReader"] = "release-data-table-reader"; + VerbId["RemoveAnnotation"] = "remove-annotation"; + VerbId["RemoveCustomView"] = "remove-custom-view"; + VerbId["RemoveExternalMenuItem"] = "remove-external-menu-item"; + VerbId["RenameExternalMenu"] = "rename-external-menu"; + VerbId["ReplayAnimation"] = "replay-animation"; + VerbId["RevertStoryPoint"] = "revert-story-point"; + VerbId["RevertWorkbook"] = "revert-workbook"; + VerbId["SaveExtensionSettings"] = "save-extension-settings"; + VerbId["SaveWorkbookAsCustomView"] = "save-workbook-as-custom-view"; + VerbId["SelectByValue"] = "select-by-value"; + VerbId["SetActiveCustomViewAsDefault"] = "set-active-custom-view-as-default"; + VerbId["SetAutoUpdate"] = "set-auto-update"; + VerbId["SetClickThrough"] = "set-click-through"; + VerbId["SendDialogMessage"] = "send-dialog-message"; + VerbId["SetVizStateWithDataModel"] = "set-viz-state-with-data-model"; + VerbId["SetSheetSize"] = "set-sheet-size"; + VerbId["SetZoneVisibility"] = "set-zone-visibility"; + VerbId["Share"] = "share"; + VerbId["ShowCustomView"] = "show-custom-view"; + VerbId["SpliceMarksCardFields"] = "splice-marks-card-fields"; + VerbId["TestConversionVerb"] = "test-conversion-verb"; + VerbId["Undo"] = "undo"; + VerbId["UpdateCustomView"] = "update-custom-view"; + VerbId["VizAPI"] = "viz-api"; +})(VerbId = exports.VerbId || (exports.VerbId = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/interface/AskDataInterface.js": +/*!*************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/interface/AskDataInterface.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var AskDataOptionNames; +(function (AskDataOptionNames) { + AskDataOptionNames["token"] = "token"; + AskDataOptionNames["origin"] = "origin"; + AskDataOptionNames["showEmbed"] = "showEmbed"; + AskDataOptionNames["showPin"] = "showPin"; + AskDataOptionNames["showSave"] = "showSave"; + AskDataOptionNames["showShare"] = "showShare"; + AskDataOptionNames["debug"] = ":jsdebug"; + AskDataOptionNames["ApiID"] = ":apiID"; + AskDataOptionNames["ApiExternalVersion"] = ":apiExternalVersion"; + AskDataOptionNames["ApiInternalVersion"] = ":apiInternalVersion"; + AskDataOptionNames["AskDataWebComponent"] = ":askDataWebComponent"; +})(AskDataOptionNames = exports.AskDataOptionNames || (exports.AskDataOptionNames = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/interface/PulseInterface.js": +/*!***********************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/interface/PulseInterface.js ***! + \***********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var PulseOptionNames; +(function (PulseOptionNames) { + PulseOptionNames["embed"] = "embed"; + PulseOptionNames["token"] = "token"; + PulseOptionNames["disableExploreFilter"] = "disableExploreFilter"; + PulseOptionNames["layout"] = "embed_layout"; + PulseOptionNames["theme"] = "embed_theme"; + PulseOptionNames["ApiExternalVersion"] = ":apiExternalVersion"; + PulseOptionNames["ApiInternalVersion"] = ":apiInternalVersion"; + PulseOptionNames["PulseWebComponent"] = ":pulseWebComponent"; +})(PulseOptionNames = exports.PulseOptionNames || (exports.PulseOptionNames = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/interface/VqlInterface.js": +/*!*********************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/interface/VqlInterface.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * These strings were *manually copied* from the server, + * workgroup/src/silos/tableau-server/libraries/tab-controller-vizql/src/com/tableausoftware/ + * controller/vizql/constants/ParameterKeys.java#L9 + * should be exported instead + * parameters that vizql will accept in an embedding URL + **/ +var VqlParameterNames; +(function (VqlParameterNames) { + VqlParameterNames["ONE"] = "1"; + VqlParameterNames["ALERTS"] = ":alerts"; + VqlParameterNames["ALIAS"] = "alias"; + VqlParameterNames["ALLOW_DEFERRED_BOOTSTRAP"] = ":allowDeferredBootstrap"; + VqlParameterNames["ALLOW_AUTOGEN_WORKSHEET_PHONE_LAYOUTS"] = "allowAutogenWorksheetPhoneLayouts"; + VqlParameterNames["API_ID"] = ":apiID"; + VqlParameterNames["APP"] = ":app"; + VqlParameterNames["ATTACHMENT"] = "attachment"; + VqlParameterNames["IS_IPAD_APP"] = "app"; + VqlParameterNames["ANIMATE_TRANSITION"] = ":animate_transition"; + VqlParameterNames["ASCENDING"] = "ascending"; + VqlParameterNames["AUTHENTICATION"] = "authentication"; + VqlParameterNames["ATTRIBUTES"] = "attributes"; + VqlParameterNames["AUTHORING_SHEET"] = ":authSheet"; + VqlParameterNames["AXIS"] = "axis"; + VqlParameterNames["BOOTSTRAP_WHEN_NOTIFIED"] = ":bootstrapWhenNotified"; + VqlParameterNames["BROWSER_BACK_BUTTON_UNDO"] = ":browserBackButtonUndo"; + VqlParameterNames["BROWSER_RENDERING_ON"] = "isBrowserRendering"; + VqlParameterNames["BROWSER_RENDERING_THRESHOLD"] = "browserRenderingThreshold"; + VqlParameterNames["CHARSET"] = "charset"; + VqlParameterNames["CLIENT_DIMENSION"] = "clientDimension"; + VqlParameterNames["CLIENT_IP"] = "client_ip"; + VqlParameterNames["CLIENT_NUM"] = "clientNum"; + VqlParameterNames["COLON_EMBEDDED"] = ":embedded"; + VqlParameterNames["COLON_MOBILE"] = ":mobile"; + VqlParameterNames["COLON_DEEP_LINKING_DISABLED"] = ":deepLinkingDisabled"; + VqlParameterNames["COLON_WATERMARK"] = ":watermark"; + VqlParameterNames["COMMENTS"] = ":comments"; + VqlParameterNames["COMMENTING_ENABLED"] = ":commentingEnabled"; + VqlParameterNames["COMMENTING_MENTIONS_ENABLED"] = ":commentingMentions"; + VqlParameterNames["CONNECTION"] = "connection"; + VqlParameterNames["CREATED_BY_FEATURE"] = "createdByFeature"; + VqlParameterNames["CRYPTED_PASSWORD"] = "crypted"; + VqlParameterNames["CSSDEBUG"] = ":cssdebug"; + VqlParameterNames["CSV"] = "csv"; + VqlParameterNames["CUSTOM_VIEWS"] = ":customViews"; + VqlParameterNames["CV"] = ":cv"; + VqlParameterNames["CV_ID"] = "cvId"; + VqlParameterNames["DASHBOARD_PORT_SIZE"] = "dashboardPortSize"; + VqlParameterNames["DATA_DETAILS"] = ":dataDetails"; + VqlParameterNames["DATASOURCE"] = "datasource"; + VqlParameterNames["DEBUG"] = ":debug"; + VqlParameterNames["DELAY"] = ":delay"; + VqlParameterNames["DEPTH"] = "depth"; + VqlParameterNames["DEVICE_TYPE"] = ":device"; + VqlParameterNames["DEVICE_PIXEL_RATIO"] = "devicePixelRatio"; + VqlParameterNames["DEVICE_PREVIEW_MODE"] = ":devicepreviewmode"; + VqlParameterNames["DIMENSIONS"] = ":dimensions"; + VqlParameterNames["DISABLE_SHARED_SESSIONS"] = ":disable_shared_sessions"; + VqlParameterNames["DISABLE_URL_ACTIONS_POPUPS"] = ":disableUrlActionsPopups"; + VqlParameterNames["DIRECTION"] = "direction"; + VqlParameterNames["DISPLAY_OVERLAY"] = ":display_overlay"; + VqlParameterNames["DISPLAY_SHARE"] = ":display_share"; + VqlParameterNames["DISPLAY_SPINNER"] = ":display_spinner"; + VqlParameterNames["DISPLAY_STATIC_IMAGE"] = ":display_static_image"; + VqlParameterNames["DISPLAY_TABS"] = "display_tabs"; + VqlParameterNames["DISPLAY_VIEW_COUNT"] = ":display_count"; + VqlParameterNames["IGNORE_STICKY_SESSION"] = ":ignore_sticky_session"; + VqlParameterNames["INCREMENT_VIEW_COUNT"] = ":increment_view_count"; + VqlParameterNames["DOCMODE"] = "docmode"; + VqlParameterNames["DOMAIN"] = "domain"; + VqlParameterNames["DO_WORK"] = "do_work"; + VqlParameterNames["DX"] = "dx"; + VqlParameterNames["DY"] = "dy"; + VqlParameterNames["EDIT_DATA_ALERT"] = ":editDataAlert"; + VqlParameterNames["EMBED"] = ":embed"; + VqlParameterNames["EMBEDDED"] = "embedded"; + VqlParameterNames["ENCRYPTED"] = "encrypted"; + VqlParameterNames["API_EXTERNAL_VERSION"] = ":apiExternalVersion"; + VqlParameterNames["API_INTERNAL_VERSION"] = ":apiInternalVersion"; + VqlParameterNames["EXCLUDE"] = "exclude"; + VqlParameterNames["EXPORT_FORMAT"] = ":export_format"; + VqlParameterNames["FIELDNAME"] = "fieldname"; + VqlParameterNames["FIELD_NAME"] = "field_name"; + VqlParameterNames["FIELD_SEP"] = "field_sep"; + VqlParameterNames["FILE"] = "file"; + VqlParameterNames["FILTER_TILE_SIZE"] = "filterTileSize"; + VqlParameterNames["FN"] = "fn"; + VqlParameterNames["FOCUS"] = "focus"; + VqlParameterNames["FORCE_CACHE"] = "force_cache"; + VqlParameterNames["FORMAT"] = "format"; + VqlParameterNames["FORMAT_DATA_VALUE_LOCALLY"] = "formatDataValueLocally"; + VqlParameterNames["FROM_WG"] = ":from_wg"; + VqlParameterNames["GRAPHQL_DATABASE_ID"] = ":graphQLDatabaseId"; + VqlParameterNames["GRAPHQL_TABLE_ID"] = ":graphQLTableId"; + VqlParameterNames["GUID"] = ":guid"; + VqlParameterNames["H"] = "h"; + VqlParameterNames["HIDDEN"] = "hidden"; + VqlParameterNames["HIDE_CLOSE_BUTTON"] = ":hideCloseButton"; + VqlParameterNames["HIDE_EDIT_BUTTON"] = ":hideEditButton"; + VqlParameterNames["HIDE_EDIT_IN_DESKTOP_BUTTON"] = ":hideEditInDesktopButton"; + VqlParameterNames["HIGH_DPI"] = ":highdpi"; + VqlParameterNames["IMAGE_SIZE_LIMIT"] = "imageSizeLimit"; + VqlParameterNames["TRANSPARENT_LINE_MARKS_LIMIT"] = "transparentLineMarkLimit"; + VqlParameterNames["CLIENT_RENDER_PIXEL_LIMIT"] = "clientRenderPixelLimit"; + VqlParameterNames["IN"] = "in"; + VqlParameterNames["INSTANCE_ID"] = ":iid"; + VqlParameterNames["IS_GUEST_REDIRECT_FROM_VIZPORTAL"] = ":isGuestRedirectFromVizportal"; + VqlParameterNames["IS_MARK_ANIMATION_ENABLED"] = "isMarkAnimationEnabled"; + VqlParameterNames["IS_VIZPORTAL"] = ":isVizPortal"; + VqlParameterNames["INPUT_"] = "input_string"; + VqlParameterNames["JSDEBUG"] = ":jsdebug"; + VqlParameterNames["JSON"] = "json"; + VqlParameterNames["JSON_ONLY"] = ":jsonOnly"; + VqlParameterNames["KEEPFILE"] = "keepfile"; + VqlParameterNames["KEY"] = "key"; + VqlParameterNames["LANGUAGE"] = "language"; + VqlParameterNames["LANGUAGE_REQUESTED"] = ":language"; + VqlParameterNames["LINKTARGET"] = ":linktarget"; + VqlParameterNames["LOAD_ORDER_ID"] = ":loadOrderID"; + VqlParameterNames["LOAD_NEWEST_REVISION"] = ":loadNewestRevision"; + VqlParameterNames["LOCAL_PATHS"] = ":localPaths"; + VqlParameterNames["LOCALE"] = "locale"; + VqlParameterNames["LOCATION_ID"] = "locationid"; + VqlParameterNames["LOCATION_TYPE"] = "locationtype"; + VqlParameterNames["WORKBOOK_LOCALE"] = "workbookLocale"; + VqlParameterNames["MAXROWS"] = "maxrows"; + VqlParameterNames["MAX_AGE"] = "maxAge"; + VqlParameterNames["MAX_ROWS"] = "maxRows"; + VqlParameterNames["METHOD"] = "method"; + VqlParameterNames["MOBILE"] = "mobile"; + VqlParameterNames["MODIFIER"] = "modifier"; + VqlParameterNames["NAME"] = "name"; + VqlParameterNames["NAV_TYPE"] = "navType"; + VqlParameterNames["NAV_SRC"] = "navSrc"; + VqlParameterNames["NOATTACHMENT"] = "no-attachment"; + VqlParameterNames["NO_OVERWRITE"] = "no_overwrite"; + VqlParameterNames["OPEN_AUTHORING_IN_TOP_WINDOW"] = ":openAuthoringInTopWindow"; + VqlParameterNames["OPENID_HD"] = ":openid_hd"; + VqlParameterNames["OPENID_LOGIN_HINT"] = ":openid_login_hint"; + VqlParameterNames["OAUTHREQUEST"] = "oauthrequest"; + VqlParameterNames["OAUTH_CREDENTIAL_IDS"] = "oauth_credential_ids"; + VqlParameterNames["OFFLINE_MODE"] = ":offlinemode"; + VqlParameterNames["ORIGIN"] = ":origin"; + VqlParameterNames["OVERLAY"] = ":overlay"; + VqlParameterNames["P"] = "p"; + VqlParameterNames["PATH"] = "path"; + VqlParameterNames["PANE_RESOLVER_X"] = "paneResolverX"; + VqlParameterNames["PANE_RESOLVER_Y"] = "paneResolverY"; + VqlParameterNames["PARAM"] = "param"; + VqlParameterNames["PARENT_ID"] = "parent_id"; + VqlParameterNames["PASSWORD"] = "password"; + VqlParameterNames["PATTERN"] = "pattern"; + VqlParameterNames["PIXEL_RATIO"] = ":pixelratio"; + VqlParameterNames["PREFIX"] = ":prefix"; + VqlParameterNames["PREVIEW"] = ":preview"; + VqlParameterNames["PRIMARY_CONTENT_URL"] = "primary_content_url"; + VqlParameterNames["PROJECT"] = "project"; + VqlParameterNames["PROTOCOL"] = "protocol"; + VqlParameterNames["PSEUDO"] = ":pseudo"; + VqlParameterNames["QUERY"] = "query"; + VqlParameterNames["R"] = "r"; + VqlParameterNames["RANGE_TYPE"] = "range_type"; + VqlParameterNames["RECORD_SEP"] = "record_sep"; + VqlParameterNames["RECORD_CLIENT_PERFORMANCE"] = ":record_client_performance"; + VqlParameterNames["RECORD_PERFORMANCE"] = ":record_performance"; + VqlParameterNames["RECOVER_OLD_SESSION_ID"] = ":recover_old_session_id"; + VqlParameterNames["RECOVER_SESSION_STATE_TICKETS"] = ":recover_session_state_tickets"; + VqlParameterNames["REFRESH"] = ":refresh"; + VqlParameterNames["REFRESHUNMODIFIED"] = ":refreshunmodified"; + VqlParameterNames["REGION"] = "region"; + VqlParameterNames["RELOAD_ON_CUSTOM_VIEW_SAVE"] = ":reloadOnCustomViewSave"; + VqlParameterNames["RENDER"] = ":render"; + VqlParameterNames["RENDER_MAPS_CLIENT_SIDE"] = "renderMapsClientSide"; + VqlParameterNames["RETRY"] = ":retry"; + VqlParameterNames["REUSE"] = "reuse"; + VqlParameterNames["REUSE_FOREVER"] = "reuse_forever"; + VqlParameterNames["REVERT"] = ":revert"; + VqlParameterNames["SAVE_DB_PASSWORDS"] = "save_db_passwords"; + VqlParameterNames["SELECT_X"] = "select_x"; + VqlParameterNames["SELECT_Y"] = "select_y"; + VqlParameterNames["SESSION_FEATURE_PREFIX"] = ":ff_"; + VqlParameterNames["SESSION_FLAGS"] = ":session_feature_flags"; + VqlParameterNames["SHARE_BUTTON"] = "share_button"; + VqlParameterNames["SHEET_ID"] = "sheet_id"; + VqlParameterNames["SHARED"] = "shared"; + VqlParameterNames["SHOWALL"] = "showall"; + VqlParameterNames["SHOW_APP_BANNER"] = ":showAppBanner"; + VqlParameterNames["SHOW_ASK_DATA"] = ":showAskData"; + VqlParameterNames["SHOW_PARAMS"] = "showParams"; + VqlParameterNames["SHOW_SHARE_OPTIONS"] = ":showShareOptions"; + VqlParameterNames["SIZE"] = ":size"; + VqlParameterNames["SOURCE"] = "source"; + VqlParameterNames["STATE"] = "state"; + VqlParameterNames["STICKY_SESSION_KEY"] = "stickySessionKey"; + VqlParameterNames["SUBSCRIPTIONS"] = ":subscriptions"; + VqlParameterNames["SUMMARY"] = "summary"; + VqlParameterNames["SUPPRESS_DEFAULT_EDIT_BEHAVIOR"] = ":suppressDefaultEditBehavior"; + VqlParameterNames["SYNC_SESSION"] = ":sync_session"; + VqlParameterNames["SYNC_SESSION_STATE"] = "sync_session_state"; + VqlParameterNames["TABS"] = ":tabs"; + VqlParameterNames["TARGET"] = "target"; + VqlParameterNames["TARGET_SITE"] = "target_site"; + VqlParameterNames["TOOLBAR"] = ":toolbar"; + VqlParameterNames["TOOLTIP"] = ":tooltip"; + VqlParameterNames["TS"] = "ts"; + VqlParameterNames["UNDERLYING_TABLE_ID"] = "underlying_table_id"; + VqlParameterNames["UNDERLYING_TABLE_CAPTION"] = "underlying_table_caption"; + VqlParameterNames["UPDATE_TYPE"] = "update_type"; + VqlParameterNames["USE_GUEST"] = ":useGuest"; + VqlParameterNames["USE_INLINE_IMAGES"] = "use_inline_images"; + VqlParameterNames["USERAGENT"] = "useragent"; + VqlParameterNames["USERNAME"] = "username"; + VqlParameterNames["VALUE"] = "value"; + VqlParameterNames["VERBOSE_MODE"] = "verboseMode"; + VqlParameterNames["VIEW_ID"] = "views_id"; + VqlParameterNames["VIZ_SNAPSHOT_ID"] = "viz_snapshot_id"; + VqlParameterNames["VW"] = ":vw"; + VqlParameterNames["W"] = "w"; + VqlParameterNames["WORKSHEET_PORT_SIZE"] = "worksheetPortSize"; + VqlParameterNames["WATERMARK"] = "watermark"; + VqlParameterNames["WATERMARK_MARGIN"] = ":watermark_margin"; + VqlParameterNames["WB"] = ":wb"; + VqlParameterNames["WHICH"] = "which"; + VqlParameterNames["X"] = "x"; + VqlParameterNames["Y"] = "y"; + VqlParameterNames["ZID"] = "zid"; + VqlParameterNames["ZONE_ID"] = "zone_id"; + VqlParameterNames["KEYCHAIN_VERSION"] = "keychain_version"; + VqlParameterNames["DATASOURCE_ID"] = "datasource_id"; + VqlParameterNames["DATASOURCE_NAME"] = "datasource_name"; + VqlParameterNames["LENS_ID"] = "lens_id"; + VqlParameterNames["WIDTH"] = "width"; + VqlParameterNames["HEIGHT"] = "height"; + // Default Layout params + VqlParameterNames["LAYOUT_VIEWS"] = "views"; + VqlParameterNames["LAYOUT_MENUS"] = "menus"; + VqlParameterNames["LAYOUT_GEOMETRY"] = "geometry"; + VqlParameterNames["LAYOUT_PAGES"] = "pages"; + VqlParameterNames["LAYOUT_CACHEURL"] = "cacheurl"; + VqlParameterNames["LAYOUT_SHEET"] = "sheet"; + VqlParameterNames["LAYOUT_DEPTH"] = "depth"; +})(VqlParameterNames || (VqlParameterNames = {})); +/** + * parameters that are only relevant when working with Tableau Public + * maybe not really necessry to split them out + */ +var PublicParameterNames; +(function (PublicParameterNames) { + PublicParameterNames["SHOW_VIZ_HOME"] = ":showVizHome"; + // display view count +})(PublicParameterNames || (PublicParameterNames = {})); +/** + * Map the parameter names as used in the url to what we call them publicly in the embedding library. + * The only parameters listed here should be the ones that get sent to vizql + * - this should match the interface at external-contract:VizInterfaces:VizSettings + */ +var VizOptionNames; +(function (VizOptionNames) { + // publicName = internalStringValue + VizOptionNames["Size"] = ":size"; + VizOptionNames["Embed"] = ":embed"; + VizOptionNames["ApiInternalVersion"] = ":apiInternalVersion"; + VizOptionNames["ApiExternalVersion"] = ":apiExternalVersion"; + VizOptionNames["ShowVizHome"] = ":showVizHome"; + VizOptionNames["Jsdebug"] = ":jsdebug"; + VizOptionNames["BootstrapWhenNotified"] = ":bootstrapWhenNotified"; + VizOptionNames["NavType"] = "navType"; + VizOptionNames["NavSrc"] = "navSrc"; + VizOptionNames["debug"] = ":jsdebug"; + VizOptionNames["ApiID"] = ":apiID"; + VizOptionNames["disableUrlActionsPopups"] = ":disableUrlActionsPopups"; + VizOptionNames["hideTabs"] = ":tabs"; + VizOptionNames["toolbar"] = ":toolbar"; + VizOptionNames["device"] = ":device"; + VizOptionNames["instanceIdToClone"] = ":iid"; + VizOptionNames["touchOptimize"] = "mobile"; + VizOptionNames["hideEditButton"] = ":hideEditButton"; + VizOptionNames["hideEditInDesktopButton"] = ":hideEditInDesktopButton"; + VizOptionNames["suppressDefaultEditBehavior"] = ":suppressDefaultEditBehavior"; + VizOptionNames["hideCloseButton"] = ":hideCloseButton"; +})(VizOptionNames = exports.VizOptionNames || (exports.VizOptionNames = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js": +/*!****************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js ***! + \****************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const guid = __webpack_require__(/*! guid */ "../../node_modules/guid/guid.js"); +const JsApiInternalContract_1 = __webpack_require__(/*! ../JsApiInternalContract */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const CrossFramePreparedMessage_1 = __webpack_require__(/*! ./CrossFramePreparedMessage */ "../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js"); +const MessageTypeChecks_1 = __webpack_require__(/*! ./MessageTypeChecks */ "../api-internal-contract-js/lib/src/messaging/MessageTypeChecks.js"); +const MessageTypes_1 = __webpack_require__(/*! ./interface/MessageTypes */ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js"); +/** + * The CrossFrameMessenger is the primary export from the api-messaging module. An instance of + * this class can be instantiated on both sides of a frame boundary to facilitate communication + * in both directions between the frames. This class implements both the dispatcher and the listener + * portions, but doesn't require callers to care about both. + */ +class CrossFrameMessenger { + /** + * Creates an instance of CrossFrameMessenger. If you would like to use the CrossFrameMessenger as a MessageListener, + * be sure to call StartListening and register message handlers. + * @param thisWindow The window object which the CrossFrameMessenger lives. An onMessage listener will be added here. + * @param [otherWindow] Optional otherWindow which messages will be posted to. + * If defined, incoming messages must originate from otherWindow to be passed on + * @param [otherWindowOrigin] The target origin which otherWindow must have in order to receive dispatched messages. + * This value will be sent as the targetOrigin of a postMessage + * (https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) + */ + constructor(thisWindow, otherWindow, otherWindowOrigin) { + this.thisWindow = thisWindow; + this.otherWindow = otherWindow; + this.otherWindowOrigin = otherWindowOrigin; + // Make sure to call StartListening + } + ///// MessageListener Implementation + startListening() { + // Check if we already are listening, if not, hook up a message listener + if (!this.unregisterFunction) { + const boundHandler = this.onMessageReceived.bind(this); + this.thisWindow.addEventListener('message', boundHandler, true); + this.unregisterFunction = () => this.thisWindow.removeEventListener('message', boundHandler, true); + } + } + stopListening() { + // Stop listening if we have started listening + if (this.unregisterFunction) { + this.unregisterFunction(); + this.unregisterFunction = undefined; + } + } + setInitializeMessageHandler(handler) { + this.initializeMessageHandler = handler; + } + setCommandResponseMessageHandler(handler) { + this.commandResponseMessageHandler = handler; + } + setCommandMessageHandler(handler) { + this.commandMessageHandler = handler; + } + setNotificationMessageHandler(handler) { + this.notificationMessageHandler = handler; + } + setHandshakeMessageHandler(handler) { + this.handshakeMessageHandler = handler; + } + ///// MessageDispatcher Implementation + /** + * @param apiVersion api-internal-contract-js version (exported in JsApiInternalConntract) + * @param crossFrameVersion crossframe messaging version (exported in JsApiInternalConntract) + * @param options additional options that can be passed at initialization (information about the version of + * external being used for example) + */ + prepareInitializationMessage(apiVersion, crossFrameVersion, options) { + const message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.Initialize, + crossFrameVersion: crossFrameVersion, + apiVersion: apiVersion, + options: options, + }; + return this.prepareMessage(message); + } + prepareCommandMessage(verbId, parameters) { + const message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.Command, + verbId: verbId, + parameters: parameters, + }; + return this.prepareMessage(message); + } + prepareCommandResponseMessage(commandGuid, data, error) { + const message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.CommandResponse, + commandGuid: commandGuid, + data: data, + error: error, + }; + if (error) { + // stringify error object to remove unserializable fields like functions and prevent serialization errors + message.error = JSON.parse(JSON.stringify(error)); + } + return this.prepareMessage(message); + } + prepareNotificationMessage(notificationId, data) { + const message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.Notification, + notificationId: notificationId, + data: data, + }; + return this.prepareMessage(message); + } + prepareAckMessage() { + const message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.Ack, + platformVersion: JsApiInternalContract_1.INTERNAL_CONTRACT_VERSION, + }; + return this.prepareMessage(message); + } + /** + * Prepares a pending message for sending and returns the prepared message + * + * @param msg The message to be sent to this.otherWindow + * @returns The prepared message + */ + prepareMessage(msg) { + if (!this.otherWindow || !this.otherWindowOrigin) { + throw 'Other window not initialized, cannot dispatch messages'; + } + const preparedMessage = new CrossFramePreparedMessage_1.CrossFramePreparedMessage(msg, this.otherWindow, this.otherWindowOrigin); + return preparedMessage; + } + /** + * Called when a message is received. Does some validation of the message, and then + * calls an appropriate message handler if one is defined + * + * @param event The incoming MessageEvent + */ + onMessageReceived(event) { + // If we have an otherWindow defined, make sure the message is coming from there + if (this.otherWindow && event.source !== this.otherWindow) { + return; + } + // Do some validation on event.data to make sure that we have received a real message + if (!event.data) { + return; + } + const message = event.data; + if (!MessageTypeChecks_1.isMessage(message)) { + return; + } + // Check the declared message type, validate the message, and call an appropriate hander if one exists + switch (message.msgType) { + case MessageTypes_1.MessageType.Initialize: { + if (!MessageTypeChecks_1.isInitMessage(message) || !this.initializeMessageHandler) { + return; + } + this.initializeMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.CommandResponse: { + if (!MessageTypeChecks_1.isCommandResponseMessage(message) || !this.commandResponseMessageHandler) { + return; + } + this.commandResponseMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.Command: { + if (!MessageTypeChecks_1.isCommandMessage(message) || !this.commandMessageHandler) { + return; + } + this.commandMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.Notification: { + if (!MessageTypeChecks_1.isNotificationMessage(message) || !this.notificationMessageHandler) { + return; + } + this.notificationMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.Handshake: { + if (!MessageTypeChecks_1.isHandshakeMessage(message) || !this.handshakeMessageHandler) { + return; + } + this.handshakeMessageHandler(message, event.source); + break; + } + default: + // Just ignore this since we don't know how to handle the message type + } + } + setOtherWindow(otherWindow) { + this.otherWindow = otherWindow; + } + setOtherWindowOrigin(origin) { + this.otherWindowOrigin = origin; + } +} +exports.CrossFrameMessenger = CrossFrameMessenger; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js": +/*!**********************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the PreparedMessage interface used to post messages between + * two frames using window.postMessage + */ +class CrossFramePreparedMessage { + /** + * Creates an instance of CrossFramePreparedMessage. + * @param _message The message to be sent + * @param _target The target window where the message will be sent + * @param _origin The targetOrigin where this message can be received + */ + constructor(_message, _target, _origin) { + this._message = _message; + this._target = _target; + this._origin = _origin; + } + get messageGuid() { + return this._message.msgGuid; + } + send() { + this._target.postMessage(this._message, this._origin); + return this; + } +} +exports.CrossFramePreparedMessage = CrossFramePreparedMessage; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/MessageTypeChecks.js": +/*!**************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/MessageTypeChecks.js ***! + \**************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const guid = __webpack_require__(/*! guid */ "../../node_modules/guid/guid.js"); +const Notifications_1 = __webpack_require__(/*! ../contract/Notifications */ "../api-internal-contract-js/lib/src/contract/Notifications.js"); +const MessageTypes_1 = __webpack_require__(/*! ./interface/MessageTypes */ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js"); +const expectedEmptyNotifications = new Set([ + Notifications_1.NotificationId.EditButtonClicked, + Notifications_1.NotificationId.EditInDesktopButtonClicked, + Notifications_1.NotificationId.WorkbookPublished, + Notifications_1.NotificationId.WorkbookReadyToClose, + Notifications_1.NotificationId.ReadyToReceiveAuthToken, +]); +/* tslint:disable no-any */ +function isMessage(data) { + if (!data) { + return false; + } + const message = data; + if (!message || !message.msgGuid || !message.msgType) { + return false; + } + if (!guid.isGuid(message.msgGuid)) { + return false; + } + if (typeof message.msgType !== 'string') { + return false; + } + const messageTypes = [ + MessageTypes_1.MessageType.Command, + MessageTypes_1.MessageType.CommandResponse, + MessageTypes_1.MessageType.Initialize, + MessageTypes_1.MessageType.Notification, + MessageTypes_1.MessageType.Handshake, + ]; + if (messageTypes.indexOf(message.msgType) < 0) { + return false; + } + return true; +} +exports.isMessage = isMessage; +function isVersion(versionNumber) { + if (!versionNumber) { + return false; + } + const v = versionNumber; + if (typeof v !== 'object') { + return false; + } + if (typeof v.fix !== 'number' || typeof v.minor !== 'number' || typeof v.major !== 'number') { + return false; + } + return true; +} +exports.isVersion = isVersion; +function isInitMessage(message) { + if (!isMessage(message)) { + return false; + } + const initMessage = message; + if (initMessage.msgType !== MessageTypes_1.MessageType.Initialize) { + return false; + } + if (!initMessage.apiVersion || !isVersion(initMessage.apiVersion)) { + return false; + } + if (!initMessage.crossFrameVersion || !isVersion(initMessage.crossFrameVersion)) { + return false; + } + return true; +} +exports.isInitMessage = isInitMessage; +function isCommandResponseMessage(message) { + if (!isMessage(message)) { + return false; + } + const crMessage = message; + if (crMessage.msgType !== MessageTypes_1.MessageType.CommandResponse) { + return false; + } + if (!guid.isGuid(crMessage.commandGuid)) { + return false; + } + if (!crMessage.data && !crMessage.error) { + return false; + } + return true; +} +exports.isCommandResponseMessage = isCommandResponseMessage; +function isCommandMessage(message) { + if (!isMessage(message)) { + return false; + } + const commandMessage = message; + if (commandMessage.msgType !== MessageTypes_1.MessageType.Command) { + return false; + } + if (!commandMessage.parameters || typeof commandMessage.parameters !== 'object') { + return false; + } + if (!commandMessage.verbId || typeof commandMessage.verbId !== 'string') { + return false; + } + return true; +} +exports.isCommandMessage = isCommandMessage; +function isNotificationMessage(message) { + if (!isMessage(message)) { + return false; + } + const notificationMessage = message; + if (notificationMessage.msgType !== MessageTypes_1.MessageType.Notification) { + return false; + } + if (!notificationMessage.data && !expectedEmptyNotifications.has(notificationMessage.notificationId)) { + return false; + } + if (!notificationMessage.notificationId || typeof notificationMessage.notificationId !== 'string') { + return false; + } + return true; +} +exports.isNotificationMessage = isNotificationMessage; +function isHandshakeMessage(message) { + if (!isMessage(message)) { + return false; + } + const handshakeMessage = message; + if (handshakeMessage.msgType !== MessageTypes_1.MessageType.Handshake) { + return false; + } + return true; +} +exports.isHandshakeMessage = isHandshakeMessage; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js": +/*!*******************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js ***! + \*******************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Enum defining the 4 different types of messages we have defined + */ +var MessageType; +(function (MessageType) { + MessageType["Initialize"] = "initialize"; + MessageType["Notification"] = "notification"; + MessageType["Command"] = "command"; + MessageType["CommandResponse"] = "command-response"; + MessageType["Handshake"] = "v-handshake"; + MessageType["Ack"] = "v-ack"; +})(MessageType = exports.MessageType || (exports.MessageType = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js": +/*!**********************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// tslint:disable:no-any +/** + * This version converter doesn't actually do anything but is useful for testing or when we have + * a matching platform and internal version number + */ +class IdentityVersionConverter { + upgradeExecuteCall(verb, parameters) { + return { + verb: verb, + parameters: parameters, + }; + } + downgradeExecuteReturn(executeResponse) { + return executeResponse; + } + downgradeNotification(notification) { + return notification; + } +} +exports.IdentityVersionConverter = IdentityVersionConverter; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js": +/*!**********************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// tslint:disable:no-any +/** + * The version converter is designed to allow the platform and external modules + * to seemlessly communicate over two different versions of the internal API. The only + * mode it supports is external's version <= platform's version. When executing + * commands, it is used to upgrade the external representation to what platform knows on the way in + * and downgrade the representations on the way out. Similarly for notifications, it can + * downgrade those on the way from platform to external. + */ +class StackingVersionConverter { + /** + * Creates a new instance of the StackingVersionConverter + * + * @param _externalMajorVersion The major version of the internal contract api-external-js is using + * @param _platformMajorVersion The major version of the internal contract the api-platform-js is using + * @param _upgradeExecuteTranslations Ordered list of the translations to perform when upgrading cmd parameters + * @param _downgradeExecuteTranslations Ordered list of downgrade translations to perform after a cmd + * @param _downgradeNotificationTranslations Ordered list of downgrade translations to perform on a notification + */ + constructor(_externalMajorVersion, _platformMajorVersion, _upgradeExecuteTranslations, _downgradeExecuteTranslations, _downgradeNotificationTranslations) { + this._externalMajorVersion = _externalMajorVersion; + this._platformMajorVersion = _platformMajorVersion; + this._upgradeExecuteTranslations = _upgradeExecuteTranslations; + this._downgradeExecuteTranslations = _downgradeExecuteTranslations; + this._downgradeNotificationTranslations = _downgradeNotificationTranslations; + if (this._externalMajorVersion > this._platformMajorVersion) { + throw new Error(`Cannot convert between external version ${this._externalMajorVersion} and ${this._platformMajorVersion}`); + } + } + /** + * Creates a new instance of the StackingVersionConverter + * + * @param _externalVersion The version of the internal contract api-external-js is using + * @param _platformVersion The version of the internal contract the api-platform-js is using + * @param _upgradeExecuteTranslations Ordered list of the translations to perform when upgrading cmd parameters + * @param _downgradeExecuteTranslations Ordered list of downgrade translations to perform after a cmd + * @param _downgradeNotificationTranslations Ordered list of downgrade translations to perform on a notification + */ + static fromData(externalVersion, platformVersion, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations) { + return new this(externalVersion.major, platformVersion.major, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations); + } + upgradeExecuteCall(verb, parameters) { + // Perform the upgrade of the verb and parameters to the level that platform is using + let upgraded = { verb: verb, parameters: parameters }; + for (const upgradeTranslation of this._upgradeExecuteTranslations) { + upgraded = upgradeTranslation(upgraded.verb, upgraded.parameters); + } + return upgraded; + } + downgradeExecuteReturn(executeResponse) { + // Downgrade the response to what the external module is expecting + let downgraded = executeResponse; + for (const downgradeTranslation of this._downgradeExecuteTranslations) { + downgraded = downgradeTranslation(downgraded); + } + return downgraded; + } + downgradeNotification(notification) { + // Downgrade the notification to what the external module is expecting + let downgraded = notification; + for (const downgradeTranslation of this._downgradeNotificationTranslations) { + downgraded = downgradeTranslation(downgraded); + } + return downgraded; + } +} +exports.StackingVersionConverter = StackingVersionConverter; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js": +/*!*********************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js ***! + \*********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const IdentityVersionConverter_1 = __webpack_require__(/*! ./IdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js"); +const StackingVersionConverter_1 = __webpack_require__(/*! ./StackingVersionConverter */ "../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js"); +const VersionTranslations_1 = __webpack_require__(/*! ./VersionTranslations */ "../api-internal-contract-js/lib/src/versioning/VersionTranslations.js"); +/** + * @returns true if lhs < rhs (ignoring fix number) + * @param lhs + * @param rhs + */ +function VersionLessThan(lhs, rhs) { + if (lhs.major > rhs.major) { + return false; + } + if (lhs.major < rhs.major) { + return true; + } + return lhs.minor < rhs.minor; +} +exports.VersionLessThan = VersionLessThan; +/** + * @returns true if lhs == rhs (ignoring fix number) + * @param lhs + * @param rhs + */ +function VersionEqualTo(lhs, rhs) { + return lhs.major === rhs.major && lhs.minor === rhs.minor; +} +exports.VersionEqualTo = VersionEqualTo; +// A mapping from an older client version of internal-contract to the current platform version of this contract. +// Each version bump can have an array of translations to perform in order. Notice that this is +// different than the major upgrades/downgrades above because it handles both major and minor version changes. +// Also please note: downgradeExecuteCall is handled on the client/external side rather than platform side. +// When updating the major or minor version of our internal-contract, you will need to update these data structures. +// * If there are translations to add, add them to the version to "upgrade from" or "downgrade to". +exports.ExecuteMinorUpgrades = { + 1: { + 9: [], + }, +}; +exports.ExecuteMinorDowngrades = { + 1: { + 5: [VersionTranslations_1.DowngradeWorksheetNames], + 9: [], + 175: [VersionTranslations_1.DowngradeWorksheetFomatting175], + 182: [VersionTranslations_1.DowngradeExtensionEnvironmentContext], + }, +}; +exports.NotificationMinorDowngrades = { + 1: { + 9: [], + 10: [VersionTranslations_1.DowngradeFlipboardZoneID], + 175: [VersionTranslations_1.DowngradeWorksheetFomattingNotification175], + }, +}; +/** + * Creates a new InternalContractVersionConverter which has the ability to upgrade and downgrade the contract + * between the two versions, which are specified. If externalMajorVersion is greater than platformMajorVersion, + * an error will be thrown because we won't know how to do those conversions. + * This converter can handle both major and minor updates when the platform version is greater than external version. + * + * @param externalVersion VersionNumber of the internal api which the external module is using + * @param platformVersion VersionNumber of the internal api which the platform is using + */ +function CreateVersionConverter(externalVersion, platformVersion) { + return CreateVersionConverterWithTranslators(externalVersion, platformVersion, exports.ExecuteMinorUpgrades, exports.ExecuteMinorDowngrades, exports.NotificationMinorDowngrades); +} +exports.CreateVersionConverter = CreateVersionConverter; +/** + * Implementation of CreateVersionConverter. This function takes the upgrade, downgrade, and + * notification arrays so that all the logic can be tested. + * + * @param externalVersion VersionNumber of the internal api which the external module is using + * @param platformVersion VersionNumber of the internal api which the platform is using + * @param upgrades MajorMinorTranslators for upgrades + * @param downgrades MajorMinorTranslators for downgrades + * @param notificationDowngrades MajorMinorTranslators for notification downgrades + */ +function CreateVersionConverterWithTranslators(externalVersion, platformVersion, upgrades, downgrades, notificationDowngrades) { + const externalMajorVersion = externalVersion.major; + const externalMinorVersion = externalVersion.minor; + const platformMajorVersion = platformVersion.major; + if (externalMajorVersion > platformMajorVersion) { + throw new Error(`External version must be less than or equal to platform version. + externalMajorVersion=${externalMajorVersion} platformMajorVersion=${platformMajorVersion}`); + } + // If we are using the exact same versions (major.minor), just use the identity converter + if (VersionEqualTo(externalVersion, platformVersion)) { + return new IdentityVersionConverter_1.IdentityVersionConverter(); + } + // Walk the span between the versions we have here and collect the upgrade and downgrades necessary + const neededExecuteUpgrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, upgrades); + const neededExecuteDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, downgrades); + const neededNotificationDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, notificationDowngrades); + // We want to apply the downgrades in reverse order in case of dependencies between them + neededExecuteDowngrades.reverse(); + neededNotificationDowngrades.reverse(); + return StackingVersionConverter_1.StackingVersionConverter.fromData(externalVersion, platformVersion, neededExecuteUpgrades, neededExecuteDowngrades, neededNotificationDowngrades); +} +exports.CreateVersionConverterWithTranslators = CreateVersionConverterWithTranslators; +function GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, majorMinorTranslators) { + const neededTranslations = []; + for (let major = externalMajorVersion; major <= platformMajorVersion; major++) { + if (major in majorMinorTranslators) { + const start = major === externalMajorVersion ? externalMinorVersion : 0; + const maximumMinorVersion = GetMaximumMinorIndex(Object.keys(majorMinorTranslators[major])); + for (let minor = start; minor <= maximumMinorVersion; minor++) { + if (minor in majorMinorTranslators[major]) { + neededTranslations.push(...majorMinorTranslators[major][minor]); + } + } + } + } + return neededTranslations; +} +function GetMaximumMinorIndex(minorVersions) { + return minorVersions.map((a) => Number(a)).reduce((a, b) => (a > b ? a : b)); +} +exports.GetMaximumMinorIndex = GetMaximumMinorIndex; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/VersionTranslations.js": +/*!*****************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/VersionTranslations.js ***! + \*****************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const JsApiInternalContract_1 = __webpack_require__(/*! ../JsApiInternalContract */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const Notifications_1 = __webpack_require__(/*! ../contract/Notifications */ "../api-internal-contract-js/lib/src/contract/Notifications.js"); +// This is where we will start to define some of these translations. +// When modifying existing models, add the requisite conversion functions here, then use them +// in the VersionConverterFactory implementation. Import old versions as you would any other module +// 0 <-> Translations +// Uncomment this line to import from the V0 definition of the API +// import * as V0 from '@tableau-api-internal-contract-js_v0'; +// 1 <-> 2 Translations +// Uncomment this line to import from the V1 definition of the API +// import * as V1 from '@tableau-api-internal-contract-js_v1'; +function DowngradeWorksheetNames(executeResponse) { + // Fix the dashboard friendly name issue. The structures are compatible, + // so we still return the original reply, but we copy the SheetInfo.name + // into the DashboardZone.name, where v1 wants to find it. + const bootstrapInfo = executeResponse.result; + if (bootstrapInfo.extensionDashboardInfo !== undefined) { + bootstrapInfo.extensionDashboardInfo.zones.forEach((zone) => { + if (zone.sheetInfo) { + zone.name = zone.sheetInfo.name; + } + }); + } + return executeResponse; +} +exports.DowngradeWorksheetNames = DowngradeWorksheetNames; +function DowngradeFlipboardZoneID(notification) { + // Fix the FlipboardZoneId issue. Older external versions still check for flipboardZoneIDs. + // When running against a newer server, if flipboardZoneId is absent, set it to default(0). + if (notification.notificationId === Notifications_1.NotificationId.SelectedMarksChanged) { + const visualModel = notification.data; + if (visualModel.flipboardZoneID === undefined) { + visualModel.flipboardZoneID = 0; + } + } + return notification; +} +exports.DowngradeFlipboardZoneID = DowngradeFlipboardZoneID; +// Filter out formatting sheets that are specified in the classNames list +function DowngradeWorksheetFormatting(executeResponse, classNames) { + var _a, _b; + const bootstrapInfo = executeResponse.result; + if ((_b = (_a = bootstrapInfo) === null || _a === void 0 ? void 0 : _a.extensionWorksheetInfo) === null || _b === void 0 ? void 0 : _b.formatting) + bootstrapInfo.extensionWorksheetInfo.formatting.formattingSheets = + bootstrapInfo.extensionWorksheetInfo.formatting.formattingSheets.filter((x) => !classNames.includes(x.classNameKey)); + return executeResponse; +} +// Filter out formatting sheets that are specified in the classNames list +// Filter out formatting sheets that are specified in the classNames list +function DowngradeWorksheetFormattingNotification(notification, classNames) { + if (notification.notificationId === Notifications_1.NotificationId.WorksheetFormattingChanged) { + const formatting = notification.data; + notification.data = formatting.formattingSheets.filter((x) => !classNames.includes(x.classNameKey)); + } + return notification; +} +// We added new enum values for ClassNameKeys enum in 176. Need to filter them out if the client version is <176 +const ClassNameKeysToFilter175 = ["tableau-row-dividers" /* RowDividers */, "tableau-column-dividers" /* ColumnDividers */, "tableau-pane" /* Pane */]; +exports.DowngradeWorksheetFomatting175 = (response) => DowngradeWorksheetFormatting(response, ClassNameKeysToFilter175); +exports.DowngradeWorksheetFomattingNotification175 = (notification) => DowngradeWorksheetFormattingNotification(notification, ClassNameKeysToFilter175); +function DowngradeExtensionEnvironmentContext(executeResponse) { + // Fix the extension environment context issue. Replaces new enum values that go unrecognized + // by older extensions with their respective older enum values. + const bootstrapInfo = executeResponse.result; + if (bootstrapInfo.extensionEnvironment !== undefined) { + const context = bootstrapInfo.extensionEnvironment.extensionContext; + if (context === JsApiInternalContract_1.ExtensionContext.PublicWeb || context === JsApiInternalContract_1.ExtensionContext.Cloud) { + bootstrapInfo.extensionEnvironment.extensionContext = JsApiInternalContract_1.ExtensionContext.Server; + } + else if (context === JsApiInternalContract_1.ExtensionContext.PublicDesktop) { + bootstrapInfo.extensionEnvironment.extensionContext = JsApiInternalContract_1.ExtensionContext.Desktop; + } + } + return executeResponse; +} +exports.DowngradeExtensionEnvironmentContext = DowngradeExtensionEnvironmentContext; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js": +/*!***************************************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js ***! + \***************************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// tslint:disable:no-any +/** + * This version converter doesn't actually do anything but is useful for testing or when we have + * a matching platform and external version number + */ +class ExternalIdentityVersionConverter { + downgradeExecuteCall(verb, parameters) { + return { + verb: verb, + parameters: parameters, + }; + } + upgradeExecuteReturn(executeResponse, verb, parameters) { + return executeResponse; + } + upgradeNotification(notification) { + return notification; + } +} +exports.ExternalIdentityVersionConverter = ExternalIdentityVersionConverter; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js": +/*!***************************************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js ***! + \***************************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// tslint:disable:no-any +/** + * The version converter is designed to allow the platform and external modules + * to seemlessly communicate over two different versions of the internal API. This converter + * supports external's version(minor) >= platform's version(minor). When executing + * commands, it is used to downgrade the external representation to what platform knows on the way in + * and upgrade the representations on the way out. + */ +class ExternalStackingVersionConverter { + /** + * Creates a new instance of the StackingVersionConverter + * + * @param _externalVersion The version of the internal contract api-external-js is using + * @param _platformVersion The version of the internal contract the api-platform-js is using + * @param _downgradeExecuteCallTranslations Ordered list of the translations to perform when downgrading cmd parameters + * @param _upgradeExecuteReturnTranslations Ordered list of upgrade translations to perform after a cmd is executed + * @param _upgradeNotificationTranslations Ordered list of upgrade notfications to perform on events + */ + constructor(_externalVersion, _platformVersion, _downgradeExecuteCallTranslations, _upgradeExecuteReturnTranslations, _upgradeNotificationTranslations) { + this._externalVersion = _externalVersion; + this._platformVersion = _platformVersion; + this._downgradeExecuteCallTranslations = _downgradeExecuteCallTranslations; + this._upgradeExecuteReturnTranslations = _upgradeExecuteReturnTranslations; + this._upgradeNotificationTranslations = _upgradeNotificationTranslations; + if (this._externalVersion.major > this._platformVersion.major) { + throw new Error(`Cannot convert between external version ${this._externalVersion.major} + and ${this._platformVersion.major}`); + } + } + downgradeExecuteCall(verb, parameters) { + // Perform the downgrade of the verb and parameters to the level that platform is using + let downgraded = { verb: verb, parameters: parameters }; + for (const downgradeTranslation of this._downgradeExecuteCallTranslations) { + downgraded = downgradeTranslation(downgraded.verb, downgraded.parameters); + } + return downgraded; + } + upgradeExecuteReturn(executeResponse, verb, parameters) { + // Perform the upgrade of the response to what the external module is expecting + let upgraded = executeResponse; + for (const upgradeTranslation of this._upgradeExecuteReturnTranslations) { + upgraded = upgradeTranslation(upgraded, verb, parameters); + } + return upgraded; + } + upgradeNotification(notification) { + // Perform the upgrade of notification to what the external module is expecting + let upgraded = notification; + for (const upgradeNotification of this._upgradeNotificationTranslations) { + upgraded = upgradeNotification(upgraded); + } + return upgraded; + } +} +exports.ExternalStackingVersionConverter = ExternalStackingVersionConverter; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js": +/*!**************************************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js ***! + \**************************************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const VersionConverterFactory_1 = __webpack_require__(/*! ../VersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js"); +const ExternalIdentityVersionConverter_1 = __webpack_require__(/*! ./ExternalIdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js"); +const ExternalStackingVersionConverter_1 = __webpack_require__(/*! ./ExternalStackingVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js"); +// A mapping from the current client version of internal-contract to an older platform version of the contract. +// Each version bump can have an array of translations to perform in order. +// These translations handle downgradeExecuteCall and upgradeExecuteReturn and are meant to be called on the +// client/external side. +// When updating the major or minor version of our internal-contract, you will need to update these data structures. +// * If there are translations to add, add them to the version to 'upgrade from' or 'downgrade to'. +exports.ExecuteMinorDowngradeCallExternal = { + 1: { + 9: [], + }, +}; +exports.ExecuteMinorUpgradeReturnExternal = { + 1: { + 9: [], + }, +}; +exports.ExecuteMinorUpgradeNotification = { + 1: { + 9: [], + }, +}; +/** + * Creates a new ExternalContractVersionConverter which has the ability to upgrade and downgrade + * the contract between the two versions which are specified. If externalMajorVersion is less than + * platformMajorVersion, an ExternalIdentityVersionConverter will be returned. + * Handles upgrade/downgrade for both major and minor updates. + * + * @param externalVersion VersionNumber of the internal api which the external module is using + * @param platformVersion VersionNumber of the internal api which the platform is using + */ +function CreateExternalCompatibleVersionConverter(externalVersion, platformVersion) { + return CreateExternalCompatibleVersionConverterWithTranslators(externalVersion, platformVersion, exports.ExecuteMinorDowngradeCallExternal, exports.ExecuteMinorUpgradeReturnExternal, exports.ExecuteMinorUpgradeNotification); +} +exports.CreateExternalCompatibleVersionConverter = CreateExternalCompatibleVersionConverter; +/** + * Implementation of CreateExternalCompatibleVersionConverterWithTranslators. + * This function takes the upgrade, downgrade arrays so that all the logic can be tested. + * + * @param externalVersion VersionNumber of the internal contract which the external module is using + * @param platformVersion VersionNumber of the internal contract which the platform is using + * @param upgrades MajorMinorTranslators for response upgrades + * @param downgrades MajorMinorTranslators for execute call downgrades + */ +function CreateExternalCompatibleVersionConverterWithTranslators(externalVersion, platformVersion, downgrades, upgrades, upgradeNotifications) { + const externalMajorVersion = externalVersion.major; + const platformMajorVersion = platformVersion.major; + const platformMinorVersion = platformVersion.minor; + // This check is present in VersionConverterFactory. We throw the same error here as well. + // Hence we only need to check the minor versions for translations. + if (externalMajorVersion > platformMajorVersion) { + throw new Error(`External version must be less than or equal to platform version. + externalMajorVersion=${externalMajorVersion} platformMajorVersion=${platformMajorVersion}`); + } + if (externalMajorVersion < platformMajorVersion || VersionConverterFactory_1.VersionEqualTo(externalVersion, platformVersion)) { + return new ExternalIdentityVersionConverter_1.ExternalIdentityVersionConverter(); + } + // Walk the span between the versions we have here and collect the upgrade and downgrades necessary + const neededExecuteCallDowngrade = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, downgrades); + const neededExecuteReturnUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgrades); + const neededNotificationUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgradeNotifications); + // Reverse the downgrade calls, so that we start the downgrade from the external version to the platform version + neededExecuteCallDowngrade.reverse(); + return new ExternalStackingVersionConverter_1.ExternalStackingVersionConverter(externalVersion, platformVersion, neededExecuteCallDowngrade, neededExecuteReturnUpgrades, neededNotificationUpgrades); +} +exports.CreateExternalCompatibleVersionConverterWithTranslators = CreateExternalCompatibleVersionConverterWithTranslators; +function GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, majorMinorTranslators) { + const neededTranslations = []; + if (platformMajorVersion in majorMinorTranslators) { + const start = platformMinorVersion; + const maximumMinorVersion = VersionConverterFactory_1.GetMaximumMinorIndex(Object.keys(majorMinorTranslators[platformMajorVersion])); + for (let minor = start; minor <= maximumMinorVersion; minor++) { + if (minor in majorMinorTranslators[platformMajorVersion]) { + neededTranslations.push(...majorMinorTranslators[platformMajorVersion][minor]); + } + } + } + return neededTranslations; +} + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared.js": +/*!*********************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +// Export everything which had been previously in the api-shared module +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +var ApiVersion_1 = __webpack_require__(/*! ./ApiShared/ApiVersion */ "../api-shared-js/lib/src/ApiShared/ApiVersion.js"); +exports.ApiVersion = ApiVersion_1.ApiVersion; +__export(__webpack_require__(/*! ./ApiShared/CrossFrame/CrossFrameBootstrap */ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js")); +var CrossFrameDispatcher_1 = __webpack_require__(/*! ./ApiShared/CrossFrame/CrossFrameDispatcher */ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js"); +exports.CrossFrameDispatcher = CrossFrameDispatcher_1.CrossFrameDispatcher; +var DataSource_1 = __webpack_require__(/*! ./ApiShared/DataSource */ "../api-shared-js/lib/src/ApiShared/DataSource.js"); +exports.DataSource = DataSource_1.DataSource; +var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ./ApiShared/EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +exports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings; +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ./ApiShared/EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +exports.InternalToExternalEnumMappings = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings; +var EventListenerManager_1 = __webpack_require__(/*! ./ApiShared/EventListenerManager */ "../api-shared-js/lib/src/ApiShared/EventListenerManager.js"); +exports.EventListenerManager = EventListenerManager_1.EventListenerManager; +var Field_1 = __webpack_require__(/*! ./ApiShared/Field */ "../api-shared-js/lib/src/ApiShared/Field.js"); +exports.Field = Field_1.Field; +var CustomViewImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/CustomViewImpl */ "../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js"); +exports.CustomViewImpl = CustomViewImpl_1.CustomViewImpl; +var DashboardImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/DashboardImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js"); +exports.DashboardImpl = DashboardImpl_1.DashboardImpl; +var DashboardObjectImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/DashboardObjectImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js"); +exports.DashboardObjectImpl = DashboardObjectImpl_1.DashboardObjectImpl; +var DataSourceImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/DataSourceImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); +exports.DataSourceImpl = DataSourceImpl_1.DataSourceImpl; +var ParameterImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/ParameterImpl */ "../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js"); +exports.ParameterImpl = ParameterImpl_1.ParameterImpl; +var SheetImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +exports.SheetImpl = SheetImpl_1.SheetImpl; +var SheetInfoImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/SheetInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js"); +exports.SheetInfoImpl = SheetInfoImpl_1.SheetInfoImpl; +var SingleEventManagerImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/SingleEventManagerImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js"); +exports.SingleEventManagerImpl = SingleEventManagerImpl_1.SingleEventManagerImpl; +var StoryImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/StoryImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryImpl.js"); +exports.StoryImpl = StoryImpl_1.StoryImpl; +var StoryPointImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/StoryPointImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js"); +exports.StoryPointImpl = StoryPointImpl_1.StoryPointImpl; +var StoryPointInfoImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/StoryPointInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js"); +exports.StoryPointInfoImpl = StoryPointInfoImpl_1.StoryPointInfoImpl; +var WorkbookImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/WorkbookImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorkbookImpl.js"); +exports.WorkbookImpl = WorkbookImpl_1.WorkbookImpl; +var WorksheetImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/WorksheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js"); +exports.WorksheetImpl = WorksheetImpl_1.WorksheetImpl; +var Point_1 = __webpack_require__(/*! ./ApiShared/Point */ "../api-shared-js/lib/src/ApiShared/Point.js"); +exports.Point = Point_1.Point; +__export(__webpack_require__(/*! ./ApiShared/Services/RegisterAllSharedServices */ "../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js")); +__export(__webpack_require__(/*! ./ApiShared/Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js")); +var ClientInfoServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/ClientInfoServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js"); +exports.ClientInfoServiceImpl = ClientInfoServiceImpl_1.ClientInfoServiceImpl; +var NotificationServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/NotificationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js"); +exports.NotificationServiceImpl = NotificationServiceImpl_1.NotificationServiceImpl; +var NotificationServiceImplBase_1 = __webpack_require__(/*! ./ApiShared/Services/impl/NotificationServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js"); +exports.NotificationServiceImplBase = NotificationServiceImplBase_1.NotificationServiceImplBase; +exports.Registration = NotificationServiceImplBase_1.Registration; +var ServiceImplBase_1 = __webpack_require__(/*! ./ApiShared/Services/impl/ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +exports.ServiceImplBase = ServiceImplBase_1.ServiceImplBase; +var SizeServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/SizeServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js"); +exports.SizeServiceImpl = SizeServiceImpl_1.SizeServiceImpl; +var StoryActivationServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/StoryActivationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/StoryActivationServiceImpl.js"); +exports.StoryActivationServiceImpl = StoryActivationServiceImpl_1.StoryActivationServiceImpl; +var TableauError_1 = __webpack_require__(/*! ./ApiShared/TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +exports.TableauError = TableauError_1.TableauError; +var Deferred_1 = __webpack_require__(/*! ./ApiShared/Utils/Deferred */ "../api-shared-js/lib/src/ApiShared/Utils/Deferred.js"); +exports.Deferred = Deferred_1.Deferred; +var ErrorHelpers_1 = __webpack_require__(/*! ./ApiShared/Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +exports.ErrorHelpers = ErrorHelpers_1.ErrorHelpers; +var ExportHelpers_1 = __webpack_require__(/*! ./ApiShared/Utils/ExportHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js"); +exports.ExportHelpers = ExportHelpers_1.ExportHelpers; +var SheetUtils_1 = __webpack_require__(/*! ./ApiShared/Utils/SheetUtils */ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js"); +exports.SheetUtils = SheetUtils_1.SheetUtils; +var VersionNumber_1 = __webpack_require__(/*! ./ApiShared/VersionNumber */ "../api-shared-js/lib/src/ApiShared/VersionNumber.js"); +exports.VersionNumber = VersionNumber_1.VersionNumber; +var VersionedExternalApiDispatcher_1 = __webpack_require__(/*! ./VersionedExternalApiDispatcher */ "../api-shared-js/lib/src/VersionedExternalApiDispatcher.js"); +exports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher_1.VersionedExternalApiDispatcher; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/ApiVersion.js": +/*!********************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/ApiVersion.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const VersionNumber_1 = __webpack_require__(/*! ./VersionNumber */ "../api-shared-js/lib/src/ApiShared/VersionNumber.js"); +/** + * This is the singleton wrapper of VersionNumber + */ +class ApiVersion { + /** + * Gets the singleton instance of the version number. + */ + static get Instance() { + return ApiVersion._instance; + } + static SetVersionNumber(numString, isAlpha) { + ApiVersion._instance = new VersionNumber_1.VersionNumber(numString, isAlpha); + } +} +exports.ApiVersion = ApiVersion; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/ConnectionSummary.js": +/*!***************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/ConnectionSummary.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of a connection summary. + * This does not follow the Impl pattern as it is just a property bag. + */ +class ConnectionSummary { + constructor(_connectionInfo) { + this._connectionInfo = _connectionInfo; + } + get name() { + return this._connectionInfo.name; + } + get id() { + return this._connectionInfo.id; + } + get serverURI() { + return this._connectionInfo.serverURI; + } + get type() { + return this._connectionInfo.type; + } +} +exports.ConnectionSummary = ConnectionSummary; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js": +/*!****************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js ***! + \****************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const CrossFrameDispatcher_1 = __webpack_require__(/*! ./CrossFrameDispatcher */ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js"); +// Checks to see if we are running in an iframe currently: https://stackoverflow.com/a/326076/8821153 +function inIframe(thisWindow) { + try { + return thisWindow.self !== thisWindow.parent; + } + catch (e) { + return true; + } +} +/** + * Attempts to bootstrap the extension with a cross-frame parent where Tableau is running + * + * @param thisWindow The window which we are running in (injected for unit testing purposes) + * @param internalContractVersion The version number of the internal contract we are using + * @returns A promise which is doing the actual bootstrapping + */ +function doCrossFrameBootstrap(thisWindow, internalContractVersion, options) { + return new Promise((resolve, reject) => { + let parent; + // Normally, we are running inside an iframe. The exception to this is + // when we are running as an extension inside a dialog as part of the UINamespace + // functionality. In that case, we want the opener of this window rather than the parent. + if (!inIframe(thisWindow)) { + parent = thisWindow.opener; + } + else { + parent = thisWindow.parent; + } + if (!parent) { + reject('This extension is not running inside an iframe, desktop, or popup window. Initialization failed.'); + } + // Create the messenger which will do he communication between this window and our parent + // Since we don't know where we are running yet, we have to make this initial origin '*'. Once + // we have successfully initialized our extension, we will limit where we send messages + const messenger = new api_internal_contract_js_1.CrossFrameMessenger(thisWindow, parent, '*'); + // Prepare to send an initialization message to the parent frame + const initializationMessage = messenger.prepareInitializationMessage(internalContractVersion, api_internal_contract_js_1.MESSAGING_VERSION, options); + // When we receive a response back from the parent, we check to make sure the guids match and then we know + // that the parent is aware of us and we can start communicating + messenger.setCommandResponseMessageHandler(function (msg) { + // Verify we are getting a response from our initialize message + if (msg.commandGuid === initializationMessage.messageGuid) { + // The versioning of the dispatcher happens on the other side of our frame, and + // in a wrapper on this side. This one doesn't have any version knowledge. + const dispatcherFactory = () => new CrossFrameDispatcher_1.CrossFrameDispatcher(messenger); + resolve(dispatcherFactory); + } + }); + // Now that our handlers are ready, start listening and send our initialization message + messenger.startListening(); + initializationMessage.send(); + }); +} +exports.doCrossFrameBootstrap = doCrossFrameBootstrap; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js": +/*!*****************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js ***! + \*****************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +/** + * This is an implementation of the InternalApiDispatcher interface which functions by passing messages + * across a frame boundary. This is usually between the code where our javscript library has been included + * by a 3rd party dev and another frame where Tableau server has content. + */ +class CrossFrameDispatcher { + /** + * Creates an instance of CrossFrameDispatcher which will use the given messenger to communicate + * @param _messenger an instantiated and listening messenger object + */ + constructor(_messenger) { + this._messenger = _messenger; + // Collection of pending promises which are waiting to be resolved. When we receive a response back from the other frame, + // these promises can be either resolved or rejected + this._pendingPromises = {}; + // The collection of notification handlers which have been registered with this dispatcher + this._notificationHandlers = []; + if (!this._messenger) { + throw 'Missing messenger object'; + } + // Set up our message handlers. We only care about incoming notifications and command responses + this._messenger.setCommandResponseMessageHandler(this.onCommandResponse.bind(this)); + this._messenger.setNotificationMessageHandler(this.onNotification.bind(this)); + } + ////// Start InternalApiDispatcher implementation + execute(verb, parameters) { + // To execute a verb, we first prepare a command message and then define a promise. + const preparedMessage = this._messenger.prepareCommandMessage(verb, parameters); + const promise = new Promise((resolve, reject) => { + // Save off the pending promise by the messageGuid we are about to send. When a response is + // received, we'll be able to resolve this promise with the result + this._pendingPromises[preparedMessage.messageGuid] = { resolve: resolve, reject: reject }; + }); + // Actually send the message and return the promise + preparedMessage.send(); + return promise; + } + registerNotificationHandler(handler) { + this._notificationHandlers.push(handler); + } + unregisterNotificationHandler(handler) { + this._notificationHandlers = this._notificationHandlers.filter((h) => h !== handler); + } + ////// End InternalApiDispatcher implementation + onCommandResponse(response) { + // We got a command response, look through the pending promises and resolve + if (Object.keys(this._pendingPromises).indexOf(response.commandGuid) < 0) { + return; // We don't have any reference to this command, just return + } + const pendingPromise = this._pendingPromises[response.commandGuid]; + // If we have an error defined, reject the promise + if (response.error) { + pendingPromise.reject(response.error); + } + // If we have data defined, resolve the promise + if (response.data) { + pendingPromise.resolve({ result: response.data }); + } + // Clean up our pending promises object + delete this._pendingPromises[response.commandGuid]; + } + onNotification(notificationMessage) { + // Go through each notification handler we have registered and let them know a notification came in + for (const handler of this._notificationHandlers) { + try { + handler({ notificationId: notificationMessage.notificationId, data: notificationMessage.data }); + } + catch (e) { + // Incase of a IncompatibleVersionError, re-throw the error. + if (e.errorCode === api_external_contract_js_1.EmbeddingErrorCodes.IncompatibleVersionError) { + throw e; + } + // Else Ignore so if one handler errors, the other still get the message. + } + } + } +} +exports.CrossFrameDispatcher = CrossFrameDispatcher; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/DataSource.js": +/*!********************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/DataSource.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class DataSource { + constructor(_dataSourceImpl) { + this._dataSourceImpl = _dataSourceImpl; + } + get name() { + return this._dataSourceImpl.name; + } + get id() { + return this._dataSourceImpl.id; + } + get fields() { + return this._dataSourceImpl.fields; + } + get extractUpdateTime() { + return this._dataSourceImpl.extractUpdateTime; + } + get isExtract() { + return this._dataSourceImpl.isExtract; + } + get isPublished() { + return this._dataSourceImpl.isPublished; + } + publishedUrl() { + return this._dataSourceImpl.publishedUrl(); + } + refreshAsync() { + return this._dataSourceImpl.refreshAsync(); + } + getActiveTablesAsync() { + console.warn('DataSource.getActiveTablesAsync is deprecated. Please use DataSource.getLogicalTablesAsync.'); + return this._dataSourceImpl.getActiveTablesAsync(); + } + getConnectionSummariesAsync() { + return this._dataSourceImpl.getConnectionSummariesAsync(); + } + getUnderlyingDataAsync(options) { + console.warn('DataSource.getUnderlyingDataAsync is deprecated. Please use ' + + 'DataSource.getLogicalTablesAsync and DataSource.getLogicalTableDataAsync.'); + return this._dataSourceImpl.getUnderlyingDataAsync(options); + } + getLogicalTablesAsync() { + return this._dataSourceImpl.getLogicalTablesAsync(); + } + getLogicalTableDataAsync(logicalTableId, options) { + return this._dataSourceImpl.getLogicalTableDataAsync(logicalTableId, options); + } + getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options) { + return this._dataSourceImpl.getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options); + } +} +exports.DataSource = DataSource; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js": +/*!*****************************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js ***! + \*****************************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const EnumConverter_1 = __webpack_require__(/*! ../Utils/EnumConverter */ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); +/* tslint:disable:typedef - Disable this to make declaring these classes a bit easier */ +/** + * Maps enums used by the external-api-contract to the enums used + * in the internal-api-contract, which developers code against. + */ +class ExternalToInternalEnumMappings { +} +exports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings; +ExternalToInternalEnumMappings.filterDomainType = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.FilterDomainType.Relevant]: api_internal_contract_js_1.FilterDomainType.Relevant, + [api_external_contract_js_1.FilterDomainType.Database]: api_internal_contract_js_1.FilterDomainType.Database, +}); +ExternalToInternalEnumMappings.nullOptions = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.FilterNullOption.AllValues]: api_internal_contract_js_1.FilterNullOption.AllValues, + [api_external_contract_js_1.FilterNullOption.NonNullValues]: api_internal_contract_js_1.FilterNullOption.NonNullValues, + [api_external_contract_js_1.FilterNullOption.NullValues]: api_internal_contract_js_1.FilterNullOption.NullValues, +}); +ExternalToInternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.FilterUpdateType.Add]: api_internal_contract_js_1.FilterUpdateType.Add, + [api_external_contract_js_1.FilterUpdateType.All]: api_internal_contract_js_1.FilterUpdateType.All, + [api_external_contract_js_1.FilterUpdateType.Remove]: api_internal_contract_js_1.FilterUpdateType.Remove, + [api_external_contract_js_1.FilterUpdateType.Replace]: api_internal_contract_js_1.FilterUpdateType.Replace, +}); +ExternalToInternalEnumMappings.setVisibilityType = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.ZoneVisibilityType.Show]: true, + [api_external_contract_js_1.ZoneVisibilityType.Hide]: false, +}); +ExternalToInternalEnumMappings.setReplaySpeedType = new EnumConverter_1.EnumConverter({ + // these numbers are duration multipliers + // 2.0, for example, doubles the duration of the replay, slowing it down to 0.5x speed + [api_external_contract_js_1.ReplaySpeedType.Slow]: 2.0, + [api_external_contract_js_1.ReplaySpeedType.Normal]: 1.0, + [api_external_contract_js_1.ReplaySpeedType.Fast]: 0.5, +}); +ExternalToInternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.SheetType.Dashboard]: api_internal_contract_js_1.SheetType.Dashboard, + [api_external_contract_js_1.SheetType.Worksheet]: api_internal_contract_js_1.SheetType.Worksheet, + [api_external_contract_js_1.SheetType.Story]: api_internal_contract_js_1.SheetType.Story, +}); +ExternalToInternalEnumMappings.showDataTableFormatType = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.IncludeDataValuesOption.AllValues]: api_internal_contract_js_1.ApiShowDataTableFormat.NativeAndFormattedValues, + [api_external_contract_js_1.IncludeDataValuesOption.OnlyNativeValues]: api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly, + [api_external_contract_js_1.IncludeDataValuesOption.OnlyFormattedValues]: api_internal_contract_js_1.ApiShowDataTableFormat.FormattedValuesOnly, +}); +ExternalToInternalEnumMappings.periodType = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.PeriodType.Years]: api_internal_contract_js_1.DateStepPeriod.Years, + [api_external_contract_js_1.PeriodType.Quarters]: api_internal_contract_js_1.DateStepPeriod.Quarters, + [api_external_contract_js_1.PeriodType.Months]: api_internal_contract_js_1.DateStepPeriod.Months, + [api_external_contract_js_1.PeriodType.Weeks]: api_internal_contract_js_1.DateStepPeriod.Weeks, + [api_external_contract_js_1.PeriodType.Days]: api_internal_contract_js_1.DateStepPeriod.Days, + [api_external_contract_js_1.PeriodType.Hours]: api_internal_contract_js_1.DateStepPeriod.Hours, + [api_external_contract_js_1.PeriodType.Minutes]: api_internal_contract_js_1.DateStepPeriod.Minutes, + [api_external_contract_js_1.PeriodType.Seconds]: api_internal_contract_js_1.DateStepPeriod.Seconds, +}); +ExternalToInternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.DateRangeType.Last]: api_internal_contract_js_1.DateRangeType.Last, + [api_external_contract_js_1.DateRangeType.LastN]: api_internal_contract_js_1.DateRangeType.LastN, + [api_external_contract_js_1.DateRangeType.Next]: api_internal_contract_js_1.DateRangeType.Next, + [api_external_contract_js_1.DateRangeType.NextN]: api_internal_contract_js_1.DateRangeType.NextN, + [api_external_contract_js_1.DateRangeType.Current]: api_internal_contract_js_1.DateRangeType.Current, + [api_external_contract_js_1.DateRangeType.ToDate]: api_internal_contract_js_1.DateRangeType.ToDate, +}); +ExternalToInternalEnumMappings.dialogStyles = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.DialogStyle.Window]: api_internal_contract_js_1.DialogStyle.Window, + [api_external_contract_js_1.DialogStyle.Modal]: api_internal_contract_js_1.DialogStyle.Modal, + [api_external_contract_js_1.DialogStyle.Modeless]: api_internal_contract_js_1.DialogStyle.Modeless, +}); +/* tslint:enable:typedef */ + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js": +/*!*****************************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js ***! + \*****************************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const EnumConverter_1 = __webpack_require__(/*! ../Utils/EnumConverter */ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); +/* tslint:disable:typedef - Disable this to make declaring these classes a bit easier */ +/** + * Maps enums used by the internal-api-contract to the enums used + * in the external-api-contract, which developers code against. + */ +class InternalToExternalEnumMappings { +} +exports.InternalToExternalEnumMappings = InternalToExternalEnumMappings; +InternalToExternalEnumMappings.extensionContext = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.ExtensionContext.Desktop]: api_external_contract_js_1.ExtensionContext.Desktop, + [api_internal_contract_js_1.ExtensionContext.Server]: api_external_contract_js_1.ExtensionContext.Server, + [api_internal_contract_js_1.ExtensionContext.PublicWeb]: api_external_contract_js_1.ExtensionContext.PublicWeb, + [api_internal_contract_js_1.ExtensionContext.PublicDesktop]: api_external_contract_js_1.ExtensionContext.PublicDesktop, + [api_internal_contract_js_1.ExtensionContext.Cloud]: api_external_contract_js_1.ExtensionContext.Cloud, +}); +InternalToExternalEnumMappings.extensionMode = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.ExtensionMode.Authoring]: api_external_contract_js_1.ExtensionMode.Authoring, + [api_internal_contract_js_1.ExtensionMode.Viewing]: api_external_contract_js_1.ExtensionMode.Viewing, +}); +InternalToExternalEnumMappings.columnType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.ColumnType.Continuous]: api_external_contract_js_1.ColumnType.Continuous, + [api_internal_contract_js_1.ColumnType.Discrete]: api_external_contract_js_1.ColumnType.Discrete, + [api_internal_contract_js_1.ColumnType.Unknown]: api_external_contract_js_1.ColumnType.Unknown, +}); +InternalToExternalEnumMappings.fieldAggregationType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.FieldAggregationType.Attr]: api_external_contract_js_1.FieldAggregationType.Attr, + [api_internal_contract_js_1.FieldAggregationType.Avg]: api_external_contract_js_1.FieldAggregationType.Avg, + [api_internal_contract_js_1.FieldAggregationType.Collect]: api_external_contract_js_1.FieldAggregationType.Collect, + [api_internal_contract_js_1.FieldAggregationType.Count]: api_external_contract_js_1.FieldAggregationType.Count, + [api_internal_contract_js_1.FieldAggregationType.Countd]: api_external_contract_js_1.FieldAggregationType.Countd, + [api_internal_contract_js_1.FieldAggregationType.Day]: api_external_contract_js_1.FieldAggregationType.Day, + [api_internal_contract_js_1.FieldAggregationType.End]: api_external_contract_js_1.FieldAggregationType.End, + [api_internal_contract_js_1.FieldAggregationType.Hour]: api_external_contract_js_1.FieldAggregationType.Hour, + [api_internal_contract_js_1.FieldAggregationType.InOut]: api_external_contract_js_1.FieldAggregationType.InOut, + [api_internal_contract_js_1.FieldAggregationType.Kurtosis]: api_external_contract_js_1.FieldAggregationType.Kurtosis, + [api_internal_contract_js_1.FieldAggregationType.Max]: api_external_contract_js_1.FieldAggregationType.Max, + [api_internal_contract_js_1.FieldAggregationType.Mdy]: api_external_contract_js_1.FieldAggregationType.Mdy, + [api_internal_contract_js_1.FieldAggregationType.Median]: api_external_contract_js_1.FieldAggregationType.Median, + [api_internal_contract_js_1.FieldAggregationType.Min]: api_external_contract_js_1.FieldAggregationType.Min, + [api_internal_contract_js_1.FieldAggregationType.Minute]: api_external_contract_js_1.FieldAggregationType.Minute, + [api_internal_contract_js_1.FieldAggregationType.MonthYear]: api_external_contract_js_1.FieldAggregationType.MonthYear, + [api_internal_contract_js_1.FieldAggregationType.None]: api_external_contract_js_1.FieldAggregationType.None, + [api_internal_contract_js_1.FieldAggregationType.Qtr]: api_external_contract_js_1.FieldAggregationType.Qtr, + [api_internal_contract_js_1.FieldAggregationType.Quart1]: api_external_contract_js_1.FieldAggregationType.Quart1, + [api_internal_contract_js_1.FieldAggregationType.Quart3]: api_external_contract_js_1.FieldAggregationType.Quart3, + [api_internal_contract_js_1.FieldAggregationType.Second]: api_external_contract_js_1.FieldAggregationType.Second, + [api_internal_contract_js_1.FieldAggregationType.Skewness]: api_external_contract_js_1.FieldAggregationType.Skewness, + [api_internal_contract_js_1.FieldAggregationType.Stdev]: api_external_contract_js_1.FieldAggregationType.Stdev, + [api_internal_contract_js_1.FieldAggregationType.Stdevp]: api_external_contract_js_1.FieldAggregationType.Stdevp, + [api_internal_contract_js_1.FieldAggregationType.Sum]: api_external_contract_js_1.FieldAggregationType.Sum, + [api_internal_contract_js_1.FieldAggregationType.TruncDay]: api_external_contract_js_1.FieldAggregationType.TruncDay, + [api_internal_contract_js_1.FieldAggregationType.TruncHour]: api_external_contract_js_1.FieldAggregationType.TruncHour, + [api_internal_contract_js_1.FieldAggregationType.TruncMinute]: api_external_contract_js_1.FieldAggregationType.TruncMinute, + [api_internal_contract_js_1.FieldAggregationType.TruncMonth]: api_external_contract_js_1.FieldAggregationType.TruncMonth, + [api_internal_contract_js_1.FieldAggregationType.TruncQtr]: api_external_contract_js_1.FieldAggregationType.TruncQtr, + [api_internal_contract_js_1.FieldAggregationType.TruncSecond]: api_external_contract_js_1.FieldAggregationType.TruncSecond, + [api_internal_contract_js_1.FieldAggregationType.TruncWeek]: api_external_contract_js_1.FieldAggregationType.TruncWeek, + [api_internal_contract_js_1.FieldAggregationType.TruncYear]: api_external_contract_js_1.FieldAggregationType.TruncYear, + [api_internal_contract_js_1.FieldAggregationType.User]: api_external_contract_js_1.FieldAggregationType.User, + [api_internal_contract_js_1.FieldAggregationType.Var]: api_external_contract_js_1.FieldAggregationType.Var, + [api_internal_contract_js_1.FieldAggregationType.Varp]: api_external_contract_js_1.FieldAggregationType.Varp, + [api_internal_contract_js_1.FieldAggregationType.Week]: api_external_contract_js_1.FieldAggregationType.Week, + [api_internal_contract_js_1.FieldAggregationType.Weekday]: api_external_contract_js_1.FieldAggregationType.Weekday, + [api_internal_contract_js_1.FieldAggregationType.Year]: api_external_contract_js_1.FieldAggregationType.Year, +}); +InternalToExternalEnumMappings.fieldRoleType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.FieldRoleType.Dimension]: api_external_contract_js_1.FieldRoleType.Dimension, + [api_internal_contract_js_1.FieldRoleType.Measure]: api_external_contract_js_1.FieldRoleType.Measure, + [api_internal_contract_js_1.FieldRoleType.Unknown]: api_external_contract_js_1.FieldRoleType.Unknown, +}); +InternalToExternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.SheetType.Dashboard]: api_external_contract_js_1.SheetType.Dashboard, + [api_internal_contract_js_1.SheetType.Story]: api_external_contract_js_1.SheetType.Story, + [api_internal_contract_js_1.SheetType.Worksheet]: api_external_contract_js_1.SheetType.Worksheet, +}); +InternalToExternalEnumMappings.dashboardObjectType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.DashboardObjectType.Extension]: api_external_contract_js_1.DashboardObjectType.Extension, + [api_internal_contract_js_1.DashboardObjectType.Blank]: api_external_contract_js_1.DashboardObjectType.Blank, + [api_internal_contract_js_1.DashboardObjectType.Image]: api_external_contract_js_1.DashboardObjectType.Image, + [api_internal_contract_js_1.DashboardObjectType.Legend]: api_external_contract_js_1.DashboardObjectType.Legend, + [api_internal_contract_js_1.DashboardObjectType.PageFilter]: api_external_contract_js_1.DashboardObjectType.PageFilter, + [api_internal_contract_js_1.DashboardObjectType.ParameterControl]: api_external_contract_js_1.DashboardObjectType.ParameterControl, + [api_internal_contract_js_1.DashboardObjectType.QuickFilter]: api_external_contract_js_1.DashboardObjectType.QuickFilter, + [api_internal_contract_js_1.DashboardObjectType.Text]: api_external_contract_js_1.DashboardObjectType.Text, + [api_internal_contract_js_1.DashboardObjectType.Title]: api_external_contract_js_1.DashboardObjectType.Title, + [api_internal_contract_js_1.DashboardObjectType.WebPage]: api_external_contract_js_1.DashboardObjectType.WebPage, + [api_internal_contract_js_1.DashboardObjectType.Worksheet]: api_external_contract_js_1.DashboardObjectType.Worksheet, +}); +InternalToExternalEnumMappings.dataType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.DataType.Bool]: api_external_contract_js_1.DataType.Bool, + [api_internal_contract_js_1.DataType.Date]: api_external_contract_js_1.DataType.Date, + [api_internal_contract_js_1.DataType.DateTime]: api_external_contract_js_1.DataType.DateTime, + [api_internal_contract_js_1.DataType.Float]: api_external_contract_js_1.DataType.Float, + [api_internal_contract_js_1.DataType.Int]: api_external_contract_js_1.DataType.Int, + [api_internal_contract_js_1.DataType.Spatial]: api_external_contract_js_1.DataType.Spatial, + [api_internal_contract_js_1.DataType.String]: api_external_contract_js_1.DataType.String, +}); +InternalToExternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.FilterUpdateType.Add]: api_external_contract_js_1.FilterUpdateType.Add, + [api_internal_contract_js_1.FilterUpdateType.All]: api_external_contract_js_1.FilterUpdateType.All, + [api_internal_contract_js_1.FilterUpdateType.Remove]: api_external_contract_js_1.FilterUpdateType.Remove, + [api_internal_contract_js_1.FilterUpdateType.Replace]: api_external_contract_js_1.FilterUpdateType.Replace, +}); +InternalToExternalEnumMappings.allowableValues = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.DomainRestrictionType.All]: api_external_contract_js_1.ParameterValueType.All, + [api_internal_contract_js_1.DomainRestrictionType.List]: api_external_contract_js_1.ParameterValueType.List, + [api_internal_contract_js_1.DomainRestrictionType.Range]: api_external_contract_js_1.ParameterValueType.Range, +}); +InternalToExternalEnumMappings.dateStepPeriod = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.DateStepPeriod.Years]: api_external_contract_js_1.PeriodType.Years, + [api_internal_contract_js_1.DateStepPeriod.Quarters]: api_external_contract_js_1.PeriodType.Quarters, + [api_internal_contract_js_1.DateStepPeriod.Months]: api_external_contract_js_1.PeriodType.Months, + [api_internal_contract_js_1.DateStepPeriod.Weeks]: api_external_contract_js_1.PeriodType.Weeks, + [api_internal_contract_js_1.DateStepPeriod.Days]: api_external_contract_js_1.PeriodType.Days, + [api_internal_contract_js_1.DateStepPeriod.Hours]: api_external_contract_js_1.PeriodType.Hours, + [api_internal_contract_js_1.DateStepPeriod.Minutes]: api_external_contract_js_1.PeriodType.Minutes, + [api_internal_contract_js_1.DateStepPeriod.Seconds]: api_external_contract_js_1.PeriodType.Seconds, +}); +InternalToExternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.DateRangeType.Current]: api_external_contract_js_1.DateRangeType.Current, + [api_internal_contract_js_1.DateRangeType.Last]: api_external_contract_js_1.DateRangeType.Last, + [api_internal_contract_js_1.DateRangeType.LastN]: api_external_contract_js_1.DateRangeType.LastN, + [api_internal_contract_js_1.DateRangeType.Next]: api_external_contract_js_1.DateRangeType.Next, + [api_internal_contract_js_1.DateRangeType.NextN]: api_external_contract_js_1.DateRangeType.NextN, + [api_internal_contract_js_1.DateRangeType.ToDate]: api_external_contract_js_1.DateRangeType.ToDate, +}); +InternalToExternalEnumMappings.errorCode = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.ErrorCodes.INITIALIZATION_ERROR]: api_external_contract_js_1.ErrorCodes.InternalError, + [api_internal_contract_js_1.ErrorCodes.INTERNAL_ERROR]: api_external_contract_js_1.ErrorCodes.InternalError, + [api_internal_contract_js_1.ErrorCodes.MISSING_ENUM_MAPPING]: api_external_contract_js_1.ErrorCodes.InternalError, + [api_internal_contract_js_1.ErrorCodes.MISSING_PARAMETER]: api_external_contract_js_1.ErrorCodes.InternalError, + [api_internal_contract_js_1.ErrorCodes.PERMISSION_DENIED]: api_external_contract_js_1.ErrorCodes.InternalError, + [api_internal_contract_js_1.ErrorCodes.PRES_MODEL_PARSING_ERROR]: api_external_contract_js_1.ErrorCodes.InternalError, + [api_internal_contract_js_1.ErrorCodes.UNKNOWN_VERB_ID]: api_external_contract_js_1.ErrorCodes.InternalError, + [api_internal_contract_js_1.ErrorCodes.VERSION_NOT_CONFIGURED]: api_external_contract_js_1.ErrorCodes.APINotInitialized, + [api_internal_contract_js_1.ErrorCodes.VISIBILITY_ERROR]: api_external_contract_js_1.ErrorCodes.VisibilityError, +}, api_external_contract_js_1.ErrorCodes.InternalError); +InternalToExternalEnumMappings.filterType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.FilterType.Categorical]: api_external_contract_js_1.FilterType.Categorical, + [api_internal_contract_js_1.FilterType.Range]: api_external_contract_js_1.FilterType.Range, + [api_internal_contract_js_1.FilterType.RelativeDate]: api_external_contract_js_1.FilterType.RelativeDate, + [api_internal_contract_js_1.FilterType.Hierarchical]: api_external_contract_js_1.FilterType.Hierarchical, +}); +InternalToExternalEnumMappings.classNameKey = new EnumConverter_1.EnumConverter({ + ["tableau-dashboard-title" /* DashboardTitle */]: api_external_contract_js_1.ClassNameKey.DashboardTitle, + ["tableau-story-title" /* StoryTitle */]: api_external_contract_js_1.ClassNameKey.StoryTitle, + ["tableau-tooltip" /* Tooltip */]: api_external_contract_js_1.ClassNameKey.Tooltip, + ["tableau-worksheet" /* Worksheet */]: api_external_contract_js_1.ClassNameKey.Worksheet, + ["tableau-worksheet-title" /* WorksheetTitle */]: api_external_contract_js_1.ClassNameKey.WorksheetTitle, + ["tableau-pane" /* Pane */]: api_external_contract_js_1.ClassNameKey.Pane, + ["tableau-row-dividers" /* RowDividers */]: api_external_contract_js_1.ClassNameKey.RowDividers, + ["tableau-column-dividers" /* ColumnDividers */]: api_external_contract_js_1.ClassNameKey.ColumnDividers, + // Temporary until we fix 1317266 - Platform hasn't been updated currently because near branch is closed + ['dashboard-title']: api_external_contract_js_1.ClassNameKey.DashboardTitle, + ['story-title']: api_external_contract_js_1.ClassNameKey.StoryTitle, + ['tooltip']: api_external_contract_js_1.ClassNameKey.Tooltip, + ['worksheet']: api_external_contract_js_1.ClassNameKey.Worksheet, + ['worksheet-title']: api_external_contract_js_1.ClassNameKey.WorksheetTitle, + ['pane']: api_external_contract_js_1.ClassNameKey.Pane, + ['row-dividers']: api_external_contract_js_1.ClassNameKey.RowDividers, + ['column-dividers']: api_external_contract_js_1.ClassNameKey.ColumnDividers, +}); +InternalToExternalEnumMappings.hierarchicalLevelSelectionState = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.HierarchicalLevelSelectionState.AllSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.AllSelected, + [api_internal_contract_js_1.HierarchicalLevelSelectionState.NoneSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.NoneSelected, + [api_internal_contract_js_1.HierarchicalLevelSelectionState.SomeSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.SomeSelected, + [api_internal_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected, +}); +InternalToExternalEnumMappings.annotationType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.AnnotateEnum.Area]: api_external_contract_js_1.AnnotationType.Area, + [api_internal_contract_js_1.AnnotateEnum.Mark]: api_external_contract_js_1.AnnotationType.Mark, + [api_internal_contract_js_1.AnnotateEnum.Point]: api_external_contract_js_1.AnnotationType.Point, +}); +InternalToExternalEnumMappings.markType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.MarkType.Area]: api_external_contract_js_1.MarkType.Area, + [api_internal_contract_js_1.MarkType.Bar]: api_external_contract_js_1.MarkType.Bar, + [api_internal_contract_js_1.MarkType.Circle]: api_external_contract_js_1.MarkType.Circle, + [api_internal_contract_js_1.MarkType.GanttBar]: api_external_contract_js_1.MarkType.GanttBar, + [api_internal_contract_js_1.MarkType.Heatmap]: api_external_contract_js_1.MarkType.Heatmap, + [api_internal_contract_js_1.MarkType.Line]: api_external_contract_js_1.MarkType.Line, + [api_internal_contract_js_1.MarkType.Map]: api_external_contract_js_1.MarkType.Map, + [api_internal_contract_js_1.MarkType.Pie]: api_external_contract_js_1.MarkType.Pie, + [api_internal_contract_js_1.MarkType.Polygon]: api_external_contract_js_1.MarkType.Polygon, + [api_internal_contract_js_1.MarkType.Shape]: api_external_contract_js_1.MarkType.Shape, + [api_internal_contract_js_1.MarkType.Square]: api_external_contract_js_1.MarkType.Square, + [api_internal_contract_js_1.MarkType.Text]: api_external_contract_js_1.MarkType.Text, + [api_internal_contract_js_1.MarkType.VizExtension]: api_external_contract_js_1.MarkType.VizExtension, +}); +/* tslint:enable:typedef */ + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/EventListenerManager.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/EventListenerManager.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ./TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +/** + * Class designed to register and unregister handlers from a user. Only those events + * which are added via AddNewEventType will be supported by this instance + */ +class EventListenerManager { + constructor() { + this._eventListenerManagers = {}; + } + addEventListener(eventType, handler) { + if (!this._eventListenerManagers.hasOwnProperty(eventType)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedEventName, `Cannot add event, unsupported event type: ${eventType}`); + } + return this._eventListenerManagers[eventType].addEventListener(handler); + } + removeEventListener(eventType, handler) { + if (!this._eventListenerManagers.hasOwnProperty(eventType)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedEventName, `Cannot remove event, unsupported event type: ${eventType}`); + } + return this._eventListenerManagers[eventType].removeEventListener(handler); + } + addNewEventType(eventManager) { + this._eventListenerManagers[eventManager.eventType] = eventManager; + } +} +exports.EventListenerManager = EventListenerManager; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Field.js": +/*!***************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Field.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class Field { + constructor(_fieldImpl) { + this._fieldImpl = _fieldImpl; + } + get name() { + return this._fieldImpl.name; + } + get id() { + return this._fieldImpl.id; + } + get description() { + return this._fieldImpl.description; + } + get dataType() { + return this._fieldImpl.dataType; + } + get aggregation() { + return this._fieldImpl.aggregation; + } + get dataSource() { + return this._fieldImpl.dataSource; + } + get role() { + return this._fieldImpl.role; + } + get columnType() { + return this._fieldImpl.columnType; + } + get isCalculatedField() { + return this._fieldImpl.isCalculatedField; + } + get isCombinedField() { + return this._fieldImpl.isCombinedField; + } + get isGenerated() { + return this._fieldImpl.isGenerated; + } + get isGeospatial() { + return this._fieldImpl.isGeospatial; + } + get isHidden() { + return this._fieldImpl.isHidden; + } + get isPresentOnPublishedDatasource() { + return this._fieldImpl.isPresentOnPublishedDatasource; + } +} +exports.Field = Field; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const ApiShared_1 = __webpack_require__(/*! ../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); +class CustomViewImpl { + constructor(customViewModel, _registryId) { + this._registryId = _registryId; + this._luid = customViewModel.luid; + this._name = customViewModel.name; + this._shared = customViewModel.shared; + this._isDefault = customViewModel.isDefault; + this._ownerName = customViewModel.owner.userFriendlyName; + this._url = customViewModel.url; + } + get luid() { + return this._luid; + } + get name() { + return this._name; + } + set name(name) { + this._name = name; + } + get shared() { + return this._shared; + } + set shared(shared) { + this._shared = shared; + } + get isDefault() { + return this._isDefault; + } + set isDefault(isDefault) { + this._isDefault = isDefault; + } + get ownerName() { + return this._ownerName; + } + get url() { + return this._url; + } + saveAsync() { + const service = ApiShared_1.ApiServiceRegistry.get(this._registryId).getService("viz-service" /* Viz */); + return service.saveAsync(this); + } +} +exports.CustomViewImpl = CustomViewImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js": +/*!****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +const Point_1 = __webpack_require__(/*! ../Point */ "../api-shared-js/lib/src/ApiShared/Point.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const DashboardObjectImpl_1 = __webpack_require__(/*! ./DashboardObjectImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js"); +const SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +const SheetInfoImpl_1 = __webpack_require__(/*! ./SheetInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js"); +const WorksheetImpl_1 = __webpack_require__(/*! ./WorksheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js"); +class DashboardImpl extends SheetImpl_1.SheetImpl { + constructor(_sheetInfo, _zones, _sheetPath, _registryId, _parentStoryPointImpl, _activeDashboardObjectId = 0) { + super(_sheetInfo, _registryId); + this._zones = _zones; + this._sheetPath = _sheetPath; + this._parentStoryPointImpl = _parentStoryPointImpl; + this._activeDashboardObjectId = _activeDashboardObjectId; + } + get worksheetsImpl() { + return this._worksheetsImpl; + } + get objects() { + return this._objects; + } + get parentStoryPoint() { + return this._parentStoryPointImpl; + } + get activeDashboardObjectId() { + return this._activeDashboardObjectId; + } + get activeDashboardName() { + return this._sheetPath.sheetName; + } + initializeWithPublicInterfaces() { + this._worksheetsImpl = new Array(); + this._objects = new Array(); + this.zoneMap = new Map(); + // Process all the zones which are contained in this dashboard + for (const zone of this._zones) { + let worksheetImpl = undefined; + const zoneSize = { width: zone.width, height: zone.height }; + // As the dashboard is active, all other zones in the dashboard are inactive. + const isActive = false; + if (zone.zoneType === api_internal_contract_js_1.DashboardObjectType.Worksheet || zone.zoneType === api_internal_contract_js_1.DashboardObjectType.QuickFilter) { + let worksheetName = ''; + let worksheetUrl = ''; + let isHidden = false; + if (zone.sheetInfo) { + // zone.sheetInfo was not initialized prior to internal-contract 1.6.0 + worksheetName = zone.sheetInfo.name; + // worksheetUrl & isHidden is for Embedding only + worksheetUrl = zone.sheetInfo.url || ''; + // If there's a url, then it's not hidden + isHidden = worksheetUrl === ''; + } + else { + worksheetName = zone.name; + } + // Indexes, isActive and some more properties in sheetInfoImpl are embedding specific. + // But we init them for both extensions and embedding as the Models will only use what is relevant. + const sheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(worksheetName, api_external_contract_js_1.SheetType.Worksheet, zoneSize, this._worksheetsImpl.length, isActive, isHidden, worksheetUrl); + const vizId = { + worksheet: worksheetName, + dashboard: this._sheetInfoImpl.name, + storyboard: this._sheetPath.storyboard, + flipboardZoneID: this._sheetPath.flipboardZoneID, + storyPointID: this._sheetPath.storyPointID, + }; + worksheetImpl = new WorksheetImpl_1.WorksheetImpl(sheetInfoImpl, this._registryId, vizId, this, this._parentStoryPointImpl); + if (zone.zoneType === api_internal_contract_js_1.DashboardObjectType.Worksheet) { + this._worksheetsImpl.push(worksheetImpl); + } + } + const zonePoint = new Point_1.Point(zone.x, zone.y); + const dashboardObjectImpl = new DashboardObjectImpl_1.DashboardObjectImpl(this, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dashboardObjectType.convert(zone.zoneType), zonePoint, zoneSize, worksheetImpl, zone.name, zone.isFloating !== undefined ? zone.isFloating : false, // before 1.6.0 we didn't have isFloating, so we assume false + zone.isVisible !== undefined ? zone.isVisible : true, // before 1.6.0 we didn't have isVisible, so we assume true + zone.zoneId, zone.fieldId); + this._objects.push(dashboardObjectImpl); + this.zoneMap.set(zone.zoneId, dashboardObjectImpl); + } + } + setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap) { + const zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("zone-service" /* Zone */); + return zoneService.setVisibilityAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectVisibilityMap); + } + getDashboardObjectById(dashboardObjectId) { + return this.zoneMap.get(dashboardObjectId); + } + updateZones(newZones, newActiveZoneId = 0, newActiveDashboardName = '') { + // getting previous dashboard objects, active zone ID and active dashboard name + const oldDashboardObjects = this._objects; + const oldZoneMap = this.zoneMap; + const oldActiveZoneId = this._activeDashboardObjectId; + const oldActiveDashboardName = this._sheetPath.sheetName; + // updating zones and reinitializing instance variables + this._zones = newZones; + this._activeDashboardObjectId = newActiveZoneId; + if (newActiveDashboardName) { + this._sheetPath.sheetName = newActiveDashboardName; + this._sheetInfoImpl.name = newActiveDashboardName; + } + this.initializeWithPublicInterfaces(); + // getting new dashboard objects + const newDashboardObjects = this._objects; + const newZoneMap = this.zoneMap; + // initializing map for changes + const zoneChanges = new Map(); + // comparing old dashboard objects with new ones + oldDashboardObjects.forEach((oldObject) => { + const oldId = oldObject.id; + // checking if zone was removed + if (!newZoneMap.has(oldId)) { + this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Removed); + return; + } + const newObject = newZoneMap.get(oldId); + if (oldObject.isFloating !== newObject.isFloating) { + this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.IsFloatingChanged); + } + if (oldObject.isVisible !== newObject.isVisible) { + this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.IsVisibleChanged); + } + if (oldObject.name !== newObject.name) { + this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.NameChanged); + } + if (oldObject.position.x !== newObject.position.x || oldObject.position.y !== newObject.position.y) { + this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.PositionChanged); + } + if (oldObject.size.width !== newObject.size.width || oldObject.size.height !== newObject.size.height) { + this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.SizeChanged); + } + }); + // Checking for any added zones + newDashboardObjects.forEach((newObject) => { + if (!oldZoneMap.has(newObject.id)) { + this.addChange(newObject.id, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Added); + } + }); + // Checking if zone selection has changed + if (oldActiveZoneId !== newActiveZoneId) { + if (newActiveZoneId !== 0) { + this.addChange(newActiveZoneId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Selected); + } + if (oldActiveZoneId !== 0) { + this.addChange(oldActiveZoneId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Deselected); + } + } + // Checking if switched to another dashboard + if (newActiveDashboardName && oldActiveDashboardName !== newActiveDashboardName) { + this.addChange(0, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.DashboardChanged); + } + return zoneChanges; + } + addChange(zoneId, zoneChanges, change) { + if (!zoneChanges.has(zoneId)) { + zoneChanges.set(zoneId, []); + } + zoneChanges.get(zoneId).push(change); + } + moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray) { + const zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("zone-service" /* Zone */); + return zoneService.moveAndResizeAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectPositionAndSizeUpdateArray); + } + replayAnimationAsync(replaySpeed) { + const animationService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("animation-service" /* Animation */); + return animationService.replayAsync(replaySpeed); + } + getFiltersAsync() { + this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.getDashboardFiltersAsync(); + } + applyFilterAsync(fieldName, values, updateType, options) { + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'FilterUpdateType'); + ErrorHelpers_1.ErrorHelpers.verifyStringParameter(fieldName, 'fieldName'); + if (!Array.isArray(values)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'values parameter for applyDashboardFilterAsync must be an array'); + } + this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.applyDashboardFilterAsync(fieldName, values, updateType, options); + } + // @W-12986439: remove once initializeWithPublicInterfaces is moved to the constructor for this class + // This method only exists since worksheetsImpl can be undefined, but we need the worksheet names in the Export APIs + getWorksheetNamesFromZones() { + const worksheetNames = []; + for (const zone of this._zones) { + if (zone.zoneType !== api_internal_contract_js_1.DashboardObjectType.Worksheet) { + continue; + } + // zone.sheetInfo was not initialized prior to internal-contract 1.6.0 + const worksheetName = zone.sheetInfo ? zone.sheetInfo.name : zone.name; + worksheetNames.push(worksheetName); + } + return worksheetNames; + } + verifyActiveSheetOrEmbeddedInActiveStoryPoint() { + const isRootAndActiveDashboard = this.active; + const isWithinActiveStoryPoint = this.parentStoryPoint != null && this.parentStoryPoint.active; + if (!isRootAndActiveDashboard && !isWithinActiveStoryPoint) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.NotActiveSheet, 'Operation not allowed on non-active sheet'); + } + } +} +exports.DashboardImpl = DashboardImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js": +/*!**********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the dashboard objects - the zones in a dashboard. + * This does not follow the Impl pattern as it is just a property bag. + */ +class DashboardObjectImpl { + constructor(_dashboardImpl, _type, _position, _size, _worksheetImpl, _name, _isFloating, _isVisible, _id, _fieldId) { + this._dashboardImpl = _dashboardImpl; + this._type = _type; + this._position = _position; + this._size = _size; + this._worksheetImpl = _worksheetImpl; + this._name = _name; + this._isFloating = _isFloating; + this._isVisible = _isVisible; + this._id = _id; + this._fieldId = _fieldId; + } + get dashboardImpl() { + return this._dashboardImpl; + } + get type() { + return this._type; + } + get position() { + return this._position; + } + get size() { + return this._size; + } + get worksheetImpl() { + return this._worksheetImpl; + } + get name() { + return this._name; + } + get isFloating() { + return this._isFloating; + } + get isVisible() { + return this._isVisible; + } + get id() { + return this._id; + } + get fieldId() { + return this._fieldId; + } +} +exports.DashboardObjectImpl = DashboardObjectImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const ConnectionSummary_1 = __webpack_require__(/*! ../ConnectionSummary */ "../api-shared-js/lib/src/ApiShared/ConnectionSummary.js"); +const Field_1 = __webpack_require__(/*! ../Field */ "../api-shared-js/lib/src/ApiShared/Field.js"); +const LogicalTable_1 = __webpack_require__(/*! ../LogicalTable */ "../api-shared-js/lib/src/ApiShared/LogicalTable.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const TableSummary_1 = __webpack_require__(/*! ../TableSummary */ "../api-shared-js/lib/src/ApiShared/TableSummary.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const FieldImpl_1 = __webpack_require__(/*! ./FieldImpl */ "../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js"); +class DataSourceImpl { + constructor(_dataSourceInfo, _registryId) { + this._dataSourceInfo = _dataSourceInfo; + this._registryId = _registryId; + this._fields = _dataSourceInfo.fields.map((fieldModel) => { + const fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, this); + return new Field_1.Field(fieldImpl); + }); + } + get name() { + return this._dataSourceInfo.name; + } + get id() { + return this._dataSourceInfo.id; + } + get extractUpdateTime() { + return this._dataSourceInfo.extractUpdateTime; + } + get fields() { + return this._fields; + } + get isExtract() { + return this._dataSourceInfo.isExtract; + } + get isPublished() { + return this._dataSourceInfo.isPublished; + } + publishedUrl() { + return this._dataSourceInfo.publishedUrl; + } + getMaxPageRowLimit() { + return 10000; + } + refreshAsync() { + const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return dataSourceService.refreshAsync(this._dataSourceInfo.id); + } + getConnectionSummariesAsync() { + const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return dataSourceService.getConnectionSummariesAsync(this._dataSourceInfo.id).then((summaries) => { + return summaries.map((summary) => new ConnectionSummary_1.ConnectionSummary(summary)); + }); + } + getActiveTablesAsync() { + const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return dataSourceService.getActiveTablesAsync(this._dataSourceInfo.id).then((tableInfos) => { + return tableInfos.map((tableInfo) => new TableSummary_1.TableSummary(tableInfo)); + }); + } + getUnderlyingDataAsync(options) { + const getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return getDataService.getDataSourceDataAsync(this.id, !!options.ignoreAliases, options.maxRows || 0, // 0 and [] are defaults + options.columnsToInclude || [], options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + } + getLogicalTableDataAsync(logicalTableId, options) { + const getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return getDataService.getLogicalTableDataAsync(this.id, logicalTableId, !!options.ignoreAliases, options.maxRows || 0, // 0 and [] are defaults + options.columnsToInclude || [], options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + } + getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options) { + const getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return getDataService.getLogicalTableDataReaderAsync(this.id, logicalTableId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + } + initializeWithPublicInterfaces(dataSource) { + ErrorHelpers_1.ErrorHelpers.verifyInternalValue(dataSource, 'dataSource'); + this._fields = this._dataSourceInfo.fields.map((fieldModel) => { + const fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, dataSource); + return new Field_1.Field(fieldImpl); + }); + } + getLogicalTablesAsync() { + const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return dataSourceService.getLogicalTablesAsync(this.id).then((logicalTableInfos) => { + return logicalTableInfos.map((logicalTableInfo) => new LogicalTable_1.LogicalTable(logicalTableInfo)); + }); + } +} +exports.DataSourceImpl = DataSourceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js": +/*!************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js ***! + \************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +class FieldImpl { + constructor(_fieldInfo, _parentDataSource) { + this._fieldInfo = _fieldInfo; + this._parentDataSource = _parentDataSource; + } + get name() { + return this._fieldInfo.name; + } + get id() { + return this._fieldInfo.id; + } + get description() { + return this._fieldInfo.description; + } + get dataType() { + var _a; + return _a = this._fieldInfo.dataType, (_a !== null && _a !== void 0 ? _a : Contract.DataType.Unknown); + } + get aggregation() { + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation); + } + get dataSource() { + if (!this._parentDataSource) + throw new Error(`Data source information is not available for this field. Please use getFieldAsync method to get field's data source information`); + return this._parentDataSource; + } + get role() { + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldRoleType.convert(this._fieldInfo.role); + } + get columnType() { + let definedValue = this._fieldInfo.columnType || InternalContract.ColumnType.Unknown; + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.columnType.convert(definedValue); + } + get isCalculatedField() { + return this._fieldInfo.isCalculatedField; + } + get isCombinedField() { + return this._fieldInfo.isCombinedField; + } + get isGenerated() { + return this._fieldInfo.isGenerated; + } + get isGeospatial() { + return this._fieldInfo.isGeospatial; + } + get isHidden() { + return this._fieldInfo.isHidden; + } + get isPresentOnPublishedDatasource() { + return this._fieldInfo.isPresentOnPublishedDatasource; + } +} +exports.FieldImpl = FieldImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js": +/*!****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const DataValueFactory_1 = __webpack_require__(/*! ../Utils/DataValueFactory */ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const Param_1 = __webpack_require__(/*! ../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +class ParameterImpl { + constructor(parameterInfo, _registryId) { + this._registryId = _registryId; + this.setParameterInfo(parameterInfo); + } + get name() { + return this._parameterInfo.name; + } + get currentValue() { + return DataValueFactory_1.DataValueFactory.MakeParameterDataValue(this._parameterInfo.currentValue, this._parameterInfo.dataType); + } + get dataType() { + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dataType.convert(this._parameterInfo.dataType); + } + get id() { + return this._globalFieldName; + } + get allowableValues() { + return this._allowableValues; + } + changeValueAsync(newValue) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(newValue, 'newValue'); + const coercedValue = Param_1.Param.serializeParameterValue(newValue); + const parametersService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); + return parametersService.changeParameterValueAsync(this._globalFieldName, coercedValue).then((parameterInfo) => { + this.setParameterInfo(parameterInfo); + return this.currentValue; + }); + } + setParameterInfo(parameterInfo) { + this._parameterInfo = parameterInfo; + this._globalFieldName = parameterInfo.fieldName; + const type = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.allowableValues.convert(parameterInfo.allowableValuesType); + let listValues; + let minValue; + let maxValue; + let stepSize; + let dateStepPeriod; + if (type === api_external_contract_js_1.ParameterValueType.List) { + const values = parameterInfo.allowableValues || []; + listValues = values.map((val) => DataValueFactory_1.DataValueFactory.MakeParameterDataValue(val, parameterInfo.dataType)); + } + else if (type === api_external_contract_js_1.ParameterValueType.Range) { + minValue = parameterInfo.minValue && DataValueFactory_1.DataValueFactory.MakeParameterDataValue(parameterInfo.minValue, parameterInfo.dataType); + maxValue = parameterInfo.maxValue && DataValueFactory_1.DataValueFactory.MakeParameterDataValue(parameterInfo.maxValue, parameterInfo.dataType); + stepSize = parameterInfo.stepSize; + dateStepPeriod = parameterInfo.dateStepPeriod && InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateStepPeriod.convert(parameterInfo.dateStepPeriod); + } + this._allowableValues = { + type: type, + allowableValues: listValues, + minValue: minValue, + maxValue: maxValue, + stepSize: stepSize, + dateStepPeriod: dateStepPeriod, + }; + } +} +exports.ParameterImpl = ParameterImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js": +/*!************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js ***! + \************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const Param_1 = __webpack_require__(/*! ../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +const SheetUtils_1 = __webpack_require__(/*! ../Utils/SheetUtils */ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js"); +class SheetImpl { + constructor(_sheetInfoImpl, _registryId) { + this._sheetInfoImpl = _sheetInfoImpl; + this._registryId = _registryId; + } + get name() { + return this._sheetInfoImpl.name; + } + get sheetType() { + return this._sheetInfoImpl.sheetType; + } + get sheetPath() { + return this._sheetInfoImpl.sheetPath; + } + get size() { + return this._sheetInfoImpl.sheetSize; + } + get hidden() { + if (this._sheetInfoImpl.isHidden !== undefined) { + return this._sheetInfoImpl.isHidden; + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `isHidden not implemented`); + } + get active() { + if (this._sheetInfoImpl.isActive !== undefined) { + return this._sheetInfoImpl.isActive; + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `active not implemented`); + } + set active(active) { + if (this._sheetInfoImpl.isActive !== undefined) { + this._sheetInfoImpl.active = active; + } + } + get index() { + if (this._sheetInfoImpl.index !== undefined) { + return this._sheetInfoImpl.index; + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `index not implemented`); + } + get url() { + if (this._sheetInfoImpl.url !== undefined) { + return this._sheetInfoImpl.url; + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `url not implemented`); + } + getSheetSize() { + if (!SheetUtils_1.SheetUtils.isValidSheetSize(this.size)) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InternalError, 'size is not of type SheetSize'); + } + return this.size; + } + findParameterAsync(parameterName) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(parameterName, 'parameterName'); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); + return service.findParameterByNameAsync(parameterName); + } + getParametersAsync() { + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); + return service.getParametersForSheetAsync(this.sheetPath); + } + changeSizeAsync(newSize) { + const invalidSizeError = new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Invalid sheet size parameter'); + if (!newSize || !newSize.behavior) { + throw invalidSizeError; + } + const partialSheetSize = this.normalizeSheetSize(newSize); + const isAutomatic = partialSheetSize.behavior === Contract.SheetSizeBehavior.Automatic; + if (!isAutomatic && !partialSheetSize.minSize && !partialSheetSize.maxSize) { + throw invalidSizeError; + } + if (!isAutomatic && this.sheetType === Contract.SheetType.Worksheet) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSizeBehaviorOnWorksheet, 'Only SheetSizeBehavior.Automatic is allowed on Worksheets'); + } + if (isAutomatic && this.getSheetSize().behavior === partialSheetSize.behavior) { + return Promise.resolve(newSize); + } + const processedNewSize = this.processNewSize(partialSheetSize); + const sizeService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("size-service" /* Size */); + return sizeService.changeSizeAsync(this.name, processedNewSize).then(() => { + const clientInfoService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("client-info-service" /* ClientInfo */); + return clientInfoService.getClientInfoAsync().then((bootstrapInfo) => { + const sheet = bootstrapInfo.publishedSheets.find((s) => s.name === this.name); + if (!sheet) { + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InternalError, `Can't find sheet with name ${this.name}`); + } + const sheetSize = SheetUtils_1.SheetUtils.getSheetSizeFromSizeConstraints(sheet.sizeConstraint); + this._sheetInfoImpl.sheetSize = sheetSize; + return sheetSize; + }); + }); + } + normalizeSheetSize(newSize) { + const { behavior } = newSize; + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(behavior, Contract.SheetSizeBehavior, 'SheetSizeBehavior'); + const minSize = SheetImpl.parseDimensions(newSize.minSize); + const maxSize = SheetImpl.parseDimensions(newSize.maxSize); + return { behavior, minSize, maxSize }; + } + processNewSize(newSize) { + var _a, _b, _c, _d; + const { behavior, minSize: minSizeMaybe, maxSize: maxSizeMaybe } = newSize; + const hasMinWidth = !Param_1.Param.isNullOrUndefined((_a = minSizeMaybe) === null || _a === void 0 ? void 0 : _a.width); + const hasMinHeight = !Param_1.Param.isNullOrUndefined((_b = minSizeMaybe) === null || _b === void 0 ? void 0 : _b.height); + const hasMaxWidth = !Param_1.Param.isNullOrUndefined((_c = maxSizeMaybe) === null || _c === void 0 ? void 0 : _c.width); + const hasMaxHeight = !Param_1.Param.isNullOrUndefined((_d = maxSizeMaybe) === null || _d === void 0 ? void 0 : _d.height); + const hasValidMinSize = hasMinWidth && hasMinHeight; + const hasValidMaxSize = hasMaxWidth && hasMaxHeight; + switch (behavior) { + case Contract.SheetSizeBehavior.Automatic: { + return { behavior }; + } + case Contract.SheetSizeBehavior.AtMost: { + if (!maxSizeMaybe || !hasValidMaxSize) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMaxSize, 'Missing maxSize for SheetSizeBehavior.AtMost'); + } + const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; + if (maxSize.width < 0 || maxSize.height < 0) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Size value cannot be less than zero'); + } + return { behavior, maxSize }; + } + case Contract.SheetSizeBehavior.AtLeast: { + if (!minSizeMaybe || !hasValidMinSize) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMinSize, 'Missing minSize for SheetSizeBehavior.AtLeast'); + } + const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; + if (minSize.width < 0 || minSize.height < 0) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Size value cannot be less than zero'); + } + return { behavior, minSize }; + } + case Contract.SheetSizeBehavior.Range: { + if (!minSizeMaybe || !maxSizeMaybe || !hasValidMinSize || !hasValidMaxSize) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMinMaxSize, 'Missing minSize or maxSize for SheetSizeBehavior.Range'); + } + const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; + const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; + if (minSize.width < 0 || + minSize.height < 0 || + maxSize.width < 0 || + maxSize.height < 0 || + minSize.width > maxSize.width || + minSize.height > maxSize.height) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Missing minSize or maxSize for SheetSizeBehavior.Range'); + } + return { behavior, minSize, maxSize }; + } + case Contract.SheetSizeBehavior.Exactly: { + if (minSizeMaybe && maxSizeMaybe) { + if (hasValidMinSize && hasValidMaxSize) { + const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; + const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; + if (minSize.width !== maxSize.width || minSize.height !== maxSize.height) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Conflicting size values for SheetSizeBehavior.Exactly'); + } + return { behavior, minSize, maxSize }; + } + if (hasValidMinSize) { + const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; + return { behavior, minSize, maxSize: minSize }; + } + if (hasValidMaxSize) { + const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; + return { behavior, minSize: maxSize, maxSize }; + } + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Invalid sheet size parameter'); + } + default: { + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InternalError, `Unsupported sheet size behavior: ${behavior}`); + } + } + } +} +exports.SheetImpl = SheetImpl; +SheetImpl.parseDimensions = (size) => { + const empty = { width: undefined, height: undefined }; + if (!size) { + return empty; + } + const { success: widthParsed, parsed: parsedWidth } = Param_1.Param.tryParseNumber(size.width); + const { success: heightParsed, parsed: parsedHeight } = Param_1.Param.tryParseNumber(size.height); + if (widthParsed && heightParsed) { + return { width: parsedWidth, height: parsedHeight }; + } + if (widthParsed) { + return { width: parsedWidth }; + } + if (heightParsed) { + return { height: parsedHeight }; + } + return empty; +}; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js": +/*!****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +class SheetInfoImpl { + constructor(_name, _sheetType, _sheetSize, _index, _isActive, _isHidden, _url) { + this._name = _name; + this._sheetType = _sheetType; + this._sheetSize = _sheetSize; + this._index = _index; + this._isActive = _isActive; + this._isHidden = _isHidden; + this._url = _url; + } + get name() { + return this._name; + } + set name(sheetName) { + this._name = sheetName; + } + get sheetSize() { + return this._sheetSize; + } + set sheetSize(value) { + this._sheetSize = value; + } + get sheetType() { + return this._sheetType; + } + get sheetPath() { + return { + sheetName: this.name, + isDashboard: this.sheetType === api_external_contract_js_1.SheetType.Dashboard, + }; + } + get index() { + return this._index; + } + get isActive() { + return this._isActive; + } + set active(active) { + this._isActive = active; + } + get isHidden() { + return this._isHidden; + } + get url() { + return this._url; + } +} +exports.SheetInfoImpl = SheetInfoImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js": +/*!*************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * This class implements the SingleEventManager interface for a single type of Tableau event + * + * @template TEventType The Tableau event type this class specializes + */ +class SingleEventManagerImpl { + constructor(eventType) { + this._eventType = eventType; + this._handlers = []; + } + get eventType() { + return this._eventType; + } + addEventListener(handler) { + this._handlers.push(handler); + return () => this.removeEventListener(handler); + } + removeEventListener(handler) { + const beforeCount = this._handlers.length; + this._handlers = this._handlers.filter((h) => h !== handler); + return beforeCount > this._handlers.length; + } + triggerEvent(eventGenerator) { + for (const handler of this._handlers) { + try { + const eventModel = eventGenerator(); + handler(eventModel); + } + catch (e) { + // Since this handler could be outside our control, just catch anything it throws and continue on + continue; + } + } + } +} +exports.SingleEventManagerImpl = SingleEventManagerImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/StoryImpl.js": +/*!************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/StoryImpl.js ***! + \************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const ShortLivedDeferred_1 = __webpack_require__(/*! ../Utils/ShortLivedDeferred */ "../api-shared-js/lib/src/ApiShared/Utils/ShortLivedDeferred.js"); +const SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +const StoryPointImpl_1 = __webpack_require__(/*! ./StoryPointImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js"); +const StoryPointInfoImpl_1 = __webpack_require__(/*! ./StoryPointInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js"); +class StoryImpl extends SheetImpl_1.SheetImpl { + constructor(_sheetInfoImpl, storyModel, _publishedSheetInfos, _registryId) { + super(_sheetInfoImpl, _registryId); + this._sheetInfoImpl = _sheetInfoImpl; + this._publishedSheetInfos = _publishedSheetInfos; + this._registryId = _registryId; + this._storyPointInfoImpls = []; + this._deferred = new ShortLivedDeferred_1.ShortLivedDeferred(); + this.initializeStory(storyModel); + } + initializeStory(storyModel) { + storyModel.storyPoints.forEach((storyPointModel) => { + const isActive = storyPointModel.index === storyModel.activeStoryPointIndex; + const storyPointInfoImpl = new StoryPointInfoImpl_1.StoryPointInfoImpl(storyPointModel.caption, storyPointModel.index, storyPointModel.storyPointId, isActive, storyPointModel.updated, this); + this._storyPointInfoImpls.push(storyPointInfoImpl); + if (isActive) { + this._activeStoryPointImpl = new StoryPointImpl_1.StoryPointImpl(storyPointInfoImpl, this._publishedSheetInfos, this._registryId, storyPointModel.containedSheetInfo); + } + }); + } + updateStoryInfo(index, storyPointModel) { + if (!this._storyPointInfoImpls) { + return; + } + let storyInfoImpl = this._storyPointInfoImpls[index]; + if (storyInfoImpl.storyPointId !== storyPointModel.storyPointId) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.StoryPointIdMismatch, `We should not be updating a story point when the IDs don't match. Existing storyPointID=${storyInfoImpl.storyPointId}, newStoryPointID=${storyPointModel.storyPointId}`); + } + storyInfoImpl.caption = storyPointModel.caption; + storyInfoImpl.updated = storyPointModel.updated; + if (this._activeStoryPointImpl.storyPointId === storyPointModel.storyPointId) { + this._activeStoryPointImpl.updated = storyInfoImpl.updated; + } + } + updateStory(storyPointModel) { + if (!this._storyPointInfoImpls) { + return; + } + this._storyPointInfoImpls.forEach((storyPointInfoImpl) => { + const isActive = storyPointInfoImpl.storyPointId === storyPointModel.storyPointId; + if (isActive) { + // update the state + storyPointInfoImpl.caption = storyPointModel.caption; + storyPointInfoImpl.index = storyPointModel.index; + storyPointInfoImpl.active = true; + storyPointInfoImpl.updated = storyPointModel.updated; + // re-initialize activeStoryPointImpl + this._activeStoryPointImpl = new StoryPointImpl_1.StoryPointImpl(storyPointInfoImpl, this._publishedSheetInfos, this._registryId, storyPointModel.containedSheetInfo); + } + else { + // set old ones to false + storyPointInfoImpl.active = false; + } + }); + if (this.activeStoryPoint) { + this._deferred.resolve(this.activeStoryPoint); + } + } + get activeStoryPoint() { + return this._activeStoryPointImpl; + } + get storyPointsInfo() { + return this._storyPointInfoImpls; + } + get isActive() { + return this._sheetInfoImpl.active; + } + get isHidden() { + return !!this._sheetInfoImpl.isHidden; + } + activateNextStoryPointAsync() { + if (this._activeStoryPointImpl.index === this._storyPointInfoImpls.length - 1) { + return Promise.resolve(this._activeStoryPointImpl); + } + let promise = this._deferred.getNewPromiseOrThrowIfBusy(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + service.activateNextStoryPointAsync(); + return promise; + } + activatePreviousStoryPointAsync() { + if (this._activeStoryPointImpl.index === 0) { + return Promise.resolve(this._activeStoryPointImpl); + } + let promise = this._deferred.getNewPromiseOrThrowIfBusy(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + service.activatePreviousStoryPointAsync(); + return promise; + } + activateStoryPointAsync(index) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(index, 'index'); + ErrorHelpers_1.ErrorHelpers.verifyParameterType(index, 'number', 'index'); + if (index < 0 || index >= this._storyPointInfoImpls.length) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.IndexOutOfRange, 'The index passed to this command is out of range.'); + } + if (index === this._activeStoryPointImpl.index) { + return Promise.resolve(this._activeStoryPointImpl); + } + let promise = this._deferred.getNewPromiseOrThrowIfBusy(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + service.activateStoryPointAsync(index); + return promise; + } + revertStoryPointAsync(index) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(index, 'index'); + ErrorHelpers_1.ErrorHelpers.verifyParameterType(index, 'number', 'index'); + if (index < 0 || index >= this._storyPointInfoImpls.length) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.IndexOutOfRange, 'The index passed to this command is out of range.'); + } + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + return service.revertStoryPointAsync(index).then((response) => { + this.updateStoryInfo(response.index, response); + const storyPointInfoImpl = new StoryPointInfoImpl_1.StoryPointInfoImpl(response.caption, response.index, response.storyPointId, false, response.updated, this); + return storyPointInfoImpl; + }); + } + clearPendingPromises() { + if (this._deferred) { + this._deferred.reject('All pending promises cleared'); + } + } +} +exports.StoryImpl = StoryImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const SheetUtils_1 = __webpack_require__(/*! ../Utils/SheetUtils */ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js"); +const DashboardImpl_1 = __webpack_require__(/*! ./DashboardImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js"); +const SheetInfoImpl_1 = __webpack_require__(/*! ./SheetInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js"); +const WorksheetImpl_1 = __webpack_require__(/*! ./WorksheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js"); +class StoryPointImpl { + constructor(_storyPointInfoImpl, sheetInfos, registryId, containedSheetInfo) { + this._storyPointInfoImpl = _storyPointInfoImpl; + if (containedSheetInfo) { + this._containedSheetImpl = this.createContainedSheet(containedSheetInfo, sheetInfos, registryId); + } + } + get index() { + return this._storyPointInfoImpl.index; + } + get caption() { + return this._storyPointInfoImpl.caption; + } + get active() { + return this._storyPointInfoImpl.active; + } + get updated() { + return this._storyPointInfoImpl.updated; + } + set updated(updated) { + this._storyPointInfoImpl.updated = updated; + } + get parentStory() { + return this._storyPointInfoImpl.parentStory; + } + get containedSheet() { + return this._containedSheetImpl; + } + get storyPointId() { + return this._storyPointInfoImpl.storyPointId; + } + createContainedSheet(containedSheetInfo, sheetInfos, registryId) { + const containedSheetIdx = -1; + const publishedSheetInfo = SheetUtils_1.SheetUtils.getPublishedSheetInfoByName(containedSheetInfo.name, sheetInfos); + const containedSheetSize = SheetUtils_1.SheetUtils.createAutomaticSize(); + const isContainedSheetHidden = publishedSheetInfo === undefined; + const containedSheetUrl = publishedSheetInfo ? publishedSheetInfo.url : ''; + // Contained sheets aren't active - the containing sheet is active. + const containedSheetActive = false; + const containedSheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(containedSheetInfo.name, SheetUtils_1.SheetUtils.getSheetTypeEnum(containedSheetInfo.sheetType), containedSheetSize, containedSheetIdx, containedSheetActive, isContainedSheetHidden, containedSheetUrl); + let sheetImpl; + switch (containedSheetInfoImpl.sheetType) { + case Contract.SheetType.Worksheet: { + const vizId = { + worksheet: containedSheetInfoImpl.name, + }; + sheetImpl = new WorksheetImpl_1.WorksheetImpl(containedSheetInfoImpl, registryId, vizId, null, this); + break; + } + case Contract.SheetType.Dashboard: { + const sheetPath = { + sheetName: containedSheetInfoImpl.name, + isDashboard: true, + }; + sheetImpl = new DashboardImpl_1.DashboardImpl(containedSheetInfoImpl, containedSheetInfo.dashboardZones, sheetPath, registryId, this); + break; + } + default: { + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.ServerError, 'Invalid SheetType'); + } + } + return sheetImpl; + } +} +exports.StoryPointImpl = StoryPointImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js": +/*!*********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class StoryPointInfoImpl { + constructor(_caption, _index, _storyPointId, _active, _updated, _parentStoryImpl) { + this._caption = _caption; + this._index = _index; + this._storyPointId = _storyPointId; + this._active = _active; + this._updated = _updated; + this._parentStoryImpl = _parentStoryImpl; + } + get caption() { + return this._caption; + } + set caption(caption) { + this._caption = caption; + } + get index() { + return this._index; + } + set index(index) { + this._index = index; + } + get storyPointId() { + return this._storyPointId; + } + get active() { + return this._active; + } + set active(isActive) { + this._active = isActive; + } + get updated() { + return this._updated; + } + set updated(isUpdated) { + this._updated = isUpdated; + } + get parentStory() { + return this._parentStoryImpl; + } +} +exports.StoryPointInfoImpl = StoryPointInfoImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/WorkbookImpl.js": +/*!***************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/WorkbookImpl.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class WorkbookImpl { +} +exports.WorkbookImpl = WorkbookImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js": +/*!****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const DataSource_1 = __webpack_require__(/*! ../DataSource */ "../api-shared-js/lib/src/ApiShared/DataSource.js"); +const LogicalTable_1 = __webpack_require__(/*! ../LogicalTable */ "../api-shared-js/lib/src/ApiShared/LogicalTable.js"); +const GetDataService_1 = __webpack_require__(/*! ../Services/GetDataService */ "../api-shared-js/lib/src/ApiShared/Services/GetDataService.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const DataSourceImpl_1 = __webpack_require__(/*! ./DataSourceImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); +const SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +class WorksheetImpl extends SheetImpl_1.SheetImpl { + constructor(sheetInfoImpl, _registryId, _visualId, _parentDashboardImpl, _parentStoryPointImpl, _backgroundColor = null, _formatting = null) { + super(sheetInfoImpl, _registryId); + this._visualId = _visualId; + this._parentDashboardImpl = _parentDashboardImpl; + this._parentStoryPointImpl = _parentStoryPointImpl; + this._backgroundColor = _backgroundColor; + this._formatting = _formatting; + } + get parentDashboard() { + return this._parentDashboardImpl; + } + get parentStoryPoint() { + return this._parentStoryPointImpl; + } + get visualId() { + return this._visualId; + } + getMaxPageRowLimit() { + return 10000; + } + get backgroundColor() { + return this._backgroundColor; + } + get formatting() { + return this._formatting; + } + applyFilterAsync(fieldName, values, updateType, options) { + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'Contract.FilterUpdateType'); + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.applyFilterAsync(this.visualId, fieldName, values, updateType, options); + } + applyRangeFilterAsync(fieldName, filterOptions) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName'); + ErrorHelpers_1.ErrorHelpers.verifyParameter(filterOptions, 'filterOptions'); + if (filterOptions.nullOption) { + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(filterOptions.nullOption, api_external_contract_js_1.FilterNullOption, 'FilterNullOption'); + } + else { + ErrorHelpers_1.ErrorHelpers.verifyRangeParamType(filterOptions.min, filterOptions.max); + } + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.applyRangeFilterAsync(this.visualId, fieldName, filterOptions); + } + applyHierarchicalFilterAsync(fieldName, values, updateType, options) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName'); + ErrorHelpers_1.ErrorHelpers.verifyParameter(values, 'values'); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'Contract.FilterUpdateType'); + if (!Array.isArray(values) && !values.levels) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'values parameter for applyHierarchicalFilterAsync must be an array or contain a levels key'); + } + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.applyHierarchicalFilterAsync(this.visualId, fieldName, values, updateType, options); + } + clearFilterAsync(fieldName) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName'); + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.clearFilterAsync(this.visualId, fieldName); + } + applyRelativeDateFilterAsync(fieldName, options) { + ErrorHelpers_1.ErrorHelpers.verifyStringParameter(fieldName, 'fieldName'); + ErrorHelpers_1.ErrorHelpers.verifyParameter(options, 'options'); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(options.periodType, api_external_contract_js_1.PeriodType, 'PeriodType'); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(options.rangeType, api_external_contract_js_1.DateRangeType, 'DateRangeType'); + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.applyRelativeDateFilterAsync(this.visualId, fieldName, options); + } + getDataSourcesAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return service.getDataSourcesAsync(this.visualId).then((result) => { + const dataSchema = result; + const worksheetDataSourceInfo = dataSchema.worksheetDataSchemaMap[this.name]; + const dataSources = []; + // First, add the primary datasource. By convention, it comes first in the returned array. + const primaryId = worksheetDataSourceInfo.primaryDataSource; + dataSources.push(this.createDataSourceFromInfo(dataSchema.dataSources[primaryId])); + // Then, loop through any secondary data sources and add them. + for (const secondaryId of worksheetDataSourceInfo.referencedDataSourceList) { + if (secondaryId !== primaryId) { + dataSources.push(this.createDataSourceFromInfo(dataSchema.dataSources[secondaryId])); + } + } + return dataSources; + }); + } + getFiltersAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.getFiltersAsync(this.visualId); + } + getSelectedMarksAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + return service.getSelectedMarksAsync(this.visualId); + } + getHighlightedMarksAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + return service.getHighlightedMarksAsync(this.visualId); + } + getSummaryDataAsync(options) { + var _a; + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return service.getUnderlyingDataAsync(this.visualId, GetDataService_1.GetDataType.Summary, !!options.ignoreAliases, !!options.ignoreSelection, true, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false))); + } + getSummaryDataReaderAsync(pageRowCount, options) { + var _a; + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return service.getSummaryDataReaderAsync(this.visualId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, !!options.ignoreSelection, true, // includeAllColumns (can be overridden by columnsToIncludeById) + options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false))); + } + getVisualSpecificationAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); + return service.getVisualSpecificationAsync(this.visualId); + } + addMarksCardFieldsAsync(marksCardIndex, encodingType, columns, startIndex) { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); + return service.addMarksCardFieldsAsync(this.visualId, marksCardIndex, encodingType, columns, startIndex); + } + moveMarksCardFieldAsync(marksCardIndex, fromIndex, toIndex, fieldCount) { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); + return service.moveMarksCardFieldAsync(this.visualId, marksCardIndex, fromIndex, toIndex, fieldCount); + } + spliceMarksCardFieldsAsync(marksCardIndex, encodingType, startIndex, deleteCount, columns) { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); + return service.spliceMarksCardFieldsAsync(this.visualId, marksCardIndex, encodingType, startIndex, deleteCount, columns); + } + getSummaryColumnsInfoAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + return service.getSummaryColumnsInfoAsync(this.visualId); + } + getUnderlyingDataAsync(options) { + var _a; + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return service.getUnderlyingDataAsync(this.visualId, GetDataService_1.GetDataType.Underlying, !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false))); + } + getUnderlyingTablesAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return service.getUnderlyingTablesAsync(this.visualId).then((logicalTableInfos) => { + return logicalTableInfos.map((logicalTableInfo) => new LogicalTable_1.LogicalTable(logicalTableInfo)); + }); + } + getUnderlyingTableDataAsync(logicalTableId, options) { + var _a; + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return service.getUnderlyingTableDataAsync(this.visualId, logicalTableId, !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false))); + } + getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options) { + var _a; + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return service.getUnderlyingTableDataReaderAsync(this.visualId, logicalTableId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false))); + } + clearSelectedMarksAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + return service.clearSelectedMarksAsync(this.visualId); + } + selectMarksByValueAsync(selections, selectionUpdateType) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(selections, 'fieldName'); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(selectionUpdateType, api_external_contract_js_1.SelectionUpdateType, 'SelectionUpdateType'); + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + return service.selectMarksByValueAsync(this.visualId, selections, selectionUpdateType); + } + selectMarksByIdAsync(selections, selectionUpdateType) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(selections, 'fieldName'); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(selectionUpdateType, api_external_contract_js_1.SelectionUpdateType, 'SelectionUpdateType'); + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + return service.selectMarksByIdAsync(this.visualId, selections, selectionUpdateType); + } + annotateMarkAsync(mark, annotationText) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(mark, 'mark'); + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); + return service.annotateMarkAsync(this.visualId, mark, annotationText); + } + getAnnotationsAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); + return service.getAnnotationsAsync(this.visualId); + } + removeAnnotationAsync(annotation) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(annotation, 'annotation'); + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); + return service.removeAnnotationAsync(this.visualId, annotation); + } + appendContextMenuAsync(targetMenu, config) { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); + return service.appendContextMenuAsync(this.visualId.worksheet, targetMenu, config); + } + removeContextMenuAsync(targetMenu, menuItemId) { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); + return service.removeContextMenuAsync(this.visualId.worksheet, targetMenu, menuItemId); + } + executeContextMenuAsync(targetMenu, menuItemId) { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); + return service.executeContextMenuAsync(this.visualId.worksheet, targetMenu, menuItemId); + } + renameContextMenuAsync(targetMenu, menuHeader, menuDescription) { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); + return service.renameContextMenuAsync(this.visualId.worksheet, targetMenu, menuHeader, menuDescription); + } + hoverTupleAsync(hoveredTuple, tooltip, allowHoverActions) { + if (this.isInsideDashboardExtension()) { + return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `hoverTupleAsync is not supported in dashboard extensions`)); + } + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + return service.hoverTupleAsync(this.visualId, hoveredTuple, tooltip, allowHoverActions); + } + selectTuplesAsync(selectedTuples, selectOption, tooltip) { + if (this.isInsideDashboardExtension()) { + return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `selectTuplesAsync is not supported in dashboard extensions`)); + } + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + return service.selectTuplesAsync(this.visualId, selectedTuples, selectOption, tooltip); + } + getTooltipTextAsync(tupleId) { + if (this.isInsideDashboardExtension()) { + return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `getTooltipTextAsync is not supported in dashboard extensions`)); + } + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("accessibility" /* Accessibility */); + return service.getTooltipTextAsync(this.visualId, tupleId); + } + leaveMarkNavigationAsync() { + if (this.isInsideDashboardExtension()) { + return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `leaveMarkNavigationAsync is not supported in dashboard extensions`)); + } + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("accessibility" /* Accessibility */); + return service.leaveMarkNavigationAsync(this.visualId); + } + editAliasesDialogAsync(fieldName) { + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); + return service.editAliasesDialogAsync(fieldName); + } + createDataSourceFromInfo(dataSourceInfo) { + const dataSourceImpl = new DataSourceImpl_1.DataSourceImpl(dataSourceInfo, this._registryId); + const dataSource = new DataSource_1.DataSource(dataSourceImpl); + dataSourceImpl.initializeWithPublicInterfaces(dataSource); + return dataSource; + } + verifyActiveSheet() { + const isRootAndActiveWorksheet = this.active; + const isInsideActiveDashboard = this.isInsideActiveDashboard(); + const isInsideActiveStoryPoint = this.isInsideActiveStoryPoint(); + if (!isRootAndActiveWorksheet && !isInsideActiveDashboard && !isInsideActiveStoryPoint) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.NotActiveSheet, 'Operation not allowed on non-active sheet'); + } + } + isInsideActiveStoryPoint() { + return this._parentStoryPointImpl && this._parentStoryPointImpl.active; + } + isInsideActiveDashboard() { + return this._parentDashboardImpl && this._parentDashboardImpl.active; + } + isInsideDashboardExtension() { + return this._parentDashboardImpl !== null; + } +} +exports.WorksheetImpl = WorksheetImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/LogicalTable.js": +/*!**********************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/LogicalTable.js ***! + \**********************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of a logical table. + * This does not follow the Impl pattern as it is just a property bag. + */ +class LogicalTable { + constructor(_logicalTable) { + this._logicalTable = _logicalTable; + } + get id() { + return this._logicalTable.id; + } + get caption() { + return this._logicalTable.caption; + } +} +exports.LogicalTable = LogicalTable; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Models/AccessibilityModels.js": +/*!************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Models/AccessibilityModels.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class TooltipTextRequestModel { + constructor(visualIdPresModel, tupleId) { + this.visualIdPresModel = visualIdPresModel; + this.tupleId = tupleId; + } +} +exports.TooltipTextRequestModel = TooltipTextRequestModel; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Models/FilterModels.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Models/FilterModels.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +class Filter { + constructor(_worksheetName, _fieldName, _filterType, _fieldId, _registryId) { + this._worksheetName = _worksheetName; + this._fieldName = _fieldName; + this._filterType = _filterType; + this._fieldId = _fieldId; + this._registryId = _registryId; + } + get worksheetName() { + return this._worksheetName; + } + get fieldName() { + return this._fieldName; + } + get fieldId() { + return this._fieldId; + } + get filterType() { + return this._filterType; + } + getFieldAsync() { + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return service.getFieldAsync(this._fieldId); + } + getAppliedWorksheetsAsync() { + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.getAppliedWorksheetsAsync(this._worksheetName, this._fieldId); + } + setAppliedWorksheetsAsync(applyToWorksheets) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(applyToWorksheets, 'applyToWorksheets'); + const uniqueWorksheets = new Set(applyToWorksheets); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.setAppliedWorksheetsAsync(this._worksheetName, this._fieldName, this._fieldId, Array.from(uniqueWorksheets)); + } +} +exports.Filter = Filter; +class CategoricalFilter extends Filter { + constructor(worksheetName, fieldName, fieldId, filterType, registryId, _appliedValues, _isExcludeMode, _isAllSelected) { + super(worksheetName, fieldName, filterType, fieldId, registryId); + this._appliedValues = _appliedValues; + this._isExcludeMode = _isExcludeMode; + this._isAllSelected = _isAllSelected; + } + get isAllSelected() { + return this._isAllSelected; + } + get appliedValues() { + return this._appliedValues; + } + get isExcludeMode() { + return this._isExcludeMode; + } + getDomainAsync(domainType) { + if (!domainType) { + domainType = api_external_contract_js_1.FilterDomainType.Relevant; + } + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(domainType, api_external_contract_js_1.FilterDomainType, 'FilterDomainType'); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.getCategoricalDomainAsync(this._worksheetName, this._fieldId, domainType); + } +} +exports.CategoricalFilter = CategoricalFilter; +class HierarchicalDataValue { + constructor(_value, _hierarchicalPath, _level) { + this._value = _value; + this._hierarchicalPath = _hierarchicalPath; + this._level = _level; + } + get value() { + return this._value; + } + get hierarchicalPath() { + return this._hierarchicalPath; + } + get level() { + return this._level; + } +} +exports.HierarchicalDataValue = HierarchicalDataValue; +class HierarchicalLevelDetail { + constructor(_name, _levelSelectionState) { + this._name = _name; + this._levelSelectionState = _levelSelectionState; + } + get name() { + return this._name; + } + get levelSelectionState() { + return this._levelSelectionState; + } +} +exports.HierarchicalLevelDetail = HierarchicalLevelDetail; +class HierarchicalFilter extends Filter { + constructor(worksheetName, fieldName, fieldId, filterType, registryId, _dimensionName, _hierarchyCaption, _numberOfLevels, _levelDetails, _appliedValues, _isAllSelected) { + super(worksheetName, fieldName, filterType, fieldId, registryId); + this._dimensionName = _dimensionName; + this._hierarchyCaption = _hierarchyCaption; + this._numberOfLevels = _numberOfLevels; + this._levelDetails = _levelDetails; + this._appliedValues = _appliedValues; + this._isAllSelected = _isAllSelected; + } + getDomainAsync(domainType) { + throw new Error('Method not implemented.'); + } + get dimensionName() { + return this._dimensionName; + } + get hierarchyCaption() { + return this._hierarchyCaption; + } + get numberOfLevels() { + return this._numberOfLevels; + } + get levelDetails() { + return this._levelDetails; + } + get isAllSelected() { + return this._isAllSelected; + } + get appliedValues() { + return this._appliedValues; + } +} +exports.HierarchicalFilter = HierarchicalFilter; +class RangeFilter extends Filter { + constructor(worksheetName, fieldName, fieldId, filterType, registryId, _min, _max, _includeNullValues) { + super(worksheetName, fieldName, filterType, fieldId, registryId); + this._min = _min; + this._max = _max; + this._includeNullValues = _includeNullValues; + } + get minValue() { + return this._min; + } + get maxValue() { + return this._max; + } + get includeNullValues() { + return this._includeNullValues; + } + getDomainAsync(domainType) { + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + if (!domainType) { + domainType = api_external_contract_js_1.FilterDomainType.Relevant; + } + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(domainType, api_external_contract_js_1.FilterDomainType, 'FilterDomainType'); + return service.getRangeDomainAsync(this._worksheetName, this._fieldId, domainType); + } +} +exports.RangeFilter = RangeFilter; +class RelativeDateFilter extends Filter { + constructor(worksheetName, fieldName, fieldId, filterType, registryId, _anchorDate, _periodType, _rangeType, _rangeN) { + super(worksheetName, fieldName, filterType, fieldId, registryId); + this._anchorDate = _anchorDate; + this._periodType = _periodType; + this._rangeType = _rangeType; + this._rangeN = _rangeN; + } + get anchorDate() { + return this._anchorDate; + } + get periodType() { + return this._periodType; + } + get rangeType() { + return this._rangeType; + } + get rangeN() { + return this._rangeN; + } +} +exports.RelativeDateFilter = RelativeDateFilter; +class CategoricalDomain { + constructor(_values, _domainType) { + this._values = _values; + this._domainType = _domainType; + } + get values() { + return this._values; + } + get type() { + return this._domainType; + } +} +exports.CategoricalDomain = CategoricalDomain; +class RangeDomain { + constructor(_min, _max, _domainType) { + this._min = _min; + this._max = _max; + this._domainType = _domainType; + } + get type() { + return this._domainType; + } + get min() { + return this._min; + } + get max() { + return this._max; + } +} +exports.RangeDomain = RangeDomain; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class DataTable { + constructor(_data, _columns, _totalRowCount, _isTotalRowCountLimited, _isSummaryData, _marksInfo) { + this._data = _data; + this._columns = _columns; + this._totalRowCount = _totalRowCount; + this._isTotalRowCountLimited = _isTotalRowCountLimited; + this._isSummaryData = _isSummaryData; + this._marksInfo = _marksInfo; + this._name = _isSummaryData ? 'Summary Data Table' : 'Underlying Data Table'; + } + get name() { + return this._name; + } + get data() { + return this._data; + } + get columns() { + return this._columns; + } + get marksInfo() { + return this._marksInfo; + } + get totalRowCount() { + return this._totalRowCount; + } + get isTotalRowCountLimited() { + return this._isTotalRowCountLimited; + } + get isSummaryData() { + return this._isSummaryData; + } +} +exports.DataTable = DataTable; +class MarkInfo { + constructor(_type, _color, _tupleId) { + this._type = _type; + this._color = _color; + this._tupleId = _tupleId; + } + get type() { + return this._type; + } + get color() { + return this._color; + } + get tupleId() { + return this._tupleId; + } +} +exports.MarkInfo = MarkInfo; +class Column { + constructor(_fieldName, _fieldId, _dataType, _isReferenced, _index) { + this._fieldName = _fieldName; + this._fieldId = _fieldId; + this._dataType = _dataType; + this._isReferenced = _isReferenced; + this._index = _index; + } + get fieldName() { + return this._fieldName; + } + get fieldId() { + return this._fieldId; + } + get dataType() { + return this._dataType; + } + get isReferenced() { + return this._isReferenced; + } + get index() { + return this._index; + } +} +exports.Column = Column; +class DataValue { + /* tslint:disable:no-any */ + constructor(_value, _nativeValue, _formattedValue, _aliasValue, _hasAlias) { + this._value = _value; + this._nativeValue = _nativeValue; + this._formattedValue = _formattedValue; + this._aliasValue = _aliasValue; + this._hasAlias = _hasAlias; + } + get value() { + return this._value; + } + get nativeValue() { + return this._nativeValue; + } + get formattedValue() { + return this._formattedValue; + } + get aliasValue() { + return this._aliasValue; + } + get hasAlias() { + return this._hasAlias; + } +} +exports.DataValue = DataValue; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Models/GetDataTableReaderModels.js": +/*!*****************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Models/GetDataTableReaderModels.js ***! + \*****************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +class DataTableReader { + constructor(_id, _totalRowCount, _pageRowCount, _registryId) { + this._id = _id; + this._totalRowCount = _totalRowCount; + this._pageRowCount = _pageRowCount; + this._registryId = _registryId; + this._pageCount = Math.ceil(_totalRowCount / _pageRowCount); + } + get totalRowCount() { + return this._totalRowCount; + } + get pageCount() { + return this._pageCount; + } + getPageAsync(pageNumber) { + ErrorHelpers_1.ErrorHelpers.verifyRange(pageNumber, 0, this._pageCount); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + return service.getPageAsync(this._id, pageNumber, this._pageRowCount); + } + getAllPagesAsync(maxRows) { + return __awaiter(this, void 0, void 0, function* () { + const firstPage = yield this.getPageAsync(0); + maxRows = maxRows || this.totalRowCount; + const rowsRequested = Math.min(maxRows, this.totalRowCount); + const pagesRequested = Math.ceil(rowsRequested / this._pageRowCount); + // Fetch up to 400 pages, with a default of 10,000 pageRowCount that gives us 4,000,000 rows + const pagesToFetch = Math.min(pagesRequested, 400); + const isDataLimited = pagesToFetch < pagesRequested; + let remainingData = []; + for (let i = 1; i < pagesToFetch; i++) { + const page = yield this.getPageAsync(i); + remainingData.push(page.data); + } + let fullData = firstPage.data.concat(...remainingData); + // This slices the array only if maxRows has been set and is less than totalRowCount + fullData.length = rowsRequested; + return { + name: firstPage.name, + data: fullData, + columns: firstPage.columns, + totalRowCount: isDataLimited ? pagesToFetch * this._pageRowCount : rowsRequested, + isTotalRowCountLimited: isDataLimited, + isSummaryData: firstPage.isSummaryData, + }; + }); + } + releaseAsync() { + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + return service.releaseAsync(this._id); + } +} +exports.DataTableReader = DataTableReader; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js": +/*!********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Selection Model. + */ +class SelectionModel { +} +exports.SelectionModel = SelectionModel; +/** + * Value based selection model. Meant for hierarchical, range and categorical selections. + */ +class ValueSelectionModel extends SelectionModel { + constructor() { + super(...arguments); + this.selectValues = []; + } +} +exports.ValueSelectionModel = ValueSelectionModel; +/** + * Hierarchical value selection model + */ +class HierarchicalSelectionModel extends ValueSelectionModel { +} +exports.HierarchicalSelectionModel = HierarchicalSelectionModel; +/** + * Range based value selection model + */ +class RangeSelectionModel extends SelectionModel { +} +exports.RangeSelectionModel = RangeSelectionModel; +/** + * Dimension value selection model + */ +class DimensionSelectionModel extends ValueSelectionModel { +} +exports.DimensionSelectionModel = DimensionSelectionModel; +/** + * Tuple based selection model + */ +class TupleSelectionModel { + constructor() { + this.objectIds = []; + } +} +exports.TupleSelectionModel = TupleSelectionModel; +/** + * Container class to populate all the selection models when parsing input + */ +class SelectionModelsContainer { + constructor() { + this.hierModelArr = []; + this.dimModelArr = []; + this.quantModelArr = []; + } +} +exports.SelectionModelsContainer = SelectionModelsContainer; +class SelectTuplesInteractionModel { + constructor(visualIdPresModel, tupleIds = [], selectOptions, tooltipContext) { + this.visualIdPresModel = visualIdPresModel; + this.tupleIds = tupleIds; + this.selectOptions = selectOptions; + this.tooltipContext = tooltipContext; + } +} +exports.SelectTuplesInteractionModel = SelectTuplesInteractionModel; +class HoverTupleInteractionModel { + constructor(visualIdPresModel, tupleId, tooltipContext, allowHoverActions) { + this.visualIdPresModel = visualIdPresModel; + this.tupleId = tupleId; + this.tooltipContext = tooltipContext; + this.allowHoverActions = allowHoverActions; + } +} +exports.HoverTupleInteractionModel = HoverTupleInteractionModel; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Point.js": +/*!***************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Point.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class Point { + constructor(_x, _y) { + this._x = _x; + this._y = _y; + } + get x() { + return this._x; + } + get y() { + return this._y; + } +} +exports.Point = Point; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/GetDataService.js": +/*!*********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/GetDataService.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Defines which type of getData call to make. + */ +var GetDataType; +(function (GetDataType) { + GetDataType["Summary"] = "summary"; + GetDataType["Underlying"] = "underlying"; +})(GetDataType = exports.GetDataType || (exports.GetDataType = {})); + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js": +/*!********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js ***! + \********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const ServiceRegistry_1 = __webpack_require__(/*! ./ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const AccessibilityServiceImpl_1 = __webpack_require__(/*! ./impl/AccessibilityServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/AccessibilityServiceImpl.js"); +const AnimationServiceImpl_1 = __webpack_require__(/*! ./impl/AnimationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js"); +const AnnotationServiceImpl_1 = __webpack_require__(/*! ./impl/AnnotationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js"); +const DataSourceServiceImpl_1 = __webpack_require__(/*! ./impl/DataSourceServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js"); +const ExportServiceImpl_1 = __webpack_require__(/*! ./impl/ExportServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ExportServiceImpl.js"); +const ExternalContextMenuServiceImpl_1 = __webpack_require__(/*! ./impl/ExternalContextMenuServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js"); +const FilterServiceImpl_1 = __webpack_require__(/*! ./impl/FilterServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js"); +const GetDataServiceImpl_1 = __webpack_require__(/*! ./impl/GetDataServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js"); +const NotificationServiceImpl_1 = __webpack_require__(/*! ./impl/NotificationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js"); +const ParametersServiceImpl_1 = __webpack_require__(/*! ./impl/ParametersServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js"); +const SelectionServiceImpl_1 = __webpack_require__(/*! ./impl/SelectionServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js"); +const SizeServiceImpl_1 = __webpack_require__(/*! ./impl/SizeServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js"); +const VisualModelServiceImpl_1 = __webpack_require__(/*! ./impl/VisualModelServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js"); +const VizServiceImpl_1 = __webpack_require__(/*! ./impl/VizServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js"); +const ZoneServiceImpl_1 = __webpack_require__(/*! ./impl/ZoneServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js"); +function registerAllSharedServices(dispatcher, registryId) { + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new AnimationServiceImpl_1.AnimationServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new DataSourceServiceImpl_1.DataSourceServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ExportServiceImpl_1.ExportServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new GetDataServiceImpl_1.GetDataServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new FilterServiceImpl_1.FilterServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new NotificationServiceImpl_1.NotificationServiceImpl(dispatcher)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ParametersServiceImpl_1.ParametersServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new SelectionServiceImpl_1.SelectionServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new AnnotationServiceImpl_1.AnnotationServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ZoneServiceImpl_1.ZoneServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new SizeServiceImpl_1.SizeServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new VisualModelServiceImpl_1.VisualModelServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new VizServiceImpl_1.VizServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ExternalContextMenuServiceImpl_1.ExternalContextMenuServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new AccessibilityServiceImpl_1.AccessibilityServiceImpl(dispatcher, registryId)); +} +exports.registerAllSharedServices = registerAllSharedServices; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js": +/*!**********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +if (typeof window !== 'undefined') { + window.__tableauApiServiceRegistry = window.__tableauApiServiceRegistry || {}; +} +class ServiceRegistryImpl { + constructor() { + this._services = {}; + } + registerService(service) { + this._services[service.serviceName] = service; + } + getService(serviceName) { + if (!this._services.hasOwnProperty(serviceName)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Service not registered: ${serviceName}`); + } + return this._services[serviceName]; + } +} +/** + * Static class used for getting access to the single instance + * of the ApiServiceRegistry associated with the registryId. + * + * Extensions by design don't need to store/access multiple service registries. Their single instance of ServiceRegistry is + * stored/access with registryId = 0. + * + * Whereas Embedding needs to be aware of which ServiceRegistry to use when there are multiple vizzes embedded. + * An example of how window.__tableauApiServiceRegistry will look when there are two vizzes: { 0 : ServiceRegistry, 1 : ServiceRegistry} + * where registry ID of 0 & 1 refers to viz's internal identifier (which is generated by VizManager). + */ +class ApiServiceRegistry { + /** + * Gets the singleton instance of the ServiceRegistry + */ + static get(registryId) { + if (!window.__tableauApiServiceRegistry || !window.__tableauApiServiceRegistry[registryId]) { + ApiServiceRegistry.setInstance(registryId, new ServiceRegistryImpl()); + } + if (!window.__tableauApiServiceRegistry[registryId]) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Service registry failed'); + } + return window.__tableauApiServiceRegistry[registryId]; + } + /** + * Helper method that sets the service registry instance for the corresponding registryId. Can be used by unit tests + * + * @param {ServiceRegistry} serviceRegistry The new registry + */ + static setInstance(registryId, serviceRegistry) { + if (!window.__tableauApiServiceRegistry) { + window.__tableauApiServiceRegistry = {}; + } + window.__tableauApiServiceRegistry[registryId] = serviceRegistry; + } + /** + * Only used by unit tests + */ + static clearRegistry() { + window.__tableauApiServiceRegistry = {}; + } + // Private to avoid anyone constructing this + constructor() { } +} +exports.ApiServiceRegistry = ApiServiceRegistry; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/AccessibilityServiceImpl.js": +/*!************************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/AccessibilityServiceImpl.js ***! + \************************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const AccessibilityModels_1 = __webpack_require__(/*! ../../Models/AccessibilityModels */ "../api-shared-js/lib/src/ApiShared/Models/AccessibilityModels.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class AccessibilityServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "accessibility" /* Accessibility */; + } + getTooltipTextAsync(visualId, tupleId) { + let tooltipTextRequest = new AccessibilityModels_1.TooltipTextRequestModel(visualId, tupleId); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getTooltipTextAsync', + [api_internal_contract_js_1.ParameterId.TooltipTextRequest]: tooltipTextRequest, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetTooltipText, parameters).then((response) => { + return response.result; + }); + } + leaveMarkNavigationAsync(visualId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'leaveMarkNavigationAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + }; + return this.execute(api_internal_contract_js_1.VerbId.RaiseLeaveMarkNavNotification, parameters).then((response) => { + return; + }); + } +} +exports.AccessibilityServiceImpl = AccessibilityServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js": +/*!********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js ***! + \********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class AnimationServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "animation-service" /* Animation */; + } + replayAsync(replaySpeed) { + const parameters = { + [api_internal_contract_js_1.ParameterId.ReplaySpeed]: 1.0, + }; + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(replaySpeed, api_external_contract_js_1.ReplaySpeedType, 'ReplaySpeedType'); + parameters[api_internal_contract_js_1.ParameterId.ReplaySpeed] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.setReplaySpeedType.convert(replaySpeed); + return this.execute(api_internal_contract_js_1.VerbId.ReplayAnimation, parameters).then((response) => { + return; + }); + } +} +exports.AnimationServiceImpl = AnimationServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js": +/*!*********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js ***! + \*********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +const SelectionModels_1 = __webpack_require__(/*! ../../Models/SelectionModels */ "../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js"); +const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class AnnotationServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "annotation-service" /* Annotation */; + } + /** + * Method to annotate a mark on the given worksheet. + * + * @param visualId + * @param mark + * @param annotationText + */ + annotateMarkAsync(visualId, mark, annotationText) { + const selectionModelContainer = this.parseMarkSelectionIds([mark]); + const dummyTargetPoint = { x: 0, y: 0 }; + const formattedText = `${annotationText}`; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'annotateMarkAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.AnnotateEnum]: api_internal_contract_js_1.AnnotateEnum.Mark, + [api_internal_contract_js_1.ParameterId.TargetPoint]: dummyTargetPoint, + [api_internal_contract_js_1.ParameterId.SelectionList]: [selectionModelContainer.selection], + [api_internal_contract_js_1.ParameterId.FormattedText]: formattedText, + }; + return this.execute(api_internal_contract_js_1.VerbId.CreateAnnotation, parameters).then((response) => { + // Expecting an empty model and hence the void response. + return; + }); + } + /** + * Method to retrieve annotations for the given worksheet. + * + * @param visualId + * @returns {Promise>} + */ + getAnnotationsAsync(visualId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getAnnotationsAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetAnnotations, parameters).then((response) => { + const annotationsList = response.result; + return this.annotationFilterMap(annotationsList); + }); + } + /** + * Method to remove an annotation from a given worksheet. + * + * @param visualId + * @param annotation + */ + removeAnnotationAsync(visualId, annotation) { + const selectionModelContainer = this.parseAnnotationSelectionIds([annotation]); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'removeAnnotationAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.SelectionList]: [selectionModelContainer.selection], + }; + return this.execute(api_internal_contract_js_1.VerbId.RemoveAnnotation, parameters).then((response) => { + // Expecting an empty model and hence the void response. + return; + }); + } + /** + * Method to prepare the pres models for selection by MarksInfo + * @param marks + */ + parseMarkSelectionIds(marks) { + const ids = []; + const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + marks.forEach((mark) => { + const tupleId = mark.tupleId; + if (tupleId !== undefined && tupleId !== null && tupleId > 0) { + ids.push(tupleId.toString()); // collect the tuple ids + } + else { + throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'invalid tupleId'); + } + }); + if (ids.length !== 0) { + // tuple ids based selection + const tupleSelectionModel = new SelectionModels_1.TupleSelectionModel(); + tupleSelectionModel.selectionType = 'tuples'; + tupleSelectionModel.objectIds = ids; + selectionModelContainer.selection = tupleSelectionModel; + } + return selectionModelContainer; + } + /** + * Method to prepare the pres models for selection by MarkAnnotationInfo + * @param marks + */ + parseAnnotationSelectionIds(annotations) { + const ids = []; + const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + annotations.forEach((annotation) => { + const annotationId = annotation.annotationId; + if (annotationId !== undefined && annotationId !== null && annotationId >= 0) { + ids.push(annotationId.toString()); // collect the annotation ids + } + else { + throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'invalid annotationId'); + } + }); + if (ids.length !== 0) { + // annotation ids based selection + const tupleSelectionModel = new SelectionModels_1.TupleSelectionModel(); + tupleSelectionModel.selectionType = 'annotations'; + tupleSelectionModel.objectIds = ids; + selectionModelContainer.selection = tupleSelectionModel; + } + return selectionModelContainer; + } + /** + * Method to map Annotation to MarkAnnotationInfo + * @param annotation + * @returns {Annotation} + */ + mapAnnotation(annotation) { + return { + annotationHTML: annotation.annotationText, + annotationId: annotation.annotationId, + annotationText: annotation.annotationPlainText, + annotationType: InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.annotationType.convert(annotation.annotateEnum), + tupleId: annotation.tupleId, + }; + } + /** + * Filter the Annotations to Mark Annotations, and map them to MarkAnnotationInfo + * @param annotations + * @returns {Array} + */ + annotationFilterMap(annotations) { + const annotationInfos = annotations.map((annotation) => this.mapAnnotation(annotation)); + return annotationInfos; + } +} +exports.AnnotationServiceImpl = AnnotationServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js": +/*!*********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js ***! + \*********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class ClientInfoServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "client-info-service" /* ClientInfo */; + } + getClientInfoAsync() { + const verb = api_internal_contract_js_1.VerbId.GetEmbeddingClientInfo; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getClientInfoAsync', + }; + return this.execute(verb, parameters).then((response) => { + const clientInfo = response.result; + return clientInfo; + }); + } +} +exports.ClientInfoServiceImpl = ClientInfoServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js": +/*!*********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js ***! + \*********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const DataSource_1 = __webpack_require__(/*! ../../DataSource */ "../api-shared-js/lib/src/ApiShared/DataSource.js"); +const Field_1 = __webpack_require__(/*! ../../Field */ "../api-shared-js/lib/src/ApiShared/Field.js"); +const DataSourceImpl_1 = __webpack_require__(/*! ../../Impl/DataSourceImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); +const FieldImpl_1 = __webpack_require__(/*! ../../Impl/FieldImpl */ "../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js"); +const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class DataSourceServiceImpl extends ServiceImplBase_1.ServiceImplBase { + // Since Object Model is supported since Tableau 2020.2, DataSourceServiceImpl can be initialized with the + // platform version when OM was supported. Once we drop support for Tableau versions <= 2020.1, all additional + // code in here for Object Model can be removed. + constructor(dispatcher, registryId) { + super(dispatcher, registryId); + } + get serviceName() { + return "data-source-service" /* DataSourceService */; + } + refreshAsync(dataSourceId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'refreshAsync', + [api_internal_contract_js_1.ParameterId.DeltaTimeMs]: 0, + [api_internal_contract_js_1.ParameterId.ShouldRefreshDS]: true, + }; + // On server: Not passing the datasource id will refresh all datasources. + if (dataSourceId) { + parameters[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId; + } + return this.execute(api_internal_contract_js_1.VerbId.RefreshDataSource, parameters).then((response) => { + return; + }); + } + getActiveTablesAsync(dataSourceId) { + const joinParameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getActiveTablesAsync', + [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId, + }; + // Get the description of the tables used by this connection + return this.execute(api_internal_contract_js_1.VerbId.GetActiveTables, joinParameters).then((joinResponse) => { + const tableInfos = joinResponse.result; + // getActiveTables is unsupported for cubes and GA. We do not have a connection type property + // available from the platform (intentionally, to reduce code churn as new connections are added). + // Instead,just check if any tables are returned. This array will be empty for any non-table based datasource. + if (tableInfos.tables.length === 0) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedMethodForDataSourceType, `getActiveTables is not supported for: ${dataSourceId}`); + } + return tableInfos.tables; + }); + } + getDataSourcesAsync(visualId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getDataSourcesAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetDataSources, parameters).then((response) => { + const dataSchema = response.result; + return dataSchema; + }); + } + getAllDataSourcesAsync() { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getAllDataSourcesAsync', + }; + return this.execute(api_internal_contract_js_1.VerbId.GetAllDataSources, parameters).then((response) => { + const dataSchema = response.result; + return dataSchema; + }); + } + getConnectionSummariesAsync(dataSourceId) { + const params = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getConnectionSummariesAsync', + [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId, + }; + // Get the description of the tables used by this connection + return this.execute(api_internal_contract_js_1.VerbId.GetConnectionDescriptionSummaries, params).then((response) => { + const descriptionSummaries = response.result; + return descriptionSummaries; + }); + } + getFieldAsync(globalfieldName) { + const verb = api_internal_contract_js_1.VerbId.GetFieldAndDataSource; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getFieldAsync', + [api_internal_contract_js_1.ParameterId.FieldId]: globalfieldName, + }; + return this.execute(verb, parameters).then((response) => { + const dataSource = response.result[api_internal_contract_js_1.ParameterId.DataSource]; + const field = response.result[api_internal_contract_js_1.ParameterId.Field]; + return this.convertField(field, this.convertDataSource(dataSource)); + }); + } + getLogicalTablesAsync(dataSourceId) { + const params = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getLogicalTablesAsync', + [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTables, params).then((response) => { + return response.result; + }); + } + getUnderlyingTablesAsync(visualId) { + const params = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getUnderlyingTablesAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTables, params).then((response) => { + return response.result; + }); + } + convertField(field, dataSource) { + return new Field_1.Field(new FieldImpl_1.FieldImpl(field, dataSource)); + } + convertDataSource(dataSource) { + return new DataSource_1.DataSource(new DataSourceImpl_1.DataSourceImpl(dataSource, this._registryId)); + } +} +exports.DataSourceServiceImpl = DataSourceServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ExportServiceImpl.js": +/*!*****************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ExportServiceImpl.js ***! + \*****************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +const ExportHelpers_1 = __webpack_require__(/*! ../../Utils/ExportHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class ExportServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "export-service" /* Export */; + } + getExportCrosstabSheetMapAsync(currentSheetType) { + const verb = api_internal_contract_js_1.VerbId.GetExportCrosstabSheetMap; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getExportCrosstabSheetMapAsync', + [api_internal_contract_js_1.ParameterId.CurrentSheetType]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.sheetType.convert(currentSheetType), + }; + return this.execute(verb, parameters).then((response) => { + const result = response.result; + return result; + }); + } + exportCrosstabAsync(sheetName, format, exportableWorksheetNames, currentSheetType) { + return __awaiter(this, void 0, void 0, function* () { + ErrorHelpers_1.ErrorHelpers.verifySheetName(exportableWorksheetNames, sheetName); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(format, api_external_contract_js_1.CrosstabFileFormat, 'CrosstabFileFormat'); + // The pres layer command for exporting Crosstab uses SimpleSheetIdentifiers instead of sheet names. + // The extensions-and-embedding-api current does not store references to the SimpleSheetIdentifiers of its sheets + // so we call a pres layer command that gives us the SimpleSheetIdentifier for each sheet name that appears in the + // export Crosstab dialog popup. + const sheetNameToIdMap = yield this.getExportCrosstabSheetMapAsync(currentSheetType); + if (!sheetNameToIdMap[sheetName]) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'missing sheet doc id from sheetMap'); + } + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportCrosstabAsync', + [api_internal_contract_js_1.ParameterId.SheetIdentifier]: sheetNameToIdMap[sheetName], + [api_internal_contract_js_1.ParameterId.SendNotifications]: true, + }; + // pres layer command invoked depends on the crosstab file format + let verb; + switch (format) { + case api_external_contract_js_1.CrosstabFileFormat.CSV: + verb = api_internal_contract_js_1.VerbId.ExportCrosstabCsvDownload; + // CSV only parameter: see browser-clients/export-crosstab-options-dialog repo + parameters[api_internal_contract_js_1.ParameterId.UseTabDelimiters] = true; + break; + case api_external_contract_js_1.CrosstabFileFormat.Excel: + verb = api_internal_contract_js_1.VerbId.ExportCrosstabExcelDownload; + break; + default: + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'unsupported Crosstab file format.'); + } + return this.execute(verb, parameters) + .then((response) => { + const result = response.result; + return result; + }) + .catch(() => { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.CrosstabCreationError, 'An unexpected error occurred while generating the document.'); + }); + }); + } + exportDataAsync(visualId, options) { + var _a; + ErrorHelpers_1.ErrorHelpers.verifyExportDataOptions(options); + // Remove any duplicates from the input array + const columnsAsSet = new Set(options.columnsToIncludeById); + const columnsToIncludeById = Array.from(columnsAsSet); + const verb = api_internal_contract_js_1.VerbId.ExportDataDownload; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportDataAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: (_a = options.ignoreAliases, (_a !== null && _a !== void 0 ? _a : false)), + [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: columnsToIncludeById, + }; + return this.execute(verb, parameters) + .then(() => { }) + .catch(() => { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.DataCreationError, 'An unexpected error occurred while generating the document.'); + }); + } + exportPowerPointAsync(sheetNames, exportScenarios) { + ErrorHelpers_1.ErrorHelpers.verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios); + // Note: the ExportOriginUrl param is listed as optional for the pres layer command we are invoking; however, + // recent changes were made that enforced the use of the empty string when invoking this command with no ExportOriginUrl. + // see browser-clients/export-powerpoint-options-dialog repo. + const verb = api_internal_contract_js_1.VerbId.ExportPowerpointDownload; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportPowerPointAsync', + [api_internal_contract_js_1.ParameterId.ExportOriginUrl]: '', + [api_internal_contract_js_1.ParameterId.SelectedSheetNames]: sheetNames, + }; + return this.execute(verb, parameters) + .then((response) => { + const result = response.result; + return result; + }) + .catch(() => { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.PowerPointCreationError, 'An error occured while attempting to generate the PowerPoint file.'); + }); + } + exportPDFAsync(sheetNames, externalExportPdfOptions, exportScenarios) { + return __awaiter(this, void 0, void 0, function* () { + ErrorHelpers_1.ErrorHelpers.verifyExportPDFOptions(externalExportPdfOptions); + ErrorHelpers_1.ErrorHelpers.verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios); + const internalExportPdfOptions = yield this.getExportPDFOptionsAsync(); + ExportHelpers_1.ExportHelpers.updateInternalExportPDFOptions(internalExportPdfOptions, externalExportPdfOptions, sheetNames); + const verb = api_internal_contract_js_1.VerbId.ExportPdfDownload; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportPDFAsync', + [api_internal_contract_js_1.ParameterId.ExportPdfOptions]: internalExportPdfOptions, + }; + return this.execute(verb, parameters) + .then((response) => { + const result = response.result; + return result; + }) + .catch(() => { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.PDFCreationError, 'Unable to create PDF because something went wrong. Try again.'); + }); + }); + } + getExportPDFOptionsAsync() { + const verb = api_internal_contract_js_1.VerbId.GetExportPdfOptions; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getExportPdfOptionsAsync', + }; + return this.execute(verb, parameters).then((response) => { + const result = response.result; + return result; + }); + } +} +exports.ExportServiceImpl = ExportServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js": +/*!******************************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js ***! + \******************************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class ExternalContextMenuServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "external-context-menu-service" /* ExternalContextMenu */; + } + appendContextMenuAsync(sheetName, targetMenu, config) { + const verb = api_internal_contract_js_1.VerbId.AppendExternalMenuItem; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'appendContextMenuAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName, + [api_internal_contract_js_1.ParameterId.ExternalMenuItemDisplayName]: config.displayName, + }; + return this.execute(verb, parameters).then((response) => { + const newMenuItemId = response.result; + return newMenuItemId; + }); + } + removeContextMenuAsync(sheetName, targetMenu, menuItemId) { + const verb = api_internal_contract_js_1.VerbId.RemoveExternalMenuItem; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'removeContextMenuAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName, + [api_internal_contract_js_1.ParameterId.ExternalMenuItemId]: menuItemId, + }; + return this.execute(verb, parameters).then((response) => { + return; + }); + } + executeContextMenuAsync(sheetName, targetMenu, menuItemId) { + const verb = api_internal_contract_js_1.VerbId.ExecuteExternalMenuItem; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'executeContextMenuAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName, + [api_internal_contract_js_1.ParameterId.ExternalMenuItemId]: menuItemId, + }; + return this.execute(verb, parameters).then((response) => { + return; + }); + } + renameContextMenuAsync(sheetName, targetMenu, menuHeader, menuDescription) { + const verb = api_internal_contract_js_1.VerbId.RenameExternalMenu; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'renameContextMenuAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName, + [api_internal_contract_js_1.ParameterId.ExternalMenuHeader]: menuHeader, + [api_internal_contract_js_1.ParameterId.ExternalMenuDescription]: menuDescription, + }; + return this.execute(verb, parameters).then((response) => { + return; + }); + } +} +exports.ExternalContextMenuServiceImpl = ExternalContextMenuServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js": +/*!*****************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js ***! + \*****************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ApiShared_1 = __webpack_require__(/*! ../../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); +const ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +const FilterModels_1 = __webpack_require__(/*! ../../Models/FilterModels */ "../api-shared-js/lib/src/ApiShared/Models/FilterModels.js"); +const DataValueFactory_1 = __webpack_require__(/*! ../../Utils/DataValueFactory */ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); +const Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class FilterServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "filter-service" /* Filter */; + } + applyFilterAsync(visualId, fieldName, values, updateType, filterOptions) { + const verb = api_internal_contract_js_1.VerbId.ApplyCategoricalFilter; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyFilterAsync', + }; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; + if (!Array.isArray(values)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'values parameter for applyFilterAsync must be an array'); + } + parameters[api_internal_contract_js_1.ParameterId.FilterValues] = values; + parameters[api_internal_contract_js_1.ParameterId.FilterUpdateType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterUpdateType.convert(updateType); + parameters[api_internal_contract_js_1.ParameterId.IsExcludeMode] = + filterOptions === undefined || filterOptions.isExcludeMode === undefined ? false : filterOptions.isExcludeMode; + return this.execute(verb, parameters).then((response) => { + return fieldName; + }); + } + applyRangeFilterAsync(visualId, fieldName, filterOptions) { + const verb = api_internal_contract_js_1.VerbId.ApplyRangeFilter; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyRangeFilterAsync', + }; + if (filterOptions.min !== undefined && filterOptions.min !== null) { + let min; + if (filterOptions.min instanceof Date) { + min = Param_1.Param.serializeDateForPlatform(filterOptions.min); + } + else { + min = filterOptions.min; + } + parameters[api_internal_contract_js_1.ParameterId.FilterRangeMin] = min; + } + if (filterOptions.max !== undefined && filterOptions.max !== null) { + let max; + if (filterOptions.max instanceof Date) { + max = Param_1.Param.serializeDateForPlatform(filterOptions.max); + } + else { + max = filterOptions.max; + } + parameters[api_internal_contract_js_1.ParameterId.FilterRangeMax] = max; + } + // The null option is used with min+max for 'include-range' or 'include-range-or-null' + if (filterOptions.nullOption) { + parameters[api_internal_contract_js_1.ParameterId.FilterRangeNullOption] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.nullOptions.convert(filterOptions.nullOption); + } + parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + return this.execute(verb, parameters).then((response) => { + this.apiFilterHandlerCheckForCommandError(response.result); + return fieldName; + }); + } + applyHierarchicalFilterAsync(visualId, fieldName, values, updateType, filterOptions) { + const verb = api_internal_contract_js_1.VerbId.HierarchicalFilter; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyHierarchicalFilterAsync', + }; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; + const hierarchicalLevels = values.levels; + if (Array.isArray(hierarchicalLevels) && hierarchicalLevels.length > 0) { + parameters[api_internal_contract_js_1.ParameterId.FilterLevels] = hierarchicalLevels; + } + else if (values.length > 0) { + parameters[api_internal_contract_js_1.ParameterId.FilterValues] = values; + } + else { + // the server command expects empty list for clearing the filter + // it also expects eithers FilterLevels or FilterValues to be set + parameters[api_internal_contract_js_1.ParameterId.FilterLevels] = []; + } + parameters[api_internal_contract_js_1.ParameterId.FilterUpdateType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterUpdateType.convert(updateType); + parameters[api_internal_contract_js_1.ParameterId.IsExcludeMode] = filterOptions && !!filterOptions.isExcludeMode; + return this.execute(verb, parameters).then((response) => { + return fieldName; + }); + } + clearFilterAsync(visualId, fieldName) { + const verb = api_internal_contract_js_1.VerbId.ClearFilter; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'clearFilterAsync', + }; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; + return this.execute(verb, parameters).then((resposne) => { + return fieldName; + }); + } + applyRelativeDateFilterAsync(visualId, fieldName, options) { + const verb = api_internal_contract_js_1.VerbId.ApplyRelativeDateFilter; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyRelativeDateFilterAsync', + }; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; + parameters[api_internal_contract_js_1.ParameterId.PeriodType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.periodType.convert(options.periodType); + parameters[api_internal_contract_js_1.ParameterId.DateRangeType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.dateRangeType.convert(options.rangeType); + if (options.rangeType === api_external_contract_js_1.DateRangeType.LastN || options.rangeType === api_external_contract_js_1.DateRangeType.NextN) { + if (options.rangeN === undefined || options.rangeN === null) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.EmbeddingErrorCodes.MissingRangeNForRelativeDateFilters, 'Missing rangeN field for a relative date filter of LASTN or NEXTN.'); + } + parameters[api_internal_contract_js_1.ParameterId.RangeN] = options.rangeN; + } + if (options.anchorDate !== undefined && options.anchorDate !== null) { + parameters[api_internal_contract_js_1.ParameterId.AnchorDate] = this.convertAnchorDate(options.anchorDate); + } + return this.execute(verb, parameters).then((response) => { + return response.result; + }); + } + getFiltersAsync(visualId) { + const verb = api_internal_contract_js_1.VerbId.GetFilters; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getFiltersAsync', + }; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + return this.execute(verb, parameters).then((response) => { + const filters = response.result; + return this.convertDomainFilters(filters); + }); + } + getCategoricalDomainAsync(worksheetName, fieldId, domainType) { + const verb = api_internal_contract_js_1.VerbId.GetCategoricalDomain; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getCategoricalDomainAsync', + }; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = { + worksheet: worksheetName, + }; + parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; + parameters[api_internal_contract_js_1.ParameterId.DomainType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterDomainType.convert(domainType); + return this.execute(verb, parameters).then((response) => { + const domain = response.result; + return this.convertCategoricalDomain(domain, domainType); + }); + } + getRangeDomainAsync(worksheetName, fieldId, domainType) { + const verb = api_internal_contract_js_1.VerbId.GetRangeDomain; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getRangeDomainAsync', + }; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = { + worksheet: worksheetName, + }; + parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; + parameters[api_internal_contract_js_1.ParameterId.DomainType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterDomainType.convert(domainType); + return this.execute(verb, parameters).then((response) => { + const domain = response.result; + return this.convertRangeDomain(domain, domainType); + }); + } + getDashboardFiltersAsync() { + const verb = api_internal_contract_js_1.VerbId.GetDashboardFilters; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getDashboardFiltersAsync', + }; + return this.execute(verb, parameters).then((response) => { + const filters = response.result; + return this.convertDomainFilters(filters); + }); + } + applyDashboardFilterAsync(fieldName, values, updateType, filterOptions) { + const verb = api_internal_contract_js_1.VerbId.DashboardCategoricalFilter; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyDashboardFilterAsync', + }; + parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; + parameters[api_internal_contract_js_1.ParameterId.FilterValues] = values; + parameters[api_internal_contract_js_1.ParameterId.FilterUpdateType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterUpdateType.convert(updateType); + parameters[api_internal_contract_js_1.ParameterId.IsExcludeMode] = filterOptions && !!filterOptions.isExcludeMode; + return this.execute(verb, parameters).then((response) => { + return response.result; + }); + } + getAppliedWorksheetsAsync(worksheetName, fieldId) { + var _a; + return __awaiter(this, void 0, void 0, function* () { + const sharedFilterModel = yield this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsync'); + const worksheetNames = []; + (_a = sharedFilterModel.worksheets) === null || _a === void 0 ? void 0 : _a.map((worksheetInfo) => { + if (worksheetInfo.isSelected) { + worksheetNames.push(worksheetInfo.worksheetName); + } + }); + return worksheetNames; + }); + } + setAppliedWorksheetsAsync(worksheetName, fieldName, fieldId, applyToWorksheets) { + return __awaiter(this, void 0, void 0, function* () { + const sharedFilterModel = yield this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsyncInternal'); + if (!sharedFilterModel || !sharedFilterModel.worksheets) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'This filter does not apply to multiple worksheets'); + } + const allowedWorksheets = []; + let activeWorksheet = ''; + sharedFilterModel.worksheets.forEach((worksheet) => { + // Get active worksheet + if (worksheet.isActive) { + activeWorksheet = worksheet.worksheetName; + } + // Populate allowed worksheets + if (worksheet.isSelected || worksheet.isEnabled) { + allowedWorksheets.push(worksheet.worksheetName); + } + }); + if (activeWorksheet === '') { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'No active worksheet'); + } + if (!applyToWorksheets.includes(activeWorksheet)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `${activeWorksheet} must be included in the applied worksheets`); + } + applyToWorksheets.forEach((sheet) => { + // check if it's present within compatible sheets + if (!allowedWorksheets.includes(sheet)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `The field ${fieldName} isn't applicable to the worksheet ${sheet}`); + } + }); + const verb = api_internal_contract_js_1.VerbId.ChangeSharedFilter; + const parameters = {}; + parameters[api_internal_contract_js_1.ParameterId.FunctionName] = 'setAppliedWorksheetsAsync'; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = { + worksheet: worksheetName, + }; + parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; + parameters[api_internal_contract_js_1.ParameterId.SharedFilterSheets] = applyToWorksheets; + return this.execute(verb, parameters).then((response) => { + return applyToWorksheets; + }); + }); + } + // Helper Methods + executeGetAppliedWorksheets(worksheetName, fieldId, telemetryFunctionName) { + const verb = api_internal_contract_js_1.VerbId.GetSharedFilter; + const parameters = {}; + parameters[api_internal_contract_js_1.ParameterId.FunctionName] = telemetryFunctionName; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = { + worksheet: worksheetName, + }; + parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; + return this.execute(verb, parameters).then((response) => { + const sharedFilterModel = response.result; + return sharedFilterModel; + }); + } + convertDomainFilters(domainFilters) { + const filters = []; + domainFilters.forEach((domainFilter) => { + switch (domainFilter.filterType) { + case api_internal_contract_js_1.FilterType.Categorical: { + const filter = domainFilter; + if (filter) { + filters.push(this.convertCategoricalFilter(filter)); + } + else { + throw new Error('Invalid Categorical Filter'); + } + break; + } + case api_internal_contract_js_1.FilterType.Hierarchical: { + const filter = domainFilter; + if (filter) { + filters.push(this.convertHierarchicalFilter(filter)); + } + else { + throw new Error('Invalid Hierarchical Filter'); + } + break; + } + case api_internal_contract_js_1.FilterType.Range: { + const filter = domainFilter; + if (filter) { + filters.push(this.convertRangeFilter(filter)); + } + else { + throw new Error('Invalid Range Filter'); + } + break; + } + case api_internal_contract_js_1.FilterType.RelativeDate: { + const filter = domainFilter; + if (filter) { + filters.push(this.convertRelativeDateFilter(filter)); + } + else { + throw new Error('Invalid Relative Date Filter'); + } + break; + } + default: { + break; + } + } + }); + return filters; + } + convertCategoricalFilter(domainFilter) { + const appliedValues = domainFilter.values.map((dv) => { + return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(dv); + }); + return new FilterModels_1.CategoricalFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Categorical, this._registryId, appliedValues, domainFilter.isExclude, domainFilter.isAllSelected); + } + convertHierarchicalFilter(domainFilter) { + const appliedValues = domainFilter.values.map((hierarchicalDataValue) => { + return new FilterModels_1.HierarchicalDataValue(DataValueFactory_1.DataValueFactory.MakeFilterDataValue(hierarchicalDataValue.value), hierarchicalDataValue.hierarchicalPath, hierarchicalDataValue.level); + }); + const levelDetails = domainFilter.levelInfo.map((aLevel) => { + return new FilterModels_1.HierarchicalLevelDetail(aLevel.name, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.hierarchicalLevelSelectionState.convert(aLevel.levelSelectionState)); + }); + return new FilterModels_1.HierarchicalFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Hierarchical, this._registryId, domainFilter.dimensionName, domainFilter.hierarchyCaption, domainFilter.levels, levelDetails, appliedValues, domainFilter.isAllSelected); + } + convertRangeFilter(domainFilter) { + const minValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.min); + const maxValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.max); + return new FilterModels_1.RangeFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Range, this._registryId, minValue, maxValue, domainFilter.includeNullValues); + } + convertRelativeDateFilter(domainFilter) { + const anchorDateValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.anchorDate); + return new FilterModels_1.RelativeDateFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_external_contract_js_1.FilterType.RelativeDate, this._registryId, anchorDateValue, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateStepPeriod.convert(domainFilter.periodType), InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateRangeType.convert(domainFilter.rangeType), domainFilter.rangeN); + } + convertCategoricalDomain(domain, domainType) { + const values = domain.values.map((domainDv) => { + return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainDv); + }); + return new FilterModels_1.CategoricalDomain(values, domainType); + } + convertRangeDomain(domain, domainType) { + const min = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.min); + const max = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.max); + return new FilterModels_1.RangeDomain(min, max, domainType); + } + convertAnchorDate(anchorDate) { + // Converts a Date object into a string format that the server expects for date/time values. + // If anchorDate doesn't represent a valid Date object, any of these would be NaN. + const year = anchorDate.getUTCFullYear(); + const month = anchorDate.getUTCMonth() + 1; + const day = anchorDate.getUTCDate(); + const hh = anchorDate.getUTCHours(); + const mm = anchorDate.getUTCMinutes(); + const sec = anchorDate.getUTCSeconds(); + if (isNaN(year) || isNaN(month) || isNaN(day) || isNaN(hh) || isNaN(mm) || isNaN(sec)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.EmbeddingErrorCodes.InvalidDateParameter, 'Invalid date parameter: anchorDate'); + } + const result = `${year}-${month}-${day} ${hh}:${mm}:${sec}`; + return result; + } + apiFilterHandlerCheckForCommandError(serverPm) { + if (!serverPm[InternalContract.ParameterId.ParameterError]) { + return; + } + if (serverPm[InternalContract.ParameterId.InvalidFieldCaption]) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidFilterFieldName, serverPm[InternalContract.ParameterId.InvalidFieldCaption]); + } + if (serverPm[InternalContract.ParameterId.InvalidValues]) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidFilterFieldValue, serverPm[InternalContract.ParameterId.InvalidValues]); + } + if (serverPm[InternalContract.ParameterId.InvalidAggFieldName]) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidAggregationFieldName, serverPm[InternalContract.ParameterId.InvalidAggFieldName]); + } + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.ServerError, 'Server Error'); + } +} +exports.FilterServiceImpl = FilterServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js": +/*!******************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js ***! + \******************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const uuid_1 = __webpack_require__(/*! uuid */ "../api-shared-js/node_modules/uuid/dist/esm-browser/index.js"); +const ApiShared_1 = __webpack_require__(/*! ../../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); +const ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +const GetDataModels_1 = __webpack_require__(/*! ../../Models/GetDataModels */ "../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js"); +const GetDataTableReaderModels_1 = __webpack_require__(/*! ../../Models/GetDataTableReaderModels */ "../api-shared-js/lib/src/ApiShared/Models/GetDataTableReaderModels.js"); +const DataValueFactory_1 = __webpack_require__(/*! ../../Utils/DataValueFactory */ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); +const GetDataService_1 = __webpack_require__(/*! ../GetDataService */ "../api-shared-js/lib/src/ApiShared/Services/GetDataService.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class GetDataServiceImpl extends ServiceImplBase_1.ServiceImplBase { + constructor() { + super(...arguments); + // The extension/embedding instance uses the same cache for all DataTableReaders. + this.viewDataTableCacheId = uuid_1.v4(); + } + get serviceName() { + return "get-data-service" /* GetData */; + } + getMaxRowLimit() { + return 10000; + } + getViewDataTableCacheId() { + return this.viewDataTableCacheId; + } + getLimitedMaxRows(requestedRows, rowCountLimit) { + return requestedRows > 0 && requestedRows < rowCountLimit ? requestedRows : rowCountLimit; + } + getUnderlyingDataAsync(visualId, getType, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption, applyWorksheetFormatting) { + // Create all of our parameters + const summaryData = getType === GetDataService_1.GetDataType.Summary; + const functionName = summaryData ? 'getSummaryDataAsync' : 'getUnderlyingDataAsync'; + const verb = summaryData ? api_internal_contract_js_1.VerbId.GetDataSummaryData : api_internal_contract_js_1.VerbId.GetUnderlyingData; + const requestMaxRows = verb === api_internal_contract_js_1.VerbId.GetUnderlyingData ? this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1) : maxRows; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: functionName, + }; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + parameters[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases; + parameters[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection; + parameters[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns; + parameters[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById); + parameters[api_internal_contract_js_1.ParameterId.MaxRows] = requestMaxRows; + parameters[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption); + parameters[api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting] = applyWorksheetFormatting; + return this.execute(verb, parameters).then((response) => { + const responseData = response.result; + return this.processResultsTable(responseData.data, responseData.isSummary); + }); + } + getSummaryDataReaderAsync(visualId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption, applyWorksheetFormatting) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getSummaryDataReaderAsync', + [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(), + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.PageRowCount]: pageRowCount, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, + [api_internal_contract_js_1.ParameterId.IgnoreSelection]: ignoreSelection, + [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: includeAllColumns, + [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), + [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + [api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting]: applyWorksheetFormatting, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetDataSummaryDataReader, parameters).then((response) => { + const responseData = response.result; + return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, this._registryId); + }); + } + getSummaryColumnsInfoAsync(visualId) { + // Create all the parameters for GetDataType of Summary with 1 row, and only native values + // Then return just the columns + const verb = api_internal_contract_js_1.VerbId.GetDataSummaryData; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getSummaryColumnsInfoAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: true, + [api_internal_contract_js_1.ParameterId.IgnoreSelection]: true, + [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: true, + [api_internal_contract_js_1.ParameterId.MaxRows]: 1, + [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly, + }; + return this.execute(verb, parameters).then((response) => { + const underlyingDataTable = response.result; + const dataTable = underlyingDataTable.data; + const columns = dataTable.headers.map((h) => new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index)); + return columns; + }); + } + getSelectedMarksAsync(visualId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getSelectedMarksAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetSelectedMarks, parameters).then((response) => { + const responseData = response.result; + return { + data: responseData.data.map((table) => this.processResultsTable(table, true)), + }; + }); + } + getHighlightedMarksAsync(visualId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getHighlightedMarksAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetHighlightedMarks, parameters).then((response) => { + const responseData = response.result; + return { + data: responseData.data.map((table) => this.processResultsTable(table, true)), + }; + }); + } + getDataSourceDataAsync(dataSourceId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getDataSourceDataAsync', + [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, + [api_internal_contract_js_1.ParameterId.MaxRows]: this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1), + [api_internal_contract_js_1.ParameterId.ColumnsToInclude]: this.verifyIncludeColumnArray(columnsToInclude), + [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), + [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + }; + return this.execute(api_internal_contract_js_1.VerbId.GetDataSourceData, parameters).then((response) => { + const responseData = response.result; + return this.processResultsTable(responseData.data, false); + }); + } + getLogicalTableDataAsync(datasourceId, logicalTableId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getLogicalTableDataAsync', + [api_internal_contract_js_1.ParameterId.ColumnsToInclude]: columnsToInclude, + [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), + [api_internal_contract_js_1.ParameterId.DataSourceId]: datasourceId, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, + [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId, + [api_internal_contract_js_1.ParameterId.MaxRows]: this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1), + [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + }; + return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableData, parameters).then((response) => { + const responseData = response.result; + return this.processResultsTable(responseData.data, false); + }); + } + getLogicalTableDataReaderAsync(datasourceId, logicalTableId, pageRowCount, ignoreAliases, columnsToIncludeById, includeDataValuesOption) { + pageRowCount = this.getLimitedMaxRows(pageRowCount, this.getMaxRowLimit()); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getLogicalTableDataReaderAsync', + [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(), + [api_internal_contract_js_1.ParameterId.DataSourceId]: datasourceId, + [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId, + [api_internal_contract_js_1.ParameterId.PageRowCount]: pageRowCount, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, + [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), + [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + }; + return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableDataReader, parameters).then((response) => { + const responseData = response.result; + return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, this._registryId); + }); + } + getUnderlyingTableDataAsync(visualId, logicalTableId, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption, applyWorksheetFormatting) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getUnderlyingTableDataAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, + [api_internal_contract_js_1.ParameterId.IgnoreSelection]: ignoreSelection, + [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: includeAllColumns, + [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), + [api_internal_contract_js_1.ParameterId.MaxRows]: this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1), + [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + [api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting]: applyWorksheetFormatting, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableData, parameters).then((response) => { + const responseData = response.result; + return this.processResultsTable(responseData.data, false); + }); + } + getUnderlyingTableDataReaderAsync(visualId, logicalTableId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption, applyWorksheetFormatting) { + pageRowCount = this.getLimitedMaxRows(pageRowCount, this.getMaxRowLimit()); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getUnderlyingTableDataReaderAsync', + [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(), + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, + [api_internal_contract_js_1.ParameterId.IgnoreSelection]: ignoreSelection, + [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: includeAllColumns, + [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), + [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + [api_internal_contract_js_1.ParameterId.PageRowCount]: pageRowCount, + [api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting]: applyWorksheetFormatting, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableDataReader, parameters).then((response) => { + const responseData = response.result; + return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, this._registryId); + }); + } + getPageAsync(tableId, pageNumber, pageSize) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getPageAsync', + [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(), + [api_internal_contract_js_1.ParameterId.ViewDataTableId]: tableId, + [api_internal_contract_js_1.ParameterId.DataRowIndex]: pageNumber * pageSize, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetDataTableReaderPage, parameters).then((response) => { + const responseData = response.result; + return this.processResultsPage(responseData, tableId === GetDataServiceImpl.summaryTableId ? true : false); + }); + } + releaseAsync(tableId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'release', + [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(), + [api_internal_contract_js_1.ParameterId.ViewDataTableId]: tableId, + }; + return this.execute(api_internal_contract_js_1.VerbId.ReleaseDataTableReader, parameters).then((response) => { + return; + }); + } + verifyIncludeColumnArray(columns) { + // columns must be a valid array + if (!Array.isArray(columns)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'columnsToInclude and columnsToIncludeById must be valid arrays'); + } + // Remove any duplicates from the input array + const columnsAsSet = new Set(columns); + return Array.from(columnsAsSet); + } + processResultsTable(responseData, isSummary) { + const headers = responseData.headers.map((h) => new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index)); + // TODO This should be controlled by a flag indicating whether this api will respond marks info or not + let marks; + if (responseData.marks) { + marks = responseData.marks.map((h) => new GetDataModels_1.MarkInfo(h.type, h.color, h.tupleId)); + } + // Limit+1 is our sentinal that underlying data contains more rows than user is allowed to fetch. + // Remove the last element so we always return MaxRowLimit + const isTotalRowCountLimited = isSummary === false && responseData.dataTable.length === this.getMaxRowLimit() + 1; + if (isTotalRowCountLimited) { + responseData.dataTable.length -= 1; + } + const table = responseData.dataTable.map((row) => { + return row.map((cell, index) => { + return DataValueFactory_1.DataValueFactory.MakeTableDataValue(cell, headers[index].dataType); + }); + }); + if (marks) { + return new GetDataModels_1.DataTable(table, headers, table.length, isTotalRowCountLimited, isSummary, marks); + } + return new GetDataModels_1.DataTable(table, headers, table.length, isTotalRowCountLimited, isSummary); + } + processResultsPage(responseData, isSummary) { + const headers = responseData.headers.map((h) => new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index)); + let marks; + if (responseData.marks) { + marks = responseData.marks.map((h) => new GetDataModels_1.MarkInfo(h.type, h.color, h.tupleId)); + } + const table = responseData.dataTable.map((row) => { + return row.map((cell, index) => { + return DataValueFactory_1.DataValueFactory.MakeTableDataValue(cell, headers[index].dataType); + }); + }); + if (marks) { + return new GetDataModels_1.DataTable(table, headers, table.length, false, isSummary, marks); + } + return new GetDataModels_1.DataTable(table, headers, table.length, false, isSummary); + } +} +exports.GetDataServiceImpl = GetDataServiceImpl; +GetDataServiceImpl.summaryTableId = ''; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js": +/*!***********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js ***! + \***********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const NotificationServiceImplBase_1 = __webpack_require__(/*! ./NotificationServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js"); +class NotificationServiceImpl extends NotificationServiceImplBase_1.NotificationServiceImplBase { + get serviceName() { + return "notification-service" /* Notification */; + } +} +exports.NotificationServiceImpl = NotificationServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js": +/*!***************************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js ***! + \***************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class Registration { + constructor(_filterFn, _callbackFn) { + this._filterFn = _filterFn; + this._callbackFn = _callbackFn; + // Nothing Here + } + onNotification(notificationModel) { + if (this._filterFn(notificationModel)) { + this._callbackFn(notificationModel); + } + } +} +exports.Registration = Registration; +class NotificationServiceImplBase { + constructor(dispatcher) { + this.dispatcher = dispatcher; + this._handlers = {}; + this.dispatcher.registerNotificationHandler(this.onNotification.bind(this)); + } + registerHandler(id, filterFn, handler) { + const handlers = this._handlers[id] || new Array(); + const registration = new Registration(filterFn, handler); + handlers.push(registration); + this._handlers[id] = handlers; + return () => this.removeRegistration(id, registration); + } + hasHandlersForNotificationType(id) { + // eslint-disable-next-line no-prototype-builtins + return this._handlers.hasOwnProperty(id); + } + onNotification(notification) { + if (!this.hasHandlersForNotificationType(notification.notificationId)) { + return; + } + // Go through and check for all the handlers of this particular notification + this._handlers[notification.notificationId].forEach((h) => h.onNotification(notification.data)); + } + removeRegistration(id, registration) { + if (!this.hasHandlersForNotificationType(id)) { + return; + } + this._handlers[id] = this._handlers[id].filter((reg) => reg !== registration); + } +} +exports.NotificationServiceImplBase = NotificationServiceImplBase; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js": +/*!*********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js ***! + \*********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ParameterImpl_1 = __webpack_require__(/*! ../../Impl/ParameterImpl */ "../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js"); +const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class ParametersServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "parameters-service" /* Parameters */; + } + getParametersForSheetAsync(sheetPath) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getParametersForSheetAsync', + [api_internal_contract_js_1.ParameterId.SheetPath]: sheetPath, + }; + return this.getParametersAsync(parameters); + } + getAllParametersAsync() { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getParametersForSheetAsync', + }; + return this.getParametersAsync(parameters); + } + getParametersAsync(inputParameters) { + return this.execute(api_internal_contract_js_1.VerbId.GetParametersForSheet, inputParameters).then((response) => { + const result = response.result; + return result.map((parameterInfo) => { + return new ParameterImpl_1.ParameterImpl(parameterInfo, this._registryId); + }); + }); + } + changeParameterValueAsync(fieldName, newValue) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'changeParameterValueAsync', + [api_internal_contract_js_1.ParameterId.ParameterFieldName]: fieldName, + [api_internal_contract_js_1.ParameterId.ParameterValue]: newValue, + }; + return this.execute(api_internal_contract_js_1.VerbId.ChangeParameterValue, parameters).then((response) => { + const result = response.result; + return result; + }); + } + findParameterByNameAsync(name) { + return this.findParameterAsync(name, undefined); + } + findParameterByGlobalFieldNameAsync(fieldName) { + return this.findParameterAsync(undefined, fieldName); + } + findParameterAsync(name, fieldName) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'findParameterAsync', + }; + if (name !== undefined) { + parameters[api_internal_contract_js_1.ParameterId.ParameterCaption] = name; + } + else if (fieldName !== undefined) { + parameters[api_internal_contract_js_1.ParameterId.ParameterFieldName] = fieldName; + } + else { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'name or fieldName must be provided to find parameter'); + } + return this.execute(api_internal_contract_js_1.VerbId.FindParameter, parameters).then((response) => { + const instanceOfParameterInfo = (object) => { + return 'fieldName' in object; + }; + // We need to check to see if we got a valid response back again + if (instanceOfParameterInfo(response.result)) { + const result = response.result; + return new ParameterImpl_1.ParameterImpl(result, this._registryId); + } + else { + return undefined; + } + }); + } +} +exports.ParametersServiceImpl = ParametersServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js": +/*!********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js ***! + \********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const SelectionModels_1 = __webpack_require__(/*! ../../Models/SelectionModels */ "../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js"); +const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class SelectionServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "selection-service" /* Selection */; + } + /** + * Method to clear all the selected marks for the given worksheet. + * + * @param visualId + */ + clearSelectedMarksAsync(visualId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'clearSelectedMarksAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + }; + return this.execute(api_internal_contract_js_1.VerbId.ClearSelectedMarks, parameters).then((response) => { + return; // Expecting an empty model and hence the void response. + }); + } + /** + * Method to select marks for the given worksheet. + * + * @param visualId + * @param selectionCriteria + * @param selectionUpdateType + */ + selectMarksByValueAsync(visualId, selectionCriterias, selectionUpdateType) { + if (selectionCriterias.length === 0) { + throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Selection criteria missing for selecting marks by value'); + } + const selectionType = this.validateSelectionUpdateType(selectionUpdateType); + const selectionModelContainer = this.parseSelectionMarks(selectionCriterias); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'selectMarksByValueAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.SelectionUpdateType]: selectionType, + }; + if (selectionModelContainer.hierModelArr && selectionModelContainer.hierModelArr.length) { + parameters[api_internal_contract_js_1.ParameterId.HierValSelectionModels] = selectionModelContainer.hierModelArr; + } + if (selectionModelContainer.quantModelArr && selectionModelContainer.quantModelArr.length) { + parameters[api_internal_contract_js_1.ParameterId.QuantRangeSelectionModels] = selectionModelContainer.quantModelArr; + } + if (selectionModelContainer.dimModelArr && selectionModelContainer.dimModelArr.length) { + parameters[api_internal_contract_js_1.ParameterId.DimValSelectionModels] = selectionModelContainer.dimModelArr; + } + return this.execute(api_internal_contract_js_1.VerbId.SelectByValue, parameters).then((response) => { + this.apiFilterHandlerCheckForCommandError(response.result); + return; + }); + } + /** + * Method to execute hover actions and render tooltip for a given tuple representing a mark in the visualization. + * If the tooltip parameter is included it will show the tooltip on hover. If not, no tooltip is shown. + * + * @param visualId + * @param hoveredTuple + * @param tooltip + * @returns empty promise that resolves when the extension host has successfully been informed of the request and rejects on error + */ + hoverTupleAsync(visualId, hoveredTuple, tooltip, allowHoverActions) { + let interactionModel = new SelectionModels_1.HoverTupleInteractionModel(visualId, this.ensureTupleIDIsNonNegative(hoveredTuple), tooltip, allowHoverActions); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'hoverTupleAsync', + [api_internal_contract_js_1.ParameterId.HoverTupleInteraction]: interactionModel, + }; + return this.execute(api_internal_contract_js_1.VerbId.RaiseHoverTupleNotification, parameters).then((response) => { + return; + }); + } + /** + * Method to modify selection, execute select actions and render tooltip for a given list of tuples representing a mark or marks in the visualization. + * If the tooltip parameter is included it will show the tooltip on select. If not, no tooltip is shown. + * + * @param visualId + * @param selectedTuples + * @param selectOption + * @param tooltip + * @returns empty promise that resolves when the extension host has successfully been informed of the request and rejects on error + */ + selectTuplesAsync(visualId, selectedTuples, selectOption, tooltip) { + let interactionModel = new SelectionModels_1.SelectTuplesInteractionModel(visualId, selectedTuples, selectOption, tooltip); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'selectTuplesAsync', + [api_internal_contract_js_1.ParameterId.SelectTuplesInteraction]: interactionModel, + }; + return this.execute(api_internal_contract_js_1.VerbId.RaiseSelectTuplesNotification, parameters).then((response) => { + return; + }); + } + apiFilterHandlerCheckForCommandError(serverPm) { + if (!serverPm[api_internal_contract_js_1.ParameterId.ParameterError]) { + return; + } + if (serverPm[api_internal_contract_js_1.ParameterId.InvalidFields]) { + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InvalidSelectionFieldName, serverPm[api_internal_contract_js_1.ParameterId.InvalidFields]); + } + if (serverPm[api_internal_contract_js_1.ParameterId.InvalidValues]) { + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InvalidSelectionValue, serverPm[api_internal_contract_js_1.ParameterId.InvalidValues]); + } + if (serverPm[api_internal_contract_js_1.ParameterId.InvalidDates]) { + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InvalidSelectionDate, serverPm[api_internal_contract_js_1.ParameterId.InvalidDates]); + } + } + /** + * Method to select marks for the given worksheet. + * + * @param visualId + * @param MarkInfo + * @param selectionUpdateType + */ + selectMarksByIdAsync(visualId, marks, selectionUpdateType) { + if (marks.length === 0) { + throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Marks info missing for selecting marks by Id'); + } + const selectionType = this.validateSelectionUpdateType(selectionUpdateType); + const selectionModelContainer = this.parseSelectionIds(marks); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'selectMarksByIdAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.SelectionUpdateType]: selectionType, + [api_internal_contract_js_1.ParameterId.Selection]: selectionModelContainer.selection, + }; + return this.execute(api_internal_contract_js_1.VerbId.SelectByValue, parameters).then((response) => { + // Expecting an empty model and hence the void response. + return; + // TODO Investigate the error response with multiple output params and throw error accordingly. + }); + } + /** + * Method to prepare the pres models for selection by MarksInfo + * @param marks + */ + parseSelectionIds(marks) { + const ids = []; + const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + for (let i = 0; i < marks.length; i++) { + const tupleId = marks[i].tupleId; + if (tupleId !== undefined && tupleId !== null) { + // If tuple id is provided use that instead of pair + ids.push(tupleId.toString()); // collect the tuple ids + } + else { + throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'tupleId parsing error'); + } + } + if (ids.length !== 0) { + // tuple ids based selection + const tupleSelectionModel = new SelectionModels_1.TupleSelectionModel(); + tupleSelectionModel.selectionType = 'tuples'; + tupleSelectionModel.objectIds = ids; + selectionModelContainer.selection = tupleSelectionModel; + } + return selectionModelContainer; + } + /** + * Method to prepare the pres models for selection by values. + * + * Supports 3 types for selection: + * 1) Hierarchical value based selection + * 2) Range value based selection + * 3) Dimension value based selection + * + * @param marks + */ + parseSelectionMarks(selectionCriterias) { + const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + for (let i = 0; i < selectionCriterias.length; i++) { + const st = selectionCriterias[i]; + if (!(st.fieldName && st.value !== undefined && st.value !== null)) { + throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'Selection Criteria parsing error'); + } + const catRegex = new RegExp('([[A-Za-z0-9]+]).*', 'g'); + const rangeOption = st.value; + if (catRegex.test(st.fieldName)) { + // Hierarchical value selection + const hierModel = this.addToParamsList(st.fieldName, st.value); + selectionModelContainer.hierModelArr.push(hierModel); + } + else if (rangeOption.min !== undefined && rangeOption.max !== undefined) { + // Range value selection + const quantModel = this.addToRangeParamsList(st.fieldName, rangeOption); + selectionModelContainer.quantModelArr.push(quantModel); + } + else { + // Dimension value selection + const dimModel = this.addToParamsList(st.fieldName, st.value); + selectionModelContainer.dimModelArr.push(dimModel); + } + } + return selectionModelContainer; + } + /** + * Method to transform the key value pair into value based pres model object. + * + * @param valueSelectionModel + * @param fieldName + * @param value + */ + addToParamsList(fieldName, value) { + const valueSelectionModel = new SelectionModels_1.ValueSelectionModel(); + const markValues = []; + if (value instanceof Array) { + const valueArr = value; + for (let i = 0; i < valueArr.length; i++) { + markValues.push(Param_1.Param.serializeParameterValue(valueArr[i])); + } + } + else { + markValues.push(Param_1.Param.serializeParameterValue(value)); + } + valueSelectionModel.qualifiedFieldCaption = fieldName; + valueSelectionModel.selectValues = markValues; + return valueSelectionModel; + } + /** + * Method to transform the key value pair into range based selection pres model. + * + * TODO: Need to handle the parsing of date type values. + * + * @param valueSelectionModel + * @param fieldName + * @param value + */ + addToRangeParamsList(fieldName, value) { + const rangeSelectionModel = new SelectionModels_1.RangeSelectionModel(); + rangeSelectionModel.qualifiedFieldCaption = fieldName; + if (value.max !== undefined && value.max !== null) { + rangeSelectionModel.maxValue = Param_1.Param.serializeParameterValue(value.max); + } + if (value.min !== undefined && value.min !== null) { + rangeSelectionModel.minValue = Param_1.Param.serializeParameterValue(value.min); + } + rangeSelectionModel.included = this.validateNullOptionType(value.nullOption); + return rangeSelectionModel; + } + /** + * Method to validate the selection update type. + * + * @param selectionUpdateType + */ + validateSelectionUpdateType(selectionUpdateType) { + if (selectionUpdateType === Contract.SelectionUpdateType.Replace) { + return api_internal_contract_js_1.SelectionUpdateType.Replace; + } + else if (selectionUpdateType === Contract.SelectionUpdateType.Add) { + return api_internal_contract_js_1.SelectionUpdateType.Add; + } + else if (selectionUpdateType === Contract.SelectionUpdateType.Remove) { + return api_internal_contract_js_1.SelectionUpdateType.Remove; + } + return api_internal_contract_js_1.SelectionUpdateType.Replace; + } + /** + * Method to validate the include type for range selection. + * + * @param nullOption + */ + validateNullOptionType(nullOption) { + if (nullOption) { + if (nullOption === Contract.FilterNullOption.NullValues) { + return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeNull; + } + else if (nullOption === Contract.FilterNullOption.NonNullValues) { + return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeNonNull; + } + else if (nullOption === Contract.FilterNullOption.AllValues) { + return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeAll; + } + } + return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeAll; + } + ensureTupleIDIsNonNegative(tupleId) { + if (tupleId && tupleId > 0) { + return tupleId; + } + // 0 will not refer to a valid tuple (since tuple ids are 1-based), + // but can be used for clearing the current hover or selection + return 0; + } +} +exports.SelectionServiceImpl = SelectionServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js": +/*!***************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js ***! + \***************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const EnumConverter_1 = __webpack_require__(/*! ../../Utils/EnumConverter */ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); +/** + * Each ServceImpl should extend this base class for the sake of + * proper error handling. This base handles the conversion + * from internal errors to external errors that we throw to developers + */ +class ServiceImplBase { + constructor(_dispatcher, _registryId) { + this._dispatcher = _dispatcher; + this._registryId = _registryId; + } + execute(verb, params) { + return this._dispatcher.execute(verb, params).catch((error) => { + // Any internal error that comes from the dispatcher should be converted + // to an external error using the enum mapper for error codes. + const internalError = error; + const externalErrorCode = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.errorCode.convert(internalError.errorCode, EnumConverter_1.ShouldThrow.No); + throw new TableauError_1.TableauError(externalErrorCode, internalError.message); + }); + } +} +exports.ServiceImplBase = ServiceImplBase; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js": +/*!***************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js ***! + \***************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class SizeServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "size-service" /* Size */; + } + changeSizeAsync(name, newSize) { + var _a, _b, _c, _d; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'changeSizeAsync', + [api_internal_contract_js_1.ParameterId.SheetName]: name, + [api_internal_contract_js_1.ParameterId.MinHeight]: ((_a = newSize.minSize) === null || _a === void 0 ? void 0 : _a.height) || 0, + [api_internal_contract_js_1.ParameterId.MinWidth]: ((_b = newSize.minSize) === null || _b === void 0 ? void 0 : _b.width) || 0, + [api_internal_contract_js_1.ParameterId.MaxHeight]: ((_c = newSize.maxSize) === null || _c === void 0 ? void 0 : _c.height) || 0, + [api_internal_contract_js_1.ParameterId.MaxWidth]: ((_d = newSize.maxSize) === null || _d === void 0 ? void 0 : _d.width) || 0, + }; + return this.execute(api_internal_contract_js_1.VerbId.SetSheetSize, parameters).then((_response) => { + return; + }); + } +} +exports.SizeServiceImpl = SizeServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/StoryActivationServiceImpl.js": +/*!**************************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/StoryActivationServiceImpl.js ***! + \**************************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class StoryActivationServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "story-activation-service" /* StoryActivation */; + } + activateNextStoryPointAsync() { + const verb = api_internal_contract_js_1.VerbId.ActivateNextStoryPoint; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'activateNextStoryPointAsync', + }; + return this.execute(verb, parameters).then((response) => { + return; + }); + } + activatePreviousStoryPointAsync() { + const verb = api_internal_contract_js_1.VerbId.ActivatePreviousStoryPoint; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'activatePreviousStoryPointAsync', + }; + return this.execute(verb, parameters).then((response) => { + return; + }); + } + activateStoryPointAsync(index) { + const verb = api_internal_contract_js_1.VerbId.ActivateStoryPoint; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'activateStoryPointAsync', + }; + parameters[api_internal_contract_js_1.ParameterId.StoryPointIndex] = index; + return this.execute(verb, parameters).then((response) => { + return; + }); + } + revertStoryPointAsync(index) { + const verb = api_internal_contract_js_1.VerbId.RevertStoryPoint; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'revertStoryPointAsync', + }; + parameters[api_internal_contract_js_1.ParameterId.StoryPointIndex] = index; + return this.execute(verb, parameters).then((response) => { + return response.result; + }); + } +} +exports.StoryActivationServiceImpl = StoryActivationServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js": +/*!**********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class VisualModelServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "visual-model-service" /* VisualModel */; + } + getVisualSpecificationAsync(visualId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getVisualSpecificationAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetVisualSpecification, parameters).then((response) => { + const result = response.result; + return result; + }); + } + addMarksCardFieldsAsync(visualId, marksCardIndex, encodingType, columns, startIndex) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'addMarksCardFieldsAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet, + [api_internal_contract_js_1.ParameterId.MarksCardIndex]: marksCardIndex, + [api_internal_contract_js_1.ParameterId.EncodingType]: encodingType, + [api_internal_contract_js_1.ParameterId.Columns]: columns, + [api_internal_contract_js_1.ParameterId.StartIndex]: startIndex, + }; + return this.execute(api_internal_contract_js_1.VerbId.AddMarksCardFields, parameters).then(() => { + return; + }); + } + moveMarksCardFieldAsync(visualId, marksCardIndex, fromIndex, toIndex, fieldCount = 1) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'addMarksCardFieldsAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet, + [api_internal_contract_js_1.ParameterId.MarksCardIndex]: marksCardIndex, + [api_internal_contract_js_1.ParameterId.FromIndex]: fromIndex, + [api_internal_contract_js_1.ParameterId.ToIndex]: toIndex, + [api_internal_contract_js_1.ParameterId.FieldCount]: fieldCount, + }; + return this.execute(api_internal_contract_js_1.VerbId.MoveMarksCardField, parameters).then(() => { + return; + }); + } + spliceMarksCardFieldsAsync(visualId, marksCardIndex, encodingType, startIndex, deleteCount, columns) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'spliceMarksCardFieldsAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet, + [api_internal_contract_js_1.ParameterId.MarksCardIndex]: marksCardIndex, + [api_internal_contract_js_1.ParameterId.EncodingType]: encodingType, + [api_internal_contract_js_1.ParameterId.StartIndex]: startIndex, + [api_internal_contract_js_1.ParameterId.DeleteCount]: deleteCount, + [api_internal_contract_js_1.ParameterId.Columns]: columns, + }; + return this.execute(api_internal_contract_js_1.VerbId.SpliceMarksCardFields, parameters).then(() => { + return; + }); + } + editAliasesDialogAsync(fieldName) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'editAliasesDialogAsync', + [api_internal_contract_js_1.ParameterId.FieldId]: fieldName, + }; + return this.execute(api_internal_contract_js_1.VerbId.EditAliasesDialog, parameters).then(() => { + return; + }); + } +} +exports.VisualModelServiceImpl = VisualModelServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js": +/*!**************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js ***! + \**************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const CustomViewImpl_1 = __webpack_require__(/*! ../../Impl/CustomViewImpl */ "../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class VizServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "viz-service" /* Viz */; + } + createVizImageAsync(inputSpec) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'createVizImageAsync', + [api_internal_contract_js_1.ParameterId.VizAPIInputJson]: JSON.stringify(inputSpec), + }; + return this.execute(api_internal_contract_js_1.VerbId.VizAPI, parameters).then((response) => { + const result = response.result; + return result; + }); + } + activateSheetAsync(name) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'activateSheetAsync', + [api_internal_contract_js_1.ParameterId.SwitchToSheetName]: name, + }; + return this.execute(api_internal_contract_js_1.VerbId.ActivateSheet, parameters).then(() => { + return; + }); + } + getCustomViewsAsync() { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getCustomViewsAsync', + }; + return this.execute(api_internal_contract_js_1.VerbId.GetCustomViews, parameters).then((response) => { + const customViews = response.result; + return customViews.map((customView) => { + return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId); + }); + }); + } + showCustomViewAsync(customViewName) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'showCustomViewAsync', + [api_internal_contract_js_1.ParameterId.CustomViewName]: customViewName || '', + }; + return this.execute(api_internal_contract_js_1.VerbId.ShowCustomView, parameters).then((response) => { + var _a; + const customView = response.result; + return ((_a = customView) === null || _a === void 0 ? void 0 : _a.luid) ? new CustomViewImpl_1.CustomViewImpl(customView, this._registryId) : undefined; + }); + } + removeCustomViewAsync(customViewName) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'removeCustomViewAsync', + [api_internal_contract_js_1.ParameterId.CustomViewName]: customViewName, + }; + return this.execute(api_internal_contract_js_1.VerbId.RemoveCustomView, parameters).then((response) => { + const customView = response.result; + return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId); + }); + } + saveCustomViewAsync(customViewName) { + // CustomViewIsDefault is a required parameter, but our API has not been updated to allow it to be specified yet. + // We should add a 'default' parameter to the interface. + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'saveCustomViewAsync', + [api_internal_contract_js_1.ParameterId.CustomViewName]: customViewName, + [api_internal_contract_js_1.ParameterId.CustomViewIsDefault]: false, + }; + return this.execute(api_internal_contract_js_1.VerbId.SaveWorkbookAsCustomView, parameters).then((response) => { + const customView = response.result; + return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId); + }); + } + setActiveCustomViewAsDefaultAsync() { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'setActiveCustomViewAsDefaultAsync', + }; + return this.execute(api_internal_contract_js_1.VerbId.SetActiveCustomViewAsDefault, parameters).then(() => { + return; + }); + } + saveAsync(customView) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'saveAsync', + [api_internal_contract_js_1.ParameterId.CustomViewLuid]: customView.luid, + [api_internal_contract_js_1.ParameterId.CustomViewName]: customView.name, + [api_internal_contract_js_1.ParameterId.CustomViewIsDefault]: customView.isDefault, + [api_internal_contract_js_1.ParameterId.CustomViewIsPublic]: customView.shared, + }; + return this.execute(api_internal_contract_js_1.VerbId.UpdateCustomView, parameters).then((response) => { + const customView = response.result; + return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId); + }); + } + getCurrentSrcAsync() { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getCurrentSrcAsync', + }; + return this.execute(api_internal_contract_js_1.VerbId.GetCurrentSrc, parameters).then((response) => response.result); + } +} +exports.VizServiceImpl = VizServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js": +/*!***************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js ***! + \***************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class ZoneServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "zone-service" /* Zone */; + } + setVisibilityAsync(dashboard, dashboardZoneMap, zoneVisibilityMap) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'setVisibilityAsync', + [api_internal_contract_js_1.ParameterId.Dashboard]: dashboard, + [api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap]: {}, + }; + // zoneVisibilityMap can be either an object or a Map - convert it to a Map + const parameterAsMap = Param_1.Param.convertParameterToMap(zoneVisibilityMap, 'zoneVisibilityMap'); + parameterAsMap.forEach((value, key) => { + ErrorHelpers_1.ErrorHelpers.verifyZoneIsValid(dashboardZoneMap, Number.parseInt(key, 10)); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(value, api_external_contract_js_1.DashboardObjectVisibilityType, 'DashboardObjectVisibilityType'); + parameters[api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap][key] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.setVisibilityType.convert(value); + }); + return this.execute(api_internal_contract_js_1.VerbId.SetZoneVisibility, parameters).then((response) => { + return; + }); + } + moveAndResizeAsync(dashboard, dashboardZoneMap, dashboardObjectPositionAndSizeUpdateArray) { + const parameters = { + [api_internal_contract_js_1.ParameterId.Dashboard]: dashboard, + [api_internal_contract_js_1.ParameterId.DashboardObjectPositionAndSizeUpdateList]: dashboardObjectPositionAndSizeUpdateArray, + }; + dashboardObjectPositionAndSizeUpdateArray.forEach((dashboardObject) => { + ErrorHelpers_1.ErrorHelpers.verifyZoneIsValidAndFloating(dashboardZoneMap, dashboardObject.dashboardObjectID); + ErrorHelpers_1.ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(dashboardObject); + }); + return this.execute(api_internal_contract_js_1.VerbId.MoveAndResizeZones, parameters).then((response) => { + return; + }); + } +} +exports.ZoneServiceImpl = ZoneServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/TableSummary.js": +/*!**********************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/TableSummary.js ***! + \**********************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of a table summary. + * This does not follow the Impl pattern as it is just a property bag. + */ +class TableSummary { + constructor(_tableInfo) { + this._tableInfo = _tableInfo; + } + get name() { + return this._tableInfo.name; + } + get id() { + return this._tableInfo.id; + } + get connectionId() { + return this._tableInfo.connectionId; + } + get customSQL() { + return this._tableInfo.customSQL; + } +} +exports.TableSummary = TableSummary; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/TableauError.js": +/*!**********************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/TableauError.js ***! + \**********************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Custom error class that extends the default JavaScript Error object. + * This allows us to provide a field with a specific error code + * so that developers can more easily programmatically respond + * to error scenarios. + */ +class TableauError extends Error { + constructor(_errorCode, message) { + super(`${_errorCode}: ${message}`); + this._errorCode = _errorCode; + /*tslint:disable-next-line */ + // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work + // Error inheritance does not work propertly when compiling to ES5, this is a workaround to force + // the proto chain to be built correctly. See the github link above for details. + Object.setPrototypeOf(this, TableauError.prototype); + } + get errorCode() { + return this._errorCode; + } +} +exports.TableauError = TableauError; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js": +/*!********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const GetDataModels_1 = __webpack_require__(/*! ../Models/GetDataModels */ "../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js"); +/** + * In version 2 of the interface, we should collapse value into nativeValue, and do all this work over + * in the platform. + */ +class DataValueFactory { + static MakeParameterDataValue(internalDataValue, dataType) { + // Parameter values are all strings, convert from string to value + return new GetDataModels_1.DataValue(internalDataValue.value, InternalContract.DataTypeConverter.convertStringValueToNativeValue(internalDataValue.value, dataType), internalDataValue.formattedValue, internalDataValue.aliasedValue, internalDataValue.hasAlias); + } + static MakeFilterDataValue(internalDataValue) { + // Filters already have native type in value, just use that for nativeValue also + return new GetDataModels_1.DataValue(internalDataValue.value, internalDataValue.value, internalDataValue.formattedValue); + } + static MakeTableDataValue(internalDataValue, dataType) { + // DataTables contain boolean | number | string | date as string | '%null% + // convertValueToNativeValue converts dates as string to dates, and any special to null + // (boolean, numbers, strings are passed through) + // Because of IncludeDataValuesOption - we can have undefined values, which are different than any special + return new GetDataModels_1.DataValue(internalDataValue.value, internalDataValue.value !== undefined + ? InternalContract.DataTypeConverter.convertValueToNativeValue(internalDataValue.value, dataType) + : undefined, internalDataValue.formattedValue); + } +} +exports.DataValueFactory = DataValueFactory; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Utils/Deferred.js": +/*!************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Utils/Deferred.js ***! + \************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * A Promise wrapper class allowing for resolving/rejecting the Promise outside the context of its constructor. + * + * @export + * @class Deferred + * @template TResolve The type used to resolve the promise. + * @template TReject The type used to reject the promise. Defaults to any. + * @link https://stackoverflow.com/a/34637436 + */ +class Deferred { + /** + * Creates an instance of Deferred. + */ + constructor() { + this._promise = new Promise((resolve, reject) => { + this._resolve = resolve; + this._reject = reject; + }); + } + /** + * Gets the Promise. + * + * @readonly + * @type {Promise} + */ + get promise() { + return this._promise; + } + /** + * Resolves the wrapped Promise. + * + * @param {(TResolve | PromiseLike)} response The argument to be resolved by the Promise. + * @returns {*} {void} + */ + resolve(response) { + if (!this._resolve) { + return; + } + this._resolve(response); + } + /** + * + * + * @param {TReject} [reason] The reason why the Promise rejected. + * @returns {*} {void} + */ + reject(reason) { + if (!this._reject) { + return; + } + this._reject(reason); + } +} +exports.Deferred = Deferred; +exports.UnregisterTimeoutInMilliseconds = 30000; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +/** + * This class converts from a source enum value to destination enum + * value given a mapping from source to destination when constructed. + * + * Note: This exact same class is defined in api-core. Given its small + * nature, it is not worth having in a separate project to share this between + * api-core and api-shared. If more utility functionality is added that is used by api-core + * and api-shared but has no other dependecies, a utiltity project might be merited, + * and this class could be moved. + */ +class EnumConverter { + constructor(_mappings, _defaultVal) { + this._mappings = _mappings; + this._defaultVal = _defaultVal; + } + convert(enumVal, throwIfMissing = ShouldThrow.Yes) { + if (this._mappings.hasOwnProperty(enumVal)) { + return this._mappings[enumVal]; + } + if (this._defaultVal !== undefined && throwIfMissing !== ShouldThrow.Yes) { + return this._defaultVal; + } + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Enum Mapping not found for: ${enumVal}`); + } +} +exports.EnumConverter = EnumConverter; +var ShouldThrow; +(function (ShouldThrow) { + ShouldThrow["Yes"] = "yes"; + ShouldThrow["No"] = "no"; +})(ShouldThrow = exports.ShouldThrow || (exports.ShouldThrow = {})); + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js": +/*!****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const Param_1 = __webpack_require__(/*! ./Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +/** + * This class is used to construct common errors throughout the external + * projects (api-shared, extensions-api, etc.). It has some duplication with + * the ErrorHelpers class in api-core, but is separate due to the need to throw + * an external TableauError vs. an InternalTableauError. + */ +class ErrorHelpers { + /** + * Throws with code InternalError. + * + * @param apiName name of api that was called. + */ + static apiNotImplemented(apiName) { + return new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `${apiName} API not yet implemented.`); + } + /** + * Throws an internal error if argument is null or undefined. + * + * @param argumentValue value to verify + * @param argumentName name of argument to verify + */ + /*tslint:disable-next-line */ + static verifyInternalValue(argumentValue, argumentName) { + if (argumentValue === null || argumentValue === undefined) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `${argumentValue} is invalid value for: ${argumentName}`); + } + } + /** + * Throws an InvalidParameter error if argument is null or undefined. + * + * @param argumentValue value to verify + * @param argumentName name of argument to verify + */ + /*tslint:disable-next-line */ + static verifyParameter(argumentValue, argumentName) { + if (argumentValue === null || argumentValue === undefined) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${argumentValue} is invalid value for parameter: ${argumentName}`); + } + } + /** + * Throws an InvalidParameter error if argument is not the specified type. + * For objects, it just tests that it is an object + * + * @param argumentValue value to verify + * @param expectedType expected result of typeof + * @param argumentName name of argument to verify + */ + /*tslint:disable-next-line */ + static verifyParameterType(argumentValue, expectedType, argumentName) { + if (typeof argumentValue !== expectedType) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${argumentValue} has invalid type for parameter: ${argumentName}.`); + } + } + /** + * Throws an InvalidParameter error if argument is empty string, null or undefined. + * + * @param argumentValue value to verify + * @param argumentName name of argument to verify + */ + /*tslint:disable-next-line */ + static verifyStringParameter(argumentValue, argumentName) { + if (argumentValue === null || argumentValue === undefined || argumentValue === '') { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${argumentValue} is invalid value for paramter: ${argumentName}`); + } + } + /** + * Verifies passed value is a valid value for that enum. + * + * String enums are {string : string} dictionaries which are not reverse mappable + * This is an ugly workaround + * + * @param enumValue value to verify + * @param enumType enum to verify against + */ + /*tslint:disable-next-line */ + static isValidEnumValue(enumValue, enumType) { + let isValid = false; + Object.keys(enumType).forEach((enumKey) => { + if (enumType[enumKey] === enumValue.toString()) { + isValid = true; + } + }); + return isValid; + } + /** + * Verifies passed value is a valid value for that enum. + * Throws an InvalidParameter error if the enum value is not valid. + * + * String enums are {string : string} dictionaries which are not reverse mappable + * This is an ugly workaround + * + * @param enumValue value to verify + * @param enumType enum to verify against + * @param enumName enum name for clear error message + */ + /*tslint:disable-next-line */ + static verifyEnumValue(enumValue, enumType, enumName) { + if (!ErrorHelpers.isValidEnumValue(enumValue, enumType)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${enumValue} is invalid value for enum: ${enumName}.`); + } + } + /** + * Verifies passed value is between [min, max) ... min <= value < max + * Throws an InvalidParameter error if the value is not valid. + * + * + * @param value value to verify + * @param min value must be >= min + * @param max value must be < max + */ + static verifyRange(value, min, max) { + let isValid = min <= value && value < max; + if (!isValid) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${value} is invalid value for range: [${min}..${max})`); + } + } + /** + * Verifies the params min and max for applying range filter. + * Throws with error code InvalidParameter if range is invalid. + * + * @param min range min + * @param max range max + */ + static verifyRangeParamType(min, max) { + const isMinDefined = min !== undefined; + const isMaxDefined = max !== undefined; + if (!isMinDefined && !isMaxDefined) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'Unexpected invalid param value, at least one of min or max is required.'); + } + if (isMinDefined && !Param_1.Param.isTypeNumber(min) && !Param_1.Param.isTypeDate(min)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'Unexpected invalid param value, only Date and number are allowed for parameter min.'); + } + if (isMaxDefined && !Param_1.Param.isTypeNumber(max) && !Param_1.Param.isTypeDate(max)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'Unexpected invalid param value, only Date and number are allowed for parameter max.'); + } + if (isMinDefined && isMaxDefined && typeof min !== typeof max) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'Unexpected invalid param value, parameters min and max should be of the same type.'); + } + } + /** + * Verifies that the zoneId is present in the current dashboard. + * Throws with error code InvalidParameter if either condition is false. + * + * @param dashboardZoneMap A map of zoneId's to the corresponding dashboard object. + * @param zoneID ZoneId to be validated + */ + static verifyZoneIsValid(dashboardZoneMap, zoneID) { + if (dashboardZoneMap.has(zoneID)) { + return; + } + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `Unexpected invalid param value, Dashboard Object Id: ${zoneID} is not present in dashboard.`); + } + /** + * Verifies that the zone is present and floating in the current dashboard. + * Throws with error code InvalidParameter if either condition is false. + * + * @param dashboardZoneMap A map of zoneId's to the corresponding dashboard object. + * @param zoneID ZoneId to be validated + */ + static verifyZoneIsValidAndFloating(dashboardZoneMap, zoneID) { + if (dashboardZoneMap.has(zoneID) && dashboardZoneMap.get(zoneID).isFloating) { + return; + } + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `Unexpected invalid param value, Dashboard Object Id: ${zoneID} is not present or is a fixed zone in the dashboard.`); + } + /** + * Verifies that width and height are > 0 for each DashboardObjectPositionAndSizeUpdate object. + * Throws with error code InvalidParameter if either condition is false. + * + * @param dashboardObjectPositionAndSizeUpdate DashboardObjectPositionAndSizeUpdate object for which width and height will be validated + */ + static verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(dashboardObjectPositionAndSizeUpdate) { + if (dashboardObjectPositionAndSizeUpdate.width < 0 || dashboardObjectPositionAndSizeUpdate.height < 0) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `Unexpected invalid param value for dashboard object ID ${dashboardObjectPositionAndSizeUpdate.dashboardObjectID}:` + + ` negative widths and heights are not allowed.`); + } + } + /** + * Verifies is the given sheet name is in the list of sheets names allowed for exporting. + * Throws with error code InvalidParameter if the condition above is false. + * + * @param exportableSheetNames A list of sheet names allowed for exporting + * @param sheetName the name of the sheet selected for export + */ + static verifySheetName(exportableSheetNames, sheetName) { + if (!exportableSheetNames.includes(sheetName)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidSelectionSheet, 'sheetName parameter must belong to a worksheet within the current view'); + } + } + /** + * Verifies the ExportDataOptions object + * Throws with error code InvalidParameter if the parameter is not of ExportDataOptions type. + * + * @param options The ExportDataOptions object used to configure the output CSV file for exportDataAsync. + */ + static verifyExportDataOptions(options) { + if ((!Param_1.Param.isNullOrUndefined(options.ignoreAliases) && !Param_1.Param.isTypeBool(options.ignoreAliases)) || + (!Param_1.Param.isNullOrUndefined(options.columnsToIncludeById) && !Array.isArray(options.columnsToIncludeById))) + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'options paramater must be of type ExportDataOptions'); + } + /** + * Verifies if the sheet names are included in any of the export scenarios. + * Throws with error code InvalidParameter if the parameter is not an array. + * Throws with error code InvalidSelectionSheet if there are array entries that dont exist or if there is mixing between sheets from the dashboard and sheet from the workbook. + * + * @param sheetNames List of sheet names selected for exporting. + * @param exportScenarios an object containing the current sheet name, exportable sheets from the dashboard, and exportable sheets from the workbook. + */ + static verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios) { + if (!Array.isArray(sheetNames)) + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'sheetNames parameter must be an array'); + if (sheetNames.length === 0) + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'sheetNames should not be empty'); + const isIncludedInDashboard = sheetNames.every((sheetName) => exportScenarios.exportableSheetNamesFromDashboard.includes(sheetName)); + if (isIncludedInDashboard) { + return; + } + const isIncludedInWorkbook = sheetNames.every((sheetName) => exportScenarios.exportableSheetNamesFromWorkbook.includes(sheetName)); + if (isIncludedInWorkbook) { + return; + } + const isCurrentSheet = sheetNames.length === 1 && sheetNames[0] === exportScenarios.currentSheetName; + if (isCurrentSheet) { + return; + } + // Export requirement: all sheet names must be included in the list of exportable sheets in the dashboard or + // all sheet names must be included in the list of exportable sheets in the workbook, or the sheet name is the current sheet + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidSelectionSheet, 'sheetNames parameter must have all its entries be exportable sheet names from the dashboard or all its entries be exportable sheet names from the workbook'); + } + /** + * Verifies the external ExportPDFOptions object's properties. + * Throws with error code InvalidParameter if the parameter is not of external ExportPDFOptions type. + * + * @param options The external user-facing ExportPDFOptions object used to configure the output PDF file for exportPDFAsync. + */ + static verifyExportPDFOptions(options) { + try { + this.verifyEnumValue(options.orientation, api_external_contract_js_1.PrintOrientation, 'PrintOrientation'); + this.verifyEnumValue(options.pageSize, api_external_contract_js_1.PrintPageSize, 'PrintPageSize'); + this.verifyEnumValue(options.scaling, api_external_contract_js_1.PrintScaling, 'PrintScaling'); + } + catch (_a) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'options parameter must be of type ExportPDFOptions'); + } + } +} +exports.ErrorHelpers = ErrorHelpers; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +/** + * Helper methods for Export APIs. + * + * @class ExportHelpers + */ +class ExportHelpers { + /** + * Modifies the internal ExportPDFOptions' properties based on the given PDF export configuration. + * This method will construct the internal ExportPDFOptions identically to how the 'Export PDF' dialog constructs the ExportPdfOptionsPresModel. + * See the handleExportClick method in @browser-clients/export-pdf-options-dialog for reference. + * + * @param internalExportPdfOptions The internal ExportPDFOptions pres model used to configure the output PDF file. + * @param externalExportPdfOptions The external ExportPDFOptions user-facing object passed to exportPDFAsync. + * @param sheetNames The list of sheets selected for export. + */ + static updateInternalExportPDFOptions(internalExportPdfOptions, externalExportPdfOptions, sheetNames) { + internalExportPdfOptions.currentSheet = sheetNames[0]; + this.updateExportLayoutOptions(internalExportPdfOptions, externalExportPdfOptions); + this.updateSheetOptions(internalExportPdfOptions, sheetNames); + } + /** + * Helper method for updateInternalExportPDFOptions. + * Modifies the exportLayoutOptions property of the internal ExportPDFOptions based on the external ExportPDFOptions. + * See the getExportLayoutOptions method in @browser-clients/export-pdf-options-dialog for reference. + * + * @param internalExportPdfOptions The internal ExportPDFOptions pres model used to configure the output PDF file. + * @param externalExportPdfOptions The external ExportPDFOptions user-facing object passed to exportPDFAsync. + */ + static updateExportLayoutOptions(internalExportPdfOptions, externalExportPdfOptions) { + const exportLayoutOptions = internalExportPdfOptions.exportLayoutOptions; + // setting the image height and width properties to their default values + exportLayoutOptions.imageHeight = this.DefaultLayoutOptions.imageHeight; + exportLayoutOptions.imageWidth = this.DefaultLayoutOptions.imageWidth; + // setting the orientation value for the exportLayoutOptions + switch (externalExportPdfOptions.orientation) { + case api_external_contract_js_1.PrintOrientation.Landscape: + exportLayoutOptions.pageOrientationOption = api_internal_contract_js_1.PageOrientation.Landscape; + break; + case api_external_contract_js_1.PrintOrientation.Portrait: + exportLayoutOptions.pageOrientationOption = api_internal_contract_js_1.PageOrientation.Portrait; + break; + default: + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'invalid orientation for ExportPDFOption'); + } + // setting the page size value for the exportLayoutOptions + switch (externalExportPdfOptions.pageSize) { + case api_external_contract_js_1.PrintPageSize.A3: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.A3; + break; + case api_external_contract_js_1.PrintPageSize.A4: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.A4; + break; + case api_external_contract_js_1.PrintPageSize.A5: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.A5; + break; + case api_external_contract_js_1.PrintPageSize.B4: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.B4; + break; + case api_external_contract_js_1.PrintPageSize.B5: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.B5; + break; + case api_external_contract_js_1.PrintPageSize.Executive: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Executive; + break; + case api_external_contract_js_1.PrintPageSize.Folio: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Folio; + break; + case api_external_contract_js_1.PrintPageSize.Ledger: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Ledger; + break; + case api_external_contract_js_1.PrintPageSize.Legal: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Legal; + break; + case api_external_contract_js_1.PrintPageSize.Letter: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Letter; + break; + case api_external_contract_js_1.PrintPageSize.Note: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Note; + break; + case api_external_contract_js_1.PrintPageSize.Quarto: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Quarto; + break; + case api_external_contract_js_1.PrintPageSize.Statement: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Statement; + break; + case api_external_contract_js_1.PrintPageSize.Tabloid: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Tabloid; + break; + case api_external_contract_js_1.PrintPageSize.Unspecified: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Unspecified; + break; + default: + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'invalid pageSize for ExportPDFOption'); + } + // setting the scaling values for the exportLayoutOptions + switch (externalExportPdfOptions.scaling) { + case api_external_contract_js_1.PrintScaling.AtMost1PageHigh: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.FitPages.FitOneHigh); + break; + case api_external_contract_js_1.PrintScaling.AtMost1PageWide: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.FitPages.FitOneWide); + break; + case api_external_contract_js_1.PrintScaling.AtMost2PagesHigh: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.FitPages.FitTwoHigh); + break; + case api_external_contract_js_1.PrintScaling.AtMost2PagesWide: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.FitPages.FitTwoWide); + break; + case api_external_contract_js_1.PrintScaling.Automatic: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePctAuto); + break; + case api_external_contract_js_1.PrintScaling.Perc100: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct100); + break; + case api_external_contract_js_1.PrintScaling.Perc200: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct200); + break; + case api_external_contract_js_1.PrintScaling.Perc25: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct25); + break; + case api_external_contract_js_1.PrintScaling.Perc400: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct400); + break; + case api_external_contract_js_1.PrintScaling.Perc50: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct50); + break; + case api_external_contract_js_1.PrintScaling.Perc60: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct60); + break; + case api_external_contract_js_1.PrintScaling.Perc75: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct75); + break; + case api_external_contract_js_1.PrintScaling.Perc80: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct80); + break; + case api_external_contract_js_1.PrintScaling.Perc90: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct90); + break; + default: + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'invalid scaling for ExportPDFOption'); + } + } + /** + * Helper method for updateInternalExportPDFOptions. + * Modifies the sheetOptions property of the internal ExportPDFOptions based on the sheets selected for export. + * See the handleExportClick method in @browser-clients/export-pdf-options-dialog for reference. + * + * @param internalExportPdfOptions The internal ExportPDFOptions pres model used to configure the output PDF file. + * @param sheetNames The list of sheets selected for export. + */ + static updateSheetOptions(internalExportPdfOptions, sheetNames) { + const { exportLayoutOptions, sheetOptions } = internalExportPdfOptions; + // updating the export layouts options for each sheet and selecting sheet for export if included in list + for (const sheetOption of sheetOptions) { + sheetOption.exportLayoutOptions = exportLayoutOptions; + sheetOption.isSelected = sheetNames.includes(sheetOption.sheet); + } + } + /** + * Helper method for updateExportLayoutOptons. + * This method is a spoof of the getFitAndScaleValues method used in @browser-clients/export-pdf-options to set the exportLayoutOptions' scaling properties. + * In the future, this file should be refactored to import the method directly from @browser-clients/export-pdf-options. + * + * @param scalingSelection string used for setting the exportLayoutOptions based on the PrintScaling property from the ExternalExportPDFOptions. + * @param exportLayoutOptions the ExportLayoutOptions used by the internal ExportPDFOptions pres model. + */ + static setFitAndScaleValues(exportLayoutOptions, scalingSelection) { + let { pageFitHorizontal, pageFitVertical, pageScaleMode, pageScalePercent } = this.DefaultLayoutOptions; + const fitMatch = this.fitRegex.exec(scalingSelection); + const percentMatch = this.pctRegex.exec(scalingSelection); + if (fitMatch) { + [pageFitHorizontal, pageFitVertical] = fitMatch.slice(1).map((value) => Number(value)); + pageScaleMode = api_internal_contract_js_1.ScaleMode.ScaleFitPages; + } + else if (percentMatch) { + [pageScalePercent] = percentMatch.slice(1).map((value) => Number(value)); + pageScaleMode = api_internal_contract_js_1.ScaleMode.ScalePercentage; + } + // getFitAndScaleValues returns the properties below, but instead this method will set them. + exportLayoutOptions.pageFitHorizontal = pageFitHorizontal; + exportLayoutOptions.pageFitVertical = pageFitVertical; + exportLayoutOptions.pageScaleMode = pageScaleMode; + exportLayoutOptions.pageScalePercent = pageScalePercent; + } +} +exports.ExportHelpers = ExportHelpers; +ExportHelpers.DefaultDataOptions = { + ignoreAliases: false, + columnsToIncludeById: [], +}; +ExportHelpers.DefaultPDFOptions = { + scaling: api_external_contract_js_1.PrintScaling.Automatic, + pageSize: api_external_contract_js_1.PrintPageSize.Letter, + orientation: api_external_contract_js_1.PrintOrientation.Portrait, +}; +ExportHelpers.DefaultLayoutOptions = { + imageHeight: 0, + imageWidth: 0, + pageFitHorizontal: 1, + pageFitVertical: 1, + pageOrientationOption: api_internal_contract_js_1.PageOrientation.Portrait, + pageScaleMode: api_internal_contract_js_1.ScaleMode.ScaleAuto, + pageScalePercent: 100, + pageSizeOption: api_internal_contract_js_1.PageSizeOption.Letter, +}; +ExportHelpers.fitRegex = new RegExp('fit([0-9]+)x([0-9]+)'); +ExportHelpers.pctRegex = new RegExp('pct([0-9]+)'); + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Utils/Param.js": +/*!*********************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Utils/Param.js ***! + \*********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ./ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +class Param { + /** + * serializes the date into the format that the server expects. + * @param date the date to serialize + */ + static serializeDateForPlatform(date) { + const year = date.getUTCFullYear(); + const month = date.getUTCMonth() + 1; + const day = date.getUTCDate(); + const hh = date.getUTCHours(); + const mm = date.getUTCMinutes(); + const sec = date.getUTCSeconds(); + return `${year}-${month}-${day} ${hh}:${mm}:${sec}`; + } + static serializeBooleanForPlatform(bool) { + return bool ? 'true' : 'false'; + } + static serializeNumberForPlatform(num) { + return num.toString(10); + } + /** + * Verifies the input is a number + */ + /* tslint:disable-next-line:no-any */ + static isTypeNumber(input) { + return typeof input === 'number' || input instanceof Number; + } + /** + * Verifies the input is a Date + */ + /* tslint:disable-next-line:no-any */ + static isTypeDate(input) { + return input instanceof Date; + } + /* tslint:disable-next-line:no-any */ + static isTypeString(input) { + return typeof input === 'string' || input instanceof String; + } + /* tslint:disable-next-line:no-any */ + static isTypeBool(input) { + return typeof input === 'boolean' || input instanceof Boolean; + } + /** + * Determines if the input is null or undefined + */ + /* tslint:disable-next-line:no-any */ + static isNullOrUndefined(input) { + return input === null || input === undefined; + } + /* tslint:disable-next-line:no-any */ + static serializeParameterValue(value) { + if (Param.isTypeNumber(value)) { + return Param.serializeNumberForPlatform(value); + } + else if (Param.isTypeDate(value)) { + return Param.serializeDateForPlatform(value); + } + else if (Param.isTypeBool(value)) { + return Param.serializeBooleanForPlatform(value); + } + else if (Param.isTypeString(value)) { + return value; + } + else { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Unexpected invalid value for: ${value}`); + } + } + /** + * Verifies that the parameter is already a Map, or converts an object to a Map. + * If the parameter is an object, we convert it to a Map using Object.entries. + * @throws if the parameter is not an object or Map + */ + // tslint:disable-next-line:no-any + static convertParameterToMap(param, paramName) { + ErrorHelpers_1.ErrorHelpers.verifyParameterType(param, 'object', paramName); + if (Array.isArray(param)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, `Expecting object or Map for: ${paramName}.`); + } + return param instanceof Map ? param : new Map(Object.entries(param)); + } + /* tslint:disable-next-line:no-any */ + static tryParseNumber(value) { + if (Param.isNullOrUndefined(value)) { + return { success: false }; + } + if (Param.isTypeNumber(value)) { + return { parsed: value, success: true }; + } + const valueString = value.toString(); + if (valueString === 'NaN') { + // 'NaN' parses as NaN which is indistinguishable from a failed parse. + return { parsed: NaN, success: true }; + } + const parsed = parseFloat(valueString); + if (isNaN(parsed)) { + return { success: false }; + } + return { parsed, success: true }; + } +} +exports.Param = Param; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js": +/*!**************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +class SheetUtils { + // This is a direct port from SheetSize.cs - SheetSizeFactory + static getSheetSizeFromSizeConstraints(sizeConstraint) { + const { minWidth, minHeight, maxWidth, maxHeight } = sizeConstraint; + if (minHeight === 0 && minWidth === 0) { + if (maxHeight === 0 && maxWidth === 0) { + return { + behavior: Contract.SheetSizeBehavior.Automatic, + }; + } + return { + behavior: Contract.SheetSizeBehavior.AtMost, + maxSize: { width: maxWidth, height: maxHeight }, + }; + } + if (maxHeight === 0 && maxWidth === 0) { + return { + behavior: Contract.SheetSizeBehavior.AtLeast, + minSize: { width: minWidth, height: minHeight }, + }; + } + if (maxHeight === minHeight && maxWidth === minWidth && minWidth > 0) { + return { + behavior: Contract.SheetSizeBehavior.Exactly, + minSize: { width: minWidth, height: minHeight }, + maxSize: { width: minWidth, height: minHeight }, + }; + } + // 'Fit Width' for a DSD layout + const isDsdLayout = minWidth === 0 && maxWidth === 0; + return { + behavior: Contract.SheetSizeBehavior.Range, + minSize: { width: minWidth, height: minHeight }, + maxSize: { width: isDsdLayout ? 2147483647 : maxWidth, height: maxHeight }, + }; + } + static createAutomaticSize() { + let behavior = Contract.SheetSizeBehavior.Automatic; + let minSize = { width: 0, height: 0 }; + let maxSize = { width: 0, height: 0 }; + return { behavior, minSize, maxSize }; + } + static getPublishedSheetInfoByName(name, sheetInfos) { + const sheetInfo = sheetInfos.find((sheet) => sheet.name === name); + return sheetInfo; + } + static getSheetTypeEnum(internalSheetType) { + let sheetType; + switch (internalSheetType) { + case api_internal_contract_js_1.SheetType.Worksheet: { + sheetType = Contract.SheetType.Worksheet; + break; + } + case api_internal_contract_js_1.SheetType.Dashboard: { + sheetType = Contract.SheetType.Dashboard; + break; + } + case api_internal_contract_js_1.SheetType.Story: { + sheetType = Contract.SheetType.Story; + break; + } + default: { + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.ServerError, 'Invalid SheetType'); + } + } + return sheetType; + } + static isValidSheetSize(sizeObject) { + return sizeObject.behavior !== undefined; + } +} +exports.SheetUtils = SheetUtils; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Utils/ShortLivedDeferred.js": +/*!**********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Utils/ShortLivedDeferred.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const Deferred_1 = __webpack_require__(/*! ./Deferred */ "../api-shared-js/lib/src/ApiShared/Utils/Deferred.js"); +/** + * A Deferred wrapper class adding functionality to reject unresponsive promises after timeout + * + * this class handles two things: + + * 1. Adds timeout logic for deferred + * 2. It blocks multiple calls from executing at the same time. + * + * @export + * @class ShortLivedDeferred + * @template TResolve The type used to resolve the promise. + * @template TReject The type used to reject the promise. Defaults to any. + * + */ +class ShortLivedDeferred { + constructor(_timeoutInMilliseconds = Deferred_1.UnregisterTimeoutInMilliseconds) { + this._timeoutInMilliseconds = _timeoutInMilliseconds; + } + getNewPromiseOrThrowIfBusy() { + if (this._deferred) { + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.ApiExecutionError, 'This api cannot be executed till previous call is resolved.'); + } + this._deferred = new Deferred_1.Deferred(); + this._timeoutId = setTimeout(() => { + const error = new TableauError_1.TableauError(Contract.SharedErrorCodes.Timeout, `Api failed to complete in ${this._timeoutInMilliseconds / 1000} seconds`); + this.reject(error); + }, this._timeoutInMilliseconds); + return this._deferred.promise; + } + resolve(response) { + if (this._deferred) { + clearTimeout(this._timeoutId); + this._deferred.resolve(response); + this._deferred = undefined; + } + } + reject(error) { + if (this._deferred) { + clearTimeout(this._timeoutId); + this._deferred.reject(error); + this._deferred = undefined; + } + } +} +exports.ShortLivedDeferred = ShortLivedDeferred; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/VersionNumber.js": +/*!***********************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/VersionNumber.js ***! + \***********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ./TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +/** + * Represents the current version of the extensions, embedding + * and extensions-api-types library + */ +class VersionNumber { + // private constructor so everyone uses the singleton instance + // build numbers have this form: M.m.f-pre.N + constructor(versionString, isAlpha) { + const partStr = versionString.split('-'); + this.build = this.getBuildNumber(partStr[1]); + versionString = partStr[0]; + const parts = versionString.split('.').map((p) => parseInt(p, 10)); + if (parts.length !== 3) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Invalid version number: ${versionString}`); + } + this.major = parts[0]; + this.minor = parts[1]; + this.fix = parts[2]; + this.isAlpha = isAlpha; + } + getBuildNumber(preReleaseString) { + const noBuildNumber = -1; + if (!preReleaseString) { + return noBuildNumber; + } + // The preRelease string has this form: pre.N, but we don't depend on the actual string being 'pre' + const partStr = preReleaseString.split('.'); + return partStr[1] ? parseInt(partStr[1], 10) : noBuildNumber; + } + get formattedValue() { + return `${this.major}.${this.minor}.${this.fix}`; + } + get fullFormattedValue() { + return `${this.major}.${this.minor}.${this.fix}-pre.${this.build}`; + } +} +exports.VersionNumber = VersionNumber; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/VersionedExternalApiDispatcher.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/lib/src/VersionedExternalApiDispatcher.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +/** + * Implementation of the InternalApiDispatcher which supports upgrading and downgrading the input + * internal contract to the version that this module is built against + * + * @class VersionedExternalApiDispatcher + * @implements {InternalApiDispatcher} + */ +class VersionedExternalApiDispatcher { + /** + * Creates a new instance of the VersionedExternalApiDispatcher + * We have multiple version converting dispatchers that work together. + * If needed, the VersionedExternalApiDispatcher wraps either the InternalApiDispatcher (desktop) + * or the CrossFrameDispatcher (server). + * The Internal/CrossFrame dispatchers handle an updated platform with an older external library. + * (The CrossFrameDispatcher sends messages across the frame, and it is handled by the PresLayerHandler.) + * Meanwhile, the VersionedExternalApiDispatcher handles an updated external library with an older platform. + + * @param _apiDelegateDispatcher The delegate that does the actual work. + * @param platformVersionNumber The version of the internal contract which the platform module is using. + * This number will be used to figure out how to downgrade incoming commands and upgrade the results + */ + constructor(_apiDelegateDispatcher, platformVersionNumber) { + this._apiDelegateDispatcher = _apiDelegateDispatcher; + this._versionConverter = api_internal_contract_js_1.CreateExternalCompatibleVersionConverter(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION, platformVersionNumber); + this._notificationHandlers = []; + _apiDelegateDispatcher.registerNotificationHandler((notification) => { + if (this._notificationHandlers.length === 0) { + return; + } + const upgradedNotification = this._versionConverter.upgradeNotification(notification); + this._notificationHandlers.forEach((handler) => { + handler(upgradedNotification); + }); + }); + } + static needsVersionConverter(platformVersion) { + // If our platform is less than external library version, then we need a converter + return api_internal_contract_js_1.VersionLessThan(platformVersion, api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); + } + execute(verb, parameters) { + try { + const downgradeParameters = this._versionConverter.downgradeExecuteCall(verb, parameters); + return this._apiDelegateDispatcher.execute(downgradeParameters.verb, downgradeParameters.parameters).then((response) => { + const upgradeResponse = this._versionConverter.upgradeExecuteReturn(response, verb, parameters); + return upgradeResponse; + }); + } + catch (e) { + return Promise.reject(e); + } + } + registerNotificationHandler(handler) { + this._notificationHandlers.push(handler); + } + unregisterNotificationHandler(handler) { + this._notificationHandlers = this._notificationHandlers.filter((h) => h !== handler); + } +} +exports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher; + + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/index.js": +/*!********************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/index.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ NIL: () => (/* reexport safe */ _nil_js__WEBPACK_IMPORTED_MODULE_4__["default"]), +/* harmony export */ parse: () => (/* reexport safe */ _parse_js__WEBPACK_IMPORTED_MODULE_8__["default"]), +/* harmony export */ stringify: () => (/* reexport safe */ _stringify_js__WEBPACK_IMPORTED_MODULE_7__["default"]), +/* harmony export */ v1: () => (/* reexport safe */ _v1_js__WEBPACK_IMPORTED_MODULE_0__["default"]), +/* harmony export */ v3: () => (/* reexport safe */ _v3_js__WEBPACK_IMPORTED_MODULE_1__["default"]), +/* harmony export */ v4: () => (/* reexport safe */ _v4_js__WEBPACK_IMPORTED_MODULE_2__["default"]), +/* harmony export */ v5: () => (/* reexport safe */ _v5_js__WEBPACK_IMPORTED_MODULE_3__["default"]), +/* harmony export */ validate: () => (/* reexport safe */ _validate_js__WEBPACK_IMPORTED_MODULE_6__["default"]), +/* harmony export */ version: () => (/* reexport safe */ _version_js__WEBPACK_IMPORTED_MODULE_5__["default"]) +/* harmony export */ }); +/* harmony import */ var _v1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v1.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v1.js"); +/* harmony import */ var _v3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v3.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v3.js"); +/* harmony import */ var _v4_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v4.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v4.js"); +/* harmony import */ var _v5_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v5.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v5.js"); +/* harmony import */ var _nil_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./nil.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/nil.js"); +/* harmony import */ var _version_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./version.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/version.js"); +/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./validate.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js"); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./stringify.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js"); +/* harmony import */ var _parse_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./parse.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js"); + + + + + + + + + + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/md5.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/md5.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* + * Browser-compatible JavaScript MD5 + * + * Modification of JavaScript MD5 + * https://github.com/blueimp/JavaScript-MD5 + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + * + * Based on + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + * Digest Algorithm, as defined in RFC 1321. + * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for more info. + */ +function md5(bytes) { + if (typeof bytes === 'string') { + var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape + + bytes = new Uint8Array(msg.length); + + for (var i = 0; i < msg.length; ++i) { + bytes[i] = msg.charCodeAt(i); + } + } + + return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8)); +} +/* + * Convert an array of little-endian words to an array of bytes + */ + + +function md5ToHexEncodedArray(input) { + var output = []; + var length32 = input.length * 32; + var hexTab = '0123456789abcdef'; + + for (var i = 0; i < length32; i += 8) { + var x = input[i >> 5] >>> i % 32 & 0xff; + var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16); + output.push(hex); + } + + return output; +} +/** + * Calculate output length with padding and bit length + */ + + +function getOutputLength(inputLength8) { + return (inputLength8 + 64 >>> 9 << 4) + 14 + 1; +} +/* + * Calculate the MD5 of an array of little-endian words, and a bit length. + */ + + +function wordsToMd5(x, len) { + /* append padding */ + x[len >> 5] |= 0x80 << len % 32; + x[getOutputLength(len) - 1] = len; + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + var d = 271733878; + + for (var i = 0; i < x.length; i += 16) { + var olda = a; + var oldb = b; + var oldc = c; + var oldd = d; + a = md5ff(a, b, c, d, x[i], 7, -680876936); + d = md5ff(d, a, b, c, x[i + 1], 12, -389564586); + c = md5ff(c, d, a, b, x[i + 2], 17, 606105819); + b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330); + a = md5ff(a, b, c, d, x[i + 4], 7, -176418897); + d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426); + c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341); + b = md5ff(b, c, d, a, x[i + 7], 22, -45705983); + a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416); + d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417); + c = md5ff(c, d, a, b, x[i + 10], 17, -42063); + b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162); + a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682); + d = md5ff(d, a, b, c, x[i + 13], 12, -40341101); + c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290); + b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329); + a = md5gg(a, b, c, d, x[i + 1], 5, -165796510); + d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632); + c = md5gg(c, d, a, b, x[i + 11], 14, 643717713); + b = md5gg(b, c, d, a, x[i], 20, -373897302); + a = md5gg(a, b, c, d, x[i + 5], 5, -701558691); + d = md5gg(d, a, b, c, x[i + 10], 9, 38016083); + c = md5gg(c, d, a, b, x[i + 15], 14, -660478335); + b = md5gg(b, c, d, a, x[i + 4], 20, -405537848); + a = md5gg(a, b, c, d, x[i + 9], 5, 568446438); + d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690); + c = md5gg(c, d, a, b, x[i + 3], 14, -187363961); + b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501); + a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467); + d = md5gg(d, a, b, c, x[i + 2], 9, -51403784); + c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473); + b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734); + a = md5hh(a, b, c, d, x[i + 5], 4, -378558); + d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463); + c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562); + b = md5hh(b, c, d, a, x[i + 14], 23, -35309556); + a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060); + d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353); + c = md5hh(c, d, a, b, x[i + 7], 16, -155497632); + b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640); + a = md5hh(a, b, c, d, x[i + 13], 4, 681279174); + d = md5hh(d, a, b, c, x[i], 11, -358537222); + c = md5hh(c, d, a, b, x[i + 3], 16, -722521979); + b = md5hh(b, c, d, a, x[i + 6], 23, 76029189); + a = md5hh(a, b, c, d, x[i + 9], 4, -640364487); + d = md5hh(d, a, b, c, x[i + 12], 11, -421815835); + c = md5hh(c, d, a, b, x[i + 15], 16, 530742520); + b = md5hh(b, c, d, a, x[i + 2], 23, -995338651); + a = md5ii(a, b, c, d, x[i], 6, -198630844); + d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415); + c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905); + b = md5ii(b, c, d, a, x[i + 5], 21, -57434055); + a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571); + d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606); + c = md5ii(c, d, a, b, x[i + 10], 15, -1051523); + b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799); + a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359); + d = md5ii(d, a, b, c, x[i + 15], 10, -30611744); + c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380); + b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649); + a = md5ii(a, b, c, d, x[i + 4], 6, -145523070); + d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379); + c = md5ii(c, d, a, b, x[i + 2], 15, 718787259); + b = md5ii(b, c, d, a, x[i + 9], 21, -343485551); + a = safeAdd(a, olda); + b = safeAdd(b, oldb); + c = safeAdd(c, oldc); + d = safeAdd(d, oldd); + } + + return [a, b, c, d]; +} +/* + * Convert an array bytes to an array of little-endian words + * Characters >255 have their high-byte silently ignored. + */ + + +function bytesToWords(input) { + if (input.length === 0) { + return []; + } + + var length8 = input.length * 8; + var output = new Uint32Array(getOutputLength(length8)); + + for (var i = 0; i < length8; i += 8) { + output[i >> 5] |= (input[i / 8] & 0xff) << i % 32; + } + + return output; +} +/* + * Add integers, wrapping at 2^32. This uses 16-bit operations internally + * to work around bugs in some JS interpreters. + */ + + +function safeAdd(x, y) { + var lsw = (x & 0xffff) + (y & 0xffff); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return msw << 16 | lsw & 0xffff; +} +/* + * Bitwise rotate a 32-bit number to the left. + */ + + +function bitRotateLeft(num, cnt) { + return num << cnt | num >>> 32 - cnt; +} +/* + * These functions implement the four basic operations the algorithm uses. + */ + + +function md5cmn(q, a, b, x, s, t) { + return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b); +} + +function md5ff(a, b, c, d, x, s, t) { + return md5cmn(b & c | ~b & d, a, b, x, s, t); +} + +function md5gg(a, b, c, d, x, s, t) { + return md5cmn(b & d | c & ~d, a, b, x, s, t); +} + +function md5hh(a, b, c, d, x, s, t) { + return md5cmn(b ^ c ^ d, a, b, x, s, t); +} + +function md5ii(a, b, c, d, x, s, t) { + return md5cmn(c ^ (b | ~d), a, b, x, s, t); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (md5); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/nil.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/nil.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ('00000000-0000-0000-0000-000000000000'); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js": +/*!********************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js"); + + +function parse(uuid) { + if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { + throw TypeError('Invalid UUID'); + } + + var v; + var arr = new Uint8Array(16); // Parse ########-....-....-....-............ + + arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24; + arr[1] = v >>> 16 & 0xff; + arr[2] = v >>> 8 & 0xff; + arr[3] = v & 0xff; // Parse ........-####-....-....-............ + + arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8; + arr[5] = v & 0xff; // Parse ........-....-####-....-............ + + arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8; + arr[7] = v & 0xff; // Parse ........-....-....-####-............ + + arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8; + arr[9] = v & 0xff; // Parse ........-....-....-....-############ + // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes) + + arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff; + arr[11] = v / 0x100000000 & 0xff; + arr[12] = v >>> 24 & 0xff; + arr[13] = v >>> 16 & 0xff; + arr[14] = v >>> 8 & 0xff; + arr[15] = v & 0xff; + return arr; +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (parse); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/regex.js": +/*!********************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/regex.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ rng) +/* harmony export */ }); +// Unique ID creation requires a high quality random # generator. In the browser we therefore +// require the crypto API and do not support built-in fallback to lower quality random number +// generators (like Math.random()). +var getRandomValues; +var rnds8 = new Uint8Array(16); +function rng() { + // lazy load so that environments that need to polyfill have a chance to do so + if (!getRandomValues) { + // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also, + // find the complete implementation of crypto (msCrypto) on IE11. + getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto); + + if (!getRandomValues) { + throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported'); + } + } + + return getRandomValues(rnds8); +} + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/sha1.js": +/*!*******************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/sha1.js ***! + \*******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +// Adapted from Chris Veness' SHA1 code at +// http://www.movable-type.co.uk/scripts/sha1.html +function f(s, x, y, z) { + switch (s) { + case 0: + return x & y ^ ~x & z; + + case 1: + return x ^ y ^ z; + + case 2: + return x & y ^ x & z ^ y & z; + + case 3: + return x ^ y ^ z; + } +} + +function ROTL(x, n) { + return x << n | x >>> 32 - n; +} + +function sha1(bytes) { + var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6]; + var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]; + + if (typeof bytes === 'string') { + var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape + + bytes = []; + + for (var i = 0; i < msg.length; ++i) { + bytes.push(msg.charCodeAt(i)); + } + } else if (!Array.isArray(bytes)) { + // Convert Array-like to Array + bytes = Array.prototype.slice.call(bytes); + } + + bytes.push(0x80); + var l = bytes.length / 4 + 2; + var N = Math.ceil(l / 16); + var M = new Array(N); + + for (var _i = 0; _i < N; ++_i) { + var arr = new Uint32Array(16); + + for (var j = 0; j < 16; ++j) { + arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3]; + } + + M[_i] = arr; + } + + M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32); + M[N - 1][14] = Math.floor(M[N - 1][14]); + M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff; + + for (var _i2 = 0; _i2 < N; ++_i2) { + var W = new Uint32Array(80); + + for (var t = 0; t < 16; ++t) { + W[t] = M[_i2][t]; + } + + for (var _t = 16; _t < 80; ++_t) { + W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1); + } + + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + + for (var _t2 = 0; _t2 < 80; ++_t2) { + var s = Math.floor(_t2 / 20); + var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0; + e = d; + d = c; + c = ROTL(b, 30) >>> 0; + b = a; + a = T; + } + + H[0] = H[0] + a >>> 0; + H[1] = H[1] + b >>> 0; + H[2] = H[2] + c >>> 0; + H[3] = H[3] + d >>> 0; + H[4] = H[4] + e >>> 0; + } + + return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff]; +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (sha1); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js": +/*!************************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js"); + +/** + * Convert array of 16 byte values to UUID string format of the form: + * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX + */ + +var byteToHex = []; + +for (var i = 0; i < 256; ++i) { + byteToHex.push((i + 0x100).toString(16).substr(1)); +} + +function stringify(arr) { + var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + // Note: Be careful editing this code! It's been tuned for performance + // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 + var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one + // of the following: + // - One or more input array values don't map to a hex octet (leading to + // "undefined" in the uuid) + // - Invalid input values for the RFC `version` or `variant` fields + + if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { + throw TypeError('Stringified UUID is invalid'); + } + + return uuid; +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (stringify); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v1.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v1.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _rng_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rng.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js"); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js"); + + // **`v1()` - Generate time-based UUID** +// +// Inspired by https://github.com/LiosK/UUID.js +// and http://docs.python.org/library/uuid.html + +var _nodeId; + +var _clockseq; // Previous uuid creation time + + +var _lastMSecs = 0; +var _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details + +function v1(options, buf, offset) { + var i = buf && offset || 0; + var b = buf || new Array(16); + options = options || {}; + var node = options.node || _nodeId; + var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not + // specified. We do this lazily to minimize issues related to insufficient + // system entropy. See #189 + + if (node == null || clockseq == null) { + var seedBytes = options.random || (options.rng || _rng_js__WEBPACK_IMPORTED_MODULE_0__["default"])(); + + if (node == null) { + // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) + node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]]; + } + + if (clockseq == null) { + // Per 4.2.2, randomize (14 bit) clockseq + clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff; + } + } // UUID timestamps are 100 nano-second units since the Gregorian epoch, + // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so + // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' + // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. + + + var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock + // cycle to simulate higher resolution clock + + var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs) + + var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression + + if (dt < 0 && options.clockseq === undefined) { + clockseq = clockseq + 1 & 0x3fff; + } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new + // time interval + + + if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) { + nsecs = 0; + } // Per 4.2.1.2 Throw error if too many uuids are requested + + + if (nsecs >= 10000) { + throw new Error("uuid.v1(): Can't create more than 10M uuids/sec"); + } + + _lastMSecs = msecs; + _lastNSecs = nsecs; + _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch + + msecs += 12219292800000; // `time_low` + + var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; + b[i++] = tl >>> 24 & 0xff; + b[i++] = tl >>> 16 & 0xff; + b[i++] = tl >>> 8 & 0xff; + b[i++] = tl & 0xff; // `time_mid` + + var tmh = msecs / 0x100000000 * 10000 & 0xfffffff; + b[i++] = tmh >>> 8 & 0xff; + b[i++] = tmh & 0xff; // `time_high_and_version` + + b[i++] = tmh >>> 24 & 0xf | 0x10; // include version + + b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) + + b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low` + + b[i++] = clockseq & 0xff; // `node` + + for (var n = 0; n < 6; ++n) { + b[i + n] = node[n]; + } + + return buf || (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(b); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v1); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v3.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v3.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _v35_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v35.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js"); +/* harmony import */ var _md5_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./md5.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/md5.js"); + + +var v3 = (0,_v35_js__WEBPACK_IMPORTED_MODULE_0__["default"])('v3', 0x30, _md5_js__WEBPACK_IMPORTED_MODULE_1__["default"]); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v3); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ DNS: () => (/* binding */ DNS), +/* harmony export */ URL: () => (/* binding */ URL), +/* harmony export */ "default": () => (/* export default binding */ __WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js"); +/* harmony import */ var _parse_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./parse.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js"); + + + +function stringToBytes(str) { + str = unescape(encodeURIComponent(str)); // UTF8 escape + + var bytes = []; + + for (var i = 0; i < str.length; ++i) { + bytes.push(str.charCodeAt(i)); + } + + return bytes; +} + +var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; +var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; +/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(name, version, hashfunc) { + function generateUUID(value, namespace, buf, offset) { + if (typeof value === 'string') { + value = stringToBytes(value); + } + + if (typeof namespace === 'string') { + namespace = (0,_parse_js__WEBPACK_IMPORTED_MODULE_0__["default"])(namespace); + } + + if (namespace.length !== 16) { + throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)'); + } // Compute hash of namespace and value, Per 4.3 + // Future: Use spread syntax when supported on all platforms, e.g. `bytes = + // hashfunc([...namespace, ... value])` + + + var bytes = new Uint8Array(16 + value.length); + bytes.set(namespace); + bytes.set(value, namespace.length); + bytes = hashfunc(bytes); + bytes[6] = bytes[6] & 0x0f | version; + bytes[8] = bytes[8] & 0x3f | 0x80; + + if (buf) { + offset = offset || 0; + + for (var i = 0; i < 16; ++i) { + buf[offset + i] = bytes[i]; + } + + return buf; + } + + return (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bytes); + } // Function#name is not settable on some platforms (#270) + + + try { + generateUUID.name = name; // eslint-disable-next-line no-empty + } catch (err) {} // For CommonJS default export support + + + generateUUID.DNS = DNS; + generateUUID.URL = URL; + return generateUUID; +} + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v4.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v4.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _rng_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rng.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js"); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js"); + + + +function v4(options, buf, offset) { + options = options || {}; + var rnds = options.random || (options.rng || _rng_js__WEBPACK_IMPORTED_MODULE_0__["default"])(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` + + rnds[6] = rnds[6] & 0x0f | 0x40; + rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided + + if (buf) { + offset = offset || 0; + + for (var i = 0; i < 16; ++i) { + buf[offset + i] = rnds[i]; + } + + return buf; + } + + return (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(rnds); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v4); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v5.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v5.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _v35_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v35.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js"); +/* harmony import */ var _sha1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sha1.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/sha1.js"); + + +var v5 = (0,_v35_js__WEBPACK_IMPORTED_MODULE_0__["default"])('v5', 0x50, _sha1_js__WEBPACK_IMPORTED_MODULE_1__["default"]); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v5); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js": +/*!***********************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js ***! + \***********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _regex_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./regex.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/regex.js"); + + +function validate(uuid) { + return typeof uuid === 'string' && _regex_js__WEBPACK_IMPORTED_MODULE_0__["default"].test(uuid); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (validate); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/version.js": +/*!**********************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/version.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js"); + + +function version(uuid) { + if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { + throw TypeError('Invalid UUID'); + } + + return parseInt(uuid.substr(14, 1), 16); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (version); + +/***/ }), + +/***/ "../api-internal-contract-js/lib/internal-contract-version.json": +/*!**********************************************************************!*\ + !*** ../api-internal-contract-js/lib/internal-contract-version.json ***! + \**********************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = /*#__PURE__*/JSON.parse('{"major":1,"minor":188,"fix":0}'); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be in strict mode. +(() => { +"use strict"; +var exports = __webpack_exports__; +/*!**********************************!*\ + !*** ./lib/src/ExtensionsApi.js ***! + \**********************************/ + +/** + * This is your main. This is where you re-export everything you want to be publicly available. + * + * The build enforces that the file has the same name as the global variable that is exported. + */ +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +// Due to the way we configured webpack, we should be exporting things which will be under +// a global variable called "tableau". Export everything we want to be visible under tableau +// from this file. +const ExtensionsImpl_1 = __webpack_require__(/*! ./ExtensionsApi/Impl/ExtensionsImpl */ "./lib/src/ExtensionsApi/Impl/ExtensionsImpl.js"); +const Extensions_1 = __webpack_require__(/*! ./ExtensionsApi/Namespaces/Extensions */ "./lib/src/ExtensionsApi/Namespaces/Extensions.js"); +const isAlpha = true ? true : 0; +api_shared_js_1.ApiVersion.SetVersionNumber( true ? "1.15.0-pre.15" : 0, isAlpha); +const extensionImpl = new ExtensionsImpl_1.ExtensionsImpl(); +exports.extensions = new Extensions_1.Extensions(extensionImpl); +// Export Enums +// These show up under the tableau object. I.e. tableau.ExtensionContext.Server +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +exports.AnalyticsObjectType = api_external_contract_js_1.AnalyticsObjectType; +exports.AnnotationType = api_external_contract_js_1.AnnotationType; +exports.ClassNameKey = api_external_contract_js_1.ClassNameKey; +exports.ColumnType = api_external_contract_js_1.ColumnType; +exports.DashboardLayoutChange = api_external_contract_js_1.DashboardLayoutChange; +exports.DashboardObjectType = api_external_contract_js_1.DashboardObjectType; +exports.DashboardObjectVisibilityType = api_external_contract_js_1.DashboardObjectVisibilityType; +exports.DataType = api_external_contract_js_1.DataType; +exports.DateRangeType = api_external_contract_js_1.DateRangeType; +exports.DialogStyle = api_external_contract_js_1.DialogStyle; +exports.EncodingType = api_external_contract_js_1.EncodingType; +exports.ErrorCodes = api_external_contract_js_1.ErrorCodes; +exports.ExtensionContext = api_external_contract_js_1.ExtensionContext; +exports.ExtensionMode = api_external_contract_js_1.ExtensionMode; +exports.FieldAggregationType = api_external_contract_js_1.FieldAggregationType; +exports.FieldRoleType = api_external_contract_js_1.FieldRoleType; +exports.FilterDomainType = api_external_contract_js_1.FilterDomainType; +exports.FilterNullOption = api_external_contract_js_1.FilterNullOption; +exports.FilterType = api_external_contract_js_1.FilterType; +exports.FilterUpdateType = api_external_contract_js_1.FilterUpdateType; +exports.HierarchicalLevelSelectionState = api_external_contract_js_1.HierarchicalLevelSelectionState; +exports.IncludeDataValuesOption = api_external_contract_js_1.IncludeDataValuesOption; +exports.MarkType = api_external_contract_js_1.MarkType; +exports.ParameterValueType = api_external_contract_js_1.ParameterValueType; +exports.PeriodType = api_external_contract_js_1.PeriodType; +exports.QuickTableCalcType = api_external_contract_js_1.QuickTableCalcType; +exports.ReplaySpeedType = api_external_contract_js_1.ReplaySpeedType; +exports.SelectionUpdateType = api_external_contract_js_1.SelectionUpdateType; +exports.SelectOptions = api_external_contract_js_1.SelectOptions; +exports.SheetType = api_external_contract_js_1.SheetType; +exports.SortDirection = api_external_contract_js_1.SortDirection; +exports.TableauEventType = api_external_contract_js_1.TableauEventType; +exports.TrendLineModelType = api_external_contract_js_1.TrendLineModelType; +exports.VizImageEncodingType = api_external_contract_js_1.VizImageEncodingType; +exports.VizImagePaletteType = api_external_contract_js_1.VizImagePaletteType; +exports.VizImageSizeSettingAlignmentType = api_external_contract_js_1.VizImageSizeSettingAlignmentType; +exports.VizImageSizeSettingType = api_external_contract_js_1.VizImageSizeSettingType; +exports.VizImageSortDirectionType = api_external_contract_js_1.VizImageSortDirectionType; +exports.ZoneVisibilityType = api_external_contract_js_1.ZoneVisibilityType; + +})(); + +window.tableau = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGVhdS5leHRlbnNpb25zLjEuMTUuMC1wcmUuMTUuYmV0YS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBLHdDQUF3QyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsR0FBRzs7QUFFM0Y7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLEtBQUssS0FBNEI7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FDOURELHlJQUE4RDtBQUM5RCxtSEFBOEM7QUFFOUMsTUFBYSwyQkFBNEIsU0FBUSwyQkFBWTtJQUMzRCxZQUEwQiw2QkFBb0U7UUFDNUYsS0FBSyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRGhDLGtDQUE2QixHQUE3Qiw2QkFBNkIsQ0FBdUM7SUFFOUYsQ0FBQztJQUVELElBQVcsNEJBQTRCO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLDZCQUE2QixDQUFDO0lBQzVDLENBQUM7Q0FDRjtBQVJELGtFQVFDOzs7Ozs7Ozs7Ozs7OztBQ1ZELDJKQUFpRjtBQUNqRixtSEFBc0Q7QUFDdEQsOElBQWdFO0FBRWhFLE1BQWEsa0JBQW1CLFNBQVEsNkNBQXFCO0lBQzNELFlBQW1CLFNBQXNDLEVBQVUsVUFBa0IsRUFBVSxRQUFpQjtRQUM5RyxLQUFLLENBQUMsMkNBQWdCLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRGdC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QWU7QUFDZiwrRUFBK0U7QUFDL0UseUpBeUMyQztBQXhDekMsNEVBQW1CO0FBQ25CLGtFQUFjO0FBQ2QsOERBQVk7QUFDWiwwREFBVTtBQUNWLGdGQUFxQjtBQUNyQiw0RUFBbUI7QUFDbkIsZ0dBQTZCO0FBQzdCLHNEQUFRO0FBQ1IsZ0VBQWE7QUFDYiw0REFBVztBQUNYLDhEQUFZO0FBQ1osMERBQVU7QUFDVixzRUFBZ0I7QUFDaEIsZ0VBQWE7QUFDYiw4RUFBb0I7QUFDcEIsZ0VBQWE7QUFDYixzRUFBZ0I7QUFDaEIsc0VBQWdCO0FBQ2hCLDBEQUFVO0FBQ1Ysc0VBQWdCO0FBQ2hCLG9HQUErQjtBQUMvQixvRkFBdUI7QUFDdkIsc0RBQVE7QUFDUiwwRUFBa0I7QUFDbEIsMERBQVU7QUFDViwwRUFBa0I7QUFFbEIsb0VBQWU7QUFDZiw0RUFBbUI7QUFDbkIsZ0VBQWE7QUFDYix3REFBUztBQUNULGdFQUFhO0FBQ2Isc0VBQWdCO0FBQ2hCLDBFQUFrQjtBQUNsQiw4RUFBb0I7QUFDcEIsNEVBQW1CO0FBQ25CLHNHQUFnQztBQUNoQyxvRkFBdUI7QUFDdkIsd0ZBQXlCO0FBQ3pCLDBFQUFrQiIsInNvdXJjZXMiOlsid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2d1aWQvZ3VpZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL0Rhc2hib2FyZExheW91dENoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL0ZpbHRlckNoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL01hcmtzU2VsZWN0ZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1BhcmFtZXRlckNoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1N1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvVGFibGVhdUV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvVGFibGVhdVNoZWV0RXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9UYWJsZWF1V29ya3NoZWV0RXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL0JlbnRvblNhbnNGb250TmFtZUNvbnN0YW50cy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9Db25uZWN0ZWRTZXJ2ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvRXh0ZW5zaW9uV29ya2Jvb2tJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL0V4dGVuc2lvbnNJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL0xlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9TZXR0aW5nc0ltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvVGFibGVhdUJvb2tGb250TmFtZUNvbnN0YW50cy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9VSUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9EYXNoYm9hcmQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9EYXNoYm9hcmRPYmplY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9QYXJhbWV0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9TaGVldC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL1dvcmtib29rLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvV29ya3NoZWV0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvRW52aXJvbm1lbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvRXh0ZW5zaW9ucy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9TZXR0aW5ncy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9VSS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9Xb3JrYm9va0Zvcm1hdHRpbmdFbnZVdGlsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL1dvcmtzaGVldENvbnRlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL0ltcGwvSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvU2VydmljZXMvSW1wbC9TZXR0aW5nc1NlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9JbXBsL1VJU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL1JlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FbWJlZGRpbmdBcGlFeHRlcm5hbENvbnRyYWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlbnNpb25zQXBpRXh0ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvQXNrRGF0YUludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0VudW1zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9QdWxzZUludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1ZpekludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1dlYkNvbXBvbmVudEludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1RhYmxlYXUudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0VudW1zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL1NoYXJlZEFwaUV4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL0pzQXBpSW50ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvY29udHJhY3QvRGF0YVR5cGVDb252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L0VudW1zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9jb250cmFjdC9Ob3RpZmljYXRpb25zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9jb250cmFjdC9QYXJhbWV0ZXJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9jb250cmFjdC9WZXJicy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvaW50ZXJmYWNlL0Fza0RhdGFJbnRlcmZhY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2ludGVyZmFjZS9QdWxzZUludGVyZmFjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvaW50ZXJmYWNlL1ZxbEludGVyZmFjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvbWVzc2FnaW5nL0Nyb3NzRnJhbWVNZXNzZW5nZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9Dcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9tZXNzYWdpbmcvTWVzc2FnZVR5cGVDaGVja3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL0lkZW50aXR5VmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9TdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvVmVyc2lvbkNvbnZlcnRlckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvVmVyc2lvblRyYW5zbGF0aW9ucy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0FwaVZlcnNpb24udHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQ29ubmVjdGlvblN1bW1hcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQ3Jvc3NGcmFtZS9Dcm9zc0ZyYW1lQm9vdHN0cmFwLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0Nyb3NzRnJhbWUvQ3Jvc3NGcmFtZURpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRGF0YVNvdXJjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRXZlbnRMaXN0ZW5lck1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRmllbGQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9DdXN0b21WaWV3SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9EYXNoYm9hcmRPYmplY3RJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvRGF0YVNvdXJjZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9GaWVsZEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9QYXJhbWV0ZXJJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU2hlZXRJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU2hlZXRJbmZvSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1NpbmdsZUV2ZW50TWFuYWdlckltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TdG9yeUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TdG9yeVBvaW50SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbmZvSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1dvcmtib29rSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1dvcmtzaGVldEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTG9naWNhbFRhYmxlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL01vZGVscy9BY2Nlc3NpYmlsaXR5TW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL01vZGVscy9GaWx0ZXJNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0dldERhdGFNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0dldERhdGFUYWJsZVJlYWRlck1vZGVscy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Nb2RlbHMvU2VsZWN0aW9uTW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1BvaW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL0dldERhdGFTZXJ2aWNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL1JlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvQWNjZXNzaWJpbGl0eVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvQW5pbWF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Bbm5vdGF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9DbGllbnRJbmZvU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9EYXRhU291cmNlU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9FeHBvcnRTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0ZpbHRlclNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvR2V0RGF0YVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9QYXJhbWV0ZXJzU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9TZWxlY3Rpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlcnZpY2VJbXBsQmFzZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NpemVTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1N0b3J5QWN0aXZhdGlvblNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvVmlzdWFsTW9kZWxTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1ZpelNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvWm9uZVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1RhYmxlU3VtbWFyeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9UYWJsZWF1RXJyb3IudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvRGF0YVZhbHVlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9EZWZlcnJlZC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9FbnVtQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL0Vycm9ySGVscGVycy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9FeHBvcnRIZWxwZXJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL1BhcmFtLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL1NoZWV0VXRpbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvU2hvcnRMaXZlZERlZmVycmVkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1ZlcnNpb25OdW1iZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9WZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvbWQ1LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL25pbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9wYXJzZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9yZWdleC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9ybmcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc2hhMS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjEuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjM1LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y0LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y1LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3ZhbGlkYXRlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vdGFibGVhdS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gKCkge1xuICB2YXIgdmFsaWRhdG9yID0gbmV3IFJlZ0V4cChcIl5bYS16MC05XXs4fS1bYS16MC05XXs0fS1bYS16MC05XXs0fS1bYS16MC05XXs0fS1bYS16MC05XXsxMn0kXCIsIFwiaVwiKTtcblxuICBmdW5jdGlvbiBnZW4oY291bnQpIHtcbiAgICB2YXIgb3V0ID0gXCJcIjtcbiAgICBmb3IgKHZhciBpPTA7IGk8Y291bnQ7IGkrKykge1xuICAgICAgb3V0ICs9ICgoKDErTWF0aC5yYW5kb20oKSkqMHgxMDAwMCl8MCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIEd1aWQoZ3VpZCkge1xuICAgIGlmICghZ3VpZCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXJndW1lbnQ7IGB2YWx1ZWAgaGFzIG5vIHZhbHVlLlwiKTtcbiAgICAgIFxuICAgIHRoaXMudmFsdWUgPSBHdWlkLkVNUFRZO1xuICAgIFxuICAgIGlmIChndWlkICYmIGd1aWQgaW5zdGFuY2VvZiBHdWlkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gZ3VpZC50b1N0cmluZygpO1xuXG4gICAgfSBlbHNlIGlmIChndWlkICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChndWlkKSA9PT0gXCJbb2JqZWN0IFN0cmluZ11cIiAmJiBHdWlkLmlzR3VpZChndWlkKSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGd1aWQ7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZXF1YWxzID0gZnVuY3Rpb24ob3RoZXIpIHtcbiAgICAgIC8vIENvbXBhcmluZyBzdHJpbmcgYHZhbHVlYCBhZ2FpbnN0IHByb3ZpZGVkIGBndWlkYCB3aWxsIGF1dG8tY2FsbFxuICAgICAgLy8gdG9TdHJpbmcgb24gYGd1aWRgIGZvciBjb21wYXJpc29uXG4gICAgICByZXR1cm4gR3VpZC5pc0d1aWQob3RoZXIpICYmIHRoaXMudmFsdWUgPT0gb3RoZXI7XG4gICAgfTtcblxuICAgIHRoaXMuaXNFbXB0eSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IEd1aWQuRU1QVFk7XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICAgIFxuICAgIHRoaXMudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICB9O1xuXG4gIEd1aWQuRU1QVFkgPSBcIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiO1xuXG4gIEd1aWQuaXNHdWlkID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgKHZhbHVlIGluc3RhbmNlb2YgR3VpZCB8fCB2YWxpZGF0b3IudGVzdCh2YWx1ZS50b1N0cmluZygpKSk7XG4gIH07XG5cbiAgR3VpZC5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IEd1aWQoW2dlbigyKSwgZ2VuKDEpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDMpXS5qb2luKFwiLVwiKSk7XG4gIH07XG5cbiAgR3VpZC5yYXcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gW2dlbigyKSwgZ2VuKDEpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDMpXS5qb2luKFwiLVwiKTtcbiAgfTtcblxuICBpZih0eXBlb2YgbW9kdWxlICE9ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBHdWlkO1xuICB9XG4gIGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB3aW5kb3cuR3VpZCA9IEd1aWQ7XG4gIH1cbn0pKCk7XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBfZGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlsczogQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscykge1xuICAgIHN1cGVyKENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZExheW91dENoYW5nZURldGFpbHMoKTogQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZExheW91dENoYW5nZURldGFpbHM7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVGFibGVhdVdvcmtzaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1V29ya3NoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgRmlsdGVyQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdVdvcmtzaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRmlsdGVyQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0LCBwcml2YXRlIF9maWVsZE5hbWU6IHN0cmluZywgcHJpdmF0ZSBfZmllbGRJZD86IHN0cmluZykge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuRmlsdGVyQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZElkO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlckFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuRmlsdGVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldC5nZXRGaWx0ZXJzQXN5bmMoKS50aGVuPENvbnRyYWN0LkZpbHRlcj4oKGZpbHRlcnMpID0+IHtcbiAgICAgIC8vIFRPRE86IEZpbHRlcmluZyBvZiB0aGUgZmlsdGVycyBzaG91bGQgZXZlbnR1YWxseSBiZSBkb25lIHBsYXRmb3JtIHNpZGUuXG4gICAgICBjb25zdCBldmVudGVkRmlsdGVyID0gdGhpcy5maWVsZElkXG4gICAgICAgID8gZmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlci5maWVsZElkID09PSB0aGlzLmZpZWxkSWQsIHRoaXMpXG4gICAgICAgIDogZmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlci5maWVsZE5hbWUgPT09IHRoaXMuZmllbGROYW1lLCB0aGlzKTtcblxuICAgICAgaWYgKCFldmVudGVkRmlsdGVyKSB7XG4gICAgICAgIC8vIFdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGZpbHRlciB3YXMgcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXRcbiAgICAgICAgLy8gYWZ0ZXIgdGhlIGV2ZW50IHdhcyByYWlzZWQuXG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5NaXNzaW5nRmlsdGVyLCBgY2Fubm90IGZpbmQgZmlsdGVyOiAke3RoaXMuX2ZpZWxkTmFtZX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV2ZW50ZWRGaWx0ZXI7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVdvcmtzaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIE1hcmtzU2VsZWN0ZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0Lk1hcmtzU2VsZWN0ZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih3b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCkge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuTWFya1NlbGVjdGlvbkNoYW5nZWQsIHdvcmtzaGVldCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLndvcmtzaGVldC5nZXRTZWxlY3RlZE1hcmtzQXN5bmMoKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9yQ29kZXMsIFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBQYXJhbWV0ZXJzU2VydmljZSwgU2VydmljZU5hbWVzLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFBhcmFtZXRlciB9IGZyb20gJy4uL01vZGVscy9QYXJhbWV0ZXInO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcbmltcG9ydCB7IFRhYmxlYXVTaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1U2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1U2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlBhcmFtZXRlckNoYW5nZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9nbG9iYWxGaWVsZE5hbWU6IHN0cmluZywgc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0KSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5QYXJhbWV0ZXJDaGFuZ2VkLCBzaGVldCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UGFyYW1ldGVyQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5QYXJhbWV0ZXI+IHtcbiAgICAvLyBDYWxsIGRvd24gdG8gb3VyIHNlcnZpY2UgdG8gZ2V0IHRoZSBwYXJhbWV0ZXIgYmFjayB2aWEgaXRzIGZpZWxkIG5hbWVcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBzZXJ2aWNlLmZpbmRQYXJhbWV0ZXJCeUdsb2JhbEZpZWxkTmFtZUFzeW5jKHRoaXMuX2dsb2JhbEZpZWxkTmFtZSkudGhlbigocGFyYW1ldGVySW1wbCkgPT4ge1xuICAgICAgaWYgKHBhcmFtZXRlckltcGwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuTWlzc2luZ1BhcmFtZXRlciwgYENhbm5vdCBmaW5kIHBhcmFtZXRlcjogJHt0aGlzLl9nbG9iYWxGaWVsZE5hbWV9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVyKHBhcmFtZXRlckltcGwsIHRoaXMuc2hlZXQpO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVXb3Jrc2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlN1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0KSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5TdW1tYXJ5RGF0YUNoYW5nZWQsIHdvcmtzaGVldCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIFRhYmxlYXVFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlRhYmxlYXVFdmVudCB7XG4gIHByaXZhdGUgX3R5cGU6IFRhYmxlYXVFdmVudFR5cGU7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IFRhYmxlYXVFdmVudFR5cGUpIHtcbiAgICB0aGlzLl90eXBlID0gdHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBUYWJsZWF1RXZlbnRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVhdVNoZWV0RXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZWF1U2hlZXRFdmVudCB7XG4gIHByaXZhdGUgX3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldDtcblxuICBwdWJsaWMgZ2V0IHNoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0IHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXQ7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0KSB7XG4gICAgc3VwZXIodHlwZSk7XG5cbiAgICB0aGlzLl9zaGVldCA9IHNoZWV0O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1U2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVNoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVhdVdvcmtzaGVldEV2ZW50IGV4dGVuZHMgVGFibGVhdVNoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZWF1V29ya3NoZWV0RXZlbnQge1xuICBwdWJsaWMgZ2V0IHdvcmtzaGVldCgpOiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXQ7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgcHJvdGVjdGVkIF93b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCkge1xuICAgIHN1cGVyKHR5cGUsIF93b3Jrc2hlZXQpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Zvcm1hdHRpbmc6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZykge1xuICAgIHN1cGVyKENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvcm1hdHRpbmcoKTogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVdvcmtzaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0LCBwcml2YXRlIF9mb3JtYXR0aW5nOiBDb250cmFjdC5Xb3Jrc2hlZXRGb3JtYXR0aW5nKSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGluZygpOiBDb250cmFjdC5Xb3Jrc2hlZXRGb3JtYXR0aW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lID0gJ0JlbnRvbiBTYW5zJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUgPSAnQmVudG9uIFNhbnMgTG93LURQSSc7XG5cbmV4cG9ydCBjb25zdCBCZW50b25TYW5zQm9va0ZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBCb29rJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBCb29rIEl0YWxpYyc7XG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc1NlbWlEZW1pRm9udEZhY2VOYW1lID0gJ0JlbnRvbiBTYW5zIFNlbWlEZW1pJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgU2VtaURlbWkgSXRhbGljJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zTGlnaHRGb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgTGlnaHQnO1xuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNNZWRpdW1Gb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgTWVkaXVtJztcblxuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXM6IE1vZGVsW10gPSBbXG4gIEJlbnRvblNhbnNCb29rRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc1NlbWlEZW1pRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc01lZGl1bUZvbnRGYWNlTmFtZSxcbl07XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgQ29ubmVjdGVkU2VydmVyIGltcGxlbWVudHMgQ29udHJhY3QuQ29ubmVjdGVkU2VydmVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBfdXNlcklkPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfc2l0ZUlkPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfc2l0ZU5hbWVzcGFjZT86IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX3dvcmtib29rSWQ/OiBzdHJpbmcsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IHVzZXJJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91c2VySWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpdGVJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zaXRlSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpdGVOYW1lc3BhY2UoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2l0ZU5hbWVzcGFjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya2Jvb2tJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93b3JrYm9va0lkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNjaGVtYSwgRGF0YVNvdXJjZSBhcyBEYXRhU291cmNlSW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIERhdGFTb3VyY2UsIERhdGFTb3VyY2VJbXBsLCBEYXRhU291cmNlU2VydmljZSwgU2VydmljZU5hbWVzLCBXb3JrYm9va0ltcGwgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25Xb3JrYm9va0ltcGwgZXh0ZW5kcyBXb3JrYm9va0ltcGwge1xuICBwdWJsaWMgZ2V0QWxsRGF0YVNvdXJjZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRBbGxEYXRhU291cmNlc0FzeW5jKCkudGhlbjxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4oKHJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYTogRGF0YVNjaGVtYSA9IHJlc3VsdDtcbiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzOiBBcnJheTxDb250cmFjdC5EYXRhU291cmNlPiA9IFtdO1xuXG4gICAgICAvLyBMb29wIHRocm91Z2ggYWxsIGRhdGEgc291cmNlcyBhbmQgYWRkIHRoZW0uXG4gICAgICBPYmplY3QudmFsdWVzKGRhdGFTY2hlbWEuZGF0YVNvdXJjZXMpLmZvckVhY2goKGRzKSA9PiB7XG4gICAgICAgIGRhdGFTb3VyY2VzLnB1c2godGhpcy5jcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZHMpKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZGF0YVNvdXJjZXM7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU291cmNlSW5mbzogRGF0YVNvdXJjZUluZm8pOiBEYXRhU291cmNlIHtcbiAgICBjb25zdCBkYXRhU291cmNlSW1wbCA9IG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlSW5mbywgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZShkYXRhU291cmNlSW1wbCk7XG4gICAgZGF0YVNvdXJjZUltcGwuaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKGRhdGFTb3VyY2UpO1xuICAgIHJldHVybiBkYXRhU291cmNlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzLCBTaGVldFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29udGV4dE1lbnVFdmVudCxcbiAgRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvcixcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4dGVuc2lvbkRhc2hib2FyZEluZm8sXG4gIEV4dGVuc2lvbkxvY2F0b3IsXG4gIEV4dGVuc2lvblNldHRpbmdzSW5mbyxcbiAgRXh0ZW5zaW9uV29ya3NoZWV0SW5mbyxcbiAgRm9udE5hbWVBbmRJbmZvLFxuICBGb3JtYXR0aW5nU2hlZXQsXG4gIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sXG4gIEluaXRpYWxpemF0aW9uT3B0aW9ucyxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5LFxuICBNb2RlbCxcbiAgTm90aWZpY2F0aW9uSWQsXG4gIFBhcmFtZXRlcklkLFxuICBTaGVldFBhdGgsXG4gIFZlcmJJZCxcbiAgV29ya2Jvb2tGb3JtYXR0aW5nLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBBcGlWZXJzaW9uLFxuICBEYXNoYm9hcmRJbXBsLFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNoZWV0SW5mb0ltcGwsXG4gIFRhYmxlYXVFcnJvcixcbiAgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBWaXpTZXJ2aWNlLFxuICBXb3Jrc2hlZXRJbXBsLFxuICBkb0Nyb3NzRnJhbWVCb290c3RyYXAsXG4gIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkIH0gZnJvbSAnLi4vTW9kZWxzL0Rhc2hib2FyZCc7XG5pbXBvcnQgeyBXb3JrYm9vayB9IGZyb20gJy4uL01vZGVscy9Xb3JrYm9vayc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuLi9Nb2RlbHMvV29ya3NoZWV0JztcbmltcG9ydCB7IERhc2hib2FyZENvbnRlbnQgfSBmcm9tICcuLi9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuLi9OYW1lc3BhY2VzL0Vudmlyb25tZW50JztcbmltcG9ydCB7IFNldHRpbmdzIH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9TZXR0aW5ncyc7XG5pbXBvcnQgeyBVSSB9IGZyb20gJy4uL05hbWVzcGFjZXMvVUknO1xuaW1wb3J0IHsgV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCB9IGZyb20gJy4uL05hbWVzcGFjZXMvV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRDb250ZW50IH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9Xb3Jrc2hlZXRDb250ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0luaXRpYWxpemF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcywgcmVnaXN0ZXJJbml0aWFsaXphdGlvbkV4dGVuc2lvbnNTZXJ2aWNlcyB9IGZyb20gJy4uL1NlcnZpY2VzL1JlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9VSVNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQmVudG9uU2Fuc0Jvb2tGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zRm9udEZhbWlseU5hbWUsXG4gIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLFxuICBCZW50b25TYW5zTWVkaXVtRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgU3VwcG9ydGVkQmVudG9uU2Fuc0ZvbnRGYWNlcyxcbn0gZnJvbSAnLi9CZW50b25TYW5zRm9udE5hbWVDb25zdGFudHMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsIH0gZnJvbSAnLi9FeHRlbnNpb25Xb3JrYm9va0ltcGwnO1xuaW1wb3J0IHsgTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIH0gZnJvbSAnLi9MZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXInO1xuaW1wb3J0IHsgU2V0dGluZ3NJbXBsIH0gZnJvbSAnLi9TZXR0aW5nc0ltcGwnO1xuaW1wb3J0IHtcbiAgU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlcyxcbiAgVGFibGVhdUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVCb2xkRm9udEZhbWlseU5hbWUsXG4gIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVMaWdodEZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhbWlseU5hbWUsXG4gIFRhYmxlYXVSZWd1bGFyRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLFxufSBmcm9tICcuL1RhYmxlYXVCb29rRm9udE5hbWVDb25zdGFudHMnO1xuaW1wb3J0IHsgVUlJbXBsIH0gZnJvbSAnLi9VSUltcGwnO1xuXG5leHBvcnQgdHlwZSBDYWxsYmFja01hcCA9IHsgW2tleTogc3RyaW5nXTogKCkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbnNJbXBsIHtcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6YXRpb25Qcm9taXNlOiBQcm9taXNlPHN0cmluZz47XG4gIHByaXZhdGUgX3N0eWxlRWxlbWVudDogSFRNTFN0eWxlRWxlbWVudDtcbiAgcHVibGljIGRhc2hib2FyZENvbnRlbnQ/OiBEYXNoYm9hcmRDb250ZW50O1xuICBwdWJsaWMgd29ya3NoZWV0Q29udGVudD86IFdvcmtzaGVldENvbnRlbnQ7XG4gIHB1YmxpYyBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XG4gIHB1YmxpYyBzZXR0aW5nczogU2V0dGluZ3M7XG4gIHB1YmxpYyB1aTogVUk7XG4gIHB1YmxpYyB3b3JrYm9vazogV29ya2Jvb2s7XG4gIHB1YmxpYyBleHRlbnNpb25ab25lSWQ6IG51bWJlcjtcblxuICBwdWJsaWMgaW5pdGlhbGl6ZUFzeW5jKGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuLCBjb250ZXh0TWVudUNhbGxiYWNrcz86IENhbGxiYWNrTWFwKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZSkge1xuICAgICAgdGhpcy5faW5pdGlhbGl6YXRpb25Qcm9taXNlID0gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluaXRPcHRpb25zOiBJbml0aWFsaXphdGlvbk9wdGlvbnMgPSB7IGlzQWxwaGE6IEFwaVZlcnNpb24uSW5zdGFuY2UuaXNBbHBoYSB9O1xuICAgICAgICAvLyBGaXJzdCB0aGluZyB3ZSB3YW50IHRvIGRvIGlzIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIGRlc2t0b3AgZGlzcGF0Y2hlciBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHVzXG4gICAgICAgIGlmIChMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIuaGFzRGVza3RvcEFwaURpc3BhdGNoZXJQcm9taXNlKGluaXRPcHRpb25zKSkge1xuICAgICAgICAgIC8vIFJ1bm5pbmcgaW4gYSBwcmUtMjAxOS4zIGRlc2t0b3AsIHVzZSBvdXIgbGVnYWN5IGRpc3BhdGNoZXIgcHJvbWlzZVxuICAgICAgICAgIGNvbnN0IGRlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZSA9IExlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlci5nZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2UoaW5pdE9wdGlvbnMpO1xuICAgICAgICAgIGRlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZVxuICAgICAgICAgICAgPy50aGVuKChkaXNwYXRjaGVyRmFjdG9yeSkgPT4gdGhpcy5vbkRpc3BhdGNoZXJSZWNlaXZlZChkaXNwYXRjaGVyRmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKSlcbiAgICAgICAgICAgIC50aGVuKChvcGVuUGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKG9wZW5QYXlsb2FkKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXZSBtdXN0IGJlIHJ1bm5pbmcgaW4gc2VydmVyLCBzbyB3ZSBzaG91bGQgdHJ5IHRvIGtpY2sgb2YgdGhlIHNlcnZlciBkaXNwYXRjaGVyIGJvb3RzdHJhcHBpbmdcbiAgICAgICAgICBjb25zdCBvbkRpc3BhdGNoZXJSZWNlaXZlZENhbGxiYWNrID0gdGhpcy5vbkRpc3BhdGNoZXJSZWNlaXZlZC5iaW5kKHRoaXMpO1xuICAgICAgICAgIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcCh3aW5kb3csIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIGluaXRPcHRpb25zKVxuICAgICAgICAgICAgLnRoZW4oKGZhY3Rvcnk6IEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9uRGlzcGF0Y2hlclJlY2VpdmVkQ2FsbGJhY2soZmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigob3BlblBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShvcGVuUGF5bG9hZCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgdml6U2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Vml6U2VydmljZT4oU2VydmljZU5hbWVzLlZpeik7XG5cbiAgICByZXR1cm4gdml6U2VydmljZS5jcmVhdGVWaXpJbWFnZUFzeW5jKGlucHV0U3BlYyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVpU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VUlTZXJ2aWNlPihFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZSk7XG5cbiAgICByZXR1cm4gdWlTZXJ2aWNlLnNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQsIHRoaXMuZXh0ZW5zaW9uWm9uZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yKGxvY2F0b3I6IEV4dGVuc2lvbkxvY2F0b3IpOiBsb2NhdG9yIGlzIERhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3Ige1xuICAgIGNvbnN0IGRhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3IgPSBsb2NhdG9yIGFzIERhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3I7XG4gICAgaWYgKCFkYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yLmRhc2hib2FyZFBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgaW5pdGlhbGl6YXRpb24uJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRpc3BhdGNoZXJSZWNlaXZlZChcbiAgICBkaXNwYXRjaGVyRmFjdG9yeTogSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSxcbiAgICBpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbixcbiAgICBjb250ZXh0TWVudUZ1bmN0aW9ucz86IENhbGxiYWNrTWFwLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIgPSBkaXNwYXRjaGVyRmFjdG9yeShJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OKTtcblxuICAgIC8vIENhbGwgdG8gcmVnaXN0ZXIgYWxsIHRoZSBzZXJ2aWNlcyB3aGljaCB3aWxsIHVzZSB0aGUgbmV3bHkgaW5pdGlhbGl6ZWQgZGlzcGF0Y2hlclxuICAgIHJlZ2lzdGVySW5pdGlhbGl6YXRpb25FeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcik7XG5cbiAgICAvLyBHZXQgdGhlIGluaXRpYWxpemF0aW9uIHNlcnZpY2UgYW5kIGluaXRpYWxpemUgdGhpcyBleHRlbnNpb25cbiAgICBjb25zdCBpbml0aWFsaXphdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEluaXRpYWxpemF0aW9uU2VydmljZT4oXG4gICAgICBFeHRlbnNpb25zU2VydmljZU5hbWVzLkluaXRpYWxpemF0aW9uU2VydmljZSxcbiAgICApO1xuXG4gICAgY29uc3QgY2FsbGJhY2tNYXBLZXlzID0gY29udGV4dE1lbnVGdW5jdGlvbnMgPyBPYmplY3Qua2V5cyhjb250ZXh0TWVudUZ1bmN0aW9ucykgOiBbXTtcbiAgICByZXR1cm4gaW5pdGlhbGl6YXRpb25TZXJ2aWNlLmluaXRpYWxpemVEYXNoYm9hcmRFeHRlbnNpb25zQXN5bmMoaXNFeHRlbnNpb25EaWFsb2csIGNhbGxiYWNrTWFwS2V5cykudGhlbjxzdHJpbmc+KChyZXN1bHQpID0+IHtcbiAgICAgIC8vIElmIHdlIHJlY2VpdmUgYW4gaW52YWxpZCBwbGFmb3JtIHZlcnNpb24sIHRoaXMgbWVhbnMgdGhhdCBwbGF0Zm9ybSBpcyBydW5ubmluZyAxLjQgb3IgMi4xIGFuZFxuICAgICAgLy8gZG9lc24ndCBwYXNzIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIHRvIGV4dGVybmFsLiBJbiB0aGlzIGNhc2Ugd2UgYXNzdW1lIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIHRvIGJlIDEuOVxuICAgICAgY29uc3QgcGxhdGZvcm1WZXJzaW9uID0gcmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50LnBsYXRmb3JtVmVyc2lvblxuICAgICAgICA/IHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC5wbGF0Zm9ybVZlcnNpb25cbiAgICAgICAgOiB7IG1ham9yOiAxLCBtaW5vcjogOSwgZml4OiAwIH07XG5cbiAgICAgIC8vIFdyYXAgb3VyIGV4aXN0aW5nIGRpc3BhdGNoZXIgaW4gYSBkaXNwYXRjaGVyIHRoYXQgY2FuIGRvd25ncmFkZS91cGdyYWRlIGZvciBhbiBvbGRlciBwbGF0Zm9ybS5cbiAgICAgIGlmIChWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIubmVlZHNWZXJzaW9uQ29udmVydGVyKHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICAgICAgZGlzcGF0Y2hlciA9IG5ldyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIoZGlzcGF0Y2hlciwgcGxhdGZvcm1WZXJzaW9uKTtcbiAgICAgIH1cbiAgICAgIC8vIFJlZ2lzdHJhdGlvbiBvZiBzZXJ2aWNlcyBtdXN0IGhhcHBlbiBiZWZvcmUgaW5pdGlhbGl6aW5nIGNvbnRlbnQgYW5kIGVudmlyb25tZW50XG4gICAgICAvLyBFeHRlbnNpb25zIGRvZXNuJ3QgbmVlZCB0byBwYXNzIGluIGEgcmVnaXN0cnlJZC4gQnkgZGVmYXVsdCwgdGhlIHNlcnZpY2UgcmVnaXN0cnkgaW5zdGFuY2UgaXMgYXNzb2NpYXRlZCB3aXRoIHJlZ2lzdHJ5SWQ9MC5cbiAgICAgIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMoZGlzcGF0Y2hlciwgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpO1xuICAgICAgcmVnaXN0ZXJBbGxFeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcik7XG5cbiAgICAgIGlmIChyZXN1bHQuZXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyAmJiB0aGlzLmlzRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvcihyZXN1bHQuZXh0ZW5zaW9uSW5zdGFuY2UubG9jYXRvcikpIHtcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRDb250ZW50ID0gdGhpcy5pbml0aWFsaXplRGFzaGJvYXJkQ29udGVudChcbiAgICAgICAgICByZXN1bHQuZXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyxcbiAgICAgICAgICByZXN1bHQuZXh0ZW5zaW9uSW5zdGFuY2UubG9jYXRvci5kYXNoYm9hcmRQYXRoLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmV4dGVuc2lvblpvbmVJZCA9IHJlc3VsdC5leHRlbnNpb25EYXNoYm9hcmRJbmZvLmV4dGVuc2lvblpvbmVJZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC5leHRlbnNpb25Xb3Jrc2hlZXRJbmZvKSB7XG4gICAgICAgIHRoaXMud29ya3NoZWV0Q29udGVudCA9IHRoaXMuaW5pdGlhbGl6ZVdvcmtzaGVldENvbnRlbnQocmVzdWx0LmV4dGVuc2lvbldvcmtzaGVldEluZm8pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVudmlyb25tZW50ID0gbmV3IEVudmlyb25tZW50KHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudCk7XG4gICAgICB0aGlzLnNldHRpbmdzID0gdGhpcy5pbml0aWFsaXplU2V0dGluZ3MocmVzdWx0LmV4dGVuc2lvblNldHRpbmdzSW5mbyk7XG4gICAgICB0aGlzLnVpID0gbmV3IFVJKG5ldyBVSUltcGwoKSk7XG4gICAgICB0aGlzLndvcmtib29rID0gbmV3IFdvcmtib29rKG5ldyBFeHRlbnNpb25Xb3JrYm9va0ltcGwoKSk7XG5cbiAgICAgIGlmIChyZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tGb3JtYXR0aW5nKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRhYmxlYXVGb250cyhkaXNwYXRjaGVyLCByZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tGb3JtYXR0aW5nKTtcbiAgICAgICAgdGhpcy5hcHBseUFsbEZvcm1hdHRpbmcocmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50Lndvcmtib29rRm9ybWF0dGluZyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFmdGVyIGluaXRpYWxpemF0aW9uIGhhcyBjb21wbGV0ZWQsIHNldHVwIGxpc3RlbmVycyBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyB0aGF0XG4gICAgICAvLyBhcmUgbWVhbnQgdG8gYmUgdHJpZ2dlcmVkIHdoZW5ldmVyIGEgY29udGV4dCBtZW51IGl0ZW0gaXMgY2xpY2tlZC5cbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvbnRleHRNZW51Q2FsbGJhY2tzKGNvbnRleHRNZW51RnVuY3Rpb25zKTtcblxuICAgICAgLy8gQWxzbyBzZXQgdXAgbGlzdGVuZXJzIGZvciBFeHRlbnNpb25TdHlsZXNDaGFuZ2VkRXZlbnRcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudENhbGxiYWNrKGRpc3BhdGNoZXIpO1xuXG4gICAgICAvLyBJbiB0aGUgbm9ybWFsIGluaXRpYWxpemF0aW9uIGNhc2UsIHRoaXMgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuICBXaGVuIHJldHVybmluZyBmcm9tIGluaXRpYWxpemVBc3luYyB0byB0aGVcbiAgICAgIC8vIGRldmVsb3Blciwgd2UganVzdCBpbmdvcmUgdGhhdCBzdHJpbmcuICBJbiB0aGUgY2FzZSBvZiBpbml0aWFsaXppbmcgZnJvbSBhbiBleHRlbnNpb24gZGlhbG9nLCB0aGlzIHN0cmluZ1xuICAgICAgLy8gaXMgYW4gb3B0aW9uYWwgcGF5bG9hZCBzZW50IGZyb20gdGhlIHBhcmVudCBleHRlbnNpb24uXG4gICAgICByZXR1cm4gcmVzdWx0LmV4dGVuc2lvbkRpYWxvZ1BheWxvYWQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlBbGxGb3JtYXR0aW5nKGZvcm1hdHRpbmdNb2RlbDogV29ya2Jvb2tGb3JtYXR0aW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHlsZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX3N0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICB0aGlzLl9zdHlsZUVsZW1lbnQuaWQgPSAnVGFibGVhdS1FeHRlbnNpb24tRm9ybWF0dGluZyc7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRoaXMuX3N0eWxlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9zdHlsZUVsZW1lbnQuc2hlZXQgfHwgIWZvcm1hdHRpbmdNb2RlbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0eWxlc2hlZXQ6IENTU1N0eWxlU2hlZXQgPSB0aGlzLl9zdHlsZUVsZW1lbnQuc2hlZXQgYXMgQ1NTU3R5bGVTaGVldDtcbiAgICB3aGlsZSAoc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBzdHlsZXNoZWV0LmRlbGV0ZVJ1bGUoc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgZm9ybWF0dGluZ01vZGVsLmZvcm1hdHRpbmdTaGVldHMubWFwKChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0KSA9PiB7XG4gICAgICB0aGlzLmFwcGx5Rm9ybWF0dGluZ1NoZWV0VG9TdHlsZVNoZWV0KGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQsIHN0eWxlc2hlZXQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUZvcm1hdHRpbmdTaGVldFRvU3R5bGVTaGVldChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0OiBGb3JtYXR0aW5nU2hlZXQsIHN0eWxlc2hlZXQ6IENTU1N0eWxlU2hlZXQpOiB2b2lkIHtcbiAgICBsZXQgc3R5bGVJbmZvID0gJyc7XG5cbiAgICBjb25zdCBjc3NQcm9wZXJ0aWVzID0gY3VycmVudEZvcm1hdHRpbmdTaGVldC5jc3NQcm9wZXJ0aWVzO1xuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmZvbnRGYW1pbHkpIHtcbiAgICAgIHN0eWxlSW5mbyArPSAnZm9udC1mYW1pbHk6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRGYW1pbHkudG9TdHJpbmcoKSArICc7ICc7XG4gICAgfVxuXG4gICAgaWYgKGNzc1Byb3BlcnRpZXMuZm9udFNpemUpIHtcbiAgICAgIHN0eWxlSW5mbyArPSAnZm9udC1zaXplOiAnICsgY3NzUHJvcGVydGllcy5mb250U2l6ZS50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy5mb250V2VpZ2h0KSB7XG4gICAgICBzdHlsZUluZm8gKz0gJ2ZvbnQtd2VpZ2h0OiAnICsgY3NzUHJvcGVydGllcy5mb250V2VpZ2h0LnRvU3RyaW5nKCkgKyAnOyAnO1xuICAgIH1cblxuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmZvbnRTdHlsZSkge1xuICAgICAgc3R5bGVJbmZvICs9ICdmb250LXN0eWxlOiAnICsgY3NzUHJvcGVydGllcy5mb250U3R5bGUudG9TdHJpbmcoKSArICc7ICc7XG4gICAgfVxuXG4gICAgaWYgKGNzc1Byb3BlcnRpZXMudGV4dERlY29yYXRpb24pIHtcbiAgICAgIHN0eWxlSW5mbyArPSAndGV4dC1kZWNvcmF0aW9uOiAnICsgY3NzUHJvcGVydGllcy50ZXh0RGVjb3JhdGlvbi50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy5jb2xvcikge1xuICAgICAgc3R5bGVJbmZvICs9ICdjb2xvcjogJyArIGNzc1Byb3BlcnRpZXMuY29sb3IgKyAnOyAnO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdG9yOiBzdHJpbmcgPSAnLicgKyBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNsYXNzTmFtZUtleTtcbiAgICBjb25zdCBydWxlOiBzdHJpbmcgPSBzZWxlY3RvciArICcgeyAnICsgc3R5bGVJbmZvICsgJyB9JztcbiAgICBzdHlsZXNoZWV0Lmluc2VydFJ1bGUocnVsZSwgc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50Q2FsbGJhY2soZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyKTogdm9pZCB7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oXG4gICAgICBTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uLFxuICAgICk7XG4gICAgLy8gVW5yZWdpc3RlciBmdW5jdGlvbiBub3QgdXNlZCBzaW5jZSB0aGVzZSBub3RpZmljYXRpb25zIHNob3VsZCBiZVxuICAgIC8vIG9ic2VydmVkIGZvciB0aGUgZnVsbCBsaWZldGltZSBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCxcbiAgICAgICgpID0+IHRydWUsXG4gICAgICAoZXZlbnRGb3JtYXR0aW5nOiBXb3JrYm9va0Zvcm1hdHRpbmcpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50Rm9ybWF0dGluZykge1xuICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRhYmxlYXVGb250cyhkaXNwYXRjaGVyLCBldmVudEZvcm1hdHRpbmcpO1xuICAgICAgICAgIHRoaXMuYXBwbHlBbGxGb3JtYXR0aW5nKGV2ZW50Rm9ybWF0dGluZyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVRhYmxlYXVGb250cyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIHdvcmtib29rRm9ybWF0dGluZzogV29ya2Jvb2tGb3JtYXR0aW5nKTogdm9pZCB7XG4gICAgY29uc3QgZm9udE5hbWVzOiBNb2RlbFtdID0gWy4uLlN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXMsIC4uLlN1cHBvcnRlZFRhYmxlYXVGb250RmFjZXNdO1xuICAgIHdvcmtib29rRm9ybWF0dGluZy5mb3JtYXR0aW5nU2hlZXRzLmZvckVhY2goKGZvcm1hdHRpbmdTaGVldCkgPT4ge1xuICAgICAgaWYgKGZvcm1hdHRpbmdTaGVldC5jc3NQcm9wZXJ0aWVzLmZvbnRGYW1pbHkpIHtcbiAgICAgICAgZm9udE5hbWVzLnB1c2goZm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZm9udE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0geyBbUGFyYW1ldGVySWQuRm9udE5hbWVMaXN0SXRlbXNdOiBmb250TmFtZXMgfTtcbiAgICAgIGRpc3BhdGNoZXJcbiAgICAgICAgLmV4ZWN1dGUoVmVyYklkLkdldEZvbnRzLCBwYXJhbWV0ZXJzKVxuICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRGb250cyhyZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8Rm9udE5hbWVBbmRJbmZvPik7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZEZvbnRzKGZvbnRzOiBBcnJheTxGb250TmFtZUFuZEluZm8+KTogdm9pZCB7XG4gICAgZm9udHMuZm9yRWFjaCgoZm9udE5hbWVBbmRJbmZvKSA9PiB7XG4gICAgICBpZiAoU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlcy5pbmNsdWRlcyhmb250TmFtZUFuZEluZm8uZm9udE5hbWUpKSB7XG4gICAgICAgIHRoaXMubG9hZFRhYmxlYXVGb250cyhmb250TmFtZUFuZEluZm8pO1xuICAgICAgfSBlbHNlIGlmIChTdXBwb3J0ZWRCZW50b25TYW5zRm9udEZhY2VzLmluY2x1ZGVzKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSkpIHtcbiAgICAgICAgdGhpcy5sb2FkQmVudG9uU2Fuc0ZvbnRzKGZvbnROYW1lQW5kSW5mbyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVEYXNoYm9hcmRDb250ZW50KGluZm86IEV4dGVuc2lvbkRhc2hib2FyZEluZm8sIHNoZWV0UGF0aDogU2hlZXRQYXRoKTogRGFzaGJvYXJkQ29udGVudCB7XG4gICAgLy8gc2hlZXRzIGFyZSBhbHdheXMgYWN0aXZlIGZvciBFeHRlbnNpb25zXG4gICAgY29uc3Qgc2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKGluZm8ubmFtZSwgU2hlZXRUeXBlLkRhc2hib2FyZCwgeyB3aWR0aDogaW5mby5zaXplLncsIGhlaWdodDogaW5mby5zaXplLmggfSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICBjb25zdCBkYXNoYm9hcmRJbXBsID0gbmV3IERhc2hib2FyZEltcGwoc2hlZXRJbmZvSW1wbCwgaW5mby56b25lcywgc2hlZXRQYXRoLCBFeHRlbnNpb25zUmVnaXN0cnlJZCwgbnVsbCwgaW5mby5hY3RpdmVEYXNoYm9hcmRPYmplY3RJZCk7XG4gICAgY29uc3QgZGFzaGJvYXJkID0gbmV3IERhc2hib2FyZChkYXNoYm9hcmRJbXBsKTtcbiAgICByZXR1cm4gbmV3IERhc2hib2FyZENvbnRlbnQoZGFzaGJvYXJkKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVdvcmtzaGVldENvbnRlbnQoaW5mbzogRXh0ZW5zaW9uV29ya3NoZWV0SW5mbyk6IFdvcmtzaGVldENvbnRlbnQge1xuICAgIGNvbnN0IHNoZWV0SW5mb0ltcGwgPSBuZXcgU2hlZXRJbmZvSW1wbChcbiAgICAgIGluZm8udmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgU2hlZXRUeXBlLldvcmtzaGVldCxcbiAgICAgIHsgd2lkdGg6IGluZm8uc2l6ZS53LCBoZWlnaHQ6IGluZm8uc2l6ZS5oIH0sXG4gICAgICB1bmRlZmluZWQsIC8vIGluZGV4IHByb3BlcnR5IGlzIGVtYmVkZGluZyBzcGVjaWZpY1xuICAgICAgdHJ1ZSwgLy8gc2hlZXRzIGFyZSBhbHdheXMgYWN0aXZlIGZvciBFeHRlbnNpb25zXG4gICAgKTtcblxuICAgIGNvbnN0IHdvcmtzaGVldEltcGwgPSBuZXcgV29ya3NoZWV0SW1wbChcbiAgICAgIHNoZWV0SW5mb0ltcGwsXG4gICAgICBFeHRlbnNpb25zUmVnaXN0cnlJZCxcbiAgICAgIGluZm8udmlzdWFsSWQsXG4gICAgICBudWxsLCAvLyBwYXJlbnREYXNoYm9hcmQgaXMgYWx3YXlzIG51bGwgZm9yIHdvcmtzaGVldCBpbiBXb3Jrc2hlZXRDb250ZW50XG4gICAgICBudWxsLCAvLyBwYXJlbnRTdG9yeVBvaW50IGlzIG9ubHkgdXNlZCBmb3IgZW1iZWRkaW5nXG4gICAgICBpbmZvLmJhY2tncm91bmRDb2xvcixcbiAgICAgIFdvcmtib29rRm9ybWF0dGluZ0VudlV0aWwuY29udmVydFRvV29ya2Jvb2tGb3JtYXR0aW5nKGluZm8uZm9ybWF0dGluZyksXG4gICAgKTtcbiAgICBjb25zdCB3b3Jrc2hlZXQgPSBuZXcgV29ya3NoZWV0KHdvcmtzaGVldEltcGwpO1xuICAgIHJldHVybiBuZXcgV29ya3NoZWV0Q29udGVudCh3b3Jrc2hlZXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU2V0dGluZ3Moc2V0dGluZ3NJbmZvOiBFeHRlbnNpb25TZXR0aW5nc0luZm8pOiBTZXR0aW5ncyB7XG4gICAgY29uc3Qgc2V0dGluZ3NJbXBsID0gbmV3IFNldHRpbmdzSW1wbChzZXR0aW5nc0luZm8pO1xuICAgIHJldHVybiBuZXcgU2V0dGluZ3Moc2V0dGluZ3NJbXBsKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbnRleHRNZW51Q2FsbGJhY2tzKGNvbnRleHRNZW51RnVuY3Rpb25zPzogQ2FsbGJhY2tNYXApOiB2b2lkIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24sXG4gICAgKTtcblxuICAgIC8vIFVucmVnaXN0ZXIgZnVuY3Rpb24gbm90IHVzZWQgc2luY2UgdGhlc2Ugbm90aWZpY2F0aW9ucyBzaG91bGQgYmVcbiAgICAvLyBvYnNlcnZlZCBmb3IgdGhlIGZ1bGwgbGlmZXRpbWUgb2YgdGhlIGV4dGVuc2lvbi5cbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkNvbnRleHRNZW51Q2xpY2ssXG4gICAgICAoKSA9PiB7XG4gICAgICAgIC8vIExldCB0aHJvdWdoIGFueSBjb250ZXh0IG1lbnUgZXZlbnQsIHRoZXNlIGFyZSBhbHJlYWR5IGZpbHRlcmVkIG9uIGFwaS1jb3JlXG4gICAgICAgIC8vIGJhc2VkIG9uIHRoZSBleHRlbnNpb24gbG9jYXRvci5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgICAgKGV2ZW50OiBDb250ZXh0TWVudUV2ZW50KSA9PiB7XG4gICAgICAgIC8vIEV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQgbWVudSBJRFxuICAgICAgICBpZiAoY29udGV4dE1lbnVGdW5jdGlvbnMpIHtcbiAgICAgICAgICBpZiAoIWNvbnRleHRNZW51RnVuY3Rpb25zW2V2ZW50LmlkXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBSZWNlaXZlZCB1bmV4cGVjdGVkIGNvbnRleHQgbWVudSBJZCBmcm9tIGV2ZW50OiAke2V2ZW50LmlkfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHRNZW51RnVuY3Rpb25zW2V2ZW50LmlkXSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRUYWJsZWF1Rm9udHMoZm9udE5hbWVBbmRJbmZvOiBGb250TmFtZUFuZEluZm8pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSkge1xuICAgICAgY2FzZSBUYWJsZWF1Qm9va0ZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdUxpZ2h0Rm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVMaWdodEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdVJlZ3VsYXJGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoVGFibGVhdVJlZ3VsYXJGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdVNlbWlCb2xkRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVSZWd1bGFyRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdUJvbGRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUJvbGRGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUJvbGRGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVNZWRpdW1Gb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdU1lZGl1bUZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShUYWJsZWF1TWVkaXVtRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUxpZ2h0Rm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYCdhdHRlbXB0ZWQgdG8gbG9hZCB1bnN1cHBvcnRlZCBmb250OiAke2ZvbnROYW1lQW5kSW5mby5mb250TmFtZX0uJ2ApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZEJlbnRvblNhbnNGb250cyhmb250TmFtZUFuZEluZm86IEZvbnROYW1lQW5kSW5mbyk6IHZvaWQge1xuICAgIHN3aXRjaCAoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lKSB7XG4gICAgICBjYXNlIEJlbnRvblNhbnNCb29rRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKEJlbnRvblNhbnNGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnMTAwJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zTGlnaHRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnMTAwJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQmVudG9uU2Fuc01lZGl1bUZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyBzdHlsZTogJ2l0YWxpYycgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgc3R5bGU6ICdpdGFsaWMnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJ2F0dGVtcHRlZCB0byBsb2FkIHVuc3VwcG9ydGVkIGZvbnQ6ICR7Zm9udE5hbWVBbmRJbmZvLmZvbnROYW1lfS4nYCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBJbml0aWFsaXphdGlvbk9wdGlvbnMsIEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnksIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIGhhcyBiZWVuIG1vdmVkIChhbmQgcmVuYW1lZCkgZnJvbSBhcGktaW50ZXJuYWwtY29udHJhY3QuXG4gKiBJdCBzdXBwb3J0cyBydW5uaW5nIGEgbmV3ZXIgZXh0ZXJuYWwgbGlicmFyeSBhZ2FpbnN0IGEgcHJlIDIwMTkuMyBkZXNrdG9wLlxuICogU3RhcnRpbmcgaW4gMjAxOS4zLCB3ZSBoYXZlIGEgbWVyZ2VkIGJvb3RzdHJhcCBzdHlsZSBmb3IgYm90aCBkZXNrdG9wIGFuZCBzZXJ2ZXIuXG4gKiBJbiBhZGRpdGlvbiwgdGhlIGFscGhhIGNoZWNraW5nIHRoYXQgaXMgaGFwcGVuaW5nIGhlcmUgaXMgbm90IG5lY2Vzc2FyeSBpbiBleHRlcm5hbC1hcGktanNcbiAqICBhZnRlciAyMDE5LjMgYmVjYXVzZSB0aGF0IGNoZWNraW5nIGhhcHBlbnMgaW4gYXBpLXBsYXRmb3JtLWpzIChBcGlEaXNwYXRjaGVyVGVzdC50cylcbiAqIFRGU0lEOiAxMDkxNTYxIHRyYWNrcyBhbiBpbXByb3ZlbWVudCB0byB0aGlzIHN5c3RlbSB0byBtYWtlIGl0IGxlc3MgY29tcGxleCBhbmQgdGllIGl0IGRpcmVjdGx5IHRvXG4gKiAgdGFibGVhdSBiZXRhIHJlbGVhc2UgdmVyc2lvbnMuXG4gKiBAZGVwcmVjYXRlZFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZVxuZXhwb3J0IG5hbWVzcGFjZSBMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIge1xuICAvKipcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2Uob3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucyk6IFByb21pc2U8SW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeT4gfCB1bmRlZmluZWQge1xuICAgIGlmICgoIW9wdGlvbnMgfHwgdHlwZW9mIG9wdGlvbnMuaXNBbHBoYSA9PT0gJ3VuZGVmaW5lZCcpICYmICF3aW5kb3cuX193YXJuaW5nSXNzdWVkKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKCdUaGlzIGlzIGEgYmV0YSB2ZXJzaW9uIG9mIHRoZSBFeHRlbnNpb25zIEFQSS4gUGxlYXNlIHVwZ3JhZGUgdG8gYW4gb2ZmaWNpYWwgcmVsZWFzZS4nKTtcbiAgICAgIHdpbmRvdy5fX3dhcm5pbmdJc3N1ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uaXNBbHBoYSAmJiB3aW5kb3cuX19wbGF0Zm9ybUlzT2ZmaWNpYWxSZWxlYXNlKSB7XG4gICAgICB3aW5kb3cuX190YWJsZWF1RGVza3RvcERpc3BhdGNoZXJcbiAgICAgICAgLnRoZW4oKGRpc3BhdGNoZXJGYWN0b3J5KSA9PiB7XG4gICAgICAgICAgY29uc3QgZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXJGYWN0b3J5KElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04pO1xuICAgICAgICAgIGRpc3BhdGNoZXIuZXhlY3V0ZShWZXJiSWQuQmxvY2tFeHRlbnNpb24sIHt9KS5jYXRjaCgpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIHdpbGwgYmUgdW5kZWZpbmVkIGlmIHByb21pc2UgaXMgcmVqZWN0ZWQgb3IgdGhyb3dzXG4gICAgcmV0dXJuIHdpbmRvdy5fX3RhYmxlYXVEZXNrdG9wRGlzcGF0Y2hlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGhhc0Rlc2t0b3BBcGlEaXNwYXRjaGVyUHJvbWlzZShvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhZ2V0RGVza3RvcERpc3BhdGNoZXJQcm9taXNlKG9wdGlvbnMpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgX190YWJsZWF1RGVza3RvcERpc3BhdGNoZXI6IFByb21pc2U8SW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeT47XG4gICAgX19wbGF0Zm9ybUlzT2ZmaWNpYWxSZWxlYXNlOiBib29sZWFuO1xuICAgIF9fd2FybmluZ0lzc3VlZDogYm9vbGVhbjtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVuc2lvblNldHRpbmdzSW5mbywgTm90aWZpY2F0aW9uSWQsIFNldHRpbmdzRXZlbnQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBFcnJvckhlbHBlcnMsXG4gIE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gIFNlcnZpY2VOYW1lcyxcbiAgU2luZ2xlRXZlbnRNYW5hZ2VyLFxuICBTaW5nbGVFdmVudE1hbmFnZXJJbXBsLFxuICBUYWJsZWF1RXJyb3IsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL1RhYmxlYXVFdmVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuaW1wb3J0IHsgU2V0dGluZ3NDb2xsZWN0aW9uLCBTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXR0aW5nc1NlcnZpY2UnO1xuXG5jbGFzcyBTZXR0aW5nc0NoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlNldHRpbmdzQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX25ld1NldHRpbmdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5TZXR0aW5nc0NoYW5nZWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBuZXdTZXR0aW5ncygpOiBTZXR0aW5nc0NvbGxlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9uZXdTZXR0aW5ncztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NJbXBsIHtcbiAgcHJpdmF0ZSBzdGF0aWMgQVNZTkNfU0FWRV9JTl9QUk9HUkVTUyA9ICdBc3luYyBTYXZlIGlzIGluIHByb2dyZXNzLCB1cGRhdGluZyBzZXR0aW5ncyBpcyBub3QgYWxsb3dlZC4nO1xuICBwcml2YXRlIF9pc01vZGlmaWVkOiBib29sZWFuO1xuICBwcml2YXRlIF9jdXJyZW50U2V0dGluZ3M6IFNldHRpbmdzQ29sbGVjdGlvbjtcblxuICAvLyBTaW5jZSBwcm9taXNlcyBjYW4ndCBiZSBpbnRyb3NwZWN0ZWQgZm9yIHN0YXRlLCBrZWVwIGEgdmFyaWFibGUgdGhhdFxuICAvLyBpbmRpY2F0ZXMgYSBzYXZlIGlzIGluIHByb2dyZXNzLCBzbyB0aGF0IHNldC9lcmFzZSBjYW4ndCBiZSBjYWxsZWQgZHVyaW5nIGEgc2F2ZS5cbiAgcHJpdmF0ZSBfc2F2ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc2V0dGluZ3NJbmZvOiBFeHRlbnNpb25TZXR0aW5nc0luZm8pIHtcbiAgICB0aGlzLmluaXRpYWxpemVTZXR0aW5ncyhzZXR0aW5nc0luZm8pO1xuICB9XG5cbiAgcHVibGljIGVyYXNlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihrZXksICdrZXknKTtcblxuICAgIC8vIE9ubHkgbWFrZSBhIG1vZGlmaWNhdGlvbiBpZiB3ZSBoYXZlIHRoZSBrZXkgYWxyZWFkeVxuICAgIGlmICh0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XSkge1xuICAgICAgdGhpcy52ZXJpZnlTZXR0aW5nc0FyZVVubG9ja2VkKCk7XG5cbiAgICAgIGRlbGV0ZSB0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XTtcbiAgICAgIHRoaXMuX2lzTW9kaWZpZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoa2V5LCAna2V5Jyk7XG5cbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFNldHRpbmdzW2tleV07XG4gIH1cblxuICBwdWJsaWMgZ2V0QWxsKCk6IFNldHRpbmdzQ29sbGVjdGlvbiB7XG4gICAgLy8gUmV0dXJucyBhIG11dGFibGUgY29weSBvZiB0aGUgc2V0dGluZ3NcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fY3VycmVudFNldHRpbmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNNb2RpZmllZDtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlQXN5bmMoKTogUHJvbWlzZTxTZXR0aW5nc0NvbGxlY3Rpb24+IHtcbiAgICB0aGlzLnZlcmlmeVNldHRpbmdzQXJlVW5sb2NrZWQoKTtcblxuICAgIC8vIEp1c3QgcmVzb2x2ZSBpbW1lZGlhdGVseSBpZiBzZXR0aW5ncyBhcmUgdW5jaGFuZ2VkXG4gICAgaWYgKCF0aGlzLl9pc01vZGlmaWVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlPFNldHRpbmdzQ29sbGVjdGlvbj4odGhpcy5fY3VycmVudFNldHRpbmdzKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zYXZlSW5Qcm9ncmVzcyA9IHRydWU7XG5cbiAgICAvLyBVc2UgdGhlIHNldHRpbmdzIHNlcnZpY2UgdG8gc2F2ZSBzZXR0aW5ncyB0byB0d2JcbiAgICBjb25zdCBzZXR0aW5nc1NlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNldHRpbmdzU2VydmljZT4oXG4gICAgICBFeHRlbnNpb25zU2VydmljZU5hbWVzLlNldHRpbmdzU2VydmljZSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHNldHRpbmdzU2VydmljZS5zYXZlU2V0dGluZ3NBc3luYyh0aGlzLl9jdXJyZW50U2V0dGluZ3MpLnRoZW48U2V0dGluZ3NDb2xsZWN0aW9uPihcbiAgICAgIChuZXdTZXR0aW5ncykgPT4ge1xuICAgICAgICB0aGlzLl9zYXZlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc01vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50U2V0dGluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9IG5ld1NldHRpbmdzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fY3VycmVudFNldHRpbmdzLCBuZXdTZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld1NldHRpbmdzO1xuICAgICAgfSxcbiAgICAgIChyZWFzb24pID0+IHtcbiAgICAgICAgdGhpcy5fc2F2ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVN0cmluZ1BhcmFtZXRlcihrZXksICdrZXknKTsgLy8gS2V5IHNob3VsZG4ndCBiZSBhbiBlbXB0eSBzdHJpbmcuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcih2YWx1ZSwgJ3ZhbHVlJyk7IC8vIEVtcHR5IHN0cmluZyB2YWx1ZSBpcyBhbGxvd2VkLlxuICAgIHRoaXMudmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpO1xuXG4gICAgdGhpcy5fY3VycmVudFNldHRpbmdzW2tleV0gPSB2YWx1ZTtcbiAgICB0aGlzLl9pc01vZGlmaWVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhbGwgZXZlbnRzIHJlbGV2YW50IHRvIHNldHRpbmdzIG9iamVjdC4gIFRoaXMgaXMgb25seSBhIHNldHRpbmdzVXBkYXRlIGV2ZW50IGN1cnJlbnRseS5cbiAgICpcbiAgICogQHJldHVybnMge0FycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj59IENvbGxlY3Rpb24gb2YgZXZlbnQgbWFuYWdlcnMgdG8gcGFzcyB0byBhbiBFdmVudExpc3RlbmVyTWFuYWdlci5cbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuICAgIGxldCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBzZXJ2aWNlIHJlZ2lzdGVyZWQsIGp1c3QgcmV0dXJuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5nc0NoYW5nZWRFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPFNldHRpbmdzQ2hhbmdlZEV2ZW50PihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLlNldHRpbmdzQ2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5TZXR0aW5nc0NoYW5nZWQsXG4gICAgICAoKSA9PiB0cnVlLFxuICAgICAgKGV2ZW50OiBTZXR0aW5nc0V2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9IGV2ZW50Lm5ld1NldHRpbmdzO1xuICAgICAgICBzZXR0aW5nc0NoYW5nZWRFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IFNldHRpbmdzQ2hhbmdlZEV2ZW50KGV2ZW50Lm5ld1NldHRpbmdzKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2goc2V0dGluZ3NDaGFuZ2VkRXZlbnQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVTZXR0aW5ncyhzZXR0aW5nc0luZm86IEV4dGVuc2lvblNldHRpbmdzSW5mbyk6IHZvaWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoc2V0dGluZ3NJbmZvLCAnc2V0dGluZ3NJbmZvJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihzZXR0aW5nc0luZm8uc2V0dGluZ3NWYWx1ZXMsICdzZXR0aW5nc0luZm8uU2V0dGluZ3NWYWx1ZXMnKTtcblxuICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9IHNldHRpbmdzSW5mby5zZXR0aW5nc1ZhbHVlcztcblxuICAgIC8vIFJlc2V0IHRoZSBpc01vZGlmaWVkIGZsYWdcbiAgICB0aGlzLl9pc01vZGlmaWVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBoZWxwZXIgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgYW55IGxvY2FsIHVwZGF0ZSB0byB0aGlzLmN1cnJlbnRTZXR0aW5ncy5cbiAgICogQ2hlY2tzIGlmIGEgY3VycmVudCBzYXZlIGNhbGwgaXMgc3RpbGwgaW4gcHJvZ3Jlc3MgYW5kIHRocm93cyBhbiBlcnJvciBpZiBzby5cbiAgICovXG4gIHByaXZhdGUgdmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2F2ZUluUHJvZ3Jlc3MpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5TZXR0aW5nU2F2ZUluUHJvZ3Jlc3MsIFNldHRpbmdzSW1wbC5BU1lOQ19TQVZFX0lOX1BST0dSRVNTKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNvbnN0IFRhYmxlYXVCb29rRm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBCb29rJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1TGlnaHRGb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IExpZ2h0JztcbmV4cG9ydCBjb25zdCBUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgUmVndWxhcic7XG5leHBvcnQgY29uc3QgVGFibGVhdU1lZGl1bUZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgTWVkaXVtJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1U2VtaWJvbGRGb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IFNlbWlib2xkJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1Qm9sZEZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgQm9sZCc7XG5cbmV4cG9ydCBjb25zdCBUYWJsZWF1Qm9va0ZvbnRGYWNlTmFtZSA9ICdUYWJsZWF1IEJvb2snO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVCb2xkRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgQm9sZCc7XG5leHBvcnQgY29uc3QgVGFibGVhdUxpZ2h0Rm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgTGlnaHQnO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVNZWRpdW1Gb250RmFjZU5hbWUgPSAnVGFibGVhdSBNZWRpdW0nO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVSZWd1bGFyRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgUmVndWxhcic7XG5leHBvcnQgY29uc3QgVGFibGVhdVNlbWlCb2xkRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgU2VtaSBCb2xkJztcblxuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZFRhYmxlYXVGb250RmFjZXM6IE1vZGVsW10gPSBbXG4gIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1Qm9sZEZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdUxpZ2h0Rm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1UmVndWxhckZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdVNlbWlCb2xkRm9udEZhY2VOYW1lLFxuXTtcbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERpYWxvZ01lc3NhZ2VFdmVudCBhcyBEaWFsb2dNZXNzYWdlRXZlbnRDb250cmFjdCwgRGlhbG9nVXBkYXRlRXZlbnQsIE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG4gIFRhYmxlYXVFcnJvcixcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnQgfSBmcm9tICcuLi9FdmVudHMvVGFibGVhdUV2ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9VSVNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgRGlhbG9nTWVzc2FnZUV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRGlhbG9nTWVzc2FnZUV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLkRpYWxvZ01lc3NhZ2VSZWNlaXZlZCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVJSW1wbCB7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBwdWJsaWMgZGlzcGxheURpYWxvZ0FzeW5jKHVybDogc3RyaW5nLCBwYXlsb2FkPzogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdWlTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxVSVNlcnZpY2U+KEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlKTtcbiAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24sXG4gICAgKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB1aVNlcnZpY2VcbiAgICAgICAgLmRpc3BsYXlEaWFsb2dBc3luYyh1cmwsIHBheWxvYWQgfHwgJycsIG9wdGlvbnMpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICBjb25zdCB1bnJlZ2lzdGVyRm4gPSBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgICAgICAgIE5vdGlmaWNhdGlvbklkLkV4dGVuc2lvbkRpYWxvZ1VwZGF0ZSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gTGV0IHRocm91Z2ggYW55IGRpYWxvZyB1cGRhdGUgZXZlbnRcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGV2ZW50OiBEaWFsb2dVcGRhdGVFdmVudCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXZlbnQuaXNDbG9zZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmNsb3NlUGF5bG9hZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2Nsb3NlUGF5bG9hZCBpcyB1bmRlZmluZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShldmVudC5jbG9zZVBheWxvYWQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuRGlhbG9nQ2xvc2VkQnlVc2VyLCAnRXh0ZW5zaW9uIGRpYWxvZyBjbG9zZWQgYnkgdXNlci4nKSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB1bnJlZ2lzdGVyRm4oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNlbmREaWFsb2dNZXNzYWdlQXN5bmMobWVzc2FnZTogc3RyaW5nLCB0YXJnZXREaWFsb2dVcmw/OiBzdHJpbmcpIHtcbiAgICBjb25zdCB1aVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFVJU2VydmljZT4oRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5VSVNlcnZpY2UpO1xuXG4gICAgdWlTZXJ2aWNlLnNlbmREaWFsb2dNZXNzYWdlQXN5bmMobWVzc2FnZSwgdGFyZ2V0RGlhbG9nVXJsKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZURpYWxvZyhwYXlsb2FkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdWlTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxVSVNlcnZpY2U+KEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlKTtcblxuICAgIHVpU2VydmljZS5jbG9zZURpYWxvZyhwYXlsb2FkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhbGwgZXZlbnRzIHJlbGV2YW50IHRvIFVJIG9iamVjdC5cbiAgICpcbiAgICogQHJldHVybnMge0FycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj59IENvbGxlY3Rpb24gb2YgZXZlbnQgbWFuYWdlcnMgdG8gcGFzcyB0byBhbiBFdmVudExpc3RlbmVyTWFuYWdlci5cbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuICAgIGxldCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBzZXJ2aWNlIHJlZ2lzdGVyZWQsIGp1c3QgcmV0dXJuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBjb25zdCBkaWFsb2dNZXNzYWdlRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxDb250cmFjdC5EaWFsb2dNZXNzYWdlRXZlbnQ+KENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuRGlhbG9nTWVzc2FnZVJlY2VpdmVkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkV4dGVuc2lvbkRpYWxvZ01lc3NhZ2UsXG4gICAgICAoKSA9PiB0cnVlLFxuICAgICAgKGV2ZW50OiBEaWFsb2dNZXNzYWdlRXZlbnRDb250cmFjdCkgPT4ge1xuICAgICAgICBkaWFsb2dNZXNzYWdlRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBEaWFsb2dNZXNzYWdlRXZlbnQoZXZlbnQubWVzc2FnZSkpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmVzdWx0cy5wdXNoKGRpYWxvZ01lc3NhZ2VFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhc2hib2FyZExheW91dENoYW5nZURldGFpbHMsIFRhYmxlYXVFdmVudFR5cGUsIFdvcmtib29rRm9ybWF0dGluZyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRFdmVudCwgTm90aWZpY2F0aW9uSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBEYXNoYm9hcmRJbXBsLFxuICBEYXNoYm9hcmRPYmplY3RJbXBsLFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNpbmdsZUV2ZW50TWFuYWdlcixcbiAgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCxcbiAgV29ya3NoZWV0SW1wbCxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdCB9IGZyb20gJy4vRGFzaGJvYXJkT2JqZWN0JztcbmltcG9ydCB7IFNoZWV0IH0gZnJvbSAnLi9TaGVldCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuL1dvcmtzaGVldCc7XG5cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmQgZXh0ZW5kcyBTaGVldCBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXNoYm9hcmRJbXBsOiBEYXNoYm9hcmRJbXBsKSB7XG4gICAgc3VwZXIoX2Rhc2hib2FyZEltcGwpO1xuICAgIF9kYXNoYm9hcmRJbXBsLmluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcygpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50cygpLmZvckVhY2goKGUpID0+IHRoaXMuYWRkTmV3RXZlbnRUeXBlKGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0cygpOiBBcnJheTxDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC53b3Jrc2hlZXRzSW1wbC5tYXAoKHdvcmtzaGVldEltcGw6IFdvcmtzaGVldEltcGwpID0+IHtcbiAgICAgIHJldHVybiBuZXcgV29ya3NoZWV0KHdvcmtzaGVldEltcGwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBvYmplY3RzKCk6IEFycmF5PENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZE9iamVjdD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLm9iamVjdHMubWFwKChkYXNoYm9hcmRPYmplY3RJbXBsOiBEYXNoYm9hcmRPYmplY3RJbXBsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IERhc2hib2FyZE9iamVjdChkYXNoYm9hcmRPYmplY3RJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5hY3RpdmVEYXNoYm9hcmRPYmplY3RJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRGFzaGJvYXJkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLmFjdGl2ZURhc2hib2FyZE5hbWU7XG4gIH1cblxuICBwdWJsaWMgc2V0Wm9uZVZpc2liaWxpdHlBc3luYyh6b25lVmlzaWJpbGl0eU1hcDogQ29udHJhY3QuWm9uZVZpc2liaWxpdHlNYXApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5zZXREYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5QXN5bmMoem9uZVZpc2liaWxpdHlNYXApO1xuICB9XG5cbiAgcHVibGljIHNldERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlBc3luYyhkYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuc2V0RGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eUFzeW5jKGRhc2hib2FyZE9iamVjdFZpc2liaWxpdHlNYXApO1xuICB9XG5cbiAgcHVibGljIGdldERhc2hib2FyZE9iamVjdEJ5SWQoZGFzaGJvYXJkT2JqZWN0SWQ6IG51bWJlcik6IERhc2hib2FyZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgem9uZSA9IHRoaXMuX2Rhc2hib2FyZEltcGwuZ2V0RGFzaGJvYXJkT2JqZWN0QnlJZChkYXNoYm9hcmRPYmplY3RJZCk7XG4gICAgcmV0dXJuIHpvbmUgJiYgbmV3IERhc2hib2FyZE9iamVjdCh6b25lKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuXG4gICAgLy8gSW5pdGlhbGl6aW5nIGV2ZW50cyBhbmQgcmVnaXN0ZXJpbmcgbm90aWZpY2F0aW9uIHNlcnZpY2VcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVybiAoYWxsb3dzIHVuaXQgdGVzdGluZyB3aXRob3V0IE5vdGlmaWNhdGlvblNlcnZpY2UgbW9jaylcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIGNvbnN0IGRhc2hib2FyZExheW91dENoYW5nZWRFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPERhc2hib2FyZExheW91dENoYW5nZWRFdmVudD4oVGFibGVhdUV2ZW50VHlwZS5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkRhc2hib2FyZExheW91dENoYW5nZWQsXG4gICAgICAoKSA9PiB0cnVlLFxuICAgICAgKGV2ZW50OiBEYXNoYm9hcmRMYXlvdXRFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBkYXNoYm9hcmRPYmplY3RDaGFuZ2VzOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzID0gdGhpcy5fZGFzaGJvYXJkSW1wbC51cGRhdGVab25lcyhcbiAgICAgICAgICBldmVudC56b25lcyxcbiAgICAgICAgICBldmVudC5hY3RpdmVab25lSWQsXG4gICAgICAgICAgZXZlbnQuYWN0aXZlRGFzaGJvYXJkTmFtZSxcbiAgICAgICAgKTtcbiAgICAgICAgZGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50KGRhc2hib2FyZE9iamVjdENoYW5nZXMpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJlc3VsdHMucHVzaChkYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQpO1xuXG4gICAgY29uc3Qgd29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8V29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50PihcbiAgICAgIFRhYmxlYXVFdmVudFR5cGUuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCxcbiAgICApO1xuXG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkLFxuICAgICAgKCkgPT4gdHJ1ZSxcbiAgICAgIChldmVudEZvcm1hdHRpbmc6IFdvcmtib29rRm9ybWF0dGluZykgPT4ge1xuICAgICAgICB3b3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQoZXZlbnRGb3JtYXR0aW5nKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2god29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHVibGljIG1vdmVBbmRSZXNpemVEYXNoYm9hcmRPYmplY3RzQXN5bmMoXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5tb3ZlQW5kUmVzaXplRGFzaGJvYXJkT2JqZWN0c0FzeW5jKGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5KTtcbiAgfVxuXG4gIHB1YmxpYyByZXBsYXlBbmltYXRpb25Bc3luYyhyZXBsYXlTcGVlZDogQ29udHJhY3QuUmVwbGF5U3BlZWRUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwucmVwbGF5QW5pbWF0aW9uQXN5bmMocmVwbGF5U3BlZWQpO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5nZXRGaWx0ZXJzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuYXBwbHlGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RJbXBsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmQgfSBmcm9tICcuL0Rhc2hib2FyZCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuL1dvcmtzaGVldCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRhc2hib2FyZCBvYmplY3RzIC0gdGhlIHpvbmVzIGluIGEgZGFzaGJvYXJkLlxuICovXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkT2JqZWN0IGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkT2JqZWN0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Rhc2hib2FyZE9iamVjdEltcGw6IERhc2hib2FyZE9iamVjdEltcGwpIHt9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmQoKTogQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkIHtcbiAgICByZXR1cm4gbmV3IERhc2hib2FyZCh0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmRhc2hib2FyZEltcGwpO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLnR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvc2l0aW9uKCk6IENvbnRyYWN0LlBvaW50IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5wb3NpdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5zaXplO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXQoKTogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC53b3Jrc2hlZXRJbXBsKSB7XG4gICAgICByZXR1cm4gbmV3IFdvcmtzaGVldCh0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLndvcmtzaGVldEltcGwpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNGbG9hdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5pc0Zsb2F0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuaXNWaXNpYmxlO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuZmllbGRJZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgRXJyb3JIZWxwZXJzLFxuICBFdmVudExpc3RlbmVyTWFuYWdlcixcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgUGFyYW1ldGVySW1wbCxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVyQ2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL1BhcmFtZXRlckNoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBQYXJhbWV0ZXIgY29udHJhY3QuIENhbGxzIGRvd24gdG8gdGhlIGltcGxcbiAqIGNsYXNzIGZvciBhbG1vc3QgYWxsIG9mIHRoZSB3b3JrIGl0IGRvZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyTWFuYWdlciBpbXBsZW1lbnRzIENvbnRyYWN0LlBhcmFtZXRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhcmFtZXRlckltcGw6IFBhcmFtZXRlckltcGwsIHNoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBJbml0aWFsaXplIG91ciBldmVudCBoYW5kbGluZyBmb3IgdGhpcyBjbGFzc1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50cyhzaGVldCkuZm9yRWFjaCgoZSkgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXJyZW50VmFsdWUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJJbXBsLmN1cnJlbnRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogQ29udHJhY3QuRGF0YVR5cGUge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwuZGF0YVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsbG93YWJsZVZhbHVlcygpOiBDb250cmFjdC5QYXJhbWV0ZXJEb21haW5SZXN0cmljdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5hbGxvd2FibGVWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5pZDtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZSk6IFByb21pc2U8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5jaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHdoaWNoIGdvZXMgdGhyb3VnaCBhbmQgcmVnaXN0ZXJzIGVhY2ggZXZlbnQgdHlwZSB0aGlzIGltcGwga25vd3MgYWJvdXRcbiAgICogd2l0aCB0aGUgTm90aWZpY2F0aW9uU2VydmljZS4gSXQgcmV0dXJucyBhbiBhcnJheSBvZiBTaW5nbGVFdmVudE1hbmFnZXIgb2JqZWN0cyB3aGljaFxuICAgKiBjYW4gdGhlbiBiZSBwYXNzZWQgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXIgdG8gaGFuZGxlIHVzZXIgcmVnaXN0cmF0aW9uIC8gdW5yZWdpc3RyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBzaGVldCBUaGUgc2hlZXQgb2JqZWN0IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cyhzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5SW50ZXJuYWxWYWx1ZShzaGVldCwgJ3NoZWV0Jyk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGV2ZW50IG1hbmFnZXJzIHdlJ2xsIG5lZWQgKG9uZSBmb3IgZWFjaCBldmVudCB0eXBlKVxuICAgIGNvbnN0IHBhcmFtZXRlckV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8UGFyYW1ldGVyQ2hhbmdlZEV2ZW50PihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLlBhcmFtZXRlckNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuUGFyYW1ldGVyQ2hhbmdlZCxcbiAgICAgIChtb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSBtb2RlbCBhcyBzdHJpbmc7XG4gICAgICAgIHJldHVybiBmaWVsZE5hbWUgPT09IHRoaXMucGFyYW1ldGVySW1wbC5pZDtcbiAgICAgIH0sXG4gICAgICAoZmllbGROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcGFyYW1ldGVyRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQoZmllbGROYW1lLCBzaGVldCkpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmVzdWx0cy5wdXNoKHBhcmFtZXRlckV2ZW50KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXZlbnRMaXN0ZW5lck1hbmFnZXIsIFNoZWV0SW1wbCwgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXIgfSBmcm9tICcuL1BhcmFtZXRlcic7XG5cbmV4cG9ydCBjbGFzcyBTaGVldCBleHRlbmRzIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfc2hlZXRJbXBsOiBTaGVldEltcGwpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFR5cGUoKTogQ29udHJhY3QuU2hlZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLnNoZWV0VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkU2l6ZSh0aGlzLl9zaGVldEltcGwuc2l6ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaGVldEltcGwuc2l6ZTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgJ1NpemUgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWRTaXplKHNpemU6IGFueSk6IHNpemUgaXMgQ29udHJhY3QuU2l6ZSB7XG4gICAgY29uc3QgdGVzdFNpemUgPSBzaXplIGFzIENvbnRyYWN0LlNpemU7XG4gICAgaWYgKHRlc3RTaXplLndpZHRoICE9PSB1bmRlZmluZWQgJiYgdGVzdFNpemUuaGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQXN5bmMocGFyYW1ldGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb250cmFjdC5QYXJhbWV0ZXIgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLmZpbmRQYXJhbWV0ZXJBc3luYyhwYXJhbWV0ZXJOYW1lKS50aGVuKChwYXJhbWV0ZXJJbXBsKSA9PiB7XG4gICAgICBpZiAocGFyYW1ldGVySW1wbCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8Q29udHJhY3QuUGFyYW1ldGVyPigocmVzb2x2ZSkgPT4gcmVzb2x2ZShuZXcgUGFyYW1ldGVyKHBhcmFtZXRlckltcGwsIHRoaXMpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dW5kZWZpbmVkPigocmVzb2x2ZSkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5QYXJhbWV0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5nZXRQYXJhbWV0ZXJzQXN5bmMoKS50aGVuKChwYXJhbWV0ZXJzSW1wbCkgPT4ge1xuICAgICAgcmV0dXJuIHBhcmFtZXRlcnNJbXBsLm1hcCgocGFyYW1ldGVySW1wbCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlcihwYXJhbWV0ZXJJbXBsLCB0aGlzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsIH0gZnJvbSAnLi4vSW1wbC9FeHRlbnNpb25Xb3JrYm9va0ltcGwnO1xuXG5leHBvcnQgY2xhc3MgV29ya2Jvb2sgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25Xb3JrYm9vayB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF93b3JrYm9va0ltcGw6IEV4dGVuc2lvbldvcmtib29rSW1wbCkge31cblxuICBwdWJsaWMgZ2V0QWxsRGF0YVNvdXJjZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtib29rSW1wbC5nZXRBbGxEYXRhU291cmNlc0FzeW5jKCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDb2x1bW4sXG4gIEZpbHRlclVwZGF0ZVR5cGUsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gIFRhYmxlYXVFdmVudFR5cGUsXG4gIFRvb2x0aXBDb250ZXh0LFxuICBXb3Jrc2hlZXRGb3JtYXR0aW5nLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRmlsdGVyRXZlbnQsIE5vdGlmaWNhdGlvbklkLCBTdW1tYXJ5RGF0YUV2ZW50LCBWaXN1YWxJZCwgV29ya3NoZWV0Rm9ybWF0dGluZ0V2ZW50IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG4gIFRhYmxlYXVFcnJvcixcbiAgV29ya3NoZWV0SW1wbCxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBGaWx0ZXJDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvRmlsdGVyQ2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IE1hcmtzU2VsZWN0ZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9NYXJrc1NlbGVjdGVkRXZlbnQnO1xuaW1wb3J0IHsgU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBEYXNoYm9hcmQgfSBmcm9tICcuL0Rhc2hib2FyZCc7XG5pbXBvcnQgeyBTaGVldCB9IGZyb20gJy4vU2hlZXQnO1xuXG5leHBvcnQgY2xhc3MgV29ya3NoZWV0IGV4dGVuZHMgU2hlZXQgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIF93b3Jrc2hlZXRJbXBsOiBXb3Jrc2hlZXRJbXBsKSB7XG4gICAgc3VwZXIoX3dvcmtzaGVldEltcGwpO1xuXG4gICAgLy8gQ2FsbCB0byBpbml0aWFsaXplIGV2ZW50cyBhbmQgdGhlbiBjYWxsIGRvd24gdG8gdGhlIGV2ZW50IGxpc3RlbmVyIG1hbmFnZXIgdG8gaGFuZGxlIHRoaW5nc1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50cygpLmZvckVhY2goKGUpID0+IHRoaXMuYWRkTmV3RXZlbnRUeXBlKGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50RGFzaGJvYXJkKCk6IENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCB7XG4gICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGZvciBFeHRlbnNpb25zIGlmIHRoZSBEYXNoYm9hcmRJbXBscyBhcmUgY3JlYXRlZCBjb3JyZWN0bHlcbiAgICBpZiAodGhpcy5fd29ya3NoZWV0SW1wbC5wYXJlbnREYXNoYm9hcmQgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBQYXJlbnQgZGFzaGJvYXJkIG5vdCBpbXBsZW1lbnRlZGApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRGFzaGJvYXJkKHRoaXMuX3dvcmtzaGVldEltcGwucGFyZW50RGFzaGJvYXJkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYmFja2dyb3VuZENvbG9yKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuX3dvcmtzaGVldEltcGwuYmFja2dyb3VuZENvbG9yID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgV29ya3NoZWV0IGJhY2tncm91bmQgY29sb3IgaXMgbm90IGF2YWlsYWJsZWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmJhY2tncm91bmRDb2xvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGluZygpOiBXb3Jrc2hlZXRGb3JtYXR0aW5nIHtcbiAgICBpZiAodGhpcy5fd29ya3NoZWV0SW1wbC5mb3JtYXR0aW5nID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgV29ya3NoZWV0IGZvcm1hdHRpbmcgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmZvcm1hdHRpbmc7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB3aGljaCBnb2VzIHRocm91Z2ggYW5kIHJlZ2lzdGVycyBlYWNoIGV2ZW50IHR5cGUgdGhpcyBpbXBsIGtub3dzIGFib3V0XG4gICAqIHdpdGggdGhlIE5vdGlmaWNhdGlvblNlcnZpY2UuIEl0IHJldHVybnMgYW4gYXJyYXkgb2YgU2luZ2xlRXZlbnRNYW5hZ2VyIG9iamVjdHMgd2hpY2hcbiAgICogY2FuIHRoZW4gYmUgcGFzc2VkIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIHRvIGhhbmRsZSB1c2VyIHJlZ2lzdHJhdGlvbiAvIHVucmVnaXN0cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge1dvcmtzaGVldH0gd29ya3NoZWV0IFRoZSB3b3Jrc2hlZXQgb2JqZWN0IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cygpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGV2ZW50IG1hbmFnZXJzIHdlJ2xsIG5lZWQgKG9uZSBmb3IgZWFjaCBldmVudCB0eXBlKVxuICAgIGNvbnN0IG1hcmtzRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxNYXJrc1NlbGVjdGVkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuTWFya1NlbGVjdGlvbkNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuU2VsZWN0ZWRNYXJrc0NoYW5nZWQsXG4gICAgICAobW9kZWwpID0+IHtcbiAgICAgICAgY29uc3QgdmlzdWFsSWQgPSBtb2RlbCBhcyBWaXN1YWxJZDtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzdWFsSWRzQXJlRXF1YWwodmlzdWFsSWQsIHRoaXMuX3dvcmtzaGVldEltcGwudmlzdWFsSWQpO1xuICAgICAgfSxcbiAgICAgICgpID0+IG1hcmtzRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBNYXJrc1NlbGVjdGVkRXZlbnQodGhpcykpLFxuICAgICk7XG5cbiAgICBjb25zdCBmaWx0ZXJFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPEZpbHRlckNoYW5nZWRFdmVudD4oVGFibGVhdUV2ZW50VHlwZS5GaWx0ZXJDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkZpbHRlckNoYW5nZWQsXG4gICAgICAobW9kZWwpID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyRXZlbnRSZXNwb25zZSA9IG1vZGVsIGFzIEZpbHRlckV2ZW50O1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZC53b3Jrc2hlZXQgPT09IGZpbHRlckV2ZW50UmVzcG9uc2UudmlzdWFsSWQud29ya3NoZWV0O1xuICAgICAgfSxcbiAgICAgIChldmVudDogRmlsdGVyRXZlbnQpID0+IHtcbiAgICAgICAgZmlsdGVyRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBGaWx0ZXJDaGFuZ2VkRXZlbnQodGhpcywgZXZlbnQuZmllbGROYW1lLCBldmVudC5maWVsZElkKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBzdW1tYXJ5RGF0YUV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8U3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuU3VtbWFyeURhdGFDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLlN1bW1hcnlEYXRhQ2hhbmdlZCxcbiAgICAgIChtb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCBzdW1tYXJ5RGF0YUV2ZW50UmVzcG9uc2UgPSBtb2RlbCBhcyBTdW1tYXJ5RGF0YUV2ZW50O1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZC53b3Jrc2hlZXQgPT09IHN1bW1hcnlEYXRhRXZlbnRSZXNwb25zZS52aXN1YWxJZC53b3Jrc2hlZXQ7XG4gICAgICB9LFxuICAgICAgKGV2ZW50OiBTdW1tYXJ5RGF0YUV2ZW50KSA9PiB7XG4gICAgICAgIHN1bW1hcnlEYXRhRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCh0aGlzKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCB3b3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8V29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudD4oXG4gICAgICBUYWJsZWF1RXZlbnRUeXBlLldvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkLFxuICAgICk7XG5cbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLldvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkLFxuICAgICAgKG1vZGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IHdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgPSBtb2RlbCBhcyBXb3Jrc2hlZXRGb3JtYXR0aW5nRXZlbnQ7XG4gICAgICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnZpc3VhbElkLndvcmtzaGVldCA9PT0gd29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudC52aXN1YWxJZC53b3Jrc2hlZXQ7XG4gICAgICB9LFxuICAgICAgKGV2ZW50Rm9ybWF0dGluZzogV29ya3NoZWV0Rm9ybWF0dGluZykgPT4ge1xuICAgICAgICB3b3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudCh0aGlzLCBldmVudEZvcm1hdHRpbmcpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJlc3VsdHMucHVzaChtYXJrc0V2ZW50KTtcbiAgICByZXN1bHRzLnB1c2goZmlsdGVyRXZlbnQpO1xuICAgIHJlc3VsdHMucHVzaChzdW1tYXJ5RGF0YUV2ZW50KTtcbiAgICByZXN1bHRzLnB1c2god29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBGaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYXBwbHlGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmFwcGx5UmFuZ2VGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIGZpbHRlck9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgb3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hcHBseUhpZXJhcmNoaWNhbEZpbHRlckFzeW5jKGZpZWxkTmFtZSwgdmFsdWVzLCB1cGRhdGVUeXBlLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWUpO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldERhdGFTb3VyY2VzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0RmlsdGVyc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFBc3luYyhvcHRpb25zOiBDb250cmFjdC5HZXRTdW1tYXJ5RGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFN1bW1hcnlEYXRhQXN5bmMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhwYWdlUm93Q291bnQ6IG51bWJlciwgb3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jKHBhZ2VSb3dDb3VudCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb2x1bW4+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ1dvcmtzaGVldC5nZXRVbmRlcmx5aW5nRGF0YUFzeW5jIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgJyArXG4gICAgICAgICdXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jIGFuZCBXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jJyxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgb3B0aW9uczogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhsb2dpY2FsVGFibGVJZCwgcGFnZVJvd0NvdW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5WaXN1YWxTcGVjaWZpY2F0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgYWRkTWFya3NDYXJkRmllbGRzQXN5bmMoXG4gICAgbWFya3NDYXJkSW5kZXg6IG51bWJlcixcbiAgICBlbmNvZGluZ1R5cGU6IENvbnRyYWN0LkVuY29kaW5nVHlwZSxcbiAgICBjb2x1bW5zOiBBcnJheTxDb250cmFjdC5Db2x1bW4+LFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYWRkTWFya3NDYXJkRmllbGRzQXN5bmMobWFya3NDYXJkSW5kZXgsIGVuY29kaW5nVHlwZSwgY29sdW1ucywgc3RhcnRJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgbW92ZU1hcmtzQ2FyZEZpZWxkQXN5bmMobWFya3NDYXJkSW5kZXg6IG51bWJlciwgZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlciwgZmllbGRDb3VudCA9IDEpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5tb3ZlTWFya3NDYXJkRmllbGRBc3luYyhtYXJrc0NhcmRJbmRleCwgZnJvbUluZGV4LCB0b0luZGV4LCBmaWVsZENvdW50KTtcbiAgfVxuXG4gIHB1YmxpYyBzcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyhcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGVuY29kaW5nVHlwZTogQ29udHJhY3QuRW5jb2RpbmdUeXBlLFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgICBkZWxldGVDb3VudDogbnVtYmVyLFxuICAgIGNvbHVtbnM6IEFycmF5PENvbnRyYWN0LkNvbHVtbj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnNwbGljZU1hcmtzQ2FyZEZpZWxkc0FzeW5jKG1hcmtzQ2FyZEluZGV4LCBlbmNvZGluZ1R5cGUsIHN0YXJ0SW5kZXgsIGRlbGV0ZUNvdW50LCBjb2x1bW5zKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclNlbGVjdGVkTWFya3NBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5jbGVhclNlbGVjdGVkTWFya3NBc3luYygpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlJREFzeW5jKG1hcmtzSW5mbzogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+LCB1cGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0TWFya3NCeUlkQXN5bmMobWFya3NJbmZvLCB1cGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5VmFsdWVBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5TZWxlY3Rpb25Dcml0ZXJpYT4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zZWxlY3RNYXJrc0J5VmFsdWVBc3luYyhzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5SWRBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zZWxlY3RNYXJrc0J5SWRBc3luYyhzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBhbm5vdGF0ZU1hcmtBc3luYyhtYXJrOiBDb250cmFjdC5NYXJrSW5mbywgYW5ub3RhdGlvblRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmFubm90YXRlTWFya0FzeW5jKG1hcmssIGFubm90YXRpb25UZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbm5vdGF0aW9uc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRBbm5vdGF0aW9uc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQW5ub3RhdGlvbkFzeW5jKGFubm90YXRpb246IENvbnRyYWN0LkFubm90YXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5yZW1vdmVBbm5vdGF0aW9uQXN5bmMoYW5ub3RhdGlvbik7XG4gIH1cblxuICBwdWJsaWMgaG92ZXJUdXBsZUFzeW5jKGhvdmVyZWRUdXBsZT86IG51bWJlciwgdG9vbHRpcD86IFRvb2x0aXBDb250ZXh0IHwgbnVsbCwgYWxsb3dIb3ZlckFjdGlvbnMgPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuaG92ZXJUdXBsZUFzeW5jKGhvdmVyZWRUdXBsZSwgdG9vbHRpcCwgYWxsb3dIb3ZlckFjdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdFR1cGxlc0FzeW5jKHNlbGVjdGVkVHVwbGVzOiBBcnJheTxudW1iZXI+LCBzZWxlY3RPcHRpb246IENvbnRyYWN0LlNlbGVjdE9wdGlvbnMsIHRvb2x0aXA/OiBUb29sdGlwQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnNlbGVjdFR1cGxlc0FzeW5jKHNlbGVjdGVkVHVwbGVzLCBzZWxlY3RPcHRpb24sIHRvb2x0aXApO1xuICB9XG5cbiAgcHVibGljIGdldFRvb2x0aXBUZXh0QXN5bmModHVwbGVJZDogbnVtYmVyKTogUHJvbWlzZTxTdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRUb29sdGlwVGV4dEFzeW5jKHR1cGxlSWQpO1xuICB9XG5cbiAgcHVibGljIGxlYXZlTWFya05hdmlnYXRpb25Bc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5sZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBlZGl0QWxpYXNlc0RpYWxvZ0FzeW5jKGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZWRpdEFsaWFzZXNEaWFsb2dBc3luYyhmaWVsZE5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXN1YWxJZHNBcmVFcXVhbChhOiBWaXN1YWxJZCwgYjogVmlzdWFsSWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgYSAmJlxuICAgICAgYiAmJlxuICAgICAgYS53b3Jrc2hlZXQgPT09IGIud29ya3NoZWV0ICYmXG4gICAgICBhLmRhc2hib2FyZCA9PT0gYi5kYXNoYm9hcmQgJiZcbiAgICAgIGEuc3Rvcnlib2FyZCA9PT0gYi5zdG9yeWJvYXJkICYmXG4gICAgICBhLnN0b3J5UG9pbnRJRCA9PT0gYi5zdG9yeVBvaW50SURcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBEYXNoYm9hcmRDb250ZW50IG5hbWVzcGFjZS5cbiAqIFRoaXMgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgRGFzaGJvYXJkQ29udGVudCBpc1xuICogY3VycmVudGx5IGp1c3QgYSAoc2luZ2xlKSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRDb250ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRGFzaGJvYXJkQ29udGVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXNoYm9hcmQ6IENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCkge31cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZCgpOiBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25FbnZpcm9ubWVudCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlWZXJzaW9uLCBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRW51bU1hcHBpbmdzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBDb25uZWN0ZWRTZXJ2ZXIgfSBmcm9tICcuLi9JbXBsL0Nvbm5lY3RlZFNlcnZlcic7XG5pbXBvcnQgeyBXb3JrYm9va0Zvcm1hdHRpbmdFbnZVdGlsIH0gZnJvbSAnLi9Xb3JrYm9va0Zvcm1hdHRpbmdFbnZVdGlsJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgZW52aXJvbm1lbnQgbmFtZXNwYWNlLlxuICogRW52aXJvbm1lbnQgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgaXQgaXNcbiAqIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKiBGaXJzdCBjbGFzcyBleHRlbnNpb25zIGNhbiBnZXQgdG8gQ29ubmVjdGVkU2VydmVyIHdpdGg6IGVudmlyb25tZW50Wydjb25uZWN0ZWRTZXJ2ZXInXVxuICovXG5leHBvcnQgY2xhc3MgRW52aXJvbm1lbnQgaW1wbGVtZW50cyBDb250cmFjdC5FbnZpcm9ubWVudCB7XG4gIC8qKlRoZSBmb2xsb3dpbmcgaXMgYW4gaW5kZXggc2lnbmF0dXJlLiBJdCBhbGxvd3MgcHJvcGVydGllcyB0byBiZSBhY2Nlc3NlZCBieSBuYW1lLlxuICAgKiBUaGlzIGFsbG93cyB1cyB0byBhZGQgcHJvcGVydGllcyBkeW5hbWljYWxseSAoc2VlIHVzYWdlIG9mIHRoaXMuY29ubmVjdGVkU2VydmVyIGJlbG93KSB3aXRob3V0IFR5cGVzY3JpcHQgZXJyb3JzLlxuICAgKiBUaGUgcmVhc29uIHdlIGRvIHRoaXMgaXMgc28gdGhhdCAzcmQtcGFydHkgZXh0ZW5zaW9uIGRldmVsb3BlcnMgZG8gbm90IHNlZSB0aGUgY29ubmVjdGVkU2VydmVyIHByb3BlcnR5XG4gICAqIHRoYXQgaXMgb25seSBhdmFpbGFibGUgdG8gZmlyc3QgY2xhc3MgZXh0ZW5zaW9uIGRldmVsb3BlcnMuXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBpbmRleCBzaWdhdHVyZSBuZWVkcyB0byBiZSBhIHVuaW9uIG9mIGFsbCBwcm9wZXJ0aWVzIGluIHRoZSBvYmplY3QsIHNpbmNlIHdlIGNvdWxkXG4gICAqIGFjY2VzcyBhbnkgcHJvcGVydHkgdXNpbmcgdGhlIHByb3BlcnR5IGluZGV4IG1ldGhvZC5cbiAgICovXG4gIFt4OiBzdHJpbmddOiBDb25uZWN0ZWRTZXJ2ZXIgfCBzdHJpbmcgfCBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfYXBpVmVyc2lvbjogc3RyaW5nO1xuICBwcml2YXRlIF9jb250ZXh0OiBDb250cmFjdC5FeHRlbnNpb25Db250ZXh0O1xuICBwcml2YXRlIF9mb3JtYXR0aW5nPzogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nO1xuICBwcml2YXRlIF9sYW5ndWFnZTogc3RyaW5nO1xuICBwcml2YXRlIF9jb3VudHJ5Pzogc3RyaW5nO1xuICBwcml2YXRlIF9sb2NhbGU6IHN0cmluZztcbiAgcHJpdmF0ZSBfbW9kZTogQ29udHJhY3QuRXh0ZW5zaW9uTW9kZTtcbiAgcHJpdmF0ZSBfb3BlcmF0aW5nU3lzdGVtOiBzdHJpbmc7XG4gIHByaXZhdGUgX3RhYmxlYXVWZXJzaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgX3VuaXF1ZVVzZXJJZD86IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoZXh0ZW5zaW9uRW52aXJvbm1lbnQ6IEV4dGVuc2lvbkVudmlyb25tZW50KSB7XG4gICAgdGhpcy5fYXBpVmVyc2lvbiA9IEFwaVZlcnNpb24uSW5zdGFuY2UgJiYgQXBpVmVyc2lvbi5JbnN0YW5jZS5mb3JtYXR0ZWRWYWx1ZTsgLy8gbWFqLm1pbi5maXggKG5vIGJ1aWxkKVxuICAgIHRoaXMuX2NvbnRleHQgPSBFbnVtTWFwcGluZ3MuZXh0ZW5zaW9uQ29udGV4dC5jb252ZXJ0KGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkNvbnRleHQpO1xuICAgIHRoaXMuX2Zvcm1hdHRpbmcgPSBXb3JrYm9va0Zvcm1hdHRpbmdFbnZVdGlsLmNvbnZlcnRUb1dvcmtib29rRm9ybWF0dGluZyhleHRlbnNpb25FbnZpcm9ubWVudC53b3JrYm9va0Zvcm1hdHRpbmcpO1xuICAgIHRoaXMuX2xhbmd1YWdlID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uTGFuZ3VhZ2U7XG4gICAgdGhpcy5fY291bnRyeSA9IGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkNvdW50cnk7XG4gICAgdGhpcy5fbG9jYWxlID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uTG9jYWxlO1xuICAgIHRoaXMuX21vZGUgPSBFbnVtTWFwcGluZ3MuZXh0ZW5zaW9uTW9kZS5jb252ZXJ0KGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbk1vZGUpO1xuICAgIHRoaXMuX29wZXJhdGluZ1N5c3RlbSA9IGV4dGVuc2lvbkVudmlyb25tZW50Lm9wZXJhdGluZ1N5c3RlbTtcbiAgICB0aGlzLl90YWJsZWF1VmVyc2lvbiA9IGV4dGVuc2lvbkVudmlyb25tZW50LnRhYmxlYXVWZXJzaW9uO1xuICAgIHRoaXMuX3VuaXF1ZVVzZXJJZCA9IGV4dGVuc2lvbkVudmlyb25tZW50LnVuaXF1ZVVzZXJJZDtcblxuICAgIC8vIElmIHdlIGhhdmUgYSB1c2VySWQsIHRoZW4gd2UgYXJlIGEgZmlyc3QgY2xhc3MgZXh0ZW5zaW9uXG4gICAgaWYgKGV4dGVuc2lvbkVudmlyb25tZW50LnVzZXJJZCkge1xuICAgICAgdGhpcy5jb25uZWN0ZWRTZXJ2ZXIgPSBuZXcgQ29ubmVjdGVkU2VydmVyKFxuICAgICAgICBleHRlbnNpb25FbnZpcm9ubWVudC51c2VySWQsXG4gICAgICAgIGV4dGVuc2lvbkVudmlyb25tZW50LnNpdGVJZCxcbiAgICAgICAgZXh0ZW5zaW9uRW52aXJvbm1lbnQuc2l0ZU5hbWVzcGFjZSxcbiAgICAgICAgZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tJZCxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuZmVhdHVyZUZsYWdzID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQuZmVhdHVyZUZsYWdzO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpVmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hcGlWZXJzaW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBjb250ZXh0KCk6IENvbnRyYWN0LkV4dGVuc2lvbkNvbnRleHQge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0O1xuICB9XG5cbiAgcHVibGljIGdldCB3b3JrYm9va0Zvcm1hdHRpbmcoKTogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbGFuZ3VhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvdW50cnkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY291bnRyeTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbW9kZSgpOiBDb250cmFjdC5FeHRlbnNpb25Nb2RlIHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb3BlcmF0aW5nU3lzdGVtKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX29wZXJhdGluZ1N5c3RlbTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdGFibGVhdVZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVhdVZlcnNpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVuaXF1ZVVzZXJJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91bmlxdWVVc2VySWQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDYWxsYmFja01hcCwgRXh0ZW5zaW9uc0ltcGwgfSBmcm9tICcuLi9JbXBsL0V4dGVuc2lvbnNJbXBsJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgRXh0ZW5zaW9ucyBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25zIGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9ucyB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGV4dGVuc2lvbkltcGw6IEV4dGVuc2lvbnNJbXBsKSB7XG4gICAgdGhpcy5leHRlbnNpb25JbXBsID0gZXh0ZW5zaW9uSW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGFzaGJvYXJkQ29udGVudCgpOiBDb250cmFjdC5EYXNoYm9hcmRDb250ZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmRhc2hib2FyZENvbnRlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldENvbnRlbnQoKTogQ29udHJhY3QuV29ya3NoZWV0Q29udGVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC53b3Jrc2hlZXRDb250ZW50O1xuICB9XG5cbiAgcHVibGljIGdldCBlbnZpcm9ubWVudCgpOiBDb250cmFjdC5FbnZpcm9ubWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5lbnZpcm9ubWVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2V0dGluZ3MoKTogQ29udHJhY3QuU2V0dGluZ3Mge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuc2V0dGluZ3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVpKCk6IENvbnRyYWN0LlVJIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLnVpO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3JrYm9vaygpOiBDb250cmFjdC5FeHRlbnNpb25Xb3JrYm9vayB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC53b3JrYm9vaztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGFzaGJvYXJkT2JqZWN0SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmV4dGVuc2lvblpvbmVJZDtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplQXN5bmMoY29udGV4dE1lbnVDYWxsYmFja3M/OiBDYWxsYmFja01hcCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuaW5pdGlhbGl6ZUFzeW5jKGZhbHNlLCBjb250ZXh0TWVudUNhbGxiYWNrcykudGhlbjx2b2lkPigpO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVEaWFsb2dBc3luYygpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuaW5pdGlhbGl6ZUFzeW5jKHRydWUpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVZpekltYWdlQXN5bmMoaW5wdXRTcGVjOiBvYmplY3QpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWMpO1xuICB9XG5cbiAgcHVibGljIHNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLnNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTZXR0aW5ncyBhcyBTZXR0aW5nc0NvbnRyYWN0IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXJNYW5hZ2VyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBTZXR0aW5nc0ltcGwgfSBmcm9tICcuLi9JbXBsL1NldHRpbmdzSW1wbCc7XG5pbXBvcnQgeyBTZXR0aW5nc0NvbGxlY3Rpb24gfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXR0aW5nc1NlcnZpY2UnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBzZXR0aW5ncyBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXR0aW5ncyBleHRlbmRzIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIGltcGxlbWVudHMgU2V0dGluZ3NDb250cmFjdCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9zZXR0aW5nc0ltcGw6IFNldHRpbmdzSW1wbCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBJbml0aWFsaXplIG91ciBldmVudCBoYW5kbGluZyBmb3IgdGhpcyBjbGFzc1xuICAgIHRoaXMuX3NldHRpbmdzSW1wbC5pbml0aWFsaXplRXZlbnRzKCkuZm9yRWFjaCgoZSkgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGVyYXNlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0dGluZ3NJbXBsLmVyYXNlKGtleSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0KGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NJbXBsLmdldChrZXkpO1xuICB9XG5cbiAgcHVibGljIGdldEFsbCgpOiBTZXR0aW5nc0NvbGxlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ltcGwuZ2V0QWxsKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzTW9kaWZpZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzSW1wbC5pc01vZGlmaWVkO1xuICB9XG5cbiAgcHVibGljIHNhdmVBc3luYygpOiBQcm9taXNlPFNldHRpbmdzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ltcGwuc2F2ZUFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0dGluZ3NJbXBsLnNldChrZXksIHZhbHVlKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXJNYW5hZ2VyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBVSUltcGwgfSBmcm9tICcuLi9JbXBsL1VJSW1wbCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIFVJIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFVJIGV4dGVuZHMgRXZlbnRMaXN0ZW5lck1hbmFnZXIgaW1wbGVtZW50cyBDb250cmFjdC5VSSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9pbXBsOiBVSUltcGwpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBvdXIgZXZlbnQgaGFuZGxpbmcgZm9yIHRoaXMgY2xhc3NcbiAgICB0aGlzLl9pbXBsLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKChlKSA9PiB0aGlzLmFkZE5ld0V2ZW50VHlwZShlKSk7XG4gIH1cblxuICBwdWJsaWMgZGlzcGxheURpYWxvZ0FzeW5jKHVybDogc3RyaW5nLCBwYXlsb2FkPzogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ltcGwuZGlzcGxheURpYWxvZ0FzeW5jKHVybCwgcGF5bG9hZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgc2VuZERpYWxvZ01lc3NhZ2VBc3luYyhtZXNzYWdlOiBzdHJpbmcsIHRhcmdldERpYWxvZ1VybD86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9pbXBsLnNlbmREaWFsb2dNZXNzYWdlQXN5bmMobWVzc2FnZSwgdGFyZ2V0RGlhbG9nVXJsKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZURpYWxvZyhwYXlsb2FkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5faW1wbC5jbG9zZURpYWxvZyhwYXlsb2FkKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyBhcyBFbnVtTWFwcGluZ3MgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IENsYXNzTmFtZUtleSwgV29ya2Jvb2tGb3JtYXR0aW5nIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIFdvcmtib29rRm9ybWF0dGluZ0VudlV0aWwge1xuICBwdWJsaWMgc3RhdGljIGNvbnZlcnRUb1dvcmtib29rRm9ybWF0dGluZyh3b3JrYm9va0Zvcm1hdHRpbmdNb2RlbD86IFdvcmtib29rRm9ybWF0dGluZyk6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF3b3JrYm9va0Zvcm1hdHRpbmdNb2RlbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZm9ybWF0dGluZ01hcDogQXJyYXk8Q29udHJhY3QuRm9ybWF0dGluZ1NoZWV0PiA9IHdvcmtib29rRm9ybWF0dGluZ01vZGVsLmZvcm1hdHRpbmdTaGVldHMubWFwKChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0KSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRpbmdTaGVldDogQ29udHJhY3QuRm9ybWF0dGluZ1NoZWV0ID0ge1xuICAgICAgICAgIGNsYXNzTmFtZUtleTogRW51bU1hcHBpbmdzLmNsYXNzTmFtZUtleS5jb252ZXJ0KGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY2xhc3NOYW1lS2V5KSxcbiAgICAgICAgICBjc3NQcm9wZXJ0aWVzOiBnZXRDc3NQcm9wZXJ0aWVzKGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY2xhc3NOYW1lS2V5LCBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMpLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZm9ybWF0dGluZ1NoZWV0O1xuICAgICAgfSk7XG4gICAgICBjb25zdCByZXN1bHQ6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZyA9IHtcbiAgICAgICAgZm9ybWF0dGluZ1NoZWV0czogZm9ybWF0dGluZ01hcCxcbiAgICAgIH07XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRDc3NQcm9wZXJ0aWVzKGNsYXNzTmFtZUtleTogQ2xhc3NOYW1lS2V5LCBjc3NQcm9wZXJ0aWVzOiBSZWFjdC5DU1NQcm9wZXJ0aWVzKTogaW1wb3J0KCdyZWFjdCcpLkNTU1Byb3BlcnRpZXMge1xuICBpZiAoY2xhc3NOYW1lS2V5ID09PSBDbGFzc05hbWVLZXkuUm93RGl2aWRlcnMgfHwgY2xhc3NOYW1lS2V5ID09PSBDbGFzc05hbWVLZXkuQ29sdW1uRGl2aWRlcnMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYm9yZGVyQ29sb3I6IGNzc1Byb3BlcnRpZXMuYm9yZGVyQ29sb3IsXG4gICAgICBib3JkZXJTdHlsZTogY3NzUHJvcGVydGllcy5ib3JkZXJTdHlsZSxcbiAgICAgIGJvcmRlcldpZHRoOiBjc3NQcm9wZXJ0aWVzLmJvcmRlcldpZHRoLFxuICAgIH0gYXMgUmVhY3QuQ1NTUHJvcGVydGllcztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZm9udEZhbWlseTogY3NzUHJvcGVydGllcy5mb250RmFtaWx5LFxuICAgIGZvbnRTaXplOiBjc3NQcm9wZXJ0aWVzLmZvbnRTaXplLFxuICAgIGZvbnRXZWlnaHQ6IGNzc1Byb3BlcnRpZXMuZm9udFdlaWdodCxcbiAgICBmb250U3R5bGU6IGNzc1Byb3BlcnRpZXMuZm9udFN0eWxlLFxuICAgIHRleHREZWNvcmF0aW9uOiBjc3NQcm9wZXJ0aWVzLnRleHREZWNvcmF0aW9uLFxuICAgIGNvbG9yOiBjc3NQcm9wZXJ0aWVzLmNvbG9yLFxuICB9O1xufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgV29ya3NoZWV0Q29udGVudCBuYW1lc3BhY2UuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIFdvcmtzaGVldENvbnRlbnQgaXNcbiAqIGN1cnJlbnRseSBqdXN0IGEgKHNpbmdsZSkgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgV29ya3NoZWV0Q29udGVudCBpbXBsZW1lbnRzIENvbnRyYWN0LldvcmtzaGVldENvbnRlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfd29ya3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQpIHt9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXQoKTogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbywgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL0luaXRpYWxpemF0aW9uU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBJbml0aWFsaXphdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgSW5pdGlhbGl6YXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLkluaXRpYWxpemF0aW9uU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplRGFzaGJvYXJkRXh0ZW5zaW9uc0FzeW5jKGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuLCBjb250ZXh0TWVudUlkczogc3RyaW5nW10pOiBQcm9taXNlPEV4dGVuc2lvbkJvb3RzdHJhcEluZm8+IHtcbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdpbml0aWFsaXplRGFzaGJvYXJkRXh0ZW5zaW9uc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25Db250ZXh0TWVudUlkc106IGNvbnRleHRNZW51SWRzLFxuICAgICAgW1BhcmFtZXRlcklkLklzRXh0ZW5zaW9uRGlhbG9nXTogaXNFeHRlbnNpb25EaWFsb2csXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkluaXRpYWxpemVFeHRlbnNpb24sIHBhcmFtcykudGhlbjxFeHRlbnNpb25Cb290c3RyYXBJbmZvPigocmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIFRPRE8gLSBWYWxpZGF0ZSByZXR1cm4gdmFsdWVcblxuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkJvb3RzdHJhcEluZm87XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeHRlbnNpb25TZXR0aW5nc0luZm8sIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IFNldHRpbmdzQ29sbGVjdGlvbiwgU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vU2V0dGluZ3NTZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIFNldHRpbmdzU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBTZXR0aW5nc1NlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuU2V0dGluZ3NTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIHNhdmVTZXR0aW5nc0FzeW5jKHNldHRpbmdzOiBTZXR0aW5nc0NvbGxlY3Rpb24pOiBQcm9taXNlPFNldHRpbmdzQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzYXZlU2V0dGluZ3NBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU2V0dGluZ3NWYWx1ZXNdOiBzZXR0aW5ncyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2F2ZUV4dGVuc2lvblNldHRpbmdzLCBwYXJhbWV0ZXJzKS50aGVuPFNldHRpbmdzQ29sbGVjdGlvbj4oKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSB2YWx1ZS5yZXN1bHQgYXMgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvO1xuXG4gICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LnNldHRpbmdzVmFsdWVzKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnVW5leHBlY3RlZCBlcnJvciBzYXZpbmdzIHNldHRpbmdzLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0LnNldHRpbmdzVmFsdWVzO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEaWFsb2dPcHRpb25zLCBEaWFsb2dTdHlsZSwgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0LCBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9ySGVscGVycywgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLCBTZXJ2aWNlSW1wbEJhc2UsIFRhYmxlYXVFcnJvciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyB9IGZyb20gJy4uL0V4dGVuc2lvbnNTZXJ2aWNlTmFtZXMnO1xuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnLi4vVUlTZXJ2aWNlJztcblxuY29uc3QgREVGQVVMVF9ESUFMT0dfSEVJR0hUID0gNDAwOyAvLyBpbiBwaXhlbHNcbmNvbnN0IERFRkFVTFRfRElBTE9HX1dJRFRIID0gNjAwOyAvLyBpbiBwaXhlbHNcbmNvbnN0IERFRkFVTFRfRElBTE9HX1NUWUxFOiBEaWFsb2dTdHlsZSA9IERpYWxvZ1N0eWxlLldpbmRvdztcblxuZXhwb3J0IGNsYXNzIFVJU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBVSVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIGRpc3BsYXlEaWFsb2dBc3luYyh1cmw6IHN0cmluZywgcGF5bG9hZDogc3RyaW5nLCBvcHRpb25zPzogRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdkaXNwbGF5RGlhbG9nQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1VybF06IHVybCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dQYXlsb2FkXTogcGF5bG9hZCxcbiAgICB9O1xuXG4gICAgY29uc3QgaDogbnVtYmVyID0gb3B0aW9ucyAmJiBvcHRpb25zLmhlaWdodCA/IG9wdGlvbnMuaGVpZ2h0IDogREVGQVVMVF9ESUFMT0dfSEVJR0hUO1xuICAgIGNvbnN0IHc6IG51bWJlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy53aWR0aCA/IG9wdGlvbnMud2lkdGggOiBERUZBVUxUX0RJQUxPR19XSURUSDtcbiAgICBjb25zdCBkaWFsb2dTdHlsZTogRGlhbG9nU3R5bGUgPSBvcHRpb25zICYmIG9wdGlvbnMuZGlhbG9nU3R5bGUgPyBvcHRpb25zLmRpYWxvZ1N0eWxlIDogREVGQVVMVF9ESUFMT0dfU1RZTEU7XG5cbiAgICAvLyBPbiB0aGUgcGxhdGZvcm0gc2lkZSwgd2UgZG8gc29tZXRoaW5nIHJlYXNvbmFibGUgcmVnYXJkZXNzIG9mIHdoZXRoZXIgdGhlIHBhc3NlZFxuICAgIC8vIGhlaWdodCBhbmQgd2lkdGggYXJlIHRvbyBsYXJnZSBvciB0b28gc21hbGwuICBCdXQgdGhpcyBsaWtlbHkgaW5kaWNhdGVzIGEgZGV2ZWxvcGVyIGVycm9yLFxuICAgIC8vIHNvIHdlIHRocm93IGFuIGVycm9yIGhlcmUgdG8gaGVscCB3aXRoIGRlYnVnZ2luZy5cbiAgICBpZiAoaCA8PSAwIHx8IHcgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdTaXplIHBhcmFtZXRlcnMgZm9yIGRpc3BsYXlEaWFsb2dBc3luYyBtdXN0IGJlIHBvc2l0aXZlJyk7XG4gICAgfVxuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dIXSA9IGg7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dXXSA9IHc7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxEaWFsb2dTdHlsZT4oZGlhbG9nU3R5bGUsIERpYWxvZ1N0eWxlLCAnRGlhbG9nU3R5bGUnKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1N0eWxlXSA9IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5kaWFsb2dTdHlsZXMuY29udmVydChkaWFsb2dTdHlsZSk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5EaXNwbGF5RGlhbG9nLCBwYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGlhbG9nUmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdDtcbiAgICAgIHN3aXRjaCAoZGlhbG9nUmVzdWx0KSB7XG4gICAgICAgIGNhc2UgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0LkRpYWxvZ0FscmVhZHlPcGVuOlxuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5EaWFsb2dBbHJlYWR5T3BlbiwgJ1RoZXJlIGFscmVhZHkgZXhpc3RzIGFuIG9wZW4gZGlhbG9nIGZvciB0aGlzIGV4dGVuc2lvbi4nKTtcbiAgICAgICAgY2FzZSBFeHRlbnNpb25EaWFsb2dSZXN1bHQuSW52YWxpZERvbWFpbjpcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICAgICAgRXJyb3JDb2Rlcy5JbnZhbGlkRG9tYWluRGlhbG9nLFxuICAgICAgICAgICAgJ1RoZSB1cmwgb2YgYW4gZXh0ZW5zaW9uIGRpYWxvZyBtdXN0IG1hdGNoIHRoZSBkb21haW4gb2YgdGhlIHBhcmVudCBleHRlbnNpb24uJyxcbiAgICAgICAgICApO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIFN1Y2Nlc3MgY2FzZVxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZURpYWxvZyhwYXlsb2FkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2Nsb3NlRGlhbG9nJyxcbiAgICB9O1xuXG4gICAgaWYgKHBheWxvYWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nUGF5bG9hZF0gPSBwYXlsb2FkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNsb3NlRGlhbG9nLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHNlbmREaWFsb2dNZXNzYWdlQXN5bmMobWVzc2FnZTogc3RyaW5nLCB0YXJnZXREaWFsb2dVcmw/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2VuZERpYWxvZ01lc3NhZ2UnLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ01lc3NhZ2VdOiBtZXNzYWdlLFxuICAgIH07XG5cbiAgICBpZiAodGFyZ2V0RGlhbG9nVXJsKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1VybF0gPSB0YXJnZXREaWFsb2dVcmw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2VuZERpYWxvZ01lc3NhZ2UsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQ6IGJvb2xlYW4sIGV4dGVuc2lvblpvbmVJZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlclR5cGUoY2xpY2tUaHJvdWdoRW5hYmxlZCwgJ2Jvb2xlYW4nLCAnY2xpY2tUaHJvdWdoRW5hYmxlZCcpO1xuXG4gICAgaWYgKGV4dGVuc2lvblpvbmVJZCA9PT0gdW5kZWZpbmVkIHx8IGV4dGVuc2lvblpvbmVJZCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ0V4dGVuc2lvbiBJZCBpcyBpbnZhbGlkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvblpvbmVJZF06IGV4dGVuc2lvblpvbmVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DbGlja1Rocm91Z2hFbmFibGVkXTogY2xpY2tUaHJvdWdoRW5hYmxlZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2V0Q2xpY2tUaHJvdWdoLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vSW1wbC9Jbml0aWFsaXphdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFNldHRpbmdzU2VydmljZUltcGwgfSBmcm9tICcuL0ltcGwvU2V0dGluZ3NTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9JbXBsL1VJU2VydmljZUltcGwnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBbGxFeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyKTogdm9pZCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgU2V0dGluZ3NTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCBFeHRlbnNpb25zUmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFVJU2VydmljZUltcGwoZGlzcGF0Y2hlciwgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVySW5pdGlhbGl6YXRpb25FeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyKTogdm9pZCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCBFeHRlbnNpb25zUmVnaXN0cnlJZCkpO1xufVxuIiwiZXhwb3J0IGNvbnN0IEV4dGVuc2lvbnNSZWdpc3RyeUlkID0gMDtcbiIsIi8vIFRoaXMgZmlsZSByZS1leHBvcnRzIGV2ZXJ5dGhpbmcgd2hpY2ggaXMgcGFydCBvZiB0aGUgZXh0ZW5zaW9ucyBhcGkgcHVibGljIGludGVyZmFjZVxuXG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0Fza0RhdGFJbnRlcmZhY2VzJztcbmV4cG9ydCB7XG4gIEFwaU1lbnVUeXBlLFxuICBDcm9zc3RhYkZpbGVGb3JtYXQsXG4gIERldmljZVR5cGUsXG4gIEVtYmVkZGluZ0Vycm9yQ29kZXMsXG4gIFRhYmxlYXVFdmVudFR5cGUgYXMgRW1iZWRkaW5nVGFibGVhdUV2ZW50VHlwZSxcbiAgRmlsZUZvcm1hdHMsXG4gIFByaW50T3JpZW50YXRpb24sXG4gIFByaW50UGFnZVNpemUsXG4gIFByaW50U2NhbGluZyxcbiAgUHVsc2VFcnJvck1lc3NhZ2VWaXNpYmlsaXR5LFxuICBQdWxzZUxheW91dCxcbiAgUHVsc2VUaW1lRGltZW5zaW9uLFxuICBTaGVldFNpemVCZWhhdmlvcixcbiAgVGFibGVhdURpYWxvZ1R5cGUsXG4gIFRvb2xiYXIsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvRW51bXMnO1xuZXhwb3J0IHtcbiAgQ3VzdG9tVmlld0V2ZW50LFxuICBDdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudCBhcyBFbWJlZGRpbmdDdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudCxcbiAgRmlsdGVyQ2hhbmdlZEV2ZW50IGFzIEVtYmVkZGluZ0ZpbHRlckNoYW5nZWRFdmVudCxcbiAgTWFya3NTZWxlY3RlZEV2ZW50IGFzIEVtYmVkZGluZ01hcmtTZWxlY3RlZEV2ZW50LFxuICBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQgYXMgRW1iZWRkaW5nUGFyYW1ldGVyQ2hhbmdlZEV2ZW50LFxuICBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCBhcyBFbWJlZGRpbmdTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCxcbiAgVGFibGVhdVNoZWV0RXZlbnQgYXMgRW1iZWRkaW5nVGFibGVhdVNoZWV0RXZlbnQsXG4gIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBhcyBFbWJlZGRpbmdUYWJsZWF1V29ya3NoZWV0RXZlbnQsXG4gIFRvb2xiYXJTdGF0ZUNoYW5nZWRFdmVudCBhcyBFbWJlZGRpbmdUb29sYmFyU3RhdGVDaGFuZ2VkRXZlbnQsXG4gIEZpcnN0UHVsc2VNZXRyaWNTaXplS25vd25FdmVudCxcbiAgRmlyc3RWaXpTaXplS25vd25FdmVudCxcbiAgUHVsc2VFcnJvckV2ZW50LFxuICBQdWxzZUZpbHRlcnNDaGFuZ2VkRXZlbnQsXG4gIFB1bHNlTWV0cmljU2l6ZUNoYW5nZWRFdmVudCxcbiAgUHVsc2VJbnNpZ2h0RGlzY292ZXJlZEV2ZW50LFxuICBQdWxzZVRpbWVEaW1lbnNpb25DaGFuZ2VkRXZlbnQsXG4gIFB1bHNlVXJsQ2hhbmdlZEV2ZW50LFxuICBTdG9yeVBvaW50U3dpdGNoZWRFdmVudCxcbiAgVGFiU3dpdGNoZWRFdmVudCxcbiAgVXJsQWN0aW9uRXZlbnQsXG4gIFZpekxvYWRFcnJvckV2ZW50LFxuICBXb3JrYm9va1B1Ymxpc2hlZEFzRXZlbnQsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvRXZlbnRJbnRlcmZhY2VzJztcbmV4cG9ydCB7IFBhcmFtZXRlciBhcyBFbWJlZGRpbmdQYXJhbWV0ZXIgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1BhcmFtZXRlckludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9QdWxzZUludGVyZmFjZXMnO1xuZXhwb3J0IHtcbiAgQ29udGV4dE1lbnVPcHRpb25zLFxuICBFbWJlZGRpbmdBYnN0cmFjdFF1ZXJ5LFxuICBBdXRob3JpbmdXb3Jrc2hlZXQgYXMgRW1iZWRkaW5nQXV0aG9yaW5nV29ya3NoZWV0LFxuICBEYXNoYm9hcmQgYXMgRW1iZWRkaW5nRGFzaGJvYXJkLFxuICBEYXNoYm9hcmRPYmplY3QgYXMgRW1iZWRkaW5nRGFzaGJvYXJkT2JqZWN0LFxuICBTaGVldCBhcyBFbWJlZGRpbmdTaGVldCxcbiAgRW1iZWRkaW5nVml6U3RhdGVXaXRoRGF0YU1vZGVsLFxuICBXb3Jrc2hlZXQgYXMgRW1iZWRkaW5nV29ya3NoZWV0LFxuICBIaWVyYXJjaGljYWxMZXZlbHMsXG4gIFNoZWV0SW5mbyxcbiAgU2hlZXRTaXplLFxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1NoZWV0SW50ZXJmYWNlcyc7XG5leHBvcnQgeyBTdG9yeSwgU3RvcnlQb2ludCwgU3RvcnlQb2ludEluZm8gfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1N0b3J5SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1RhYmxlYXVFcnJvcic7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1ZpekludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9XZWJDb21wb25lbnRJbnRlcmZhY2VzJztcbmV4cG9ydCB7XG4gIEN1c3RvbVZpZXcsXG4gIEF1dGhvcmluZ1dvcmtib29rIGFzIEVtYmVkZGluZ0F1dGhvcmluZ1dvcmtib29rLFxuICBXb3JrYm9vayBhcyBFbWJlZGRpbmdXb3JrYm9vayxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9Xb3JrYm9va0ludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL1NoYXJlZEFwaUV4dGVybmFsQ29udHJhY3QnO1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBleHRlbnNpb25zIGFwaSBwdWJsaWMgaW50ZXJmYWNlXG5cbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL0V2ZW50SW50ZXJmYWNlJztcbmV4cG9ydCB7IERhc2hib2FyZENvbnRlbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQnO1xuZXhwb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0Vudmlyb25tZW50JztcbmV4cG9ydCB7IEV4dGVuc2lvbnMgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0V4dGVuc2lvbnMnO1xuZXhwb3J0IHsgU2V0dGluZ3MgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1NldHRpbmdzJztcbmV4cG9ydCB7XG4gIEVycm9yQ29kZXMsXG4gIEV4dGVuc2lvbkNvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUsXG4gIFRhYmxlYXVFdmVudFR5cGUsXG4gIFZpekltYWdlRW5jb2RpbmdUeXBlLFxuICBWaXpJbWFnZVBhbGV0dGVUeXBlLFxuICBWaXpJbWFnZVNpemVTZXR0aW5nQWxpZ25tZW50VHlwZSxcbiAgVml6SW1hZ2VTaXplU2V0dGluZ1R5cGUsXG4gIFZpekltYWdlU29ydERpcmVjdGlvblR5cGUsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvVGFibGVhdSc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1VJJztcbmV4cG9ydCB7IFdvcmtzaGVldENvbnRlbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1dvcmtzaGVldENvbnRlbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvUGFyYW1ldGVySW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUsXG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwLFxuICBEYXNoYm9hcmQgYXMgRXh0ZW5zaW9uRGFzaGJvYXJkLFxuICBEYXNoYm9hcmRPYmplY3QgYXMgRXh0ZW5zaW9uRGFzaGJvYXJkT2JqZWN0LFxuICBTaGVldCBhcyBFeHRlbnNpb25TaGVldCxcbiAgV29ya3NoZWV0IGFzIEV4dGVuc2lvbldvcmtzaGVldCxcbiAgUG9pbnQsXG4gIFpvbmVWaXNpYmlsaXR5TWFwLFxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9TaGVldEludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvVGFibGVhdUVycm9yJztcbmV4cG9ydCB7IFdvcmtib29rIGFzIEV4dGVuc2lvbldvcmtib29rIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvV29ya2Jvb2tJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vU2hhcmVkQXBpRXh0ZXJuYWxDb250cmFjdCc7XG4iLCIvKipcbiAqIFRoaXMgaXMgeW91ciBtYWluLiBUaGlzIGlzIHdoZXJlIHlvdSByZS1leHBvcnQgZXZlcnl0aGluZyB5b3Ugd2FudCB0byBiZSBwdWJsaWNseSBhdmFpbGFibGUuXG4gKlxuICogVGhlIGJ1aWxkIGVuZm9yY2VzIHRoYXQgdGhlIGZpbGUgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGdsb2JhbCB2YXJpYWJsZSB0aGF0IGlzIGV4cG9ydGVkLlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vRW1iZWRkaW5nQXBpRXh0ZXJuYWxDb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVuc2lvbnNBcGlFeHRlcm5hbENvbnRyYWN0JztcbiIsImltcG9ydCB7IFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MsIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIH0gZnJvbSAnLi9XZWJDb21wb25lbnRJbnRlcmZhY2VzJztcblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgPHRhYmxlYXUtYXNrLWRhdGE+IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgZW51bSBBc2tEYXRhQXR0cmlidXRlcyB7XG4gIE9yaWdpbiA9ICdvcmlnaW4nLFxuICBTaG93RW1iZWQgPSAnc2hvdy1lbWJlZCcsXG4gIFNob3dQaW4gPSAnc2hvdy1waW4nLFxuICBTaG93U2F2ZSA9ICdzaG93LXNhdmUnLFxuICBTaG93U2hhcmUgPSAnc2hvdy1zaGFyZScsXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc2tEYXRhU2V0dGluZ3MgZXh0ZW5kcyBXZWJDb21wb25lbnRTZXR0aW5nc1NoYXJlZCwgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW1iZWQgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHNob3ctZW1iZWQ+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd0VtYmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHBpbiBidXR0b24gaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgc2hvdy1waW4+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd1Bpbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzYXZlIGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBzaG93LXNhdmU+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd1NhdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc2hhcmUgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHNob3ctc2hhcmU+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd1NoYXJlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogIFVzZWQgZm9yIHRlbGVtZXRyeVxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIG9yaWdpbj1cImVtYmVkZGluZ1NpdGVcIj5cbiAgICogYGBgXG4gICAqL1xuICBvcmlnaW4/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGludGVyZmFjZSBmb3IgdGhlIHRvcCBsZXZlbCBBc2tEYXRhIG9iamVjdC5cbiAqIEBkZXByZWNhdGVkXG4gKiovXG5leHBvcnQgaW50ZXJmYWNlIEFza0RhdGEgZXh0ZW5kcyBBc2tEYXRhU2V0dGluZ3Mge31cbiIsIi8vIEFsbCBlbnVtIHZhbHVlcyBtYWRlIGF2YWlsYWJsZSB0byBFbWJlZGRpbmcgZGV2ZWxvcGVycy5cbi8vIEVudW1zIHNob3VsZCBiZSBrZXB0IGluIGFscGhhYmV0aWNhbCBvcmRlci5cbi8vIE1vc3Qgb2YgdGhlbSBzaG91bGQgbWF0Y2ggYW4gZW51bSBvbiB0aGUgc2VydmVyIGRlZmluZWQgYXRcbi8vIHdvcmtncm91cC92cWx3ZWIvc2NyaXB0c2hhcnAvc3JjL0FwaVNoYXJlZC9QdWJsaWNFbnVtcy5jcyNMMzk4OjE3XG5cbi8qKlxuICogQ3Jvc3N0YWIgZmlsZSBmb3JtYXRzIGF2YWlsYWJsZSB0byB1c2Ugd2l0aCB7QGxpbmsgVml6LmV4cG9ydENyb3NzdGFiQXN5bmN9XG4gKi9cbmV4cG9ydCBlbnVtIENyb3NzdGFiRmlsZUZvcm1hdCB7XG4gIENTViA9ICdjc3YnLFxuICBFeGNlbCA9ICd4bHN4Jyxcbn1cblxuLyoqXG4gKiBEZXZpY2UgdHlwZXMgYXZhaWxhYmxlIHRvIHVzZSB3aXRoIHtAbGluayBWaXouZGV2aWNlfVxuICovXG5leHBvcnQgZW51bSBEZXZpY2VUeXBlIHtcbiAgRGVmYXVsdCA9ICdkZWZhdWx0JyxcbiAgRGVza3RvcCA9ICdkZXNrdG9wJyxcbiAgVGFibGV0ID0gJ3RhYmxldCcsXG4gIFBob25lID0gJ3Bob25lJyxcbn1cblxuLyoqXG4gKiBBbGwgZXJyb3IgY29kZXMgdXNlZCBieSB0aGUgRW1iZWRkaW5nIEFQSS5cbiAqL1xuZXhwb3J0IGVudW0gRW1iZWRkaW5nRXJyb3JDb2RlcyB7XG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBhIHJlcXVlc3QgdG8gdGhlIGF1dGggZW5kcG9pbnQgZmFpbHMuXG4gICAqL1xuICBBdXRoRmFpbGVkID0gJ2F1dGgtZmFpbGVkJyxcbiAgLyoqXG4gICAqIFRoZSBicm93c2VyIGlzIG5vdCBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgdGhlIFRhYmxlYXUgRW1iZWRkaW5nIEFQSVxuICAgKi9cbiAgQnJvd3Nlck5vdENhcGFibGUgPSAnYnJvd3Nlci1ub3QtY2FwYWJsZScsXG4gIC8qKlxuICAgKiBUaGUgcGVybWlzc2lvbnMgb24gYSB3b3JrYm9vayBvciBhIHZpZXcgZG8gbm90IGFsbG93IGRvd25sb2FkaW5nIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIERvd25sb2FkV29ya2Jvb2tOb3RBbGxvd2VkID0gJ2Rvd25sb2FkLXdvcmtib29rLW5vdC1hbGxvd2VkJyxcbiAgLyoqXG4gICAqIFRocm93biB3aGVuIGFuIGVycm9yIG9jY3VycyB3aGlsZSBhdHRlbXB0aW5nIHRvIHBlcmZvcm0gYSBmaWx0ZXIgb3BlcmF0aW9uLlxuICAgKi9cbiAgRmlsdGVyQ2Fubm90QmVQZXJmb3JtZWQgPSAnZmlsdGVyLWNhbm5vdC1iZS1wZXJmb3JtZWQnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBzd2l0Y2ggdG8gYSBzaGVldCBieSBpbmRleCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIEluZGV4T3V0T2ZSYW5nZSA9ICdpbmRleC1vdXQtb2YtcmFuZ2UnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJzIHdpdGhpbiB0aGUgVGFibGVhdSBFbWJlZGRpbmcgQVBJLiBDb250YWN0IFRhYmxlYXUgU3VwcG9ydC5cbiAgICovXG4gIEludGVybmFsRXJyb3IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBjdXN0b20gdmlldyB0aGF0IGRvZXMgbm90IGV4aXN0LlxuICAgKi9cbiAgSW52YWxpZEN1c3RvbVZpZXdOYW1lID0gJ2ludmFsaWQtY3VzdG9tLXZpZXctbmFtZScsXG4gIC8qKlxuICAgKiBBbiBpbnZhbGlkIGRhdGUgd2FzIHNwZWNpZmllZCBpbiBhIG1ldGhvZCB0aGF0IHJlcXVpcmVkIGEgZGF0ZSBwYXJhbWV0ZXIuXG4gICAqL1xuICBJbnZhbGlkRGF0ZVBhcmFtZXRlciA9ICdpbnZhbGlkLWRhdGUtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEVpdGhlciBhIGZpbHRlciBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGZpZWxkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGEgc291cmNlLCBvciB0aGUgdmFsdWUgc3VwcGxpZWRcbiAgICogaW4gdGhlIGZpbHRlciBvcGVyYXRpb24gaXMgdGhlIHdyb25nIGRhdGEgdHlwZSBvciBmb3JtYXQuXG4gICAqL1xuICBpbnZhbGlkRmlsdGVyRmllbGROYW1lT3JWYWx1ZSA9ICdpbnZhbGlkLWZpbHRlci1maWVsZC1uYW1lJyxcbiAgLyoqXG4gICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZVxuICAgKiBmaWVsZC5cbiAgICovXG4gIEludmFsaWRQYXJhbWV0ZXIgPSAnaW52YWxpZC1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogVGhlIGN1cnJlbnRseSBhcHBsaWVkIHRpbWUgZGltZW5zaW9uIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIG9yIGlzIGludmFsaWQuXG4gICAqL1xuICBJbnZhbGlkVGltZURpbWVuc2lvbiA9ICdpbnZhbGlkLXRpbWUtZGltZW5zaW9uJyxcbiAgLyoqXG4gICAqIEEgbmVnYXRpdmUgc2l6ZSB3YXMgc3BlY2lmaWVkIG9yIHRoZSBtYXhTaXplIHZhbHVlIGlzIGxlc3MgdGhhbiBtaW5TaXplIGluIFNoZWV0LmNoYW5nZVNpemVBc3luYygpLlxuICAgKi9cbiAgSW52YWxpZFNpemUgPSAnaW52YWxpZC1zaXplJyxcbiAgLyoqXG4gICAqIEF0dGVtcHRlZCB0byBnZXQgYW4gYXV0aG9yaW5nIHdvcmtzaGVldCB3aGVuIHRoZSBjdXJyZW50IHNoZWV0IGlzIG5vdCBhIHdvcmtzaGVldC5cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgSW52YWxpZFNoZWV0VHlwZSA9ICdpbnZhbGlkLXNoZWV0LXR5cGUnLFxuICAvKipcbiAgICogQSBiZWhhdmlvciB2YWx1ZSB3YXMgZm91bmQgdGhhdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIFNoZWV0U2l6ZUJlaGF2aW9yIGVudW0uXG4gICAqL1xuICBJbnZhbGlkU2l6ZUJlaGF2aW9yID0gJ2ludmFsaWQtc2l6ZS1iZWhhdmlvcicsXG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIG90aGVyIHRoYW4gU2hlZXRTaXplQmVoYXZpb3IuQXV0b21hdGljIHdhcyBzcGVjaWZpZWQgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkgd2hlbiB0aGUgc2hlZXQgaXMgYVxuICAgKiBXb3Jrc2hlZXQgaW5zdGFuY2UuXG4gICAqL1xuICBJbnZhbGlkU2l6ZUJlaGF2aW9yT25Xb3Jrc2hlZXQgPSAnaW52YWxpZC1zaXplLWJlaGF2aW9yLW9uLXdvcmtzaGVldCcsXG4gIC8qKlxuICAgKiBUaGUgVVJMIHNwZWNpZmllZCBpbiB0aGUgVml6IGNsYXNzIGNvbnN0cnVjdG9yIGlzIG5vdCB2YWxpZC5cbiAgICovXG4gIEludmFsaWRVcmwgPSAnaW52YWxpZC11cmwnLFxuICAvKipcbiAgICogVGhlIG1heFNpemUgZmllbGQgaXMgbWlzc2luZyBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKSB3aGVuIHNwZWNpZnlpbmcgU2hlZXRTaXplQmVoYXZpb3IuQXRNb3N0LlxuICAgKi9cbiAgTWlzc2luZ01heFNpemUgPSAnbWlzc2luZy1tYXgtc2l6ZScsXG4gIC8qKlxuICAgKiBUaGUgbWluU2l6ZSBmaWVsZCBpcyBtaXNzaW5nIGluIFNoZWV0LmNoYW5nZVNpemVBc3luYygpIHdoZW4gc3BlY2lmeWluZyBTaGVldFNpemVCZWhhdmlvci5BdExlYXN0LlxuICAgKi9cbiAgTWlzc2luZ01pblNpemUgPSAnbWlzc2luZy1taW4tc2l6ZScsXG4gIC8qKlxuICAgKiBUaGUgbWluU2l6ZSBvciBtYXhTaXplIGZpZWxkIGlzIG1pc3NpbmcgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkgd2hlbiBzcGVjaWZ5aW5nIFNoZWV0U2l6ZUJlaGF2aW9yLlJhbmdlLlxuICAgKi9cbiAgTWlzc2luZ01pbk1heFNpemUgPSAnbWlzc2luZy1taW4tbWF4LXNpemUnLFxuICAvKipcbiAgICogQ2FuIG9jY3VyIGlmIHRoZSBlbWJlZGRpbmcgYXBwIGludGVyYWN0cyB3aXRoIGEgcGFyYW1ldGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAqL1xuICBNaXNzaW5nUGFyYW1ldGVyID0gJ21pc3NpbmctcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIFRoZSByYW5nZU4gZmllbGQgaXMgbWlzc2luZyBmb3IgYSByZWxhdGl2ZSBkYXRlIGZpbHRlciBvZiB0eXBlIExBU1ROIG9yIE5FWFROLlxuICAgKi9cbiAgTWlzc2luZ1JhbmdlTkZvclJlbGF0aXZlRGF0ZUZpbHRlcnMgPSAnbWlzc2luZy1yYW5nZS1uLWZvci1yZWxhdGl2ZS1kYXRlLWZpbHRlcnMnLFxuICAvKipcbiAgICogQW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBhY2Nlc3MgU2hlZXQuZ2V0VXJsKCkgb24gYSBoaWRkZW4gc2hlZXQuIEhpZGRlbiBzaGVldHMgZG8gbm90IGhhdmUgVVJMcy5cbiAgICovXG4gIE5vVXJsRm9ySGlkZGVuV29ya3NoZWV0ID0gJ25vLXVybC1mb3ItaGlkZGVuLXdvcmtzaGVldCcsXG4gIC8qKlxuICAgKiBPbmUgb3IgYm90aCBvZiB0aGUgcGFyZW50RWxlbWVudCBvciB0aGUgVVJMIHBhcmFtZXRlcnMgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgVml6IGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgTm9VcmxPclBhcmVudEVsZW1lbnROb3RGb3VuZCA9ICduby11cmwtb3ItcGFyZW50LWVsZW1lbnQtbm90LWZvdW5kJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgc2hlZXQgdGhhdCBpcyBub3QgYWN0aXZlIG9yIGVtYmVkZGVkIHdpdGhpbiB0aGUgYWN0aXZlIGRhc2hib2FyZC5cbiAgICovXG4gIE5vdEFjdGl2ZVNoZWV0ID0gJ25vdC1hY3RpdmUtc2hlZXQnLFxuICAvKipcbiAgICogQSByZXF1aXJlZCBwYXJhbWV0ZXIgd2FzIG5vdCBzcGVjaWZpZWQsIG51bGwsIG9yIGFuIGVtcHR5IHN0cmluZy9hcnJheS5cbiAgICovXG4gIE51bGxPckVtcHR5UGFyYW1ldGVyID0gJ251bGwtb3ItZW1wdHktcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgc2hlZXQgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgd29ya2Jvb2suXG4gICAqL1xuICBTaGVldE5vdEluV29ya2Jvb2sgPSAnc2hlZXQtbm90LWluLXdvcmtib29rJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgb24gYSBDdXN0b21WaWV3IG9iamVjdCB0aGF0IGlzIG5vIGxvbmdlciB2YWxpZCAoaXQgaGFzIGJlZW4gcmVtb3ZlZCkuXG4gICAqL1xuICBTdGFsZURhdGFSZWZlcmVuY2UgPSAnc3RhbGUtZGF0YS1yZWZlcmVuY2UnLFxuICAvKipcbiAgICogVW5rbm93biBlcnJvciB0cmlnZ2VyZWQgZHVyaW5nIHRoZSBhdXRoIGZsb3cuXG4gICAqL1xuICBVbmtub3duQXV0aEVycm9yID0gJ3Vua25vd24tYXV0aC1lcnJvcicsXG4gIC8qKlxuICAgKiBBbiB1bmtub3duIGV2ZW50IG5hbWUgd2FzIHNwZWNpZmllZCBpbiB0aGUgY2FsbCB0byBWaXouYWRkRXZlbnRMaXN0ZW5lciBvciBWaXoucmVtb3ZlRXZlbnRMaXN0ZW5lci5cbiAgICovXG4gIFVuc3VwcG9ydGVkRXZlbnROYW1lID0gJ3Vuc3VwcG9ydGVkLWV2ZW50LW5hbWUnLFxuICAvKipcbiAgICogQSBWaXogb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCBhcyBhIGNoaWxkIG9mIHRoZSBwYXJlbnRFbGVtZW50IHNwZWNpZmllZCBpbiB0aGUgVml6IGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgVml6QWxyZWFkeUluTWFuYWdlciA9ICd2aXotYWxyZWFkeS1pbi1tYW5hZ2VyJyxcbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGVtYmVkZGluZyBhcGkuXG4gICAqL1xuICBJbXBsZW1lbnRhdGlvbkVycm9yID0gJ3dyb25nLWltcGxlbWVudGF0aW9uJyxcbiAgLyoqXG4gICAqIEBOb3RJbXBsZW1lbnRlZFxuICAgKi9cbiAgTm90SW1wbGVtZW50ZWQgPSAnbm90LWltcGxlbWVudGVkJyxcbiAgLyoqXG4gICAqIFVua25vd24gZXJyb3IgZHVyaW5nIGV2ZW50IGluaXRpYWxpemF0aW9uXG4gICAqL1xuICBFdmVudEluaXRpYWxpemF0aW9uRXJyb3IgPSAnZXZlbnQtaW5pdGlhbGl6YXRpb24tZXJyb3InLFxuICAvKipcbiAgICogVmVyc2lvbiBvZiB0aGUgZW1iZWRkaW5nIGFwaSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB2ZXJzaW9uIG9mIHRhYmxlYXVcbiAgICovXG4gIEluY29tcGF0aWJsZVZlcnNpb25FcnJvciA9ICdpbmNvbXBhdGlibGUtdmVyc2lvbi1lcnJvcicsXG5cbiAgLyoqXG4gICAqIFVua25vd24ge0BsaW5rIFRhYmxlYXVEaWFsb2dUeXBlfSBwYXNzZWQgaW4gdG8gVml6LmRpc3BsYXlEaWFsb2dBc3luYy5cbiAgICovXG4gIFVua25vd25EaWFsb2dUeXBlID0gJ3Vua25vd24tZGlhbG9nLXR5cGUnLFxuXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgaWYgdGhlIEFQSSBpbnRlcmFjdHMgd2l0aCBhIGZpbHRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgKiBDYW4gYWxzbyBvY2N1cnMgaWYgYSB7QGxpbmsgRmlsdGVyVHlwZX0gaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkLlxuICAgKi9cbiAgRmlsdGVyTWlzc2luZ09yTm90SW1wbGVtZW50ZWQgPSAnZmlsdGVyLW1pc3Npbmctbm90LWltcGxlbWVudGVkJyxcblxuICAvKipcbiAgICogQ2FuIG9jY3VyIGlmIHN0b3J5IHBvaW50IGlkcyBubyBsb25nZXIgbWF0Y2guXG4gICAqL1xuICBTdG9yeVBvaW50SWRNaXNtYXRjaCA9ICdzdG9yeXBvaW50LWlkLW1pc21hdGNoJyxcbn1cblxuLyoqXG4gKiBGb3JtYXRzIGF2YWlsYWJsZSB0byB1c2Ugd2l0aCBkaXNwbGF5U3RhdGljSW1hZ2UgaW4gQFZpekludGVyZmFjZXNcbiAqL1xuZXhwb3J0IGVudW0gRmlsZUZvcm1hdHMge1xuICBQREYgPSAncGRmJyxcbiAgUE5HID0gJ3BuZycsXG59XG5cbmV4cG9ydCBlbnVtIFByaW50T3JpZW50YXRpb24ge1xuICBQb3J0cmFpdCA9ICdwb3J0cmFpdCcsXG4gIExhbmRzY2FwZSA9ICdsYW5kc2NhcGUnLFxufVxuXG5leHBvcnQgZW51bSBQcmludFBhZ2VTaXplIHtcbiAgTGV0dGVyID0gJ2xldHRlcicsXG4gIExlZ2FsID0gJ2xlZ2FsJyxcbiAgTm90ZSA9ICdub3RlJyxcbiAgRm9saW8gPSAnZm9saW8nLFxuICBUYWJsb2lkID0gJ3RhYmxvaWQnLFxuICBMZWRnZXIgPSAnbGVkZ2VyJyxcbiAgU3RhdGVtZW50ID0gJ3N0YXRlbWVudCcsXG4gIEV4ZWN1dGl2ZSA9ICdleGVjdXRpdmUnLFxuICBBMyA9ICdBMycsXG4gIEE0ID0gJ0E0JyxcbiAgQTUgPSAnQTUnLFxuICBCNCA9ICdCNCcsXG4gIEI1ID0gJ0I1JyxcbiAgUXVhcnRvID0gJ3F1YXJ0bycsXG4gIFVuc3BlY2lmaWVkID0gJ3Vuc3BlY2lmaWVkJyxcbn1cblxuZXhwb3J0IGVudW0gUHJpbnRTY2FsaW5nIHtcbiAgQXV0b21hdGljID0gJ2F1dG9tYXRpYycsXG4gIFBlcmMyNSA9ICcyNSUnLFxuICBQZXJjNTAgPSAnNTAlJyxcbiAgUGVyYzYwID0gJzYwJScsXG4gIFBlcmM3NSA9ICc3NSUnLFxuICBQZXJjODAgPSAnODAlJyxcbiAgUGVyYzkwID0gJzkwJScsXG4gIFBlcmMxMDAgPSAnMTAwJScsXG4gIFBlcmMyMDAgPSAnMjAwJScsXG4gIFBlcmM0MDAgPSAnNDAwJScsXG4gIEF0TW9zdDFQYWdlSGlnaCA9ICdhdC1tb3N0LTEtcGFnZS1oaWdoJyxcbiAgQXRNb3N0MlBhZ2VzSGlnaCA9ICdhdC1tb3N0LTItcGFnZXMtaGlnaCcsXG4gIEF0TW9zdDFQYWdlV2lkZSA9ICdhdC1tb3N0LTEtcGFnZS13aWRlJyxcbiAgQXRNb3N0MlBhZ2VzV2lkZSA9ICdhdC1tb3N0LTItcGFnZXMtd2lkZScsXG59XG5cbmV4cG9ydCBlbnVtIFJldmVydFZpelNlbGVjdGlvbiB7XG4gIEFsbCA9ICdhbGwnLFxuICBBeGVzID0gJ2F4ZXMnLFxuICBGaWx0ZXJzID0gJ2ZpbHRlcnMnLFxuICBTb3J0cyA9ICdzb3J0cycsXG4gIFNoZWx2ZXMgPSAnc2hlbHZlcycsXG59XG5cbmV4cG9ydCBlbnVtIFRvb2xiYXJCdXR0b25zIHtcbiAgQWxlcnRzID0gJ2FsZXJ0cycsXG4gIEFza0RhdGEgPSAnYXNrRGF0YScsXG4gIEN1c3RvbVZpZXdzID0gJ2N1c3RvbVZpZXdzJyxcbiAgRGF0YURldGFpbHMgPSAnZGF0YURldGFpbHMnLFxuICBTaGFyZSA9ICdzaGFyZScsXG4gIFN1YnNjcmliZSA9ICdzdWJzY3JpYmUnLFxufVxuXG5leHBvcnQgZW51bSBUb29sYmFyIHtcbiAgVG9wID0gJ3RvcCcsXG4gIEJvdHRvbSA9ICdib3R0b20nLFxuICBIaWRkZW4gPSAnaGlkZGVuJyxcbn1cblxuZXhwb3J0IGVudW0gU2hlZXRTaXplQmVoYXZpb3Ige1xuICBBdXRvbWF0aWMgPSAnYXV0b21hdGljJyxcbiAgRXhhY3RseSA9ICdleGFjdGx5JyxcbiAgUmFuZ2UgPSAncmFuZ2UnLFxuICBBdExlYXN0ID0gJ2F0bGVhc3QnLFxuICBBdE1vc3QgPSAnYXRtb3N0Jyxcbn1cblxuZXhwb3J0IGVudW0gUHVsc2VMYXlvdXQge1xuICBEZWZhdWx0ID0gJ2RlZmF1bHQnLFxuICBDYXJkID0gJ2NhcmQnLFxuICBCYW4gPSAnYmFuJyxcbn1cblxuZXhwb3J0IGVudW0gUHVsc2VUaW1lRGltZW5zaW9uIHtcbiAgVG9kYXkgPSAnVG9kYXknLFxuICBZZXN0ZXJkYXkgPSAnWWVzdGVyZGF5JyxcbiAgV2Vla1RvRGF0ZSA9ICdXZWVrVG9EYXRlJyxcbiAgTGFzdFdlZWsgPSAnTGFzdFdlZWsnLFxuICBNb250aFRvRGF0ZSA9ICdNb250aFRvRGF0ZScsXG4gIExhc3RNb250aCA9ICdMYXN0TW9udGgnLFxuICBRdWFydGVyVG9EYXRlID0gJ1F1YXJ0ZXJUb0RhdGUnLFxuICBMYXN0UXVhcnRlciA9ICdMYXN0UXVhcnRlcicsXG4gIFllYXJUb0RhdGUgPSAnWWVhclRvRGF0ZScsXG4gIExhc3RZZWFyID0gJ0xhc3RZZWFyJyxcbn1cblxuZXhwb3J0IGVudW0gUHVsc2VFcnJvck1lc3NhZ2VWaXNpYmlsaXR5IHtcbiAgVmlzaWJsZSA9ICd2aXNpYmxlJyxcbiAgSGlkZGVuID0gJ2hpZGRlbicsXG4gIFN1cHByZXNzZWQgPSAnc3VwcHJlc3NlZCcsXG59XG5cbi8qKlxuICogQmUgY2FyZWZ1bCB3aGVuIGFkZGluZyBuZXcgZXZlbnQgdHlwZXMuIEV4dGVuc2lvbnMgYW5kIGVtYmVkZGluZyBmb2xsb3cgdHdvIGRpZmZlcmVudCBwYXR0ZXJucyBvbiBob3cgZXZlbnRzIGFyZSBuYW1lZC5cbiAqIEV2ZW50cyBzaG91bGQgYmUgYWxsIGxvd2VyIGNhc2UgYW5kIHdpdGhvdXQgaHlwaGVucyBvciB1bmRlcnNjb3Jlcy5cbiAqL1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHR5cGUgb2YgdGFibGVhdSBlbWJlZGRpbmcgZXZlbnQgdGhhdCBjYW4gYmUgbGlzdGVuZWQgZm9yLlxuICovXG5leHBvcnQgZW51bSBUYWJsZWF1RXZlbnRUeXBlIHtcbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGZpbmlzaGVkIGxvYWRpbmcuIFRoaXMgZXZlbnQgaXMgcmFpc2VkIGFmdGVyIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBmb3Ige0BsaW5rIEZpcnN0SW50ZXJhY3RpdmV9IChpZiBhbnkpIGhhcyBiZWVuIGNhbGxlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbVZpZXdMb2FkZWQgPSAnY3VzdG9tdmlld2xvYWRlZCcsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gcmVtb3ZlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbVZpZXdSZW1vdmVkID0gJ2N1c3RvbXZpZXdyZW1vdmVkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgYmVlbiBzYXZlZCAobmV3bHkgY3JlYXRlZCBvciB1cGRhdGVkKS5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbVZpZXdTYXZlZCA9ICdjdXN0b212aWV3c2F2ZWQnLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNldCBhcyB0aGUgZGVmYXVsdCB2aWV3IGZvciBhIHdvcmtib29rLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgQ3VzdG9tVmlld1NldERlZmF1bHQgPSAnY3VzdG9tdmlld3NldGRlZmF1bHQnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIEVkaXQgQnV0dG9uLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgRWRpdEJ1dHRvbkNsaWNrZWQgPSAnZWRpdGJ1dHRvbmNsaWNrZWQnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIEVkaXQgSW4gRGVza3RvcCBCdXR0b24uXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmcsIFZpZXdpbmdcbiAgICovXG4gIEVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkID0gJ2VkaXRpbmRlc2t0b3BidXR0b25jbGlja2VkJyxcblxuICAvKiogUmFpc2VkIHdoZW4gYW55IGZpbHRlciBoYXMgY2hhbmdlZCBzdGF0ZS4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgRmlsdGVyQ2hhbmdlZCA9ICdmaWx0ZXJjaGFuZ2VkJyxcblxuICAvKiogRmlyZWQgd2hlbiB2aXogc2l6ZSBpcyBrbm93blxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nLCBWaWV3aW5nXG4gICAqL1xuICBGaXJzdFZpelNpemVLbm93biA9ICdmaXJzdHZpenNpemVrbm93bicsXG5cbiAgLyoqIEZpcmVkIHdoZW4gYSB2aXogZmlyc3QgYmVjb21lcyBpbnRlcmFjdGl2ZVxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nLCBWaWV3aW5nLCBQdWxzZVxuICAgKi9cbiAgRmlyc3RJbnRlcmFjdGl2ZSA9ICdmaXJzdGludGVyYWN0aXZlJyxcblxuICAvKiogUmFpc2VkIHdoZW4gYSBjdXN0b20gbWFyayBjb250ZXh0IG1lbnUgaXMgY2xpY2tlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50ID0gJ2N1c3RvbW1hcmtjb250ZXh0bWVudScsXG5cbiAgLyoqIFRoZSBzZWxlY3RlZCBtYXJrcyBvbiBhIHZpc3VhbGl6YXRpb24gaGF2ZSBjaGFuZ2VkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBNYXJrU2VsZWN0aW9uQ2hhbmdlZCA9ICdtYXJrc2VsZWN0aW9uY2hhbmdlZCcsXG5cbiAgLyoqIEEgcGFyYW1ldGVyIGhhcyBoYWQgaXRzIHZhbHVlIG1vZGlmaWVkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBbW1BhcmFtZXRlcl1dIG9iamVjdHMuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlcmNoYW5nZWQnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiBhIHRvb2xiYXIgYnV0dG9uIG9yIGNvbnRyb2wgYmVjb21lcyBhdmFpbGFibGUgb3IgYmVjb21lcyB1bmF2YWlsYWJsZS5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFRvb2xiYXJTdGF0ZUNoYW5nZWQgPSAndG9vbGJhcnN0YXRlY2hhbmdlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vayBpcyByZWFkeSB0byBjbG9zZS4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZ1xuICAgKi9cbiAgV29ya2Jvb2tSZWFkeVRvQ2xvc2UgPSAnd29ya2Jvb2tyZWFkeXRvY2xvc2UnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiB0aGUgd29ya2Jvb2sgaGFzIGJlZW4gcHVibGlzaGVkLiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW4gdXNpbmcgZW1iZWRkZWQgd2ViIGF1dGhvcmluZyBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nXG4gICAqL1xuICBXb3JrYm9va1B1Ymxpc2hlZCA9ICd3b3JrYm9va3B1Ymxpc2hlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIFwicHVibGlzaCBhc1wiIGlzIHN1Y2Nlc3NmdWwuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmdcbiAgICovXG4gIFdvcmtib29rUHVibGlzaGVkQXMgPSAnd29ya2Jvb2twdWJsaXNoZWRhcycsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgVVJMIGFjdGlvbiBvY2N1cnMuIFNlZSB0aGUge0BsaW5rIFVybEFjdGlvbkV2ZW50fSBjbGFzcy5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFVybEFjdGlvbiA9ICd1cmxhY3Rpb24nLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgYWZ0ZXIgYSB0YWIgc3dpdGNoIG9jY3VycyAodGhlIGFjdGl2ZSBzaGVldCBoYXMgY2hhbmdlZCkuIEd1YXJhbnRlZXMgdGhlIHZpeiBvYmplY3Qgd2lsbCBiZSBpbnRlcmFjdGl2ZSBhZnRlciB0aGlzLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgVGFiU3dpdGNoZWQgPSAndGFic3dpdGNoZWQnLFxuICAvKipcbiAgICpcbiAgICogUmFpc2VkIGFmdGVyIGEgbmV3IHN0b3J5IHBvaW50IGJlY29tZXMgYWN0aXZlLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgU3RvcnlQb2ludFN3aXRjaGVkID0gJ3N0b3J5cG9pbnRzd2l0Y2hlZCcsXG4gIC8qKlxuICAgKlxuICAgKiBSYWlzZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgbG9hZGluZyB0aGUgY29udGVudHMgb2YgdGhlIHdlYmNvbXBvbmVudC5cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZywgQXNrRGF0YVxuICAgKi9cbiAgVml6TG9hZEVycm9yID0gJ3ZpemxvYWRlcnJvcicsXG4gIC8qKlxuICAgKiBSYWlzZWQgYWZ0ZXIgdGhlIGlmcmFtZSBzcmMgYXR0cmlidXRlIGhhcyBiZWVuIHVwZGF0ZWRcbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZywgQXNrRGF0YVxuICAgKi9cbiAgSWZyYW1lU3JjVXBkYXRlZCA9ICdpZnJhbWVzcmN1cGRhdGVkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gY2hhbmdlcyBhcmUgbWFkZSB0byBzdW1tYXJ5IGRhdGEuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBTdW1tYXJ5RGF0YUNoYW5nZWQgPSAnc3VtbWFyeWRhdGFjaGFuZ2VkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gdGFibGVhdSAodml6LWNsaWVudCkgaXMgcmVhZHkgdG8gcmVjZWl2ZSBhbiBhdXRoIHRva2VuLlxuICAgKiBVc2VkIGZvciBhdXRoZW50aWNhdGlvbiBpbiBzYWxlc2ZvcmNlIG5hdGl2ZSBtb2RlLlxuICAgKlxuICAgKiBAaGlkZGVuXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmcsIFZpZXdpbmcsXG4gICAqL1xuICBSZWFkeVRvUmVjZWl2ZUF1dGhUb2tlbiA9ICdyZWFkeXRvcmVjZWl2ZWF1dGh0b2tlbicsXG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gdGhlIFB1bHNlIG1ldHJpYyBzaXplIGlzIGtub3duXG4gICAqXG4gICAqIEBjYXRlZ29yeSBQdWxzZVxuICAgKi9cbiAgRmlyc3RQdWxzZU1ldHJpY1NpemVLbm93biA9ICdmaXJzdHB1bHNlbWV0cmljc2l6ZWtub3duJyxcblxuICAvKipcbiAgICogRmlyZWQgd2hlbiBhbiBpbnRlcm5hbCBQdWxzZSBlcnJvciBpcyBlbmNvdW50ZXJlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IFB1bHNlXG4gICAqL1xuICBQdWxzZUVycm9yID0gJ3B1bHNlZXJyb3InLFxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSBQdWxzZSBmaWx0ZXJzIGNoYW5nZVxuICAgKlxuICAgKiBAY2F0ZWdvcnkgUHVsc2VcbiAgICovXG4gIFB1bHNlRmlsdGVyc0NoYW5nZWQgPSAncHVsc2VmaWx0ZXJzY2hhbmdlZCcsXG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gYSBQdWxzZSBpbnNpZ2h0IGlzIGRpc2NvdmVyZWRcbiAgICpcbiAgICogQGNhdGVnb3J5IFB1bHNlXG4gICAqL1xuICBQdWxzZUluc2lnaHREaXNjb3ZlcmVkID0gJ3B1bHNlaW5zaWdodGRpc2NvdmVyZWQnLFxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSBQdWxzZSBtZXRyaWMgc2l6ZSBjaGFuZ2VzXG4gICAqXG4gICAqIEBjYXRlZ29yeSBQdWxzZVxuICAgKi9cbiAgUHVsc2VNZXRyaWNTaXplQ2hhbmdlZCA9ICdwdWxzZW1ldHJpY3NpemVjaGFuZ2VkJyxcblxuICAvKipcbiAgICogRmlyZWQgd2hlbiB0aGUgUHVsc2UgbWV0cmljIHRpbWUgZGltZW5zaW9uIGNoYW5nZXNcbiAgICpcbiAgICogQGNhdGVnb3J5IFB1bHNlXG4gICAqL1xuICBQdWxzZVRpbWVEaW1lbnNpb25DaGFuZ2VkID0gJ3B1bHNldGltZWRpbWVuc2lvbmNoYW5nZWQnLFxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSBQdWxzZSBVUkwgY2hhbmdlc1xuICAgKlxuICAgKiBAY2F0ZWdvcnkgUHVsc2VcbiAgICovXG4gIFB1bHNlVXJsQ2hhbmdlZCA9ICdwdWxzZXVybGNoYW5nZWQnLFxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGxvY2F0aW9uIG9mIGEgY29udGV4dCBtZW51IHdoZXJlIHVzZXJzIGNhbiBhZGQgZXh0ZXJuYWwgbWVudSBpdGVtcy5cbiAqL1xuZXhwb3J0IGVudW0gQXBpTWVudVR5cGUge1xuICAvKiogRXh0ZXJuYWwgbWVudSBpdGVtIHdpbGwgYmUgaW5qZWN0ZWQgaW4gdWJlcnRpcCBkaWFsb2cgKi9cbiAgVWJlcnRpcCA9ICd1YmVydGlwJyxcbn1cblxuLyoqIFlvdSBjYW4gdXNlIHRoaXMgdHlwZSB3aXRoIGEge0BsaW5rIFZpen0gb2JqZWN0LiAqL1xuZXhwb3J0IGVudW0gVGFibGVhdURpYWxvZ1R5cGUge1xuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBkb3dubG9hZCBQREYgZGlhbG9nLlxuICAgKi9cbiAgRXhwb3J0UERGID0gJ2V4cG9ydC1wZGYnLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBkb3dubG9hZCBQb3dlclBvaW50IGRpYWxvZy5cbiAgICovXG4gIEV4cG9ydFBvd2VyUG9pbnQgPSAnZXhwb3J0LXBvd2VycG9pbnQnLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBkb3dubG9hZCBEYXRhIGRpYWxvZy5cbiAgICovXG4gIEV4cG9ydERhdGEgPSAnZXhwb3J0LWRhdGEnLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBkb3dubG9hZCBDcm9zc1RhYiBkaWFsb2cuXG4gICAqL1xuICBFeHBvcnRDcm9zc1RhYiA9ICdleHBvcnQtY3Jvc3MtdGFiJyxcbiAgLyoqXG4gICAqIFVzZWQgdG8gZGlzcGxheSB0aGUgZG93bmxvYWQgV29ya2Jvb2sgZGlhbG9nLlxuICAgKi9cbiAgRXhwb3J0V29ya2Jvb2sgPSAnZXhwb3J0LXdvcmtib29rJyxcbiAgLyoqXG4gICAqIFVzZWQgdG8gZGlzcGxheSB0aGUgU2hhcmUgZGlhbG9nLlxuICAgKi9cbiAgU2hhcmUgPSAnc2hhcmUnLFxufVxuIiwiaW1wb3J0IHsgRmlsdGVyT3B0aW9ucyB9IGZyb20gJy4uL1NoYXJlZC9GaWx0ZXJJbnRlcmZhY2VzJztcbmltcG9ydCB7IEZpbHRlckRvbWFpblR5cGUsIEZpbHRlclR5cGUsIEZpbHRlclVwZGF0ZVR5cGUgfSBmcm9tICcuLi9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1JztcbmltcG9ydCB7IFB1bHNlTGF5b3V0LCBQdWxzZVRpbWVEaW1lbnNpb24gfSBmcm9tICcuL0VudW1zJztcbmltcG9ydCB7IFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MgfSBmcm9tICcuL1dlYkNvbXBvbmVudEludGVyZmFjZXMnO1xuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSA8dGFibGVhdS1wdWxzZT4gd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGVudW0gUHVsc2VBdHRyaWJ1dGVzIHtcbiAgRGlzYWJsZUV4cGxvcmVGaWx0ZXIgPSAnZGlzYWJsZS1leHBsb3JlLWZpbHRlcicsXG4gIExheW91dCA9ICdsYXlvdXQnLFxuICBPbkZpcnN0SW50ZXJhY3RpdmUgPSAnb25GaXJzdEludGVyYWN0aXZlJyxcbiAgT25GaXJzdFB1bHNlTWV0cmljU2l6ZUtub3duID0gJ29uRmlyc3RQdWxzZU1ldHJpY1NpemVLbm93bicsXG4gIE9uUHVsc2VVcmxFcnJvciA9ICdvblB1bHNlRXJyb3InLFxuICBPblB1bHNlRmlsdGVyc0NoYW5nZWQgPSAnb25QdWxzZUZpbHRlcnNDaGFuZ2VkJyxcbiAgT25QdWxzZUluc2lnaHREaXNjb3ZlcmVkID0gJ29uUHVsc2VJbnNpZ2h0RGlzY292ZXJlZCcsXG4gIE9uUHVsc2VNZXRyaWNTaXplQ2hhbmdlZCA9ICdvblB1bHNlTWV0cmljU2l6ZUNoYW5nZWQnLFxuICBPblB1bHNlVGltZURpbWVuc2lvbkNoYW5nZWQgPSAnb25QdWxzZVRpbWVEaW1lbnNpb25DaGFuZ2VkJyxcbiAgT25QdWxzZVVybENoYW5nZWQgPSAnb25QdWxzZVVybENoYW5nZWQnLFxuICBUaW1lRGltZW5zaW9uID0gJ3RpbWUtZGltZW5zaW9uJyxcbiAgVG9rZW5PcHRpb25hbCA9ICd0b2tlbi1vcHRpb25hbCcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VTZXR0aW5ncyBleHRlbmRzIFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3Mge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGV4cGxvcmUgZmlsdGVyIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBkaXNhYmxlLWV4cGxvcmUtZmlsdGVyPlxuICAgKiBgYGBcbiAgICovXG4gIGRpc2FibGVFeHBsb3JlRmlsdGVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBkZXNpcmVkIGN1c3RvbSBsYXlvdXQgb2YgdGhlIFB1bHNlIG1ldHJpYy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgbGF5b3V0PVwiY2FyZFwiPlxuICAgKiBgYGBcbiAgICovXG4gIGxheW91dD86IFB1bHNlTGF5b3V0O1xuXG4gIC8qKlxuICAgKiBUaGUgdG9rZW4gdXNlZCBmb3IgYXV0aG9yaXphdGlvblxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgdG9rZW49XCJzb21lLXRva2VuLWNvbnRhaW5pbmctY2xpZW50SWRcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIHRva2VuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlICdsb2FkaW5nJyBhdHRyaWJ1dGUgb2YgdGhlIGVtYmVkZGVkIGlmcmFtZS5cbiAgICogU2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaWZyYW1lI2xvYWRpbmdcbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1sb2FkaW5nPVwibGF6eVwiIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItbG9hZGluZz1cImxhenlcIiAvPlxuICAgKiA8dGFibGVhdS1wdWxzZSBpZD1cInRhYmxlYXVQdWxzZVwiIGlmcmFtZS1hdHRyLWxvYWRpbmc9XCJsYXp5XCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBpZnJhbWVBdHRyaWJ1dGVMb2FkaW5nPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlICdzdHlsZScgYXR0cmlidXRlIG9mIHRoZSBlbWJlZGRlZCBpZnJhbWUuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCByZWRcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdHRyLXN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgcmVkXCIgLz5cbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBpZnJhbWUtYXR0ci1zdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkIHJlZFwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlU3R5bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgJ2NsYXNzJyBhdHRyaWJ1dGUgb2YgdGhlIGVtYmVkZGVkIGlmcmFtZSBwcm92aWRpbmcgYWNjZXNzIHRvIGFueVxuICAgKiBjdXN0b20gc2VsZWN0b3JzIGRlZmluZWQgaW4gdGhlIGA8aWZyYW1lLXN0eWxlPmAgY2hpbGQgdGFnLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItY2xhc3M9XCJyZWQtYm9yZGVyXCI+XG4gICAqICAgPGlmcmFtZS1zdHlsZT5cbiAgICogICAgIC5yZWQtYm9yZGVyIHtcbiAgICogICAgICAgYm9yZGVyOiAxcHggc29saWQgcmVkO1xuICAgKiAgICAgfVxuICAgKiAgIDwvaWZyYW1lLXN0eWxlPlxuICAgKiA8L3RhYmxlYXUtcHVsc2U+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlQ2xhc3M/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBCYXNlNjQtZW5jb2RlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFB1bHNlIHRoZW1lIG9iamVjdC5cbiAgICpcbiAgICovXG4gIHRoZW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGRlc2lyZWQgdGltZSBkaW1lbnNpb24gdG8gYXBwbHkgdG8gdGhlIFB1bHNlIG1ldHJpYyBieSBkZWZhdWx0LlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiB0aW1lLWRpbWVuc2lvbj1cIk1vbnRoVG9EYXRlXCI+XG4gICAqIGBgYFxuICAgKi9cbiAgdGltZURpbWVuc2lvbj86IFB1bHNlVGltZURpbWVuc2lvbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRva2VuIGlzIG9wdGlvbmFsLlxuICAgKiBXaGVuIHRydWUsIHRoZSBtZXRyaWMgd2lsbCBhdHRlbXB0IHRvIGxvYWQgZXZlbiB3aXRob3V0IHNwZWNpZnlpbmcgYSB0b2tlbi5cbiAgICogVGhpcyB3YXMgYWRkZWQgc3BlY2lmaWNhbGx5IGZvciB0aGUgTW9iaWxlIHRlYW0gd2hvIHVzZXMgUEtDRSBmbG93IHRvIGluaXRpYXRlIHRoZSBzZXNzaW9uXG4gICAqIGFuZCBzaG91bGQgbm90IGJlIGFkdmVydGlzZWQgdG8gM3JkIHBhcnRpZXMuXG4gICAqXG4gICAqIEBpZ25vcmVcbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgdG9rZW4tb3B0aW9uYWw+XG4gICAqIGBgYFxuICAgKi9cbiAgaXNUb2tlbk9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgY2hpbGQgdGFncyBmb3IgVGFibGVhdVB1bHNlIGN1c3RvbSBlbGVtZW50LlxuICovXG5leHBvcnQgZW51bSBQdWxzZUNoaWxkRWxlbWVudHMge1xuICAvKipcbiAgICogQ3VzdG9tIHN0eWxlcyBhcHBsaWNhYmxlIHRvIHRoZSBlbWJlZGRlZCBpZnJhbWUgZWxlbWVudCBpdHNlbGYgKG5vdCBpbnNpZGUgaXQpLlxuICAgKi9cbiAgSWZyYW1lU3R5bGUgPSAnaWZyYW1lLXN0eWxlJyxcblxuICAvKipcbiAgICogQSBwYXJhbWV0ZXIgdG8gYmUgdXNlZCBpbiB0aGUgUHVsc2UgdGhlbWUuXG4gICAqL1xuICBUaGVtZVBhcmFtZXRlciA9ICd0aGVtZS1wYXJhbWV0ZXInLFxuXG4gIC8qKlxuICAgKiBDb250YWlucyBhIGxpc3Qgb2YgZmlsdGVyIHBhcmFtZXRlcnMuXG4gICAqL1xuICBQdWxzZUZpbHRlciA9ICdwdWxzZS1maWx0ZXInLFxufVxuXG4vKipcbiAqIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSA8dGhlbWUtcGFyYW1ldGVyPiBjaGlsZCBlbGVtZW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxzZVRoZW1lUHJvcGVydHkge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgdGhlbWUgcGFyYW1ldGVyIHRvIGJlIHNldC5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVmFsdWUgZm9yIHRoZSB0aGVtZSBwYXJhbWV0ZXIgYmVpbmcgc2V0LlxuICAgKi9cbiAgdmFsdWU6IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgdHlwZSBvZiB0aGVtZSBwYXJhbWV0ZXIgYmVpbmcgc2V0LlxuICAgKi9cbiAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBUaGUgYXR0cmlidXRlcyBvZiB0aGUgY2hpbGQgZWxlbWVudHMgb2YgPHRhYmxlYXUtcHVsc2U+LlxuICovXG5leHBvcnQgZW51bSBQdWxzZUNoaWxkRWxlbWVudEF0dHJpYnV0ZXMge1xuICBOYW1lID0gJ25hbWUnLFxuICBGaWVsZCA9ICdmaWVsZCcsXG4gIFZhbHVlID0gJ3ZhbHVlJyxcbiAgVHlwZSA9ICd0eXBlJyxcbn1cblxuLyoqXG4gKiBUaGUgUHVsc2UgdGhlbWUgZGF0YSBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCB0eXBlIFB1bHNlVGhlbWUgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcblxuLyoqXG4gKiBBY3Rpb25zIHJlbGF0ZWQgdG8gZXZlbnRzIGFuZCBzdGF0ZSBvZiB0aGUgUHVsc2UgbWV0cmljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VBY3Rpb25zIHtcbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIGxpc3Qgb2YgcHJvdmlkZWQgY2F0ZWdvcmljYWwgZmlsdGVyIHZhbHVlcyB0byB0aGUgUHVsc2UgbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0gZmllbGROYW1lICAgICAgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGZpbHRlciBvbi5cbiAgICogQHBhcmFtIHZhbHVlcyAgICAgICAgIFRoZSBsaXN0IG9mIHZhbHVlcyB0byBmaWx0ZXIgb24uXG4gICAqIEBwYXJhbSB1cGRhdGVUeXBlICAgICBUaGUgdXBkYXRlIHR5cGUgb2YgdGhpcyBmaWx0ZXIgKGFkZCwgYWxsLCByZW1vdmUsIHJlcGxhY2UpLlxuICAgKiBAcGFyYW0gZmlsdGVyT3B0aW9ucyAgQWR2YW5jZWQgZmlsdGVyIG9wdGlvbnMgKGlzRXhjbHVkZU1vZGUpLlxuICAgKiBAcmV0dXJucyBUaGUgZmllbGQgbmFtZSB0aGF0IHRoZSBmaWx0ZXIgaXMgYXBwbGllZCBvbi5cbiAgICovXG4gIGFwcGx5RmlsdGVyQXN5bmMoZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXksIHVwZGF0ZVR5cGU6IEZpbHRlclVwZGF0ZVR5cGUsIG9wdGlvbnM6IEZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYXQgbGVhc3Qgb25lIGNhdGVnb3JpY2FsIGZpbHRlciB2YWx1ZSB0byB0aGUgUHVsc2UgbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5PHtcbiAgICogICAgICAgZmllbGROYW1lOiBzdHJpbmc7XG4gICAqICAgICAgIHZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXk7XG4gICAqICAgICAgIHVwZGF0ZVR5cGU6IEZpbHRlclVwZGF0ZVR5cGU7XG4gICAqICAgICAgIG9wdGlvbnM6IEZpbHRlck9wdGlvbnM7XG4gICAqICAgICB9Pn0gZmlsdGVycyBUaGUgc2V0IG9mIGZpbHRlcnMgdG8gYXBwbHkuXG4gICAqIEByZXR1cm5zIFRoZSBmaWVsZCBuYW1lcyB0aGF0IHRoZSBmaWx0ZXIgd2FzIGFwcGxpZWQgb24uXG4gICAqL1xuICBhcHBseUZpbHRlcnNBc3luYyhcbiAgICBmaWx0ZXJzOiBBcnJheTx7XG4gICAgICBmaWVsZE5hbWU6IHN0cmluZztcbiAgICAgIHZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXk7XG4gICAgICB1cGRhdGVUeXBlOiBGaWx0ZXJVcGRhdGVUeXBlO1xuICAgICAgb3B0aW9uczogRmlsdGVyT3B0aW9ucztcbiAgICB9PixcbiAgKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCB0aW1lIGRpbWVuc2lvbiBhcHBsaWVkIHRvIHRoZSBQdWxzZSBtZXRyaWMuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHRpbWUgZGltZW5zaW9uLlxuICAgKi9cbiAgZ2V0VGltZURpbWVuc2lvbkFzeW5jKCk6IFByb21pc2U8UHVsc2VUaW1lRGltZW5zaW9uPjtcblxuICAvKipcbiAgICogQXBwbGllcyB0aGUgdGltZSBkaW1lbnNpb24gdG8gdGhlIFB1bHNlIG1ldHJpYy5cbiAgICpcbiAgICogQHBhcmFtIHtQdWxzZVRpbWVEaW1lbnNpb259IHRpbWVEaW1lbnNpb24gVGhlIHRpbWUgZGltZW5zaW9uIHRvIGFwcGx5XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXBwbHlUaW1lRGltZW5zaW9uQXN5bmModGltZURpbWVuc2lvbjogUHVsc2VUaW1lRGltZW5zaW9uKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogR2V0cyBhIGxpc3Qgb2YgZmlsdGVycyBmb3IgdGhlIFB1bHNlIG1ldHJpYy5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8UHVsc2VGaWx0ZXI+Pn0gVGhlIGxpc3Qgb2YgZmlsdGVycy5cbiAgICovXG4gIGdldEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PFB1bHNlRmlsdGVyPj47XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgZXhpc3RpbmcgZmlsdGVyIGZvciB0aGUgZ2l2ZW4gZmllbGQgb24gdGhlIFB1bHNlIG1ldHJpYy5cbiAgICpcbiAgICogQHBhcmFtIGZpZWxkTmFtZSAgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGNsZWFyIGZpbHRlciBvbi5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGZpZWxkIHRvIGNsZWFyIGZpbHRlciBvbi5cbiAgICovXG4gIGNsZWFyRmlsdGVyQXN5bmMoZmllbGROYW1lczogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGV4aXN0aW5nIGZpbHRlciBmb3IgdGhlIGdpdmVuIGZpZWxkcyBvbiB0aGUgUHVsc2UgbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGZpZWxkTmFtZXMgVGhlIG5hbWUgb2YgdGhlIGZpZWxkcyB0byBjbGVhciBmaWx0ZXIgb24uXG4gICAqIEByZXR1cm5zIFRoZSBmaWVsZHMgdG8gY2xlYXIgZmlsdGVyIG9uLlxuICAgKi9cbiAgY2xlYXJGaWx0ZXJzQXN5bmMoZmllbGROYW1lczogQXJyYXk8c3RyaW5nPik6IFByb21pc2U8QXJyYXk8c3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIFJlc2V0cyBhbGwgdGhlIGV4aXN0aW5nIGZpbHRlcnMgb24gdGhlIFB1bHNlIG1ldHJpYy5cbiAgICovXG4gIGNsZWFyQWxsRmlsdGVyc0FzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBmaWx0ZXIgdGhlIFB1bHNlIG1ldHJpYyBiZWZvcmUgaW5pdGlhbGl6YXRpb24uIElmIHVzZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIGl0IHdpbGwgcmUtcmVuZGVyIHRoZSBtZXRyaWMuXG4gICAqIEZvciBmaWx0ZXJpbmcgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIHVzZSB0aGUgb3RoZXIgZmlsdGVyaW5nIG1ldGhvZHMsIHN1Y2ggYXMgYGFwcGx5RmlsdGVyQXN5bmNgLlxuICAgKlxuICAgKiBJZiB5b3UgYWRkIHRoZSBzYW1lIGZpbHRlciBmaWVsZHMgdXNpbmcgdGhlIGBhZGRGaWx0ZXIoKWAgbWV0aG9kIGFuZCBieSB1c2luZyB0aGUgYDxwdWxzZS1maWx0ZXI+YCBlbGVtZW50IGluIHRoZSBgPHRhYmxlYXUtcHVsc2U+YCB3ZWIgY29tcG9uZW50LFxuICAgKiB5b3UgbWlnaHQgZXhwZXJpZW5jZSB1bmV4cGVjdGVkIGJlaGF2aW9yLlxuICAgKlxuICAgKiBAcGFyYW0gZmllbGROYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBmaWx0ZXIgb24uXG4gICAqIEBwYXJhbSB2YWx1ZSBTaW5nbGUgdmFsdWUgb3IgYSBsaXN0IG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMgdG8gZmlsdGVyIG9uLlxuICAgKlxuICAgKiBgYGBcbiAgICogcHVsc2UuYWRkRmlsdGVyKCdSZWdpb24nLCAnQ2VudHJhbCxXZXN0Jyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRmlsdGVyKGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgICogVXNlIHRoaXMgbWV0aG9kIHRvIHJlYWRqdXN0IHRoZSBkaW1lbnNpb25zIG9mIHRoZSBlbWJlZGRlZCBQdWxzZSBtZXRyaWMgaW4gcmVzcG9uc2UgdG8gdGhpbmdzIGxpa2UgYSB3aW5kb3cgcmVzaXplLCBkZXZpY2Ugb3JpZW50YXRpb24gY2hhbmdlLCBvclxuICAgKiBwYXJlbnQgY29udGFpbmVyIHJlc2l6ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiBwdWxzZS5yZXNpemUoKSk7XG4gICAqXG4gICAqIG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiBwdWxzZS5yZXNpemUoKSkub2JzZXJ2ZShwdWxzZS5wYXJlbnRFbGVtZW50KTtcbiAgICogYGBgXG4gICAqL1xuICByZXNpemUoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdG9wLWxldmVsIFB1bHNlIG9iamVjdC5cbiAqKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2UgZXh0ZW5kcyBQdWxzZVNldHRpbmdzLCBQdWxzZUFjdGlvbnMge31cblxuLyoqXG4gKiBBIFB1bHNlRmllbGRWYWx1ZUFycmF5IGlzIGFuIGFycmF5IHRoYXQgY2FuIGNvbnRhaW4gc3RyaW5ncywgYm9vbGVhbnMsIG9yIG51bGxzLCBidXQgd2lsbCBuZXZlciBjb250YWluIGJvdGggc3RyaW5ncyBhbmQgYm9vbGVhbnMgYXQgdGhlIHNhbWUgdGltZS5cbiAqL1xuZXhwb3J0IHR5cGUgUHVsc2VGaWVsZFZhbHVlQXJyYXkgPSBBcnJheTxib29sZWFuIHwgbnVsbD4gfCBBcnJheTxzdHJpbmcgfCBudWxsPjtcblxuLyoqXG4gKlxuICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIG9mIHRoZSBQdWxzZSBmaWx0ZXIgdHlwZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VGaWx0ZXIge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIGZpbHRlcmVkLiAgTm90ZSB0aGF0IHRoaXMgaXMgdGhlIGNhcHRpb25cbiAgICogYXMgc2hvd24gaW4gdGhlIFVJLCBhbmQgbm90IHRoZSBhY3R1YWwgZGF0YWJhc2UgZmllbGQgbmFtZS5cbiAgICovXG4gIGZpZWxkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgZmlsdGVyLlxuICAgKi9cbiAgZmlsdGVyVHlwZTogRmlsdGVyVHlwZTtcblxuICAvKipcbiAgICogVGhlIFB1bHNlIG1ldHJpYyBJRC5cbiAgICovXG4gIG1ldHJpY0lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBQdWxzZSBDYXRlZ29yaWNhbCBGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yaWNhbFB1bHNlRmlsdGVyIGV4dGVuZHMgUHVsc2VGaWx0ZXIge1xuICAvKipcbiAgICogQSBsaXN0IG9mIHZhbHVlcyBhcHBsaWVkIHRvIHRoaXMgY2F0ZWdvcmljYWwgZmlsdGVyLiBOb3RpY2UgdGhhdCBpZiB0aGUgUHVsc2UgbWV0cmljXG4gICAqIGhhcyBhIGRlZmluaXRpb24gZmlsdGVyLCB0aGUgY3VycmVudCByZWxldmFudCB2YWx1ZXMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZ1xuICAgKiBgZ2V0RG9tYWluQXN5bmMoRmlsdGVyRG9tYWluVHlwZS5SZWxldmFudClgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwbGllZFZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXk7XG5cbiAgLyoqXG4gICAqIFRydWUgaWYgdGhpcyBmaWx0ZXIgaXMgYW4gZXhjbHVkZSBmaWx0ZXIsIGZhbHNlIGlmIGFuIGluY2x1ZGUgZmlsdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFeGNsdWRlTW9kZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVHJ1ZSBpZiBhbGwgdGhlIHZhbHVlcyBhcmUgc2VsZWN0ZWQgZm9yIHRoaXMgZmlsdGVyLiBXaGVuICdBbGwnIGlzIHNlbGVjdGVkLFxuICAgKiBhcHBsaWVkVmFsdWVzIHJldHVybnMgYW4gZW1wdHkgbGlzdC5cbiAgICovXG4gIHJlYWRvbmx5IGlzQWxsU2VsZWN0ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBkb21haW4gb2YgYSBjYXRlZ29yaWNhbCBmaWx0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IHVuZGVmaW5lZCl9IHNlYXJjaFRlcm0gVGhlIHRlcm0gdG8gc2VhcmNoIGZvciBpbiB0aGUgZG9tYWluLlxuICAgKiBAcGFyYW0geyhudW1iZXIgfCB1bmRlZmluZWQpfSBwYWdlU2l6ZSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdmFsdWVzIHRvIHJldHVybi4gSWdub3JlZCB3aGVuIG5leHRQYWdlVG9rZW4gaXMgbm90IHByb3ZpZGVkLlxuICAgKiBAcGFyYW0geyhzdHJpbmcgfCB1bmRlZmluZWQpfSBuZXh0UGFnZVRva2VuIFRoZSBuZXh0IHBhZ2UgdG9rZW4gcmV0dXJuZWQgYnkgUHVsc2Ugd2hlbiBhZGRpdGlvbmFsIHZhbHVlcyBhcmUgYXZhaWxhYmxlLlxuICAgKiBAcGFyYW0geyhGaWx0ZXJEb21haW5UeXBlIHwgdW5kZWZpbmVkKX0gZG9tYWluVHlwZSBUaGUgZG9tYWluIHR5cGUgb2YgdGhlIGZpbHRlci5cbiAgICogQHJldHVybnMge1Byb21pc2U8UHVsc2VDYXRlZ29yaWNhbERvbWFpbj59IEEgcHJvbWlzZSBjb250YWluaW5nIHRoZSBjYXRlZ29yaWNhbCBkb21haW4gZm9yIHRoZSBmaWx0ZXIuXG4gICAqL1xuICBnZXREb21haW5Bc3luYzogKFxuICAgIHNlYXJjaFRlcm0/OiBzdHJpbmcsXG4gICAgcGFnZVNpemU/OiBudW1iZXIsXG4gICAgbmV4dFBhZ2VUb2tlbj86IHN0cmluZyxcbiAgICBkb21haW5UeXBlPzogRmlsdGVyRG9tYWluVHlwZSxcbiAgKSA9PiBQcm9taXNlPFB1bHNlQ2F0ZWdvcmljYWxEb21haW4+O1xufVxuXG4vKipcbiAqIFRoZSBkb21haW4gb2YgYSBQdWxzZSBjYXRlZ29yaWNhbCBmaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxzZUNhdGVnb3JpY2FsRG9tYWluIHtcbiAgLyoqXG4gICAqIFRoZSBkb21haW4gdHlwZSAocmVsZXZhbnQsIGRhdGFiYXNlKVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogRmlsdGVyRG9tYWluVHlwZTtcbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHZhbHVlcyBpbiB0aGUgZG9tYWluIG9mIHRoZSBmaWx0ZXJcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXk7XG4gIC8qKlxuICAgKiBUaGUgdG90YWwgYXZhaWxhYmxlIG51bWJlciBvZiB2YWx1ZXMgaW4gdGhlIGRvbWFpbiBvZiB0aGUgZmlsdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgdG90YWxBdmFpbGFibGU6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBuZXh0IHBhZ2UgdG9rZW4gcmV0dXJuZWQgYnkgUHVsc2Ugd2hlbiBhZGRpdGlvbmFsIHZhbHVlcyBhcmUgYXZhaWxhYmxlLlxuICAgKiBQcm92aWRlIHRoaXMgdG9rZW4gdG8gZ2V0RG9tYWluQXN5bmMgdG8gZ2V0IHRoZSBuZXh0IHBhZ2Ugb2YgdmFsdWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV4dFBhZ2VUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHtcbiAgQ3Jvc3N0YWJGaWxlRm9ybWF0LFxuICBEZXZpY2VUeXBlLFxuICBQcmludE9yaWVudGF0aW9uLFxuICBQcmludFBhZ2VTaXplLFxuICBQcmludFNjYWxpbmcsXG4gIFRhYmxlYXVEaWFsb2dUeXBlLFxuICBUYWJsZWF1RXZlbnRUeXBlLFxuICBUb29sYmFyLFxufSBmcm9tICcuL0VudW1zJztcbmltcG9ydCB7IFNoZWV0U2l6ZSB9IGZyb20gJy4vU2hlZXRJbnRlcmZhY2VzJztcbmltcG9ydCB7IFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MsIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIH0gZnJvbSAnLi9XZWJDb21wb25lbnRJbnRlcmZhY2VzJztcbmltcG9ydCB7IFdvcmtib29rIH0gZnJvbSAnLi9Xb3JrYm9va0ludGVyZmFjZSc7XG5cbi8qKlxuICogVGhlIHNoYXJlZCBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIEhUTUwgYXR0cmlidXRlcyBmb3IgdGhlIDx0YWJsZWF1LXZpej4gYW5kIDx0YWJsZWF1LWF1dGhvcmluZy12aXo+IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFZpelNoYXJlZEF0dHJpYnV0ZXMge1xuICBUb3VjaE9wdGltaXplID0gJ3RvdWNoLW9wdGltaXplJyxcbiAgSGlkZUVkaXRJbkRlc2t0b3BCdXR0b24gPSAnaGlkZS1lZGl0LWluLWRlc2t0b3AtYnV0dG9uJyxcbiAgU3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yID0gJ3N1cHByZXNzLWRlZmF1bHQtZWRpdC1iZWhhdmlvcicsXG4gIERpc2FibGVWZXJzaW9uQ2hlY2sgPSAnZGlzYWJsZS12ZXJzaW9uLWNoZWNrJyxcbiAgT25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZCA9ICdvbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkJyxcbiAgT25GaXJzdFZpelNpemVLbm93biA9ICdvbkZpcnN0Vml6U2l6ZUtub3duJyxcbiAgT25GaXJzdEludGVyYWN0aXZlID0gJ29uRmlyc3RJbnRlcmFjdGl2ZScsXG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIEhUTUwgYXR0cmlidXRlcyBmb3IgdGhlIDx0YWJsZWF1LXZpej4gd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGVudW0gVml6QXR0cmlidXRlcyB7XG4gIERpc2FibGVVcmxBY3Rpb25zUG9wdXBzID0gJ2Rpc2FibGUtdXJsLWFjdGlvbnMnLFxuICBIaWRlVGFicyA9ICdoaWRlLXRhYnMnLFxuICBUb29sYmFyID0gJ3Rvb2xiYXInLFxuICBJbnN0YW5jZUlkVG9DbG9uZSA9ICdpbnN0YW5jZS1pZC10by1jbG9uZScsXG4gIERldmljZSA9ICdkZXZpY2UnLFxuICBIaWRlRWRpdEJ1dHRvbiA9ICdoaWRlLWVkaXQtYnV0dG9uJyxcbiAgT25FZGl0QnV0dG9uQ2xpY2tlZCA9ICdvbkVkaXRCdXR0b25DbGlja2VkJyxcbiAgT25GaWx0ZXJDaGFuZ2VkID0gJ29uRmlsdGVyQ2hhbmdlZCcsXG4gIE9uQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQgPSAnb25DdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudCcsXG4gIE9uTWFya1NlbGVjdGlvbkNoYW5nZWQgPSAnb25NYXJrU2VsZWN0aW9uQ2hhbmdlZCcsXG4gIE9uUGFyYW1ldGVyQ2hhbmdlZCA9ICdvblBhcmFtZXRlckNoYW5nZWQnLFxuICBPblRvb2xiYXJTdGF0ZUNoYW5nZWQgPSAnb25Ub29sYmFyU3RhdGVDaGFuZ2VkJyxcbiAgT25VcmxBY3Rpb24gPSAnb25VcmxBY3Rpb24nLFxuICBPblRhYlN3aXRjaGVkID0gJ29uVGFiU3dpdGNoZWQnLFxuICBPbkN1c3RvbVZpZXdMb2FkZWQgPSAnb25DdXN0b21WaWV3TG9hZGVkJyxcbiAgT25DdXN0b21WaWV3UmVtb3ZlZCA9ICdvbkN1c3RvbVZpZXdSZW1vdmVkJyxcbiAgT25DdXN0b21WaWV3U2F2ZWQgPSAnb25DdXN0b21WaWV3U2F2ZWQnLFxuICBPbkN1c3RvbVZpZXdTZXREZWZhdWx0ID0gJ29uQ3VzdG9tVmlld1NldERlZmF1bHQnLFxuICBPblN0b3J5UG9pbnRTd2l0Y2hlZCA9ICdvblN0b3J5UG9pbnRTd2l0Y2hlZCcsXG4gIE9uU3VtbWFyeURhdGFDaGFuZ2VkID0gJ29uU3VtbWFyeURhdGFDaGFuZ2VkJyxcbiAgT25SZWFkeVRvUmVjZWl2ZUF1dGhUb2tlbiA9ICdvblJlYWR5VG9SZWNlaXZlQXV0aFRva2VuJyxcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgPHRhYmxlYXUtYXV0aG9yaW5nLXZpej4gd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGVudW0gVml6QXV0aG9yaW5nQXR0cmlidXRlcyB7XG4gIE9uV29ya2Jvb2tQdWJsaXNoZWQgPSAnb25Xb3JrYm9va1B1Ymxpc2hlZCcsXG4gIE9uV29ya2Jvb2tQdWJsaXNoZWRBcyA9ICdvbldvcmtib29rUHVibGlzaGVkQXMnLFxuICBPbldvcmtib29rUmVhZHlUb0Nsb3NlID0gJ29uV29ya2Jvb2tSZWFkeVRvQ2xvc2UnLFxuICBIaWRlQ2xvc2VCdXR0b24gPSAnaGlkZS1jbG9zZS1idXR0b24nLFxufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBjaGlsZCB0YWdzIGZvciBUYWJsZWF1Vml6IGFuZCBUYWJsZWF1QXV0aG9yaW5nVml6IGN1c3RvbSBlbGVtZW50cy5cbiAqL1xuZXhwb3J0IGVudW0gVml6Q2hpbGRFbGVtZW50cyB7XG4gIC8qKlxuICAgKiBDb250YWlucyBhIGxpc3Qgb2YgZmlsdGVyIHBhcmFtZXRlcnMuIEF2YWlsYWJsZSBvbmx5IGluIHZpZXdpbmcgbW9kZS5cbiAgICovXG4gIFZpekZpbHRlciA9ICd2aXotZmlsdGVyJyxcblxuICAvKipcbiAgICogQ29udGFpbnMgYSBuYW1lIGFuZCB2YWx1ZSBmb3IgYSBwYXJhbWV0ZXIuIEF2YWlsYWJsZSBvbmx5IGluIHZpZXdpbmcgbW9kZS5cbiAgICovXG4gIFZpelBhcmFtZXRlciA9ICd2aXotcGFyYW1ldGVyJyxcblxuICAvKipcbiAgICogQ29udGFpbnMgYSBsaXN0IG9mIGN1c3RvbSBwYXJhbWV0ZXJzLiAgQXZhaWxhYmxlIGluIGJvdGggdmlld2luZyBhbmQgYXV0aG9yaW5nIG1vZGVzLlxuICAgKi9cbiAgQ3VzdG9tUGFyYW1ldGVyID0gJ2N1c3RvbS1wYXJhbWV0ZXInLFxuXG4gIC8qKlxuICAgKiBDdXN0b20gc3R5bGVzIGFwcGxpY2FibGUgdG8gdGhlIGVtYmVkZGVkIGlmcmFtZSBlbGVtZW50IGl0c2VsZiAobm90IGluc2lkZSBpdCkuIEF2YWlsYWJsZSBpbiBib3RoIHZpZXdpbmcgYW5kIGF1dGhvcmluZyBtb2Rlcy5cbiAgICovXG4gIElmcmFtZVN0eWxlID0gJ2lmcmFtZS1zdHlsZScsXG59XG5cbmV4cG9ydCBlbnVtIFZpekNoaWxkRWxlbWVudEF0dHJpYnV0ZXMge1xuICBGaWVsZCA9ICdmaWVsZCcsXG4gIFZhbHVlID0gJ3ZhbHVlJyxcbiAgTmFtZSA9ICduYW1lJyxcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdG9wIGxldmVsIFZpeiBvYmplY3QuXG4gKiovXG5leHBvcnQgaW50ZXJmYWNlIFZpeiBleHRlbmRzIFZpelNldHRpbmdzLCBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzLCBWaXpBY3Rpb25zIHtcbiAgLyoqXG4gICAqIE9uZSBXb3JrYm9vayBpcyBzdXBwb3J0ZWQgcGVyIHZpc3VhbGl6YXRpb24uXG4gICAqL1xuICByZWFkb25seSB3b3JrYm9vaz86IFdvcmtib29rO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlIGFuIGF1dGggdG9rZW4gZm9yIHNhbGVzZm9yY2UgbmF0aXZlIG1vZGVcbiAgICogQHBhcmFtIHRva2VuXG4gICAqL1xuICBzZXRBdXRoVG9rZW4odG9rZW46IHN0cmluZyk6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhlIGludGVyZmFjZSBmb3IgdGhlIHRvcCBsZXZlbCBBdXRob3JpbmcgVml6IG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRob3JpbmdWaXogZXh0ZW5kcyBWaXpBdXRob3JpbmdTZXR0aW5ncywgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2aXN1YWxpemF0aW9uJ3MgY3VycmVudCBVUkwuXG4gICAqL1xuICBnZXRDdXJyZW50U3JjQXN5bmMoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBQcm92aWRlIGFuIGF1dGggdG9rZW4gZm9yIHNhbGVzZm9yY2UgbmF0aXZlIG1vZGVcbiAgICogQHBhcmFtIHRva2VuXG4gICAqL1xuICBzZXRBdXRoVG9rZW4odG9rZW46IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byByZWFkanVzdCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZW1iZWRkZWQgdml6IGluIHJlc3BvbnNlIHRvIHRoaW5ncyBsaWtlIGEgd2luZG93IHJlc2l6ZSwgZGV2aWNlIG9yaWVudGF0aW9uIGNoYW5nZSwgb3JcbiAgICogcGFyZW50IGNvbnRhaW5lciByZXNpemUuXG4gICAqXG4gICAqIGBgYFxuICAgKiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdml6LnJlc2l6ZSgpKTtcbiAgICpcbiAgICogbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHZpei5yZXNpemUoKSkub2JzZXJ2ZSh2aXoucGFyZW50RWxlbWVudCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVzaXplKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBsYXVuY2ggdGhlIEFuYWx5dGljcyBBc3Npc3RhbnQgc2lkZSBwYW5lLlxuICAgKiBZb3UgY2FuIHVzZSB0aGUgYGlzQW5hbHl0aWNzQXNzaXN0YW50QXZhaWxhYmxlQXN5bmMoKWAgbWV0aG9kIHRvIGNoZWNrIGlmIHRoZSBBbmFseXRpY3MgQXNzaXN0YW50IGlzIGF2YWlsYWJsZSBmb3IgdXNlLlxuICAgKlxuICAgKiBgYGBcbiAgICogY29uc3QgaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUgPSBhd2FpdCB2aXouaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGVBc3luYygpO1xuICAgKiBpZiAoaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUpIHtcbiAgICogICBhd2FpdCB2aXoubGF1bmNoQW5hbHl0aWNzQXNzaXN0YW50QXN5bmMoKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGxhdW5jaEFuYWx5dGljc0Fzc2lzdGFudEFzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBBbmFseXRpY3MgQXNzaXN0YW50IHNpZGUgcGFuZSBpcyBhdmFpbGFibGUuXG4gICAqL1xuICBpc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZUFzeW5jKCk6IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbi8qKlxuICogUGFydGlhbGx5IGltcGxlbWVudGVkIC0gQWN0aW9ucyByZWxhdGVkIHRvIGV2ZW50cyBhbmQgc3RhdGUgb2YgdGhlIHZpelxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpekFjdGlvbnMge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgYXV0b21hdGljIHVwZGF0ZXMgYXJlIGN1cnJlbnRseSBwYXVzZWQuXG4gICAqL1xuICByZWFkb25seSBhdXRvbWF0aWNVcGRhdGVzQXJlUGF1c2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQYXVzZSBsYXlvdXQgdXBkYXRlcy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGFyZSByZXNpemluZyB0aGUgdmlzdWFsaXphdGlvbiBvciBwZXJmb3JtaW5nIG11bHRpcGxlIGNhbGxzIHRoYXQgY291bGQgYWZmZWN0IHRoZSBsYXlvdXQuXG4gICAqL1xuICBwYXVzZUF1dG9tYXRpY1VwZGF0ZXNBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBSZXN1bWUgbGF5b3V0IHVwZGF0ZXMuXG4gICAqL1xuICByZXN1bWVBdXRvbWF0aWNVcGRhdGVzQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVG9nZ2xlIGxheW91dCB1cGRhdGVzLlxuICAgKi9cbiAgdG9nZ2xlQXV0b21hdGljVXBkYXRlc0FzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gY2xpY2tpbmcgb24gdGhlIFJldmVydCBBbGwgdG9vbGJhciBidXR0b24sIHdoaWNoIHJlc3RvcmVzIHRoZSB3b3JrYm9vayB0byBpdHMgc3RhcnRpbmcgc3RhdGUuXG4gICAqL1xuICByZXZlcnRBbGxBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFcXVpdmFsZW50IHRvIGNsaWNraW5nIG9uIHRoZSBSZWZyZXNoIERhdGEgdG9vbGJhciBidXR0b24uXG4gICAqL1xuICByZWZyZXNoRGF0YUFzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gY2xpY2tpbmcgb24gRG93bmxvYWQgPiBJbWFnZSBmcm9tIHRoZSB0b29sYmFyLCB3aGljaCBjcmVhdGVzIGEgUE5HIGZpbGUgb2YgdGhlIGN1cnJlbnQgdmlzdWFsaXphdGlvbi5cbiAgICovXG4gIGV4cG9ydEltYWdlQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRXhwb3J0cyB0aGUgY3Jvc3N0YWIgb2YgYW55IGdpdmVuIHdvcmtzaGVldCB3aXRoaW4gdGhlIGN1cnJlbnQgdmlldyB0byBhXG4gICAqIHNwZWNpZmllZCBmb3JtYXQgKENyb3NzdGFiRmlsZUZvcm1hdC5FeGNlbCwgQ3Jvc3N0YWJGaWxlRm9ybWF0LkNTVikuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgc2hlZXQgbmFtZSBkb2VzIG5vdCBtYXRjaCBhbnkgd29ya3NoZWV0cyB3aXRoaW4gdGhlIGFjdGl2ZSBzaGVldC5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBjcm9zc3RhYiBmaWxlIGZhaWxlZCB0byBiZSBjcmVhdGVkLlxuICAgKiBOb3RlOiBleHBvcnRDcm9zc3RhYkFzeW5jIHJlc29sdmVzIHdoZW4gYSBkb3dubG9hZCBpcyBpbml0aWF0ZWQuIEl0IGRvZXMgbm90IGluZGljYXRlIHRoYXQgYSBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bCBvciBpZiB0aGUgZG93bmxvYWQgd2FzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIHZpei5leHBvcnRDcm9zc3RhYkFzeW5jKCdTYWxlcyBieSBTZWdtZW50JywgQ3Jvc3N0YWJGaWxlRm9ybWF0LkNTVik7XG4gICAqIGBgYFxuICAgKi9cbiAgZXhwb3J0Q3Jvc3N0YWJBc3luYyhzaGVldE5hbWU6IHN0cmluZywgZm9ybWF0OiBDcm9zc3RhYkZpbGVGb3JtYXQpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBzdW1tYXJ5IGRhdGEgc2hvd24gaW4gdGhlIFZpZXcgRGF0YSB3aW5kb3dcbiAgICogKHNob3duIHdoZW4geW91IGNsaWNrIERvd25sb2FkID4gRGF0YSBmcm9tIHRoZSB0b29sYmFyIGZvciBhbnkgZ2l2ZW4gd29ya3NoZWV0IHdpdGhpbiB0aGUgY3VycmVudCB2aWV3KS5cbiAgICogVGhlIGN1cnJlbnQgZmlsZSBmb3JtYXQgaXMgQ1NWLiBUaGVyZSBpcyBubyBsaW1pdGF0aW9uIG9uIHRoZSBhbW91bnQgb2Ygc3VtbWFyeSBkYXRhIHlvdSBjYW4gZXhwb3J0LlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHNoZWV0IG5hbWUgZG9lcyBub3QgbWF0Y2ggYW55IHdvcmtzaGVldHMgd2l0aGluIHRoZSBhY3RpdmUgc2hlZXQuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgQ1NWIGZpbGUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQuXG4gICAqIE5vdGU6IGV4cG9ydERhdGFBc3luYyByZXNvbHZlcyB3aGVuIGEgZG93bmxvYWQgaXMgaW5pdGlhdGVkLiBJdCBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IGEgZG93bmxvYWQgd2FzIHN1Y2Nlc3NmdWwgb3IgaWYgdGhlIGRvd25sb2FkIHdhcyBjb21wbGV0ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIGxldCB2aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVhdVZpeicpO1xuICAgKiBjb25zdCBhY3RpdmVTaGVldCA9IHZpei53b3JrYm9vay5hY3RpdmVTaGVldDtcbiAgICogaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLldvcmtzaGVldCkge1xuICAgKiAgIGNvbnN0IGNvbHVtbnMgPSBhd2FpdCBhY3RpdmVTaGVldC5nZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYygpO1xuICAgKiAgIC8vIEdldHRpbmcgZmllbGRJZCdzIGZvciBMYXRpdHVkZSBhbmQgTG9uZ2l0dWRlIGNvbHVtbnNcbiAgICogICBjb25zdCBjb2x1bW5zVG9JbmNsdWRlQnlJZCA9IGNvbHVtbnMubWFwKChjb2x1bW4pID0+IHtcbiAgICogICAgIGlmIChjb2x1bW4uZmllbGROYW1lID09PSAnTGF0aXR1ZGUnIHx8IGNvbHVtbi5maWVsZE5hbWUgPT09ICdMb25naXR1ZGUnKSB7XG4gICAqICAgICAgIHJldHVybiBjb2x1bW4uZmllbGRJZDtcbiAgICogICAgIH1cbiAgICogICB9KTtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0RGF0YUFzeW5jKGFjdGl2ZVNoZWV0Lm5hbWUsIHsgY29sdW1uc1RvSW5jbHVkZUJ5SWQgfSk7XG4gICAqIH1cbiAgICogZWxzZSBpZiAoYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuRGFzaGJvYXJkKSB7XG4gICAqICAgLy8gRXhwb3J0aW5nIHRoZSBzdW1tYXJ5IGRhdGEgZm9yIGVhY2ggd29ya3NoZWV0IGluIHRoZSBkYXNoYm9hcmQgd2hpbGUgYWxzbyBpZ25vcmluZyBhbGlhc2VzXG4gICAqICAgZm9yIChjb25zdCB3b3Jrc2hlZXQgb2YgYWN0aXZlU2hlZXQud29ya3NoZWV0cykge1xuICAgKiAgICAgYXdhaXQgdml6LmV4cG9ydERhdGFBc3luYyh3b3Jrc2hlZXQubmFtZSwgeyBpZ25vcmVBbGlhc2VzOiB0cnVlIH0pO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBlbHNlXG4gICAqIHtcbiAgICogICAvLyBhY3RpdmVTaGVldCBpcyBhIFN0b3J5IGFuZCB3ZSB3YW50IHRvIGV4cG9ydCB3b3Jrc2hlZXRzIHdpdGhpbiB0aGUgY3VycmVudCB2aWV3XG4gICAqICAgY29uc3QgY29udGFpbmVkU2hlZXQgPSBhY3RpdmVTaGVldC5hY3RpdmVTdG9yeVBvaW50LmNvbnRhaW5lZFNoZWV0O1xuICAgKiAgIGlmIChjb250YWluZWRTaGVldCAhPT0gdW5kZWZpbmVkICYmIGNvbnRhaW5lZFNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLldvcmtzaGVldCkge1xuICAgKiAgICAgLy8gRXhwb3J0aW5nIHN1bW1hcnkgZGF0YSBvZiBhIHdvcmtzaGVldCB3aXRoaW4gdGhlIGFjdGl2ZSBzdG9yeSBwb2ludFxuICAgKiAgICAgYXdhaXQgdml6LmV4cG9ydERhdGFBc3luYyhjb250YWluZWRTaGVldC5uYW1lKTtcbiAgICogICB9IGVsc2UgaWYgKGNvbnRhaW5lZFNoZWV0ICE9PSB1bmRlZmluZWQgJiYgY29udGFpbmVkU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuRGFzaGJvYXJkKSB7XG4gICAqICAgICAvLyBFeHBvcnRpbmcgdGhlIHN1bW1hcnkgZGF0YSBmb3IgZWFjaCB3b3Jrc2hlZXQgd2l0aGluIHRoZSBhY3RpdmUgc3RvcnkgcG9pbnRcbiAgICogICAgIGZvciAoY29uc3Qgd29ya3NoZWV0IG9mIGNvbnRhaW5lZFNoZWV0LndvcmtzaGVldHMpIHtcbiAgICogICAgICAgYXdhaXQgdml6LmV4cG9ydERhdGFBc3luYyh3b3Jrc2hlZXQubmFtZSk7XG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZXhwb3J0RGF0YUFzeW5jKHNoZWV0TmFtZTogc3RyaW5nLCBvcHRpb25zPzogRXhwb3J0RGF0YU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBsaXN0IG9mIHNoZWV0cyB0byBhIFBvd2VyUG9pbnQgZmlsZS4gSWYgbm8gc2hlZXRzIGFyZSBzcGVjaWZpZWQsIHRoZSBjdXJyZW50IHNoZWV0IGlzIGV4cG9ydGVkLlxuICAgKiBUaGUgb3JkZXIgdGhlIHNoZWV0cyBhcHBlYXIgaW4gdGhlIGxpc3QgaXMgdGhlIG9yZGVyIHRoZSBzaGVldHMgYXBwZWFyIGluIHRoZSBQb3dlclBvaW50IGZpbGUuXG4gICAqIFRoZSBsaXN0IG9mIHNoZWV0cyBjYW4gZWl0aGVyIGV4Y2x1c2l2ZWx5IGluY2x1ZGUgdGhlIHdvcmtzaGVldHMgd2l0aGluIGEgZGFzaGJvYXJkIG9yIGV4Y2x1c2l2ZWx5IGluY2x1ZGUgdGhlIHB1Ymxpc2hlZCBzaGVldHMgZnJvbSB0aGUgd29ya2Jvb2suXG4gICAqXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgbGlzdCBvZiBzaGVldHMgY29udGFpbnMgYm90aCB3b3Jrc2hlZXRzIHdpdGhpbiBhIGRhc2hib2FyZCBhbmQgcHVibGlzaGVkIHNoZWV0cyBmcm9tIHRoZSB3b3JrYm9vay5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBQb3dlclBvaW50IGZpbGUgZmFpbHMgdG8gYmUgY3JlYXRlZC5cbiAgICpcbiAgICogTm90ZTogZXhwb3J0UG93ZXJQb2ludEFzeW5jIHJlc29sdmVzIHdoZW4gYSBkb3dubG9hZCBpcyBpbml0aWF0ZWQuIEl0IGRvZXMgbm90IGluZGljYXRlIHRoYXQgYSBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bCBvciBpZiB0aGUgZG93bmxvYWQgd2FzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIGNvbnN0IHdvcmtib29rID0gdml6Lndvcmtib29rO1xuICAgKiBjb25zdCBhY3RpdmVTaGVldCA9IHdvcmtib29rLmFjdGl2ZVNoZWV0O1xuICAgKiBpZiAoYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuV29ya3NoZWV0IHx8IGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLlN0b3J5KSB7XG4gICAqICAgYXdhaXQgdml6LmV4cG9ydFBvd2VyUG9pbnRBc3luYygpO1xuICAgKiB9IGVsc2UgaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gIFNoZWV0VHlwZS5EYXNoYm9hcmQpIHtcbiAgICogICBjb25zdCB3b3Jrc2hlZXROYW1lcyA9IGFjdGl2ZVNoZWV0LndvcmtzaGVldHMubWFwKCh3b3Jrc2hlZXQpID0+IHdvcmtzaGVldC5uYW1lKTtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKHdvcmtzaGVldE5hbWVzKTtcbiAgICogfVxuICAgKiAvLyBleHBvcnRpbmcgYWxsIHNoZWV0cyB3aXRoaW4gdGhlIHdvcmtib29rIHRvIFBvd2VyUG9pbnRcbiAgICogY29uc3QgcHVibGlzaGVkU2hlZXROYW1lcyA9IHdvcmtib29rLnB1Ymxpc2hlZFNoZWV0c0luZm8ubWFwKChwdWJsaXNoZWRTaGVldEluZm8pID0+IHB1Ymxpc2hlZFNoZWV0SW5mby5uYW1lKTtcbiAgICogYXdhaXQgdml6LmV4cG9ydFBvd2VyUG9pbnRBc3luYyhwdWJsaXNoZWRTaGVldE5hbWVzKTtcbiAgICogYGBgXG4gICAqL1xuICBleHBvcnRQb3dlclBvaW50QXN5bmMoc2hlZXROYW1lcz86IEFycmF5PHN0cmluZz4pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBsaXN0IG9mIHNoZWV0cyB3aXRoIHRoZSBnaXZlbiB7QGxpbmsgRXhwb3J0UERGT3B0aW9uc30gb3B0aW9ucy4gSWYgbm8gc2hlZXRzIGFyZSBzcGVjaWZpZWQsIHRoZSBjdXJyZW50IHNoZWV0IGlzIGV4cG9ydGVkLlxuICAgKiBUaGUgbGlzdCBvZiBzaGVldHMgY2FuIGVpdGhlciBleGNsdXNpdmVseSBpbmNsdWRlIHRoZSB3b3Jrc2hlZXRzIHdpdGhpbiBhIGRhc2hib2FyZCBvciBleGNsdXNpdmVseSBpbmNsdWRlIHRoZSBwdWJsaXNoZWQgc2hlZXRzIGZyb20gdGhlIHdvcmtib29rLlxuICAgKiBJZiBubyBFeHBvcnRQREZPcHRpb25zIGFyZSBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHNldHRpbmdzIGFyZTogU2NhbGluZyA9IEF1dG9tYXRpYywgUGFnZVNpemUgPSBMZXR0ZXIsIGFuZCBPcmllbnRhdGlvbiA9IFBvcnRyYWl0LlxuICAgKlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGxpc3Qgb2Ygc2hlZXRzIGNvbnRhaW5zIGJvdGggd29ya3NoZWV0cyB3aXRoaW4gYSBkYXNoYm9hcmQgYW5kIHB1Ymxpc2hlZCBzaGVldHMgZnJvbSB0aGUgd29ya2Jvb2suXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgUERGIGZpbGUgZmFpbHMgdG8gYmUgY3JlYXRlZC5cbiAgICpcbiAgICogTm90ZTogZXhwb3J0UERGQXN5bmMgcmVzb2x2ZXMgd2hlbiBhIGRvd25sb2FkIGlzIGluaXRpYXRlZC4gSXQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCBhIGRvd25sb2FkIHdhcyBzdWNjZXNzZnVsIG9yIGlmIHRoZSBkb3dubG9hZCB3YXMgY29tcGxldGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiBsZXQgdml6ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlYXVWaXonKTtcbiAgICogY29uc3Qgd29ya2Jvb2sgPSB2aXoud29ya2Jvb2s7XG4gICAqIGNvbnN0IGFjdGl2ZVNoZWV0ID0gd29ya2Jvb2suYWN0aXZlU2hlZXQ7XG4gICAqIGlmIChhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5Xb3Jrc2hlZXQgfHwgYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuU3RvcnkpIHtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UERGQXN5bmMoKTtcbiAgICogfSBlbHNlIGlmIChhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09ICBTaGVldFR5cGUuRGFzaGJvYXJkKSB7XG4gICAqICAgY29uc3Qgd29ya3NoZWV0TmFtZXMgPSBhY3RpdmVTaGVldC53b3Jrc2hlZXRzLm1hcCgod29ya3NoZWV0KSA9PiB3b3Jrc2hlZXQubmFtZSk7XG4gICAqICAgYXdhaXQgdml6LmV4cG9ydFBERkFzeW5jKHdvcmtzaGVldE5hbWVzKTtcbiAgICogfVxuICAgKiAvLyBleHBvcnRpbmcgYWxsIHNoZWV0cyB3aXRoaW4gdGhlIHdvcmtib29rIHRvIFBERlxuICAgKiBjb25zdCBwdWJsaXNoZWRTaGVldE5hbWVzID0gd29ya2Jvb2sucHVibGlzaGVkU2hlZXRzSW5mby5tYXAoKHB1Ymxpc2hlZFNoZWV0SW5mbykgPT4gcHVibGlzaGVkU2hlZXRJbmZvLm5hbWUpO1xuICAgKiBhd2FpdCB2aXouZXhwb3J0UERGQXN5bmMocHVibGlzaGVkU2hlZXROYW1lcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgZXhwb3J0UERGQXN5bmMoc2hlZXROYW1lcz86IEFycmF5PHN0cmluZz4sIG9wdGlvbnM/OiBFeHBvcnRQREZPcHRpb25zKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRGlzcGxheSBvbmUgb2YgdGhlIGV4cG9ydCBkaWFsb2dzIGJhc2VkIG9uIHRoZSBkaWFsb2dUeXBlIHBhcmFtZXRlclxuICAgKlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgZGlhbG9nVHlwZSBpcyBpbnZhbGlkXG4gICAqL1xuICBkaXNwbGF5RGlhbG9nQXN5bmMoZGlhbG9nVHlwZTogVGFibGVhdURpYWxvZ1R5cGUpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2aXN1YWxpemF0aW9uJ3MgY3VycmVudCBVUkwuXG4gICAqL1xuICBnZXRDdXJyZW50U3JjQXN5bmMoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBSZWRvZXMgdGhlIGxhc3QgYWN0aW9uIHBlcmZvcm1lZCBvbiBhIHNoZWV0LlxuICAgKi9cbiAgcmVkb0FzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFVuZG9lcyB0aGUgbGFzdCBhY3Rpb24gcGVyZm9ybWVkIG9uIGEgc2hlZXQuXG4gICAqL1xuICB1bmRvQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgKlxuICAgKiBgYGBcbiAgICogYXN5bmMgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRNYXJrcyhldmVudCkge1xuICAgKiAgICAgY29uc3QgbWFya3NTZWxlY3RlZCA9IGF3YWl0IGV2ZW50LmRldGFpbC5nZXRNYXJrc0FzeW5jKCk7XG4gICAqICAgICBjb25zdCBudW1NYXJrcyA9IG1hcmtzU2VsZWN0ZWQuZGF0YVswXS5kYXRhLmxlbmd0aDtcbiAgICogICAgIGNvbnNvbGUubG9nKGAke251bU1hcmtzfSBtYXJrcyBTZWxlY3RlZGApO1xuICAgKiB9XG4gICAqXG4gICAqIGxldCB2aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVhdVZpeicpO1xuICAgKiB2aXouYWRkRXZlbnRMaXN0ZW5lcihcIm1hcmtzZWxlY3Rpb25jaGFuZ2VkXCIsIGdldFNlbGVjdGVkTWFya3MpO1xuICAgKiBgYGBcbiAgICovXG4gIGFkZEV2ZW50TGlzdGVuZXIodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgbGlzdGVuZXI6IEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3QsIG9wdGlvbnM/OiBib29sZWFuIHwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIHNwZWNpZmllZCBldmVudC5cbiAgICpcbiAgICogYGBgXG4gICAqIGxldCB2aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVhdVZpeicpO1xuICAgKiB2aXoucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1hcmtzZWxlY3Rpb25jaGFuZ2VkXCIsIGdldFNlbGVjdGVkTWFya3MpO1xuICAgKiBgYGBcbiAgICovXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgbGlzdGVuZXI6IEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3QsIG9wdGlvbnM/OiBib29sZWFuIHwgRXZlbnRMaXN0ZW5lck9wdGlvbnMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gZmlsdGVyIHRoZSB2aXogYmVmb3JlIGluaXRpYWxpemF0aW9uLiBJZiB1c2VkIGFmdGVyIGluaXRpYWxpemF0aW9uLCBpdCB3aWxsIHJlLXJlbmRlciB0aGUgdml6LlxuICAgKiBGb3IgZmlsdGVyaW5nIGFmdGVyIGluaXRpYWxpemF0aW9uLCB1c2UgdGhlIG90aGVyIGZpbHRlcmluZyBtZXRob2RzLCBzdWNoIGFzIGBhcHBseUZpbHRlckFzeW5jYC5cbiAgICpcbiAgICogSWYgeW91IGFkZCB0aGUgc2FtZSBmaWx0ZXIgZmllbGRzIHVzaW5nIHRoZSBgYWRkRmlsdGVyKClgIG1ldGhvZCBhbmQgYnkgdXNpbmcgdGhlIGA8dml6LWZpbHRlcj5gIGVsZW1lbnQgaW4gdGhlIGA8dGFibGVhdS12aXo+YCB3ZWIgY29tcG9uZW50LFxuICAgKiB5b3UgbWlnaHQgZXhwZXJpZW5jZSB1bmV4cGVjdGVkIGJlaGF2aW9yLlxuICAgKlxuICAgKiBAcGFyYW0gZmllbGROYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBmaWx0ZXIgb24uXG4gICAqIEBwYXJhbSB2YWx1ZSBTaW5nbGUgdmFsdWUgb3IgYSBsaXN0IG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMgdG8gZmlsdGVyIG9uLlxuICAgKlxuICAgKiBgYGBcbiAgICogdml6LmFkZEZpbHRlcignUmVnaW9uJywgJ0NlbnRyYWwsV2VzdCcpO1xuICAgKiBgYGBcbiAgICovXG4gIGFkZEZpbHRlcihmaWVsZE5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byByZWFkanVzdCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZW1iZWRkZWQgdml6IGluIHJlc3BvbnNlIHRvIHRoaW5ncyBsaWtlIGEgd2luZG93IHJlc2l6ZSwgZGV2aWNlIG9yaWVudGF0aW9uIGNoYW5nZSwgb3JcbiAgICogcGFyZW50IGNvbnRhaW5lciByZXNpemUuXG4gICAqXG4gICAqIGBgYFxuICAgKiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdml6LnJlc2l6ZSgpKTtcbiAgICpcbiAgICogbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHZpei5yZXNpemUoKSkub2JzZXJ2ZSh2aXoucGFyZW50RWxlbWVudCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVzaXplKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBsYXVuY2ggdGhlIEFuYWx5dGljcyBBc3Npc3RhbnQgc2lkZSBwYW5lLlxuICAgKiBZb3UgY2FuIHVzZSB0aGUgYGlzQW5hbHl0aWNzQXNzaXN0YW50QXZhaWxhYmxlQXN5bmMoKWAgbWV0aG9kIHRvIGNoZWNrIGlmIHRoZSBBbmFseXRpY3MgQXNzaXN0YW50IGlzIGF2YWlsYWJsZSBmb3IgdXNlLlxuICAgKlxuICAgKiBgYGBcbiAgICogY29uc3QgaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUgPSBhd2FpdCB2aXouaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGVBc3luYygpO1xuICAgKiBpZiAoaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUpIHtcbiAgICogICBhd2FpdCB2aXoubGF1bmNoQW5hbHl0aWNzQXNzaXN0YW50QXN5bmMoKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGxhdW5jaEFuYWx5dGljc0Fzc2lzdGFudEFzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBBbmFseXRpY3MgQXNzaXN0YW50IHNpZGUgcGFuZSBpcyBhdmFpbGFibGUuXG4gICAqL1xuICBpc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZUFzeW5jKCk6IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVml6U2l6ZSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaGVldFNpemUgcmVjb3JkIGZvciB0aGUgY3VycmVudCBzaGVldFxuICAgKi9cbiAgcmVhZG9ubHkgc2hlZXRTaXplOiBTaGVldFNpemU7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGhlaWdodCBvZiB0aGUgVGFibGVhdSBVSSBlbGVtZW50cyAodGhlIGNocm9tZSkgc3Vycm91bmRpbmcgdGhlIHZpZXcuXG4gICAqL1xuICByZWFkb25seSBjaHJvbWVIZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGFsbCBvZiB0aGUgb3B0aW9ucyBmb3IgY29uZmlndXJpbmcgYSB2aXogdGhhdCBhcmUgY29tbW9uIGJldHdlZW5cbiAqIHZpZXdpbmcgYW5kIGF1dGhvcmluZyBtb2RlLlxuICovXG5pbnRlcmZhY2UgVml6U2V0dGluZ3NTaGFyZWQgZXh0ZW5kcyBXZWJDb21wb25lbnRTZXR0aW5nc1NoYXJlZCB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byB0b3VjaCBvcHRpbWl6ZSB2aXogY29udHJvbHMuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgdG91Y2gtb3B0aW1pemUgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b3VjaC1vcHRpbWl6ZSAvPlxuICAgKiBgYGBcbiAgICovXG4gIHRvdWNoT3B0aW1pemU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgRWRpdCBpbiBEZXNrdG9wIGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gZmFsc2UsIG1lYW5pbmcgdGhhdCB0aGUgRWRpdCBpbiBEZXNrdG9wIGJ1dHRvbiBpcyB2aXNpYmxlLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGhpZGUtZWRpdC1pbi1kZXNrdG9wLWJ1dHRvbj5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBoaWRlLWVkaXQtaW4tZGVza3RvcC1idXR0b24+XG4gICAqIGBgYFxuICAgKi9cbiAgaGlkZUVkaXRJbkRlc2t0b3BCdXR0b24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGVmYXVsdCBlZGl0IGJlaGF2aW9yIGlzIHN1cHByZXNzZWQuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIGZhbHNlLCBtZWFuaW5nIHRoYXQgdGhlIGRlZmF1bHQgZWRpdCBiZWhhdmlvciBpcyBub3Qgc3VwcHJlc3NlZC5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBzdXBwcmVzcy1kZWZhdWx0LWVkaXQtYmVoYXZpb3I+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgc3VwcHJlc3MtZGVmYXVsdC1lZGl0LWJlaGF2aW9yPlxuICAgKiBgYGBcbiAgICovXG4gIHN1cHByZXNzRGVmYXVsdEVkaXRCZWhhdmlvcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgRWRpdCBJbiBEZXNrdG9wIEJ1dHRvbi4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQ9XCJvbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkSGFuZGxlclwiIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZD1cIm9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgc2l6ZSBvZiB0aGUgdml6IGlzIGtub3duLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHRvIHBlcmZvcm0gdGFza3Mgc3VjaCBhcyByZXNpemluZ1xuICAgKiB0aGUgZWxlbWVudHMgc3Vycm91bmRpbmcgdGhlIFZpeiBvYmplY3Qgb25jZSB0aGUgb2JqZWN0J3Mgc2l6ZSBoYXMgYmVlbiBlc3RhYmxpc2hlZC5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBcIm9uRmlyc3RWaXpTaXplS25vd25cIj1cIm9uRmlyc3RWaXpTaXplS25vd25IYW5kbGVyXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkZpcnN0Vml6U2l6ZUtub3duPVwib25GaXJzdFZpelNpemVLbm93bkhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRmlyc3RWaXpTaXplS25vd24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSBWaXogb2JqZWN0IGZpcnN0IGJlY29tZXMgaW50ZXJhY3RpdmUuIFRoaXMgaXMgb25seSByYWlzZWQgb25jZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBcIm9uRmlyc3RJbnRlcmFjdGl2ZVwiPVwib25GaXJzdEludGVyYWN0aXZlSGFuZGxlclwiIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25GaXJzdEludGVyYWN0aXZlPVwib25GaXJzdEludGVyYWN0aXZlSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25GaXJzdEludGVyYWN0aXZlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHZpeiBpbiB2aWV3IG1vZGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6U2V0dGluZ3MgZXh0ZW5kcyBWaXpTZXR0aW5nc1NoYXJlZCB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byBzdXBwcmVzcyB0aGUgZXhlY3V0aW9uIG9mIFVSTCBhY3Rpb25zLiBUaGlzIG9wdGlvbiBkb2VzIG5vdCBwcmV2ZW50IHRoZSBVUkwgYWN0aW9uXG4gICAqIGV2ZW50IGZyb20gYmVpbmcgcmFpc2VkLiBZb3UgY2FuIHVzZSB0aGlzIG9wdGlvbiB0byBjaGFuZ2Ugd2hhdCBoYXBwZW5zIHdoZW4gYSBVUkwgYWN0aW9uIG9jY3Vycy4gSWYgc2V0XG4gICAqIHRvIHRydWUgYW5kIHlvdSBjcmVhdGUgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHRoZSBVUkxfQUNUSU9OIGV2ZW50LCB5b3UgY2FuIHVzZSBhbiBldmVudCBsaXN0ZW5lclxuICAgKiBoYW5kbGVyIHRvIGN1c3RvbWl6ZSB0aGUgYWN0aW9ucy5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBkaXNhYmxlLXVybC1hY3Rpb25zIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgZGlzYWJsZVVybEFjdGlvbnNQb3B1cHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0YWJzIGFyZSBoaWRkZW4gb3Igc2hvd24uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgIGhpZGUtdGFicyAvPlxuICAgKiBgYGBcbiAgICovXG4gIGhpZGVUYWJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9vbGJhciwgaWYgaXQgaXMgc2hvd24uIFRoZSB2YWx1ZXMgY2FuIGJlIFRvb2xiYXIuVG9wLFxuICAgKiBUb29sYmFyLkJvdHRvbSBvciBUb29sYmFyLkhpZGRlbi5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gVG9vbGJhci5Cb3R0b20uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgIHRvb2xiYXI9XCJoaWRkZW5cIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIHRvb2xiYXI/OiBUb29sYmFyO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSBkZXZpY2UgbGF5b3V0IGZvciBhIGRhc2hib2FyZCwgaWYgaXQgZXhpc3RzLlxuICAgKiBWYWx1ZXMgY2FuIGJlIGRlZmF1bHQsIGRlc2t0b3AsIHRhYmxldCwgb3IgcGhvbmUuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIGxvYWRpbmcgYSBsYXlvdXQgYmFzZWQgb24gdGhlXG4gICAqIHNtYWxsZXN0IGRpbWVuc2lvbiBvZiB0aGUgaG9zdGluZyBpZnJhbWUgZWxlbWVudC5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiAgZGV2aWNlPVwiZGVza3RvcFwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgZGV2aWNlPzogRGV2aWNlVHlwZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBJRCBvZiBhbiBleGlzdGluZyBpbnN0YW5jZSB0byBtYWtlIGEgY29weSAoY2xvbmUpIG9mLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgdXNlciB3YW50cyB0byBjb250aW51ZSBhbmFseXNpcyBvZiBhbiBleGlzdGluZyB2aXN1YWxpemF0aW9uXG4gICAqIHdpdGhvdXQgbG9zaW5nIHRoZSBzdGF0ZSBvZiB0aGUgb3JpZ2luYWwuIElmIHRoZSBJRCBkb2VzIG5vdCByZWZlciB0byBhbiBleGlzdGluZyB2aXN1YWxpemF0aW9uLFxuICAgKiB0aGUgY2xvbmVkIHZlcnNpb24gaXMgZGVyaXZlZCBmcm9tIHRoZSBvcmlnaW5hbCB2aXN1YWxpemF0aW9uLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiICBpbnN0YW5jZS1pZC10by1jbG9uZT1cImlkMVwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaW5zdGFuY2VJZFRvQ2xvbmU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBFZGl0IGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogSWYgbm90IHNldCwgZGVmYXVsdHMgdG8gZmFsc2UsIG1lYW5pbmcgdGhhdCB0aGUgRWRpdCBidXR0b24gaXMgdmlzaWJsZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBoaWRlLWVkaXQtYnV0dG9uPlxuICAgKiBgYGBcbiAgICovXG4gIGhpZGVFZGl0QnV0dG9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBFZGl0IEJ1dHRvbi5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkVkaXRCdXR0b25DbGlja2VkPVwib25FZGl0QnV0dG9uQ2xpY2tlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRWRpdEJ1dHRvbkNsaWNrZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFRhYmxlYXVWaXogb2JqZWN0cy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkZpbHRlckNoYW5nZWQ9XCJvbkZpbHRlckNoYW5nZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkZpbHRlckNoYW5nZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIG1hcmsgY29udGV4dCBtZW51IGlzIGNsaWNrZWQuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25DdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudD1cIm9uQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgc2VsZWN0ZWQgbWFya3Mgb24gYSB2aXN1YWxpemF0aW9uIGhhdmUgY2hhbmdlZC4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uTWFya1NlbGVjdGlvbkNoYW5nZWQ9XCJvbk1hcmtTZWxlY3Rpb25DaGFuZ2VkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25NYXJrU2VsZWN0aW9uQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbUGFyYW1ldGVyXV0gb2JqZWN0cy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvblBhcmFtZXRlckNoYW5nZWQ9XCJvblBhcmFtZXRlckNoYW5nZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvblBhcmFtZXRlckNoYW5nZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgdG9vbGJhciBidXR0b24gb3IgY29udHJvbCBiZWNvbWVzIGF2YWlsYWJsZSBvciBiZWNvbWVzIHVuYXZhaWxhYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uVG9vbGJhclN0YXRlQ2hhbmdlZD1cIm9uVG9vbGJhclN0YXRlQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uVG9vbGJhclN0YXRlQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBVUkwgYWN0aW9uIG9jY3Vycy4gU2VlIHRoZSB7QGxpbmsgVXJsQWN0aW9uRXZlbnR9IGNsYXNzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uVXJsQWN0aW9uPVwib25VcmxBY3Rpb25IYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvblVybEFjdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIGFmdGVyIGEgdGFiIHN3aXRjaCBvY2N1cnMgKHRoZSBhY3RpdmUgc2hlZXQgaGFzIGNoYW5nZWQpLiBHdWFyYW50ZWVzIHRoZSB2aXogb2JqZWN0IHdpbGwgYmUgaW50ZXJhY3RpdmUgYWZ0ZXIgdGhpcy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvblRhYlN3aXRjaGVkPVwib25UYWJTd2l0Y2hlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uVGFiU3dpdGNoZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGZpbmlzaGVkIGxvYWRpbmcuIFRoaXMgZXZlbnQgaXMgcmFpc2VkIGFmdGVyIHRoZSBjYWxsYmFja1xuICAgKiBmdW5jdGlvbiBmb3Ige0BsaW5rIEZpcnN0SW50ZXJhY3RpdmV9IChpZiBhbnkpIGhhcyBiZWVuIGNhbGxlZC5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbVZpZXdMb2FkZWQ9XCJvbkN1c3RvbVZpZXdMb2FkZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkN1c3RvbVZpZXdMb2FkZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gcmVtb3ZlZC5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbVZpZXdSZW1vdmVkPVwib25DdXN0b21WaWV3UmVtb3ZlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tVmlld1JlbW92ZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2F2ZWQgKG5ld2x5IGNyZWF0ZWQgb3IgdXBkYXRlZCkuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25DdXN0b21WaWV3U2F2ZWQ9XCJvbkN1c3RvbVZpZXdTYXZlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tVmlld1NhdmVkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNldCBhcyB0aGUgZGVmYXVsdCB2aWV3IGZvciBhIHdvcmtib29rLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uQ3VzdG9tVmlld1NldERlZmF1bHQ9XCJvbkN1c3RvbVZpZXdTZXREZWZhdWx0SGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25DdXN0b21WaWV3U2V0RGVmYXVsdD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIGFmdGVyIGEgbmV3IHN0b3J5IHBvaW50IGJlY29tZXMgYWN0aXZlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uU3RvcnlQb2ludFN3aXRjaGVkPVwib25TdG9yeVBvaW50U3dpdGNoZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvblN0b3J5UG9pbnRTd2l0Y2hlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHN1bW1hcnkgZGF0YSBvbiBhIHZpc3VhbGl6YXRpb24gaGF2ZSBjaGFuZ2VkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25TdW1tYXJ5RGF0YUNoYW5nZWQ9XCJvblN1bW1hcnlEYXRhQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uU3VtbWFyeURhdGFDaGFuZ2VkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIChCZXRhKSBSZXByZXNlbnRzIHRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHZpeiBpbiBhdXRob3JpbmcgbW9kZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXpBdXRob3JpbmdTZXR0aW5ncyBleHRlbmRzIFZpelNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBDbG9zZSBidXR0b24gaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIElmIG5vdCBzZXQsIGRlZmF1bHRzIHRvIGZhbHNlLCBtZWFuaW5nIHRoYXQgdGhlIENsb3NlIGJ1dHRvbiBpcyB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBoaWRlLWNsb3NlLWJ1dHRvbiAvPlxuICAgKiBgYGBcbiAgICovXG4gIGhpZGVDbG9zZUJ1dHRvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vayBoYXMgYmVlbiBwdWJsaXNoZWQuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIG9uV29ya2Jvb2tQdWJsaXNoZWQ9XCJvbldvcmtib29rUHVibGlzaGVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25Xb3JrYm9va1B1Ymxpc2hlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gXCJwdWJsaXNoIGFzXCIgaXMgc3VjY2Vzc2Z1bC4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25Xb3JrYm9va1B1Ymxpc2hlZEFzPVwib25Xb3JrYm9va1B1Ymxpc2hlZEFzSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25Xb3JrYm9va1B1Ymxpc2hlZEFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgd29ya2Jvb2sgaXMgcmVhZHkgdG8gY2xvc2UuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIG9uV29ya2Jvb2tSZWFkeVRvQ2xvc2U9XCJvbldvcmtib29rUmVhZHlUb0Nsb3NlSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25Xb3JrYm9va1JlYWR5VG9DbG9zZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJQYXJhbWV0ZXJzIHtcbiAgZmllbGQ6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBWaXpQYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIHNldCBQYXJhbWV0ZXIgdmFsdWVzIG9uIHRoZSB2aXouXG4gKlxuICogKiBgYGBcbiAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIj5cbiAqICA8dml6LXBhcmFtZXRlciBuYW1lPVwicGFyYW1ldGVyLW5hbWVcIiB2YWx1ZT1cInBhcmFtZXRlci12YWx1ZVwiPjwvdml6LXBhcmFtZXRlcj5cbiAqIDwvdGFibGVhdS12aXo+XG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6UGFyYW1ldGVyIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHBhcmFtZXRlciB0byBiZSBzZXQuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZhbGlkIHZhbHVlIGZvciB0aGUgcGFyYW1ldGVyIGJlaW5nIHNldC5cbiAgICovXG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ3VzdG9tUGFyYW1ldGVycyBhcmUgdXNlZCB0byBwYXNzIGFsb25nIHNldHRpbmdzLCBpbmZvcm1hdGlvbiwgZXRjLiwgdGhhdCBhcmVuJ3QgZXhwb3NlZCBvbiB0aGVcbiAqIHRhYmxlYXUtdml6IGVsZW1lbnQuIEN1c3RvbVBhcmFtZXRlcnMgd2lsbCBvdmVycmlkZSBhdHRyaWJ1dGVzLCBvciBmaWx0ZXJzLCBzZXQgb24gdGhlIHRhYmxlYXUtdml6IGVsZW1lbnQuXG4gKlxuICogKiBgYGBcbiAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIj5cbiAqICA8Y3VzdG9tLXBhcmFtZXRlciBuYW1lPVwicGFyYW1ldGVyLW5hbWVcIiB2YWx1ZT1cInBhcmFtZXRlci12YWx1ZVwiPjwvY3VzdG9tLXBhcmFtZXRlcj5cbiAqIDwvdGFibGVhdS12aXo+XG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tUGFyYW1ldGVyIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHBhcmFtZXRlciB0byBiZSBzZXQuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZhbGlkIHZhbHVlIGZvciB0aGUgcGFyYW1ldGVyIGJlaW5nIHNldC5cbiAgICovXG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGV4cG9ydGluZyBkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydERhdGFPcHRpb25zIHtcbiAgLyoqXG4gICAqIERvIG5vdCB1c2UgYWxpYXNlcyBzcGVjaWZpZWQgaW4gdGhlIGRhdGEgc291cmNlIGluIFRhYmxlYXUuIERlZmF1bHQgaXMgZmFsc2UuXG4gICAqL1xuICBpZ25vcmVBbGlhc2VzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBjb2x1bW5zIHRvIGluY2x1ZGUgc3BlY2lmaWVkIGJ5IGZpZWxkIGlkLCBpbmNsdWRlcyBhbGwgYnkgZGVmYXVsdC5cbiAgICogVGhlIG9yZGVyIG9mIHRoZSBjb2x1bW4gaWRzIGluIHRoZSBhcnJheSBkZXRlcm1pbmVzIHRoZSBjb2x1bW4gb3JkZXIgc2hvd24gaW4gdGhlIHN1bW1hcnkgZGF0YSB0YWJsZS5cbiAgICovXG4gIGNvbHVtbnNUb0luY2x1ZGVCeUlkPzogQXJyYXk8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRQREZPcHRpb25zIHtcbiAgc2NhbGluZzogUHJpbnRTY2FsaW5nO1xuICBwYWdlU2l6ZTogUHJpbnRQYWdlU2l6ZTtcbiAgb3JpZW50YXRpb246IFByaW50T3JpZW50YXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCB7XG4gIGN1cnJlbnRTaGVldE5hbWU6IHN0cmluZztcbiAgZXhwb3J0YWJsZVNoZWV0TmFtZXNGcm9tRGFzaGJvYXJkOiBBcnJheTxzdHJpbmc+O1xuICBleHBvcnRhYmxlU2hlZXROYW1lc0Zyb21Xb3JrYm9vazogQXJyYXk8c3RyaW5nPjtcbn1cbiIsIi8qKlxuICogVXNlciBzdXBwbGllZCBvcHRpb25zIHRoYXQgZG8gbm90IGdldCBwYXNzZWQgYXMgcmVxdWVzdCBwYXJhbWV0ZXJzIHRvIGxvYWQgYSBUYWJsZWF1IHZpeiwgVGFibGVhdSBhc2tkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBUaGUgdml6IHNyY1xuICAgKi9cbiAgc3JjPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogUmVwcmVzZW50cyB3aWR0aCBpbiBwaXhlbHNcbiAgICogQ2FuIGJlIGFueSB2YWxpZCBDU1Mgc2l6ZSBzcGVjaWZpZXIuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIHRoZSBwdWJsaXNoZWQgd2lkdGggb2YgdGhlIHZpZXcuXG4gICAqL1xuICB3aWR0aD86IHN0cmluZyB8IG51bWJlcjtcblxuICAvKipcbiAgICogUmVwcmVzZW50cyBoZWlnaHQgaW4gcGl4ZWxzXG4gICAqIENhbiBiZSBhbnkgdmFsaWQgQ1NTIHNpemUgc3BlY2lmaWVyLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byB0aGUgcHVibGlzaGVkIGhlaWdodCBvZiB0aGUgdmlldy5cbiAgICovXG4gIGhlaWdodD86IHN0cmluZyB8IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGFsbCBvZiB0aGUgb3B0aW9ucyBmb3IgY29uZmlndXJpbmcgYSB3ZWJjb21wb25lbnQgdGhhdCBhcmUgY29tbW9uIGJldHdlZW5cbiAqIHZpeiBhbmQgYXNrZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJDb21wb25lbnRTZXR0aW5nc1NoYXJlZCB7XG4gIC8qKlxuICAgKiBUaGUgdG9rZW4gdXNlZCBmb3IgYXV0aG9yaXphdGlvblxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgdG9rZW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBub24tbWluaWZpZWQgdmVyc2lvbiBvZiBKYXZhU2NyaXB0IGlzIGxvYWRlZC4gSWYgc3BlY2lmaWVkIChvciBzZXQgdG8gdHJ1ZSksIHRoZVxuICAgKiBub24tbWluaWZpZWQgdmVyc2lvbiBpcyB1c2VkIGZvciBib3RoIHRoZSBsb2NhbCBjb21wb25lbnQgYW5kIHRoZSBUYWJsZWF1IFNlcnZlciB2aXN1YWxpemF0aW9uIChpZiBlbmFibGVkKS5cbiAgICogSWYgbm90IHNwZWNpZmllZCAob3Igc2V0IHRvIGZhbHNlKSwgdGhlIG1pbmlmaWVkIHZlcnNpb24gb2YgdGhlIEphdmFTY3JpcHQgZmlsZXMgYXJlIGxvYWRlZC5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBkZWJ1ZyAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGRlYnVnIC8+XG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBkZWJ1ZyAvPlxuICAgKiBgYGBcbiAgICovXG4gIGRlYnVnPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gdXNlIHRoZSBvbGQgYXV0aCBtZWNoYW5pc20gZm9yIGF1dGhlbnRpY2F0aW9uIHdoaWNoIGhhcHBlbnMgaW5zaWRlIHRoZSBpZnJhbWUuIElmIHNwZWNpZmllZCwgVml6TG9hZEVycm9yRXZlbnRzXG4gICAqIHRyaWdnZXJlZCBkdWUgdG8gYXV0aCBmYWlsdXJlcyB3aWxsIG5vdCBiZSB0aHJvd24uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF1dGggLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXV0aCAvPlxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgaWZyYW1lLWF1dGggLz5cbiAgICogYGBgXG4gICAqL1xuICBpZnJhbWVBdXRoPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSAnbG9hZGluZycgYXR0cmlidXRlIG9mIHRoZSBlbWJlZGRlZCBpZnJhbWUuXG4gICAqIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2lmcmFtZSNsb2FkaW5nXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItbG9hZGluZz1cImxhenlcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdHRyLWxvYWRpbmc9XCJsYXp5XCIgLz5cbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBpZnJhbWUtYXR0ci1sb2FkaW5nPVwibGF6eVwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlTG9hZGluZz86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSAnc3R5bGUnIGF0dHJpYnV0ZSBvZiB0aGUgZW1iZWRkZWQgaWZyYW1lLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdHRyLXN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgcmVkXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1zdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkIHJlZFwiIC8+XG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgaWZyYW1lLWF0dHItc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCByZWRcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIGlmcmFtZUF0dHJpYnV0ZVN0eWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlICdjbGFzcycgYXR0cmlidXRlIG9mIHRoZSBlbWJlZGRlZCBpZnJhbWUgcHJvdmlkaW5nIGFjY2VzcyB0byBhbnlcbiAgICogY3VzdG9tIHNlbGVjdG9ycyBkZWZpbmVkIGluIHRoZSBgPGlmcmFtZS1zdHlsZT5gIGNoaWxkIHRhZy5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1jbGFzcz1cInJlZC1ib3JkZXJcIj5cbiAgICogICA8aWZyYW1lLXN0eWxlPlxuICAgKiAgICAgLnJlZC1ib3JkZXIge1xuICAgKiAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZWQ7XG4gICAqICAgICB9XG4gICAqICAgPC9pZnJhbWUtc3R5bGU+XG4gICAqIDwvdGFibGVhdS12aXo+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlQ2xhc3M/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBjb21tb24gc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSB0YWJsZWF1IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFdlYkNvbXBvbmVudEF0dHJpYnV0ZXMge1xuICBTcmMgPSAnc3JjJyxcbiAgV2lkdGggPSAnd2lkdGgnLFxuICBIZWlnaHQgPSAnaGVpZ2h0JyxcbiAgVG9rZW4gPSAndG9rZW4nLFxuICBEZWJ1ZyA9ICdkZWJ1ZycsXG4gIElmcmFtZUF1dGggPSAnaWZyYW1lLWF1dGgnLFxuICBPblZpekxvYWRFcnJvciA9ICdvbnZpemxvYWRlcnJvcicsXG4gIEZvcmNlVG9rZW5TeW5jID0gJ2ZvcmNlLXRva2VuLXN5bmMnLFxufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgZW1iZWRkZWQgaWZyYW1lIGF0dHJpYnV0ZXMgd2hvc2UgdmFsdWVzIGNhbiBiZSBjb250cm9sbGVkLlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBFbWJlZGRlZElmcmFtZUF0dHJpYnV0ZXMge1xuICBMb2FkaW5nID0gJ2lmcmFtZS1hdHRyLWxvYWRpbmcnLFxuICBTdHlsZSA9ICdpZnJhbWUtYXR0ci1zdHlsZScsXG4gIENsYXNzID0gJ2lmcmFtZS1hdHRyLWNsYXNzJyxcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgY2hpbGQgdGFncyBmb3IgVGFibGVhdVZpeiwgVGFibGVhdUF1dGhvcmluZ1ZpeiBhbmQgVGFibGVhdUFza0RhdGEgY3VzdG9tIGVsZW1lbnRzLlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBXZWJDb21wb25lbnRDaGlsZEVsZW1lbnRzIHtcbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbGlzdCBvZiBjdXN0b20gcGFyYW1ldGVycy4gIEF2YWlsYWJsZSBpbiB2aXogdmlld2luZywgdml6IGF1dGhvcmluZyBhbmQgYXNrZGF0YS5cbiAgICovXG4gIEN1c3RvbVBhcmFtZXRlciA9ICdjdXN0b20tcGFyYW1ldGVyJyxcblxuICAvKipcbiAgICogQ3VzdG9tIHN0eWxlcyBhcHBsaWNhYmxlIHRvIHRoZSBlbWJlZGRlZCBpZnJhbWUgZWxlbWVudCBpdHNlbGYgKG5vdCBpbnNpZGUgaXQpLlxuICAgKi9cbiAgSWZyYW1lU3R5bGUgPSAnaWZyYW1lLXN0eWxlJyxcbn1cblxuZXhwb3J0IGVudW0gV2ViQ29tcG9uZW50Q2hpbGRFbGVtZW50QXR0cmlidXRlcyB7XG4gIEZpZWxkID0gJ2ZpZWxkJyxcbiAgVmFsdWUgPSAndmFsdWUnLFxuICBOYW1lID0gJ25hbWUnLFxufVxuIiwiLy8gQWxsIGVudW0gdmFsdWVzIG1hZGUgYXZhaWxhYmxlIHRvIEV4dGVuc2lvbnMgZGV2ZWxvcGVycy5cbi8vIEVudW1zIHNob3VsZCBiZSBrZXB0IGluIGFscGhhYmV0aWNhbCBvcmRlci5cblxuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4vRXh0ZW5zaW9ucyc7XG5cbm5hbWVzcGFjZSBUYWJsZWF1IHtcbiAgZXhwb3J0IGxldCBleHRlbnNpb25zOiBFeHRlbnNpb25zO1xuICAvKipcbiAgICogQWxsIGVycm9yIGNvZGVzIHVzZWQgYnkgdGhlIEV4dGVuc2lvbnMgQVBJLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRXJyb3JDb2RlcyB7XG4gICAgLyoqXG4gICAgICogVGhyb3duIHdoZW4gY2FsbGVyIGF0dGVtcHRzIHRvIGV4ZWN1dGUgY29tbWFuZCBiZWZvcmUgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBBUElOb3RJbml0aWFsaXplZCA9ICdhcGktbm90LWluaXRpYWxpemVkJyxcbiAgICAvKipcbiAgICAgKiBUaHJvd24gd2hlbiBjYWxsZXIgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBjb21tYW5kIHdoaWxlIGV4dGVuc2lvbiBpcyBub3QgdmlzaWJsZS5cbiAgICAgKi9cbiAgICBWaXNpYmlsaXR5RXJyb3IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gICAgLyoqXG4gICAgICogT25seSBvbmUgZGlhbG9nIGNhbiBiZSBvcGVuZWQgYXQgdGltZSB3aXRoIHRoZSBVSSBuYW1lc3BhY2UgZnVuY3Rpb25hbGl0eS5cbiAgICAgKi9cbiAgICBEaWFsb2dBbHJlYWR5T3BlbiA9ICdkaWFsb2ctYWxyZWFkeS1vcGVuJyxcbiAgICAvKipcbiAgICAgKiBUaGUgb3BlbiBkaWFsb2cgd2FzIGNsb3NlZCBieSB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBEaWFsb2dDbG9zZWRCeVVzZXIgPSAnZGlhbG9nLWNsb3NlZC1ieS11c2VyJyxcbiAgICAvKipcbiAgICAgKiBBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIFRhYmxlYXUgRXh0ZW5zaW9ucyBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgICAqL1xuICAgIEludGVybmFsRXJyb3IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICAgIC8qKlxuICAgICAqIEEgZGlhbG9nIG11c3Qgc3RhcnQgb24gdGhlIHNhbWUgZG9tYWluIGFzIHRoZSBwYXJlbnQgZXh0ZW5pb24uXG4gICAgICovXG4gICAgSW52YWxpZERvbWFpbkRpYWxvZyA9ICdpbnZhbGlkLWRpYWxvZy1kb21haW4nLFxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZSBmaWVsZC5cbiAgICAgKi9cbiAgICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgICAvKipcbiAgICAgKiBDYW4gb2NjdXIgaWYgdGhlIGV4dGVuc2lvbiBpbnRlcmFjdHMgd2l0aCBhIGZpbHRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgICAqL1xuICAgIE1pc3NpbmdGaWx0ZXIgPSAnbWlzc2luZy1maWx0ZXInLFxuICAgIC8qKlxuICAgICAqIENhbiBvY2N1ciBpZiB0aGUgZXh0ZW5zaW9uIGludGVyYWN0cyB3aXRoIGEgcGFyYW1ldGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAgICovXG4gICAgTWlzc2luZ1BhcmFtZXRlciA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgU2VydmVyIEVycm9yXG4gICAgICovXG4gICAgU2VydmVyRXJyb3IgPSAnc2VydmVyLWVycm9yJyxcbiAgICAvKipcbiAgICAgKiBEZXZlbG9wZXIgY2Fubm90IHNhdmUgc2V0dGluZ3Mgd2hpbGUgYW5vdGhlciBzYXZlIGlzIHN0aWxsIGluIHByb2dyZXNzLlxuICAgICAqL1xuICAgIFNldHRpbmdTYXZlSW5Qcm9ncmVzcyA9ICdzZXR0aW5nLXNhdmUtaW4tcHJvZ3Jlc3MnLFxuICAgIC8qKlxuICAgICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIGBhZGRFdmVudExpc3RlbmVyYCBvciBgcmVtb3ZlRXZlbnRMaXN0ZW5lcmAuXG4gICAgICovXG4gICAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gICAgLyoqXG4gICAgICogQSBtZXRob2Qgd2FzIHVzZWQgZm9yIGEgdHlwZSBvZiBkYXRhIHNvdXJjZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGF0IG1ldGhvZCAoc2VlIGdldEFjdGl2ZVRhYmxlc0FzeW5jIGZvciBhbiBleGFtcGxlKVxuICAgICAqL1xuICAgIFVuc3VwcG9ydGVkTWV0aG9kRm9yRGF0YVNvdXJjZVR5cGUgPSAndW5zdXBwb3J0ZWQtbWV0aG9kLWZvci1kYXRhLXNvdXJjZS10eXBlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgRXh0ZW5zaW9ucyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4dGVuc2lvbkNvbnRleHQge1xuICAgIERlc2t0b3AgPSAnZGVza3RvcCcsXG4gICAgU2VydmVyID0gJ3NlcnZlcicsXG4gICAgQ2xvdWQgPSAnY2xvdWQnLFxuICAgIFB1YmxpY1dlYiA9ICdwdWJsaWMtd2ViJyxcbiAgICBQdWJsaWNEZXNrdG9wID0gJ3B1YmxpYy1kZXNrdG9wJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGUgRXh0ZW5zaW9ucyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4dGVuc2lvbk1vZGUge1xuICAgIEF1dGhvcmluZyA9ICdhdXRob3JpbmcnLFxuICAgIFZpZXdpbmcgPSAndmlld2luZycsXG4gIH1cblxuICAvKipcbiAgICogUmVwcmVzZW50cyB0aGUgdHlwZSBvZiBldmVudCB0aGF0IGNhbiBiZSBsaXN0ZW5lZCBmb3IuXG4gICAqL1xuICBleHBvcnQgZW51bSBUYWJsZWF1RXZlbnRUeXBlIHtcbiAgICAvKipcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICogUmFpc2VkIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkIHRoYXQgd2FzIHNlbnQgYnkgYSBkaWFsb2cgb3IgZXh0ZW5zaW9uIHZpYSBgc2VuZERpYWxvZ01lc3NhZ2VBc3luY2AuKi9cbiAgICBEaWFsb2dNZXNzYWdlUmVjZWl2ZWQgPSAnZGlhbG9nLW1lc3NhZ2UtcmVjZWl2ZWQnLFxuXG4gICAgLyoqIFJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuKi9cbiAgICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgc2VsZWN0ZWQgbWFya3Mgb24gYSB2aXN1YWxpemF0aW9uIGhhcyBjaGFuZ2VkLlxuICAgICAqIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuICovXG4gICAgTWFya1NlbGVjdGlvbkNoYW5nZWQgPSAnbWFyay1zZWxlY3Rpb24tY2hhbmdlZCcsXG5cbiAgICAvKiogVGhlIHN1bW1hcnkgZGF0YSBiYWNraW5nIGEgd29ya3NoZWV0IGhhcyBjaGFuZ2VkXG4gICAgICogWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1dvcmtzaGVldF0oLi4vaW50ZXJmYWNlcy93b3Jrc2hlZXQuaHRtbCkgb2JqZWN0cy4qL1xuICAgIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5LWRhdGEtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbUGFyYW1ldGVyXV0gb2JqZWN0cy4gKi9cbiAgICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBTZXR0aW5ncyBoYXZlIGJlZW4gY2hhbmdlZCBmb3IgdGhpcyBleHRlbnNpb24uIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbU2V0dGluZ3NdXSBvYmplY3RzLiAqL1xuICAgIFNldHRpbmdzQ2hhbmdlZCA9ICdzZXR0aW5ncy1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgZGFzaGJvYXJkIGxheW91dCBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIERhc2hib2FyZExheW91dENoYW5nZWQgPSAnZGFzaGJvYXJkLWxheW91dC1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgd29ya2Jvb2sgZm9ybWF0dGluZyBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWQgPSAnd29ya2Jvb2stZm9ybWF0dGluZy1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgd29ya3NoZWV0IGZvcm1hdHRpbmcgaGFzIGNoYW5nZWRcbiAgICAgKiBAY2F0ZWdvcnkgVml6IEV4dGVuc2lvbnNcbiAgICAgKi9cbiAgICBXb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZCA9ICd3b3Jrc2hlZXQtZm9ybWF0dGluZy1jaGFuZ2VkJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgZGF0YSB0eXBlIG9mIGVuY29kaW5ncyBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuNi4wXG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZUVuY29kaW5nVHlwZSB7XG4gICAgRGlzY3JldGUgPSAnZGlzY3JldGUnLFxuICAgIENvbnRpbnVvdXMgPSAnY29udGludW91cycsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHNvcnQgZGlyZWN0aW9uIGZvciBjcmVhdGVWaXpJbWFnZUFzeW5jLlxuICAgKiBAc2luY2UgMS44LjAgYW5kIFRhYmxlYXUgMjAyMS40XG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZVNvcnREaXJlY3Rpb25UeXBlIHtcbiAgICBBc2NlbmRpbmcgPSAnYXNjZW5kaW5nJyxcbiAgICBEZXNjZW5kaW5nID0gJ2Rlc2NlbmRpbmcnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBwYWxldHRlIHR5cGUgZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlUGFsZXR0ZVR5cGUge1xuICAgIEN1c3RvbURpdmVyZ2luZyA9ICdjdXN0b20tZGl2ZXJnaW5nJyxcbiAgICBDdXN0b21TZXF1ZW50aWFsID0gJ2N1c3RvbS1zZXF1ZW50aWFsJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgU2l6ZSBTZXR0aW5nIHR5cGUgZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlU2l6ZVNldHRpbmdUeXBlIHtcbiAgICBGaXhlZCA9ICdmaXhlZCcsXG4gICAgTWFudWFsID0gJ21hbnVhbCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIFNpemUgU2V0dGluZyBhbGlnbm1lbnQgdHlwZSBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuOC4wIGFuZCBUYWJsZWF1IDIwMjEuNFxuICAgKi9cbiAgZXhwb3J0IGVudW0gVml6SW1hZ2VTaXplU2V0dGluZ0FsaWdubWVudFR5cGUge1xuICAgIFJpZ2h0ID0gJ3JpZ2h0JyxcbiAgICBMZWZ0ID0gJ2xlZnQnLFxuICAgIENlbnRlciA9ICdjZW50ZXInLFxuICB9XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiZXhwb3J0IGVudW0gU2hhcmVkRXJyb3JDb2RlcyB7XG4gIC8qKlxuICAgKiBBIENTViBvciBFeGNlbCBmaWxlIGZhaWxlZCB0byBiZSBjcmVhdGVkIGluIFZpei5leHBvcnRDcm9zc3RhYkFzeW5jKCkuXG4gICAqL1xuICBDcm9zc3RhYkNyZWF0aW9uRXJyb3IgPSAnY3Jvc3N0YWItY3JlYXRpb24tZXJyb3InLFxuICAvKipcbiAgICogQSBDU1YgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0RGF0YUFzeW5jKCkuXG4gICAqL1xuICBEYXRhQ3JlYXRpb25FcnJvciA9ICdkYXRhLWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgYWdncmVnYXRpb24gd2FzIHNwZWNpZmllZCBmb3IgdGhlIGZpbHRlciwgc3VjaCBhcyBzZXR0aW5nIGEgcmFuZ2UgZmlsdGVyIHRvIFwiU1VNKFNhbGVzKVwiIGluc3RlYWQgb2ZcbiAgICogXCJTYWxlc1wiLlxuICAgKi9cbiAgSW52YWxpZEFnZ3JlZ2F0aW9uRmllbGROYW1lID0gJ2ludmFsaWQtYWdncmVnYXRpb24tZmllbGQtbmFtZScsXG4gIC8qKlxuICAgKiBBIGZpbHRlciBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGZpZWxkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGEgc291cmNlLlxuICAgKi9cbiAgSW52YWxpZEZpbHRlckZpZWxkTmFtZSA9ICdpbnZhbGlkLWZpbHRlci1uYW1lJyxcbiAgLyoqXG4gICAqIEEgZmlsdGVyIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIHVzaW5nIGEgdmFsdWUgdGhhdCBpcyB0aGUgd3JvbmcgZGF0YSB0eXBlIG9yIGZvcm1hdC5cbiAgICovXG4gIEludmFsaWRGaWx0ZXJGaWVsZFZhbHVlID0gJ2ludmFsaWQtZmlsdGVyLWZpZWxkVmFsdWUnLFxuICAvKipcbiAgICogQW4gaW52YWxpZCBkYXRlIHZhbHVlIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCBmb3IgYSBkYXRlIGZpZWxkLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvbkRhdGUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZGF0ZScsXG4gIC8qKlxuICAgKiBBIGZpZWxkIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYXRhIHNvdXJjZS5cbiAgICovXG4gIEludmFsaWRTZWxlY3Rpb25GaWVsZE5hbWUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZmllbGROYW1lJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBpbiBhIFNoZWV0LnNlbGVjdE1hcmtzQXN5bmMoKSBjYWxsLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblZhbHVlID0gJ2ludmFsaWQtc2VsZWN0aW9uLXZhbHVlJyxcbiAgLyoqXG4gICAqIEEgcGFyYW1ldGVyIGRpZCBub3QgaW5jbHVkZSBhIHZhbGlkIHNoZWV0IHNlbGVjdGlvbiBmb3IgZXhwb3J0aW5nLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblNoZWV0ID0gJ2ludmFsaWQtc2VsZWN0aW9uLXNoZWV0JyxcbiAgLyoqXG4gICAqIEFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgVGFibGVhdSBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgKi9cbiAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIC8qKlxuICAgKiBBIHBhcmFtZXRlciBpcyBub3QgdGhlIGNvcnJlY3QgZGF0YSB0eXBlIG9yIGZvcm1hdC4gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgaW4gdGhlIEVycm9yLm1lc3NhZ2UgZmllbGQuXG4gICAqL1xuICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEEgUERGIGZpbGUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQgaW4gVml6LmV4cG9ydFBERkFzeW5jKCkuXG4gICAqL1xuICBQREZDcmVhdGlvbkVycm9yID0gJ3BkZi1jcmVhdGlvbi1lcnJvcicsXG4gIC8qKlxuICAgKiBBIFBvd2VyUG9pbnQgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKCkuXG4gICAqL1xuICBQb3dlclBvaW50Q3JlYXRpb25FcnJvciA9ICdwb3dlcnBvaW50LWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgc2hlZXQgdGhhdCBpcyBub3QgYWN0aXZlIG9yIGVtYmVkZGVkIHdpdGhpbiB0aGUgYWN0aXZlIGRhc2hib2FyZC5cbiAgICovXG4gIE5vdEFjdGl2ZVNoZWV0ID0gJ25vdC1hY3RpdmUtc2hlZXQnLFxuICAvKipcbiAgICogUHJvcGVydHkgb3IgRnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoaW4gdGhlIFRhYmxlYXUgQVBJLlxuICAgKi9cbiAgSW1wbGVtZW50YXRpb25FcnJvciA9ICd3cm9uZy1pbXBsZW1lbnRhdGlvbicsXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgd2hlbiB0d28gaW5jb21wYXRpYmxlIGNhbGxzIGFyZSB0cmlnZ2VyZWQgdG9nZXRoZXIuXG4gICAqL1xuICBBcGlFeGVjdXRpb25FcnJvciA9ICdhcGktZXhlY3V0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEEgZ2VuZXJhbC1wdXJwb3NlIHNlcnZlciBlcnJvciBvY2N1cnJlZC4gRGV0YWlscyBhcmUgY29udGFpbmVkIGluIHRoZSBFcnJvciBvYmplY3QuXG4gICAqL1xuICBTZXJ2ZXJFcnJvciA9ICdzZXJ2ZXItZXJyb3InLFxuICAvKipcbiAgICogQ2FuIG9jY3VyIHdoZW4gYW4gYXBpIGNhbGwgdGltZXMgb3V0LlxuICAgKi9cbiAgVGltZW91dCA9ICd0aW1lb3V0Jyxcbn1cbiIsIi8qKlxuICogVGhlIHRhYmxlYXUgbmFtZXNwYWNlIGV4aXN0cyBmb3Igb3JnYW5pemF0aW9uIGFuZCB0byBhdm9pZCBwb2xsdXRpbmdcbiAqIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBJdCBjb250YWlucyBubyBjb25zdHJ1Y3RzIG90aGVyIHRoYW4gc3ViLW5hbWVzcGFjZXMgYW5kIHRoZSBUYWJsZWF1IGVudW1lcmF0aW9ucy5cbiAqL1xubmFtZXNwYWNlIFRhYmxlYXUge1xuICBleHBvcnQgZW51bSBBbmFseXRpY3NPYmplY3RUeXBlIHtcbiAgICBDbHVzdGVyID0gJ2NsdXN0ZXInLFxuICAgIEZvcmVjYXN0ID0gJ2ZvcmVjYXN0JyxcbiAgICBUcmVuZExpbmUgPSAndHJlbmQtbGluZScsXG4gIH1cblxuICBleHBvcnQgZW51bSBBbm5vdGF0aW9uVHlwZSB7XG4gICAgTWFyayA9ICdtYXJrJyxcbiAgICBQb2ludCA9ICdwb2ludCcsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIENvbHVtblR5cGUge1xuICAgIERpc2NyZXRlID0gJ2Rpc2NyZXRlJyxcbiAgICBDb250aW51b3VzID0gJ2NvbnRpbnVvdXMnLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gIH1cblxuICBleHBvcnQgZW51bSBDbGFzc05hbWVLZXkge1xuICAgIFdvcmtzaGVldFRpdGxlID0gJ3RhYmxlYXUtd29ya3NoZWV0LXRpdGxlJyxcbiAgICBXb3Jrc2hlZXQgPSAndGFibGVhdS13b3Jrc2hlZXQnLFxuICAgIFRvb2x0aXAgPSAndGFibGVhdS10b29sdGlwJyxcbiAgICBTdG9yeVRpdGxlID0gJ3RhYmxlYXUtc3RvcnktdGl0bGUnLFxuICAgIERhc2hib2FyZFRpdGxlID0gJ3RhYmxlYXUtZGFzaGJvYXJkLXRpdGxlJyxcbiAgICBQYW5lID0gJ3RhYmxlYXUtcGFuZScsXG4gICAgUm93RGl2aWRlcnMgPSAndGFibGVhdS1yb3ctZGl2aWRlcnMnLFxuICAgIENvbHVtbkRpdmlkZXJzID0gJ3RhYmxlYXUtY29sdW1uLWRpdmlkZXJzJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHRoZSBvYmplY3QgcmVwcmVzZW50cyBpbiBhIGRhc2hib2FyZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIERhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIEJsYW5rID0gJ2JsYW5rJyxcbiAgICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0JyxcbiAgICBRdWlja0ZpbHRlciA9ICdxdWljay1maWx0ZXInLFxuICAgIFBhcmFtZXRlckNvbnRyb2wgPSAncGFyYW1ldGVyLWNvbnRyb2wnLFxuICAgIFBhZ2VGaWx0ZXIgPSAncGFnZS1maWx0ZXInLFxuICAgIExlZ2VuZCA9ICdsZWdlbmQnLFxuICAgIFRpdGxlID0gJ3RpdGxlJyxcbiAgICBUZXh0ID0gJ3RleHQnLFxuICAgIEltYWdlID0gJ2ltYWdlJyxcbiAgICBXZWJQYWdlID0gJ3dlYi1wYWdlJyxcbiAgICBFeHRlbnNpb24gPSAnZXh0ZW5zaW9uJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgdmlzaWJpbGl0eSBzdGF0ZSBvZiBhIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBzaW5jZSAxLjcuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUge1xuICAgIC8qKiBVc2VkIGZvciB0dXJuaW5nIG9uIHRoZSB2aXNpYmlsaXR5IG9mIGEgZGFzaGJvYXJkIG9iamVjdC4qL1xuICAgIFNob3cgPSAnc2hvdycsXG5cbiAgICAvKiogVXNlZCBmb3IgdHVybmluZyBvZmYgdGhlIHZpc2liaWxpdHkgb2YgYSBkYXNoYm9hcmQgb2JqZWN0LiovXG4gICAgSGlkZSA9ICdoaWRlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlmZmVyZW50IHR5cGVzIG9mIGRhdGEgYSB2YWx1ZSBjYW4gaGF2ZVxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGF0YVR5cGUge1xuICAgIFN0cmluZyA9ICdzdHJpbmcnLFxuICAgIEludCA9ICdpbnQnLFxuICAgIEZsb2F0ID0gJ2Zsb2F0JyxcbiAgICBCb29sID0gJ2Jvb2wnLFxuICAgIERhdGUgPSAnZGF0ZScsXG4gICAgRGF0ZVRpbWUgPSAnZGF0ZS10aW1lJyxcbiAgICBTcGF0aWFsID0gJ3NwYXRpYWwnLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIGNoYW5nZXMgdGhhdCBvY2N1ciB0byBhIGRhc2hib2FyZCBvYmplY3QuXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXNoYm9hcmRMYXlvdXRDaGFuZ2Uge1xuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3Qgd2FzIGFkZGVkICovXG4gICAgQWRkZWQgPSAnYWRkZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCB3YXMgcmVtb3ZlZCAqL1xuICAgIFJlbW92ZWQgPSAncmVtb3ZlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0J3MgZmxvYXRpbmcgc3RhdGUgY2hhbmdlZCAqL1xuICAgIElzRmxvYXRpbmdDaGFuZ2VkID0gJ2lzLWZsb2F0aW5nLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHZpc2liaWxpdHkgY2hhbmdlZCAqL1xuICAgIElzVmlzaWJsZUNoYW5nZWQgPSAnaXMtdmlzaWJsZS1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QncyBwb3NpdGlvbiBjaGFuZ2VkICovXG4gICAgUG9zaXRpb25DaGFuZ2VkID0gJ3Bvc2l0aW9uLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHNpemUgY2hhbmdlZCAqL1xuICAgIFNpemVDaGFuZ2VkID0gJ3NpemUtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IHdhcyByZW5hbWVkICovXG4gICAgTmFtZUNoYW5nZWQgPSAnbmFtZS1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QgaXMgc2VsZWN0ZWQgKi9cbiAgICBTZWxlY3RlZCA9ICdzZWxlY3RlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IGlzIGRlc2VsZWN0ZWQgKi9cbiAgICBEZXNlbGVjdGVkID0gJ2Rlc2VsZWN0ZWQnLFxuXG4gICAgLyoqIE5hdmlnYXRlIHRvIGFub3RoZXIgZGFzaGJvYXJkICovXG4gICAgRGFzaGJvYXJkQ2hhbmdlZCA9ICdkYXNoYm9hcmQtY2hhbmdlZCcsXG4gIH1cblxuICAvKipcbiAgICogVmFsaWQgZGF0ZSByYW5nZXMgZm9yIGEgcmVsYXRpdmUgZGF0ZSBmaWx0ZXIuXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXRlUmFuZ2VUeXBlIHtcbiAgICBMYXN0ID0gJ2xhc3QnLFxuICAgIExhc3ROID0gJ2xhc3QtbicsXG4gICAgTmV4dCA9ICduZXh0JyxcbiAgICBOZXh0TiA9ICduZXh0LW4nLFxuICAgIEN1cnJlbnQgPSAnY3VycmVudCcsXG4gICAgVG9EYXRlID0gJ3RvLWRhdGUnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSB0eXBlcyBvZiBkaWFsb2cgcG9wdXAgc3R5bGVzLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGlhbG9nU3R5bGUge1xuICAgIFdpbmRvdyA9ICd3aW5kb3cnLFxuICAgIE1vZGFsID0gJ21vZGFsJyxcbiAgICBNb2RlbGVzcyA9ICdtb2RlbGVzcycsXG4gIH1cblxuICBleHBvcnQgZW51bSBFbmNvZGluZ1R5cGUge1xuICAgIENvbHVtbiA9ICdjb2x1bW4nLFxuICAgIFJvdyA9ICdyb3cnLFxuICAgIFBhZ2UgPSAncGFnZScsXG4gICAgRmlsdGVyID0gJ2ZpbHRlcicsXG4gICAgTWFya3NUeXBlID0gJ21hcmtzLXR5cGUnLFxuICAgIE1lYXN1cmVWYWx1ZXMgPSAnbWVhc3VyZS12YWx1ZXMnLFxuICAgIENvbG9yID0gJ2NvbG9yJyxcbiAgICBTaXplID0gJ3NpemUnLFxuICAgIExhYmVsID0gJ2xhYmVsJyxcbiAgICBEZXRhaWwgPSAnZGV0YWlsJyxcbiAgICBUb29sdGlwID0gJ3Rvb2x0aXAnLFxuICAgIFNoYXBlID0gJ3NoYXBlJyxcbiAgICBQYXRoID0gJ3BhdGgnLFxuICAgIEFuZ2xlID0gJ2FuZ2xlJyxcbiAgICBHZW9tZXRyeSA9ICdnZW9tZXRyeScsXG4gICAgQ3VzdG9tID0gJ2N1c3RvbScsXG4gIH1cblxuICAvKipcbiAgICogIFR5cGUgb2YgYWdncmVnYXRpb24gb24gYSBmaWVsZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICBTdW0gPSAnc3VtJyxcbiAgICBBdmcgPSAnYXZnJyxcbiAgICBNaW4gPSAnbWluJyxcbiAgICBNYXggPSAnbWF4JyxcbiAgICBTdGRldiA9ICdzdGRldicsXG4gICAgU3RkZXZwID0gJ3N0ZGV2cCcsXG4gICAgVmFyID0gJ3ZhcicsXG4gICAgVmFycCA9ICd2YXJwJyxcbiAgICBDb2xsZWN0ID0gJ2NvbGxlY3QnLFxuICAgIENvdW50ID0gJ2NvdW50JyxcbiAgICBDb3VudGQgPSAnY291bnRkJyxcbiAgICBNZWRpYW4gPSAnbWVkaWFuJyxcbiAgICBBdHRyID0gJ2F0dHInLFxuICAgIE5vbmUgPSAnbm9uZScsXG4gICAgWWVhciA9ICd5ZWFyJyxcbiAgICBRdHIgPSAncXRyJyxcbiAgICBNb250aCA9ICdtb250aCcsXG4gICAgRGF5ID0gJ2RheScsXG4gICAgSG91ciA9ICdob3VyJyxcbiAgICBNaW51dGUgPSAnbWludXRlJyxcbiAgICBTZWNvbmQgPSAnc2Vjb25kJyxcbiAgICBXZWVrID0gJ3dlZWsnLFxuICAgIFdlZWtkYXkgPSAnd2Vla2RheScsXG4gICAgTW9udGhZZWFyID0gJ21vbnRoLXllYXInLFxuICAgIE1keSA9ICdtZHknLFxuICAgIEVuZCA9ICdlbmQnLFxuICAgIFRydW5jWWVhciA9ICd0cnVuYy15ZWFyJyxcbiAgICBUcnVuY1F0ciA9ICd0cnVuYy1xdHInLFxuICAgIFRydW5jTW9udGggPSAndHJ1bmMtbW9udGgnLFxuICAgIFRydW5jV2VlayA9ICd0cnVuYy13ZWVrJyxcbiAgICBUcnVuY0RheSA9ICd0cnVuYy1kYXknLFxuICAgIFRydW5jSG91ciA9ICd0cnVuYy1ob3VyJyxcbiAgICBUcnVuY01pbnV0ZSA9ICd0cnVuYy1taW51dGUnLFxuICAgIFRydW5jU2Vjb25kID0gJ3RydW5jLXNlY29uZCcsXG4gICAgUXVhcnQxID0gJ3F1YXJ0MScsXG4gICAgUXVhcnQzID0gJ3F1YXJ0MycsXG4gICAgU2tld25lc3MgPSAnc2tld25lc3MnLFxuICAgIEt1cnRvc2lzID0gJ2t1cnRvc2lzJyxcbiAgICBJbk91dCA9ICdpbi1vdXQnLFxuICAgIFVzZXIgPSAndXNlcicsXG4gIH1cblxuICAvKipcbiAgICogUm9sZSBvZiBhIGZpZWxkLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmllbGRSb2xlVHlwZSB7XG4gICAgRGltZW5zaW9uID0gJ2RpbWVuc2lvbicsXG4gICAgTWVhc3VyZSA9ICdtZWFzdXJlJyxcbiAgICBVbmtub3duID0gJ3Vua25vd24nLFxuICB9XG5cbiAgLyoqXG4gICAqIEFuIGVudW1lcmF0aW9uIG9mIHRoZSB2YWxpZCB0eXBlcyBvZiBmaWx0ZXJzIHRoYXQgY2FuIGJlIGFwcGxpZWQuXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJUeXBlIHtcbiAgICBDYXRlZ29yaWNhbCA9ICdjYXRlZ29yaWNhbCcsXG4gICAgUmFuZ2UgPSAncmFuZ2UnLFxuICAgIEhpZXJhcmNoaWNhbCA9ICdoaWVyYXJjaGljYWwnLFxuICAgIFJlbGF0aXZlRGF0ZSA9ICdyZWxhdGl2ZS1kYXRlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlmZmVyZW50IHVwZGF0ZSB0eXBlcyBmb3IgYXBwbHlpbmcgZmlsdGVyXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJVcGRhdGVUeXBlIHtcbiAgICBBZGQgPSAnYWRkJyxcbiAgICBBbGwgPSAnYWxsJyxcbiAgICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxuICAgIFJlbW92ZSA9ICdyZW1vdmUnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkb21haW4gdHlwZSBmb3IgYSBmaWx0ZXJcbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpbHRlckRvbWFpblR5cGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBkb21haW4gdmFsdWVzIHRoYXQgYXJlIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgZmlsdGVyXG4gICAgICogaS5lLiB0aGUgZG9tYWluIGlzIHJlc3RyaWN0ZWQgYnkgYSBwcmV2aW91cyBmaWx0ZXJcbiAgICAgKi9cbiAgICBSZWxldmFudCA9ICdyZWxldmFudCcsXG4gICAgLyoqXG4gICAgICogbGlzdCBvZiBhbGwgcG9zc2libGUgZG9tYWluIHZhbHVlcyBmcm9tIGRhdGFiYXNlXG4gICAgICovXG4gICAgRGF0YWJhc2UgPSAnZGF0YWJhc2UnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvcHRpb24gZm9yIHNwZWNpZnlpbmcgd2hpY2ggdmFsdWVzIHRvIGluY2x1ZGUgZm9yIGZpbHRlcmluZ1xuICAgKiBJbmRpY2F0ZXMgd2hhdCB0byBkbyB3aXRoIG51bGwgdmFsdWVzIGZvciBhIGdpdmVuIGZpbHRlciBvciBtYXJrIHNlbGVjdGlvbiBjYWxsLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmlsdGVyTnVsbE9wdGlvbiB7XG4gICAgTnVsbFZhbHVlcyA9ICdudWxsLXZhbHVlcycsXG4gICAgTm9uTnVsbFZhbHVlcyA9ICdub24tbnVsbC12YWx1ZXMnLFxuICAgIEFsbFZhbHVlcyA9ICdhbGwtdmFsdWVzJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgc2VydmVzIGFzIGEgZmlsdGVyIG9uIHRoZSBEYXRhVmFsdWVzIHJldHVybmVkIGZyb20gYGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmNgLFxuICAgKiBgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jYCBhbmQgYGdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luY2AuXG4gICAqIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIG9mIHJldHVybmVkIGRhdGEgdmFsdWVzIG9ubHkuIFRhYmxlYXUgdmVyc2lvbnMgcHJpb3IgdG8gMjAyMS4yXG4gICAqIHdpbGwgcGFzcyB0aGUgZGF0YSBhY3Jvc3MgYW5kIHBvcHVsYXRlIHRoZSBEYXRhVmFsdWUgcHJvcGVydGllcy5cbiAgICogUGxlYXNlIG5vdGUgdGhhdCBhbGwgcHJvcGVydGllcyBub3QgcmVxdWVzdGVkIHdpbGwgYmUgYHVuZGVmaW5lZGAgaW4gdGhlIERhdGFWYWx1ZSByZXN1bHRzLlxuICAgKiBAc2luY2UgMS41LjBcbiAgICovXG4gIGV4cG9ydCBlbnVtIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHtcbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIGluY2x1ZGUgYWxsIHByb3BlcnRpZXMuKi9cbiAgICBBbGxWYWx1ZXMgPSAnYWxsLXZhbHVlcycsXG5cbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIG9ubHkgaW5jbHVkZSB2YWx1ZSBhbmQgbmF0aXZlVmFsdWUgcHJvcGVydGllcy4qL1xuICAgIE9ubHlOYXRpdmVWYWx1ZXMgPSAnb25seS1uYXRpdmUtdmFsdWVzJyxcblxuICAgIC8qKiBEYXRhVmFsdWVzIHdpbGwgb25seSBpbmNsdWRlIGZvcm1hdHRlZFZhbHVlIHByb3BlcnRpZXMuICovXG4gICAgT25seUZvcm1hdHRlZFZhbHVlcyA9ICdvbmx5LWZvcm1hdHRlZC12YWx1ZXMnLFxuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgb2YgbWFyayBmb3IgYSBnaXZlbiBtYXJrcyBjYXJkIGluIGEgdml6LlxuICAgKi9cbiAgZXhwb3J0IGVudW0gTWFya1R5cGUge1xuICAgIEJhciA9ICdiYXInLFxuICAgIExpbmUgPSAnbGluZScsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgICBTcXVhcmUgPSAnc3F1YXJlJyxcbiAgICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgICBTaGFwZSA9ICdzaGFwZScsXG4gICAgVGV4dCA9ICd0ZXh0JyxcbiAgICBNYXAgPSAnbWFwJyxcbiAgICBQaWUgPSAncGllJyxcbiAgICBHYW50dEJhciA9ICdnYW50dC1iYXInLFxuICAgIFBvbHlnb24gPSAncG9seWdvbicsXG4gICAgSGVhdG1hcCA9ICdoZWF0bWFwJyxcbiAgICBWaXpFeHRlbnNpb24gPSAndml6LWV4dGVuc2lvbicsXG4gIH1cblxuICAvKipcbiAgICogQW4gZW51bWVyYXRpb24gZGVzY3JpYmluZyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGFsbG93YWJsZSB2YWx1ZXMuXG4gICAqIFRoaXMgaXMgdXNlZCBmb3IgcmVzdHJpY3RpbmcgdGhlIGRvbWFpbiBvZiBhIHBhcmFtZXRlclxuICAgKi9cbiAgZXhwb3J0IGVudW0gUGFyYW1ldGVyVmFsdWVUeXBlIHtcbiAgICBBbGwgPSAnYWxsJyxcbiAgICBMaXN0ID0gJ2xpc3QnLFxuICAgIFJhbmdlID0gJ3JhbmdlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRlIHBlcmlvZCB1c2VkIGluIGZpbHRlcnMgYW5kIGluIHBhcmFtZXRlcnMuXG4gICAqL1xuICBleHBvcnQgZW51bSBQZXJpb2RUeXBlIHtcbiAgICBZZWFycyA9ICd5ZWFycycsXG4gICAgUXVhcnRlcnMgPSAncXVhcnRlcnMnLFxuICAgIE1vbnRocyA9ICdtb250aHMnLFxuICAgIFdlZWtzID0gJ3dlZWtzJyxcbiAgICBEYXlzID0gJ2RheXMnLFxuICAgIEhvdXJzID0gJ2hvdXJzJyxcbiAgICBNaW51dGVzID0gJ21pbnV0ZXMnLFxuICAgIFNlY29uZHMgPSAnc2Vjb25kcycsXG4gIH1cblxuICBleHBvcnQgZW51bSBRdWlja1RhYmxlQ2FsY1R5cGUge1xuICAgIFJ1bm5pbmdUb3RhbCA9ICdydW5uaW5nLXRvdGFsJyxcbiAgICBEaWZmZXJlbmNlID0gJ2RpZmZlcmVuY2UnLFxuICAgIFBlcmNlbnREaWZmZXJlbmNlID0gJ3BlcmNlbnQtZGlmZmVyZW5jZScsXG4gICAgUGVyY2VudE9mVG90YWwgPSAncGVyY2VudC1vZi10b3RhbCcsXG4gICAgUmFuayA9ICdyYW5rJyxcbiAgICBQZXJjZW50aWxlID0gJ3BlcmNlbnRpbGUnLFxuICAgIE1vdmluZ0F2ZXJhZ2UgPSAnbW92aW5nLWF2ZXJhZ2UnLFxuICAgIFlURFRvdGFsID0gJ3l0ZC10b3RhbCcsXG4gICAgQ29tcG91bmRHcm93dGhSYXRlID0gJ2NvbXBvdW5kLWdyb3d0aC1yYXRlJyxcbiAgICBZZWFyT3ZlclllYXJHcm93dGggPSAneWVhci1vdmVyLXllYXItZ3Jvd3RoJyxcbiAgICBZVERHcm93dGggPSAneXRkLWdyb3d0aCcsXG4gICAgVW5kZWZpbmVkID0gJ3VuZGVmaW5lZCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSBmb3Igc3BlY2lmeWluZyB0aGUgc2VsZWN0aW9uIHR5cGUgZm9yIHNlbGVjdCBtYXJrcyBhcGkuXG4gICAqL1xuICBleHBvcnQgZW51bSBTZWxlY3Rpb25VcGRhdGVUeXBlIHtcbiAgICBSZXBsYWNlID0gJ3NlbGVjdC1yZXBsYWNlJyxcbiAgICBBZGQgPSAnc2VsZWN0LWFkZCcsXG4gICAgUmVtb3ZlID0gJ3NlbGVjdC1yZW1vdmUnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIHNlbGVjdCBvcHRpb24gZm9yIHRoZSBgZXh0ZW5zaW9ucy5Xb3Jrc2hlZXQuc2VsZWN0VHVwbGVzQXN5bmNgIG1ldGhvZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIFNlbGVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENsZWFycyBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHNlbGVjdGluZyB0aGUgdHVwbGVzIHNwZWNpZmllZFxuICAgICAqL1xuICAgIFNpbXBsZSA9ICdzZWxlY3Qtb3B0aW9ucy1zaW1wbGUnLFxuICAgIC8qKlxuICAgICAqIEFkZHMgc3BlY2lmaWVkIHR1cGxlcyB0byB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uXG4gICAgICovXG4gICAgVG9nZ2xlID0gJ3NlbGVjdC1vcHRpb25zLXRvZ2dsZScsXG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygc2hlZXQgYSBbW1NoZWV0XV0gb2JqZWN0IHJlcHJlc2VudHNcbiAgICovXG4gIGV4cG9ydCBlbnVtIFNoZWV0VHlwZSB7XG4gICAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gICAgU3RvcnkgPSAnc3RvcnknLFxuICAgIFdvcmtzaGVldCA9ICd3b3Jrc2hlZXQnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gU29ydERpcmVjdGlvbiB7XG4gICAgSW5jcmVhc2luZyA9ICdpbmNyZWFzaW5nJyxcbiAgICBEZWNyZWFzaW5nID0gJ2RlY3JlYXNpbmcnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gVHJlbmRMaW5lTW9kZWxUeXBlIHtcbiAgICBMaW5lYXIgPSAnbGluZWFyJyxcbiAgICBMb2dhcml0aG1pYyA9ICdsb2dhcml0aG1pYycsXG4gICAgRXhwb25lbnRpYWwgPSAnZXhwb25lbnRpYWwnLFxuICAgIFBvbHlub21pYWwgPSAncG9seW5vbWlhbCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlcGxheSBzcGVlZCBvZiBhbiBhbmltYXRpb24uXG4gICAqIEBzaW5jZSAxLjcuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gUmVwbGF5U3BlZWRUeXBlIHtcbiAgICAvKiogVXNlZCBmb3Igc2V0dGluZyB0aGUgcmVwbGF5IHNwZWVkIG9mIGFuIGFuaW1hdGlvbiB0byAwLjV4LiovXG4gICAgU2xvdyA9ICdzbG93JyxcblxuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDEuMHguKi9cbiAgICBOb3JtYWwgPSAnbm9ybWFsJyxcblxuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDIuMHguKi9cbiAgICBGYXN0ID0gJ2Zhc3QnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgYSBsZXZlbCBpbiBhIGhpZXJhcmNoaWNhbCBmaWx0ZXJcbiAgICogQHNpbmNlIEV4dGVuc2lvbnMgMS4xMC4wXG4gICAqL1xuICBleHBvcnQgZW51bSBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlIHtcbiAgICBBbGxTZWxlY3RlZCA9ICdhbGwtc2VsZWN0ZWQnLFxuICAgIE5vbmVTZWxlY3RlZCA9ICdub25lLXNlbGVjdGVkJyxcbiAgICBTb21lU2VsZWN0ZWQgPSAnc29tZS1zZWxlY3RlZCcsXG4gICAgVW5rbm93blNlbGVjdGVkID0gJ3Vua25vd24tc2VsZWN0ZWQnLFxuICB9XG5cbiAgLyoqXG4gICAqIFpvbmVWaXNpYmlsaXR5VHlwZVxuICAgKiBAZGVwcmVjYXRlZCB1c2UgRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGVcbiAgICovXG4gIGV4cG9ydCBkZWNsYXJlIHR5cGUgWm9uZVZpc2liaWxpdHlUeXBlID0gRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGU7XG4gIGV4cG9ydCBjb25zdCBab25lVmlzaWJpbGl0eVR5cGUgPSB7IC4uLkRhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlIH07XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBzaGFyZWQgYXBpIHB1YmxpYyBpbnRlcmZhY2VcblxuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9Bbm5vdGF0aW9uSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0RhdGFTb3VyY2VJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRGF0YVRhYmxlSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRW52aXJvbm1lbnRJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRmlsdGVySW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBBbmFseXRpY3NPYmplY3RUeXBlLFxuICBBbm5vdGF0aW9uVHlwZSxcbiAgQ2xhc3NOYW1lS2V5LFxuICBDb2x1bW5UeXBlLFxuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UsXG4gIERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlLFxuICBEYXRhVHlwZSxcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRGlhbG9nU3R5bGUsXG4gIEVuY29kaW5nVHlwZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlckRvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24sXG4gIEZpbHRlclR5cGUsXG4gIEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICBNYXJrVHlwZSxcbiAgUGFyYW1ldGVyVmFsdWVUeXBlLFxuICBQZXJpb2RUeXBlLFxuICBRdWlja1RhYmxlQ2FsY1R5cGUsXG4gIFJlcGxheVNwZWVkVHlwZSxcbiAgU2VsZWN0T3B0aW9ucyxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgU2hlZXRUeXBlLFxuICBTb3J0RGlyZWN0aW9uLFxuICBUcmVuZExpbmVNb2RlbFR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9TZWxlY3Rpb25JbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvU2hlZXRJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvVmlzdWFsTW9kZWxJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9Xb3JrYm9va0Zvcm1hdHRpbmdJbnRlcmZhY2VzJztcbiIsIi8qKlxuICogVGhpcyBpcyB5b3VyIG1haW4uIFRoaXMgaXMgd2hlcmUgeW91IHJlLWV4cG9ydCBldmVyeXRoaW5nIHlvdSB3YW50IHRvIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAqXG4gKiBUaGUgYnVpbGQgZW5mb3JjZXMgdGhhdCB0aGUgZmlsZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgaXMgZXhwb3J0ZWQuXG4gKi9cblxuLy8gRXhwb3J0IHRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB0byBiZSBhdmFpbGFibGUgYXQgcnVudGltZVxuLy8gIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgeWFybiBwdWJsaXNoOmJ1bXAgdmlhIHNjcmlwdHMvcHVibGlzaC1jaGVjay50c1xuLy8gIHVwZGF0ZUludGVybmFsQ29udHJhY3RSdW50aW1lVmVyc2lvbiBpbiB0aGUgbW9ub3JlcG8gcm9vdC5cbmltcG9ydCAqIGFzIGludGVybmFsQ29udHJhY3RWZXJzaW9uIGZyb20gJy4uL2ludGVybmFsLWNvbnRyYWN0LXZlcnNpb24uanNvbic7XG5leHBvcnQgY29uc3QgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiA9IGludGVybmFsQ29udHJhY3RWZXJzaW9uO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L0RhdGFUeXBlQ29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvRW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9Nb2RlbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9Ob3RpZmljYXRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvUGFyYW1ldGVycyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L1ZlcmJzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL0Fza0RhdGFJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvSW5pdGlhbGl6YXRpb25PcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL0ludGVybmFsQXBpRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9QdWxzZUludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9WZXJzaW9uTnVtYmVyJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL1ZxbEludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9Dcm9zc0ZyYW1lTWVzc2VuZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzYWdlRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZUxpc3RlbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3Nlbmdlcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvUHJlcGFyZWRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsVmVyc2lvbkNvbnZlcnRlckZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL0ludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9WZXJzaW9uQ29udmVydGVyRmFjdG9yeSc7XG5cbi8vIEV4cG9ydCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgbWVzc2FnaW5nIGZvciBjb25zdW1lcnMgdG8gdXNlLlxuLy8gQmUgdmVyeSBjYXJlZnVsIG1ha2luZyBhbnkgdXBkYXRlcyB0byB0aGlzIGNvbnRyYWN0IHdoaWNoIGJyZWFrIHZlcnNpb24gY29tcGF0aWJpbGl0eS5cbmV4cG9ydCBjb25zdCBNRVNTQUdJTkdfVkVSU0lPTiA9IHtcbiAgbWFqb3I6IDEsXG4gIG1pbm9yOiAwLFxuICBmaXg6IDAsXG59O1xuIiwiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuL0VudW1zJztcblxuZXhwb3J0IGNsYXNzIERhdGFUeXBlQ29udmVydGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaXNTcGVjaWFsKHZhbHVlQXNTdHJpbmc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIFByaW9yIHRvIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHNwZWNpYWwgdmFsdWVzIGNvbWUgdG8gdXMgYXNcbiAgICAvLyAnJW51bGwlJywgJyVhbGwlJywgJyV3aWxkY2FyZCUnLCAnJW1pc3NpbmclJy4uLlxuICAgIC8vIFdoaWxlIHRoaXMgZnVuY3Rpb24gd2lsbCBuZXZlciByZXR1cm4gdHJ1ZSBmb3IgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCBjb252ZXJzaW9uLFxuICAgIC8vIGl0IGlzIGFzIGNoZWFwIGFzIHBhc3NpbmcgYXJvdW5kIGEgdmVyc2lvbiBhbmQgY2hlY2tpbmcgdGhhdC5cbiAgICAvLyAoU2VlIERhdGFWYWx1ZUZvcm1hdHRlci5jcHApXG5cbiAgICBpZiAodmFsdWVBc1N0cmluZy5sZW5ndGggPiAyICYmIHZhbHVlQXNTdHJpbmdbMF0gPT09ICclJyAmJiB2YWx1ZUFzU3RyaW5nW3ZhbHVlQXNTdHJpbmcubGVuZ3RoIC0gMV0gPT09ICclJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHNwZWNpYWxWYWx1ZUluZGljYXRvciA9ICclbnVsbCUnO1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VCb29sZWFuKGJvb2xlYW5TdHJpbmc6IHN0cmluZyk6IGJvb2xlYW4gfCBzdHJpbmcge1xuICAgIC8vIGJvb2xlYW4gdmFsdWVzIGNvbWUgdG8gdXMgYXMgJ3RydWUnfCdmYWxzZSdcbiAgICBjb25zdCBub3JtYWxpemVkQm9vbGVhbjogc3RyaW5nID0gYm9vbGVhblN0cmluZy50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBub3JtYWxpemVkQm9vbGVhbiAhPT0gJ3RydWUnICYmIG5vcm1hbGl6ZWRCb29sZWFuICE9PSAnZmFsc2UnID8gdGhpcy5zcGVjaWFsVmFsdWVJbmRpY2F0b3IgOiBub3JtYWxpemVkQm9vbGVhbiA9PT0gJ3RydWUnO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBwcml2YXRlIHN0YXRpYyBwYXJzZU51bWJlcih2YWx1ZUFzU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIgfCBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gTnVtYmVyKHZhbHVlQXNTdHJpbmcpO1xuICAgIHJldHVybiBpc05hTih2YWx1ZSkgPyB0aGlzLnNwZWNpYWxWYWx1ZUluZGljYXRvciA6IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VEYXRlKGRhdGVBc1N0cmluZzogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgIC8vIE5vdGUgdGhhdCB3aXRob3V0IGEgdGltZSwgdGhlIGRhdGUgaXMgYXNzdW1lZCB0byBiZSBVVENcbiAgICAvLyBJbnB1dCBvZiAyMDIwLTAzLTI1IGlzIHByaW50ZWQgYXM6IE1hciAyNCAyMDIwIDE3OjAwOjAwIEdNVC0wNzAwXG4gICAgLy8gVGhpcyBtYXRjaGVzIHN0eWxlIHVzZWQgaW4gZXhpc3RpbmcgY29udmVydEZpbHRlclZhbHVlUHJlc01vZGVsXG4gICAgY29uc3QgdmFsdWUgPSBuZXcgRGF0ZShkYXRlQXNTdHJpbmcpO1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSA/IG51bGwgOiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlRGF0ZVRpbWUoZGF0ZUFzU3RyaW5nOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XG4gICAgLy8gV2l0aCBhIHRpbWUsIHRoZSBkYXRlIGlzIGFzc3VtZWQgdG8gYmUgVVRDLlxuICAgIC8vIE91ciBkYXRlIGZvcm1hdCBpcyBhbHdheXM6IHl5eXktbW0tZGQgaGg6bW06c3NcbiAgICAvLyBVbmZvcnR1bmF0ZWx5LCBJRTExIGNhbid0IHBhcnNlIHRoYXQgZm9ybWF0IHNvIHdlIGFkZCBhIFQgYmV0d2VlbiB0aGUgZGF5IGFuZCB0aW1lLlxuICAgIC8vIFdlIGFsc28gYWRkIGEgWiBzbyB0aGF0IGl0IGlzIFVUQy4gKFdpdGhvdXQgdGhlIFosIHNvbWUgYnJvd3NlcnMgYXNzdW1lIGxvY2FsLCBhbmQgb3RoZXJzIFVUQylcbiAgICAvLyBFdmVuIHRob3VnaCB3ZSd2ZSBkcm9wcGVkIHN1cHBvcnQgZm9yIElFMTEsIGl0J3Mgcmlza2llci9jb3N0bGllciB0byBtYWtlIHVwZGF0ZXMgaGVyZS5cbiAgICBjb25zdCBmb3JtYXR0ZWREYXRlU3RyaW5nOiBzdHJpbmcgPSBkYXRlQXNTdHJpbmcucmVwbGFjZSgnICcsICdUJykuY29uY2F0KCdaJyk7XG4gICAgY29uc3QgdmFsdWUgPSBuZXcgRGF0ZShmb3JtYXR0ZWREYXRlU3RyaW5nKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlLmdldFRpbWUoKSkgPyBudWxsIDogdmFsdWU7XG4gIH1cblxuICAvLyBJdCB3b3VsZCBiZSBuaWNlIHRvIG1lcmdlIHRoaXMgYW5kIHRoZSBtZXRob2QgRmlsdGVyQ29udmVydGVyOjpjb252ZXJ0RmlsdGVyVmFsdWVQcmVzTW9kZWwgaW4gYXBpLXBsYXRmb3JtLWpzXG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFZhbHVlQXNTdHJpbmdUb1ZhbHVlKHZhbHVlQXNTdHJpbmc6IHN0cmluZywgdHlwZTogRGF0YVR5cGUpOiBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBUaGlzIGlzIGJvdGggRGF0YURpY3Rpb25hcnkgYW5kIFNob3dEYXRhVGFibGVQcmVzTW9kZWwgY29tcGF0aWJsZS5cbiAgICAvLyBJbiB0aGUgRGF0YURpY3Rpb25hcnksIHZhbHVlQXNTdHJpbmcgY2FuIGJlICclbnVsbCUnIG9yICclbWlzc2luZyUnLCB3aGlsZSBpblxuICAgIC8vIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHdlIGNhbiBnZXQgJ251bGwnIG9yICdtaXNzaW5nJywgb3IgJyVudWxsJScgZm9yIHN0cmluZyBzcGVjaWFsIHZhbHVlcy5cbiAgICAvLyBGb3IgZWl0aGVyIG9mIHRoZXNlIGNhc2VzLCB3ZSByZXR1cm4gc3BlY2lhbFZhbHVlSW5kaWNhdG9yIChvciB0aGUgb3JpZ2luYWwgc3BlY2lhbCBzdHJpbmcpLlxuICAgIC8vIFRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsdHksIHRoaXMgY29udmVydGVyOlxuICAgIC8vIDEuIHJldHVybnMgYSBzdHJpbmcgZm9yIGFueSBzcGVjaWFsIHZhbHVlc1xuICAgIC8vIDIuIHJldHVybnMgYSBzdHJpbmcgZm9yIGFueSBkYXRlXG5cbiAgICAvLyBQYXJhbWV0ZXIgbWluL21heCB2YWx1ZXMgY2FuIGJlIHVuZGVmaW5lZCwgc28gcmVzdWx0IGlzIGFsc28gdW5kZWZpbmVkXG4gICAgaWYgKHZhbHVlQXNTdHJpbmcgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZUFzU3RyaW5nID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzU3BlY2lhbCh2YWx1ZUFzU3RyaW5nKSkge1xuICAgICAgcmV0dXJuIHZhbHVlQXNTdHJpbmc7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIERhdGFUeXBlLkJvb2w6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQm9vbGVhbih2YWx1ZUFzU3RyaW5nKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5JbnQ6XG4gICAgICBjYXNlIERhdGFUeXBlLkZsb2F0OlxuICAgICAgICAvLyBSZXR1cm4gc3BlY2lhbCB2YWx1ZSAnJW51bGwlJyBmb3IgYW55IGZhaWx1cmUgaW4gcGFyc2luZy5cbiAgICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGF0IGJlY2F1c2UgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCB3aWxsIGdpdmUgdXMgc3RyaW5ncyBsaWtlICdudWxsJ1xuICAgICAgICAvLyBmb3Igc3BlY2lhbCB2YWx1ZXMuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlTnVtYmVyKHZhbHVlQXNTdHJpbmcpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGU6XG4gICAgICAgIC8vIEZvciBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCBzcGVjaWFsIHZhbHVlcyB3aWxsIGJlIFwibnVsbFwiIHdoaWNoIHdpbGwgZmFpbCB0byBwYXJzZS5cbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSByZXR1cm4gJyVudWxsJScuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGF0ZSh2YWx1ZUFzU3RyaW5nKSA9PT0gbnVsbCA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yIDogdmFsdWVBc1N0cmluZztcblxuICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlVGltZTpcbiAgICAgICAgLy8gRm9yIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHNwZWNpYWwgdmFsdWVzIHdpbGwgYmUgXCJudWxsXCIgd2hpY2ggd2lsbCBmYWlsIHRvIHBhcnNlLlxuICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIHJldHVybiAnJW51bGwlJ1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGVUaW1lKHZhbHVlQXNTdHJpbmcpID09PSBudWxsID8gdGhpcy5zcGVjaWFsVmFsdWVJbmRpY2F0b3IgOiB2YWx1ZUFzU3RyaW5nO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLlNwYXRpYWw6XG4gICAgICBjYXNlIERhdGFUeXBlLlN0cmluZzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZUFzU3RyaW5nO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlKHZhbHVlOiBhbnksIHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB8IG51bWJlciB8IERhdGUgfCBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBUaGlzIGNvbnZlcnRzIGZyb20gb3VyIDEuMiBBUEkgdGhhdCByZXR1cm5zIHN0cmluZ3MgZm9yIHNwZWNpYWxzLCBhbmQgZGF0ZXMgYXMgc3RyaW5ncy5cbiAgICAvLyBJdCB0YWtlcyB0aGUgc3BlY2lhbCBjYXNlIG9mICclbnVsbCUnIGFuZCByZXR1cm5zIGEgbnVsbC5cbiAgICAvLyBGb3IgZGF0ZXMsIGl0IHJldHVybnMgYSBEYXRlIG9iamVjdCByYXRoZXIgdGhhbiBhIHN0cmluZy5cbiAgICAvLyBjb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlIHNob3VsZCBiZSB1c2VkIHRvIGJ1aWxkIGEgRGF0YVZhbHVlLm5hdGl2ZVZhbHVlIGZpZWxkLlxuXG4gICAgLy8gUGFyYW1ldGVyIG1pbi9tYXggY2FuIGJlIHVuZGVmaW5lZC4gSWYgdGhhdCBpcyB0aGUgY2FzZSwgbmF0aXZlVmFsdWUgaXMgdHJlYXRlZCBsaWtlIGEgc3BlY2lhbFxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgRGF0YVR5cGUuQm9vbDpcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuSW50OlxuICAgICAgY2FzZSBEYXRhVHlwZS5GbG9hdDpcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZTpcbiAgICAgICAgLy8gQ29udmVydCB0aGUgc3RyaW5nIHRvIERhdGUgb2JqZWN0IChvciBudWxsIGlmIHBhcnNpbmcgZmFpbHMgLi4uIHdlIGFzc3VtZSBzcGVjaWFsKVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGUodmFsdWUpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGVUaW1lOlxuICAgICAgICAvLyBDb252ZXJ0IHRoZSBzdHJpbmcgdG8gRGF0ZSBvYmplY3QgKG9yIG51bGwgaWYgcGFyc2luZyBmYWlscyAuLi4gd2UgYXNzdW1lIHNwZWNpYWwpXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGF0ZVRpbWUodmFsdWUpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLlN0cmluZzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTcGVjaWFsKHZhbHVlKSA/IG51bGwgOiB2YWx1ZTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5TcGF0aWFsOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0U3RyaW5nVmFsdWVUb05hdGl2ZVZhbHVlKHZhbHVlOiBzdHJpbmcsIHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB8IG51bWJlciB8IERhdGUgfCBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIGNvbnZlcnNpb24gZnJvbSBzdHJpbmcgZGlyZWN0bHkgdG8gbmF0aXZlIHZhbHVlIGZvciBhbGwgdHlwZXNcbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlKHRoaXMuY29udmVydFZhbHVlQXNTdHJpbmdUb1ZhbHVlKHZhbHVlLCB0eXBlKSwgdHlwZSk7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIEV4dGVuc2lvbkNvbnRleHQge1xuICBEZXNrdG9wID0gJ2Rlc2t0b3AnLFxuICBTZXJ2ZXIgPSAnc2VydmVyJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbiAgQ2xvdWQgPSAnY2xvdWQnLFxuICBQdWJsaWNXZWIgPSAncHVibGljLXdlYicsXG4gIFB1YmxpY0Rlc2t0b3AgPSAncHVibGljLWRlc2t0b3AnLFxufVxuXG5leHBvcnQgZW51bSBFeHRlbnNpb25Nb2RlIHtcbiAgQXV0aG9yaW5nID0gJ2F1dGhvcmluZycsXG4gIFZpZXdpbmcgPSAndmlld2luZycsXG4gIFVua25vd24gPSAndW5rbm93bicsXG59XG5cbmV4cG9ydCBlbnVtIEFubm90YXRlRW51bSB7XG4gIE1hcmsgPSAnbWFyaycsXG4gIFBvaW50ID0gJ3BvaW50JyxcbiAgQXJlYSA9ICdhcmVhJyxcbn1cblxuZXhwb3J0IGVudW0gQ29sdW1uVHlwZSB7XG4gIERpc2NyZXRlID0gJ2Rpc2NyZXRlJyxcbiAgQ29udGludW91cyA9ICdjb250aW51b3VzJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbn1cblxuZXhwb3J0IGVudW0gRGFzaGJvYXJkT2JqZWN0VHlwZSB7XG4gIEJsYW5rID0gJ2JsYW5rJyxcbiAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCcsXG4gIFF1aWNrRmlsdGVyID0gJ3F1aWNrLWZpbHRlcicsXG4gIFBhcmFtZXRlckNvbnRyb2wgPSAncGFyYW1ldGVyLWNvbnRyb2wnLFxuICBQYWdlRmlsdGVyID0gJ3BhZ2UtZmlsdGVyJyxcbiAgTGVnZW5kID0gJ2xlZ2VuZCcsXG4gIFRpdGxlID0gJ3RpdGxlJyxcbiAgVGV4dCA9ICd0ZXh0JyxcbiAgSW1hZ2UgPSAnaW1hZ2UnLFxuICBXZWJQYWdlID0gJ3dlYi1wYWdlJyxcbiAgRXh0ZW5zaW9uID0gJ2V4dGVuc2lvbicsXG59XG5cbmV4cG9ydCBlbnVtIERhdGFUeXBlIHtcbiAgU3RyaW5nID0gJ3N0cmluZycsXG4gIEludCA9ICdpbnQnLFxuICBGbG9hdCA9ICdmbG9hdCcsXG4gIEJvb2wgPSAnYm9vbCcsXG4gIERhdGUgPSAnZGF0ZScsXG4gIERhdGVUaW1lID0gJ2RhdGUtdGltZScsXG4gIFNwYXRpYWwgPSAnc3BhdGlhbCcsXG4gIFVua25vd24gPSAndW5rbm93bicsXG59XG5cbmV4cG9ydCBlbnVtIERpYWxvZ1N0eWxlIHtcbiAgV2luZG93ID0gJ3dpbmRvdycsXG4gIE1vZGFsID0gJ21vZGFsJyxcbiAgTW9kZWxlc3MgPSAnbW9kZWxlc3MnLFxufVxuXG5leHBvcnQgZW51bSBFbmNvZGVkRGF0YVR5cGUge1xuICBOdW1iZXIgPSAnbnVtYmVyJyxcbiAgU3RyaW5nID0gJ3N0cmluZycsXG4gIERhdGUgPSAnZGF0ZScsXG4gIEJvb2xlYW4gPSAnYm9vbGVhbicsXG59XG5cbmV4cG9ydCBlbnVtIEVycm9yQ29kZXMge1xuICBJTklUSUFMSVpBVElPTl9FUlJPUiA9ICdpbml0aWFsaXphdGlvbi1lcnJvcicsXG4gIElOVEVSTkFMX0VSUk9SID0gJ2ludGVybmFsLWVycm9yJyxcbiAgTUlTU0lOR19FTlVNX01BUFBJTkcgPSAnbWlzc2luZy1lbnVtLW1hcHBpbmcnLFxuICBNSVNTSU5HX1BBUkFNRVRFUiA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gIFBFUk1JU1NJT05fREVOSUVEID0gJ3Blcm1pc3Npb24tZGVuaWVkJyxcbiAgUFJFU19NT0RFTF9QQVJTSU5HX0VSUk9SID0gJ3ByZXMtbW9kZWwtcGFyc2luZy1lcnJvcicsXG4gIFZFUlNJT05fTk9UX0NPTkZJR1VSRUQgPSAndmVyc2lvbi1ub3QtY29uZmlndXJlZCcsXG4gIFZJU0lCSUxJVFlfRVJST1IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gIFVOS05PV05fVkVSQl9JRCA9ICd1bmtub3duLXZlcmItaWQnLFxufVxuXG5leHBvcnQgZW51bSBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSB7XG4gIFN1bSA9ICdzdW0nLFxuICBBdmcgPSAnYXZnJyxcbiAgTWluID0gJ21pbicsXG4gIE1heCA9ICdtYXgnLFxuICBTdGRldiA9ICdzdGRldicsXG4gIFN0ZGV2cCA9ICdzdGRldnAnLFxuICBWYXIgPSAndmFyJyxcbiAgVmFycCA9ICd2YXJwJyxcbiAgQ29sbGVjdCA9ICdjb2xsZWN0JyxcbiAgQ291bnQgPSAnY291bnQnLFxuICBDb3VudGQgPSAnY291bnRkJyxcbiAgTWVkaWFuID0gJ21lZGlhbicsXG4gIEF0dHIgPSAnYXR0cicsXG4gIE5vbmUgPSAnbm9uZScsXG4gIFllYXIgPSAneWVhcicsXG4gIFF0ciA9ICdxdHInLFxuICBNb250aCA9ICdtb250aCcsXG4gIERheSA9ICdkYXknLFxuICBIb3VyID0gJ2hvdXInLFxuICBNaW51dGUgPSAnbWludXRlJyxcbiAgU2Vjb25kID0gJ3NlY29uZCcsXG4gIFdlZWsgPSAnd2VlaycsXG4gIFdlZWtkYXkgPSAnd2Vla2RheScsXG4gIE1vbnRoWWVhciA9ICdtb250aC15ZWFyJyxcbiAgTWR5ID0gJ21keScsXG4gIEVuZCA9ICdlbmQnLFxuICBUcnVuY1llYXIgPSAndHJ1bmMteWVhcicsXG4gIFRydW5jUXRyID0gJ3RydW5jLXF0cicsXG4gIFRydW5jTW9udGggPSAndHJ1bmMtbW9udGgnLFxuICBUcnVuY1dlZWsgPSAndHJ1bmMtd2VlaycsXG4gIFRydW5jRGF5ID0gJ3RydW5jLWRheScsXG4gIFRydW5jSG91ciA9ICd0cnVuYy1ob3VyJyxcbiAgVHJ1bmNNaW51dGUgPSAndHJ1bmMtbWludXRlJyxcbiAgVHJ1bmNTZWNvbmQgPSAndHJ1bmMtc2Vjb25kJyxcbiAgUXVhcnQxID0gJ3F1YXJ0MScsXG4gIFF1YXJ0MyA9ICdxdWFydDMnLFxuICBTa2V3bmVzcyA9ICdza2V3bmVzcycsXG4gIEt1cnRvc2lzID0gJ2t1cnRvc2lzJyxcbiAgSW5PdXQgPSAnaW4tb3V0JyxcbiAgVXNlciA9ICd1c2VyJyxcbn1cblxuZXhwb3J0IGVudW0gRmllbGRSb2xlVHlwZSB7XG4gIERpbWVuc2lvbiA9ICdkaW1lbnNpb24nLFxuICBNZWFzdXJlID0gJ21lYXN1cmUnLFxuICBVbmtub3duID0gJ3Vua25vd24nLFxufVxuXG4vKipcbiAqICBUaGUgZGlmZmVyZW50IHVwZGF0ZSB0eXBlcyBmb3IgYXBwbHlpbmcgZmlsdGVyLlxuICovXG5leHBvcnQgZW51bSBGaWx0ZXJVcGRhdGVUeXBlIHtcbiAgQWRkID0gJ2FkZCcsXG4gIEFsbCA9ICdhbGwnLFxuICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxuICBSZW1vdmUgPSAncmVtb3ZlJyxcbn1cblxuZXhwb3J0IGVudW0gU2hlZXRUeXBlIHtcbiAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gIFN0b3J5ID0gJ3N0b3J5JyxcbiAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCcsXG59XG5cbmV4cG9ydCBlbnVtIERvbWFpblJlc3RyaWN0aW9uVHlwZSB7XG4gIEFsbCA9ICdhbGwnLFxuICBMaXN0ID0gJ2xpc3QnLFxuICBSYW5nZSA9ICdyYW5nZScsXG59XG5cbmV4cG9ydCBlbnVtIERhdGVTdGVwUGVyaW9kIHtcbiAgWWVhcnMgPSAneWVhcnMnLFxuICBRdWFydGVycyA9ICdxdWFydGVycycsXG4gIE1vbnRocyA9ICdtb250aHMnLFxuICBXZWVrcyA9ICd3ZWVrcycsXG4gIERheXMgPSAnZGF5cycsXG4gIEhvdXJzID0gJ2hvdXJzJyxcbiAgTWludXRlcyA9ICdtaW51dGVzJyxcbiAgU2Vjb25kcyA9ICdzZWNvbmRzJyxcbn1cblxuLyoqXG4gKiBUaGUgb3B0aW9uIGZvciBzcGVjaWZ5aW5nIHdoaWNoIHZhbHVlcyB0byBpbmNsdWRlIGZvciBmaWx0ZXJpbmcuXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlck51bGxPcHRpb24ge1xuICBOdWxsVmFsdWVzID0gJ251bGx2YWx1ZXMnLFxuICBOb25OdWxsVmFsdWVzID0gJ25vbm51bGx2YWx1ZXMnLFxuICBBbGxWYWx1ZXMgPSAnYWxsdmFsdWVzJyxcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBmaWx0ZXIgZG9tYWluXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlckRvbWFpblR5cGUge1xuICBSZWxldmFudCA9ICdyZWxldmFudCcsXG4gIERhdGFiYXNlID0gJ2RhdGFiYXNlJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Rpb24gdHlwZSBmb3Igc2VsZWN0IG1hcmtzIGFwaS5cbiAqL1xuZXhwb3J0IGVudW0gU2VsZWN0aW9uVXBkYXRlVHlwZSB7XG4gIFJlcGxhY2UgPSAnc2VsZWN0LXJlcGxhY2UnLFxuICBBZGQgPSAnc2VsZWN0LWFkZCcsXG4gIFJlbW92ZSA9ICdzZWxlY3QtcmVtb3ZlJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Qgb3B0aW9uIGZvciB0aGUgc2VsZWN0IHR1cGxlcyBhcGkuXG4gKi9cbmV4cG9ydCBlbnVtIFNlbGVjdE9wdGlvbnMge1xuICBTaW1wbGUgPSAnc2VsZWN0LW9wdGlvbnMtc2ltcGxlJyxcbiAgVG9nZ2xlID0gJ3NlbGVjdC1vcHRpb25zLXRvZ2dsZScsXG4gIE1lbnUgPSAnc2VsZWN0LW9wdGlvbnMtbWVudScsIC8vIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgZXh0ZXJuYWwgY29udHJhY3RcbiAgUmFuZ2UgPSAnc2VsZWN0LW9wdGlvbnMtcmFuZ2UnLCAvLyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGV4dGVybmFsIGNvbnRyYWN0XG4gIFNlYXJjaCA9ICdzZWxlY3Qtb3B0aW9ucy1zZWFyY2gnLCAvLyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGV4dGVybmFsIGNvbnRyYWN0XG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgaW5jbHVkZWQgdmFsdWVzIHR5cGUgZm9yIHJhbmdlIHNlbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGVudW0gUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMge1xuICBJbmNsdWRlTnVsbCA9ICdpbmNsdWRlLW51bGwnLFxuICBJbmNsdWRlTm9uTnVsbCA9ICdpbmNsdWRlLW5vbi1udWxsJyxcbiAgSW5jbHVkZUFsbCA9ICdpbmNsdWRlLWFsbCcsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyBhIGhpZXJhcmNoaWNhbCBsZXZlbCBzZWxlY3Rpb24gc3RhdGUuXG4gKi9cbmV4cG9ydCBlbnVtIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUge1xuICBBbGxTZWxlY3RlZCA9ICdhbGwtc2VsZWN0ZWQnLFxuICBOb25lU2VsZWN0ZWQgPSAnbm9uZS1zZWxlY3RlZCcsXG4gIFNvbWVTZWxlY3RlZCA9ICdzb21lLXNlbGVjdGVkJyxcbiAgVW5rbm93blNlbGVjdGVkID0gJ3Vua25vd24tc2VsZWN0ZWQnLFxufVxuXG4vKipcbiAqIFR5cGUgb2YgbWFyayBmb3IgYSBnaXZlbiBtYXJrcyBjYXJkIGluIGEgdml6LlxuICovXG5leHBvcnQgZW51bSBNYXJrVHlwZSB7XG4gIEJhciA9ICdiYXInLFxuICBMaW5lID0gJ2xpbmUnLFxuICBBcmVhID0gJ2FyZWEnLFxuICBTcXVhcmUgPSAnc3F1YXJlJyxcbiAgQ2lyY2xlID0gJ2NpcmNsZScsXG4gIFNoYXBlID0gJ3NoYXBlJyxcbiAgVGV4dCA9ICd0ZXh0JyxcbiAgTWFwID0gJ21hcCcsXG4gIFBpZSA9ICdwaWUnLFxuICBHYW50dEJhciA9ICdnYW50dC1iYXInLFxuICBQb2x5Z29uID0gJ3BvbHlnb24nLFxuICBIZWF0bWFwID0gJ2hlYXRtYXAnLFxuICBWaXpFeHRlbnNpb24gPSAndml6LWV4dGVuc2lvbicsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgdHlwZSBvZiBmaWx0ZXJcbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyVHlwZSB7XG4gIENhdGVnb3JpY2FsID0gJ2NhdGVnb3JpY2FsJyxcbiAgUmFuZ2UgPSAncmFuZ2UnLFxuICBSZWxhdGl2ZURhdGUgPSAncmVsYXRpdmVEYXRlJyxcbiAgSGllcmFyY2hpY2FsID0gJ2hpZXJhcmNoaWNhbCcsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgRGF0ZVJhbmdlVHlwZSBvZiBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyXG4gKi9cbmV4cG9ydCBlbnVtIERhdGVSYW5nZVR5cGUge1xuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBsYXN0IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTGFzdCA9ICdsYXN0JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byB0aGUgbGFzdCBOIGRheXMsIHdlZWtzLCBtb250aHMsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTGFzdE4gPSAnbGFzdE4nLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBuZXh0IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTmV4dCA9ICduZXh0JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byB0aGUgbmV4dCBOIGRheXMsIHdlZWtzLCBtb250aHMsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTmV4dE4gPSAnbmV4dE4nLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBjdXJyZW50IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgQ3VycmVudCA9ICdjdXJyZW50JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byBldmVyeXRoaW5nIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBUb0RhdGUgPSAndG9EYXRlJyxcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGRldGVybWluZSBpZiB0aGUgbGF1bmNoaW5nIG9mIGFuIGV4dGVuc2lvbiBkaWFsb2cgc3VjY2VlZGVkIG9yIGZhaWxlZC5cbiAqL1xuZXhwb3J0IGVudW0gRXh0ZW5zaW9uRGlhbG9nUmVzdWx0IHtcbiAgRGlhbG9nQWxyZWFkeU9wZW4gPSAnZGlhbG9nLWFscmVhZHktb3BlbicsXG4gIEludmFsaWREb21haW4gPSAnaW52YWxpZC1kb21haW4nLFxuICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gb3B0aW1pemUgdGhlIGdldFN1bW1hcnlEYXRhL2dldFVuZGVybHlpbmdUYWJsZURhdGEgcmVzdWx0c1xuICogTWFwcGVkIGZyb20gZXh0ZXJuYWwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb25cbiAqL1xuZXhwb3J0IGVudW0gQXBpU2hvd0RhdGFUYWJsZUZvcm1hdCB7XG4gIE5hdGl2ZVZhbHVlc09ubHkgPSAnbmF0aXZlLXZhbHVlcy1vbmx5JyxcbiAgRm9ybWF0dGVkVmFsdWVzT25seSA9ICdmb3JtYXR0ZWQtdmFsdWVzLW9ubHknLFxuICBOYXRpdmVBbmRGb3JtYXR0ZWRWYWx1ZXMgPSAnbmF0aXZlLWFuZC1mb3JtYXR0ZWQtdmFsdWVzJyxcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGRlbm90ZSB0aGUgc2VjdGlvbnMgb2YgZm9ybWF0dGluZyB3aXRoaW4gdGFibGVhdVxuICovXG5leHBvcnQgY29uc3QgZW51bSBDbGFzc05hbWVLZXkge1xuICBXb3Jrc2hlZXRUaXRsZSA9ICd0YWJsZWF1LXdvcmtzaGVldC10aXRsZScsXG4gIFdvcmtzaGVldCA9ICd0YWJsZWF1LXdvcmtzaGVldCcsXG4gIFRvb2x0aXAgPSAndGFibGVhdS10b29sdGlwJyxcbiAgU3RvcnlUaXRsZSA9ICd0YWJsZWF1LXN0b3J5LXRpdGxlJyxcbiAgRGFzaGJvYXJkVGl0bGUgPSAndGFibGVhdS1kYXNoYm9hcmQtdGl0bGUnLFxuICBQYW5lID0gJ3RhYmxlYXUtcGFuZScsXG4gIFJvd0RpdmlkZXJzID0gJ3RhYmxlYXUtcm93LWRpdmlkZXJzJyxcbiAgQ29sdW1uRGl2aWRlcnMgPSAndGFibGVhdS1jb2x1bW4tZGl2aWRlcnMnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gc2V0IHBhZ2Ugc2l6ZSBmb3IgZXhwb3J0IGxheW91dCBvcHRpb25zLlxuICovXG5leHBvcnQgZW51bSBQYWdlU2l6ZU9wdGlvbiB7XG4gIExldHRlciA9ICdsZXR0ZXInLFxuICBMZWdhbCA9ICdsZWdhbCcsXG4gIE5vdGUgPSAnbm90ZScsXG4gIEZvbGlvID0gJ2ZvbGlvJyxcbiAgVGFibG9pZCA9ICd0YWJsb2lkJyxcbiAgTGVkZ2VyID0gJ2xlZGdlcicsXG4gIFN0YXRlbWVudCA9ICdzdGF0ZW1lbnQnLFxuICBFeGVjdXRpdmUgPSAnZXhlY3V0aXZlJyxcbiAgQTMgPSAnYTMnLFxuICBBNCA9ICdhNCcsXG4gIEE1ID0gJ2E1JyxcbiAgQjQgPSAnYjQnLFxuICBCNSA9ICdiNScsXG4gIFF1YXJ0byA9ICdxdWFydG8nLFxuICBVbnNwZWNpZmllZCA9ICd1bnNwZWNpZmllZCcsXG59XG5cbi8qKlxuICogVXNlZCB0byBzZXQgdGhlIHBhZ2Ugb3JpZW50YXRpb24gbW9kZSBmb3IgZXhwb3J0IGxheW91dCBvcHRpb25zLlxuICovXG5leHBvcnQgZW51bSBQYWdlT3JpZW50YXRpb24ge1xuICBQcmludGVyID0gJ3ByaW50ZXInLFxuICBQb3J0cmFpdCA9ICdwb3J0cmFpdCcsXG4gIExhbmRzY2FwZSA9ICdsYW5kc2NhcGUnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gc2V0IHNjYWxlIG1vZGUgZm9yIGV4cG9ydCBsYXlvdXQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gU2NhbGVNb2RlIHtcbiAgU2NhbGVBdXRvID0gJ2F1dG8nLFxuICBTY2FsZVBlcmNlbnRhZ2UgPSAncGVyY2VudCcsXG4gIFNjYWxlRml0UGFnZXMgPSAnZml0LXBhZ2VzJyxcbn1cblxuLyoqXG4gKiBVc2VkIGJ5IHNldEZpdEFuZFNjYWxlVmFsdWVzIHRvIHNjYWxlIHBlcmNlbnQgdmFsdWVzXG4gKi9cbmV4cG9ydCBlbnVtIFBhZ2VTY2FsaW5nT3B0aW9uIHtcbiAgU2NhbGVQY3RBdXRvID0gJ2F1dG8nLFxuICBTY2FsZVBjdDQwMCA9ICdwY3Q0MDAnLFxuICBTY2FsZVBjdDIwMCA9ICdwY3QyMDAnLFxuICBTY2FsZVBjdDEwMCA9ICdwY3QxMDAnLFxuICBTY2FsZVBjdDkwID0gJ3BjdDkwJyxcbiAgU2NhbGVQY3Q4MCA9ICdwY3Q4MCcsXG4gIFNjYWxlUGN0NzUgPSAncGN0NzUnLFxuICBTY2FsZVBjdDYwID0gJ3BjdDYwJyxcbiAgU2NhbGVQY3Q1MCA9ICdwY3Q1MCcsXG4gIFNjYWxlUGN0MjUgPSAncGN0MjUnLFxufVxuXG4vKipcbiAqIFVzZWQgYnkgc2V0Rml0QW5kU2NhbGVWYWx1ZXMgdG8gc2NhbGUgZml0IHBhZ2UgdmFsdWVzXG4gKi9cbmV4cG9ydCBlbnVtIEZpdFBhZ2VzIHtcbiAgRml0T25lSGlnaCA9ICdmaXQweDEnLFxuICBGaXRUd29IaWdoID0gJ2ZpdDB4MicsXG4gIEZpdE9uZVdpZGUgPSAnZml0MXgwJyxcbiAgRml0VHdvV2lkZSA9ICdmaXQyeDAnLFxufVxuXG4vKipcbiAqIFVzZWQgYnkgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jXG4gKi9cbmV4cG9ydCBlbnVtIEVuY29kaW5nVHlwZSB7XG4gIENvbG9yID0gJ2NvbG9yJyxcbiAgU2l6ZSA9ICdzaXplJyxcbiAgTGFiZWwgPSAnbGFiZWwnLFxuICBEZXRhaWwgPSAnZGV0YWlsJyxcbiAgVG9vbHRpcCA9ICd0b29sdGlwJyxcbiAgU2hhcGUgPSAnc2hhcGUnLFxuICBQYXRoID0gJ3BhdGgnLFxuICBBbmdsZSA9ICdhbmdsZScsXG4gIEdlb21ldHJ5ID0gJ2dlb21ldHJ5JyxcbiAgQ3VzdG9tID0gJ2N1c3RvbScsXG59XG5cbmV4cG9ydCBlbnVtIFB1bHNlVGltZURpbWVuc2lvbiB7XG4gIFRvZGF5ID0gJ1RvZGF5JyxcbiAgWWVzdGVyZGF5ID0gJ1llc3RlcmRheScsXG4gIFdlZWtUb0RhdGUgPSAnV2Vla1RvRGF0ZScsXG4gIExhc3RXZWVrID0gJ0xhc3RXZWVrJyxcbiAgTW9udGhUb0RhdGUgPSAnTW9udGhUb0RhdGUnLFxuICBMYXN0TW9udGggPSAnTGFzdE1vbnRoJyxcbiAgUXVhcnRlclRvRGF0ZSA9ICdRdWFydGVyVG9EYXRlJyxcbiAgTGFzdFF1YXJ0ZXIgPSAnTGFzdFF1YXJ0ZXInLFxuICBZZWFyVG9EYXRlID0gJ1llYXJUb0RhdGUnLFxuICBMYXN0WWVhciA9ICdMYXN0WWVhcicsXG59XG5cbmV4cG9ydCBlbnVtIFB1bHNlRXJyb3JNZXNzYWdlVmlzaWJpbGl0eSB7XG4gIFZpc2libGUgPSAndmlzaWJsZScsXG4gIEhpZGRlbiA9ICdoaWRkZW4nLFxuICBTdXBwcmVzc2VkID0gJ3N1cHByZXNzZWQnLFxufVxuIiwiZXhwb3J0IGVudW0gTm90aWZpY2F0aW9uSWQge1xuICBDdXN0b21NYXJrQ29udGV4dE1lbnVDbGlja2VkID0gJ2N1c3RvbS1tYXJrLWNvbnRleHQtbWVudS1jbGlja2VkJyxcbiAgQ29udGV4dE1lbnVDbGljayA9ICdjb250ZXh0LW1lbnUtY2xpY2snLFxuICBDdXN0b21WaWV3UmVtb3ZlZCA9ICdjdXN0b20tdmlldy1yZW1vdmVkJyxcbiAgQ3VzdG9tVmlld1NhdmVkID0gJ2N1c3RvbS12aWV3LXNhdmVkJyxcbiAgQ3VzdG9tVmlld1NldERlZmF1bHQgPSAnY3VzdG9tLXZpZXctc2V0LWRlZmF1bHQnLFxuICBDdXN0b21WaWV3c0xvYWRlZCA9ICdjdXN0b20tdmlld3MtbG9hZGVkJyxcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCA9ICdkYXNoYm9hcmQtbGF5b3V0LWNoYW5nZWQnLFxuICBFZGl0QnV0dG9uQ2xpY2tlZCA9ICdlZGl0LWJ1dHRvbi1jbGlja2VkJyxcbiAgRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQgPSAnZWRpdC1pbi1kZXNrdG9wLWJ1dHRvbi1jbGlja2VkJyxcbiAgRXh0ZW5zaW9uRGlhbG9nVXBkYXRlID0gJ2V4dGVuc2lvbi1kaWFsb2ctdXBkYXRlJyxcbiAgRXh0ZW5zaW9uRGlhbG9nTWVzc2FnZSA9ICdleHRlbnNpb24tZGlhbG9nLW1lc3NhZ2UnLFxuICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlci1jaGFuZ2VkJyxcbiAgRmlyc3RWaXpTaXplS25vd24gPSAnZmlyc3Qtdml6LXNpemUta25vd24nLFxuICBGaXJzdFB1bHNlTWV0cmljU2l6ZUtub3duID0gJ2ZpcnN0LXB1bHNlLW1ldHJpYy1zaXplLWtub3duJyxcbiAgUGFyYW1ldGVyQ2hhbmdlZCA9ICdwYXJhbWV0ZXItY2hhbmdlZCcsXG4gIFB1bHNlRXJyb3IgPSAncHVsc2UtZXJyb3InLFxuICBQdWxzZUZpbHRlcnNDaGFuZ2VkID0gJ3B1bHNlLWZpbHRlcnMtY2hhbmdlZCcsXG4gIFB1bHNlTWV0cmljU2l6ZUNoYW5nZWQgPSAncHVsc2UtbWV0cmljLXNpemUtY2hhbmdlZCcsXG4gIFB1bHNlSW5zaWdodERpc2NvdmVyZWQgPSAncHVsc2UtaW5zaWdodC1kaXNjb3ZlcmVkJyxcbiAgUHVsc2VJbnRlcmFjdGl2ZSA9ICdwdWxzZS1pbnRlcmFjdGl2ZScsXG4gIFB1bHNlVGltZURpbWVuc2lvbkNoYW5nZWQgPSAncHVsc2UtdGltZS1kaW1lbnNpb24tY2hhbmdlZCcsXG4gIFB1bHNlVXJsQ2hhbmdlZCA9ICdwdWxzZS11cmwtY2hhbmdlZCcsXG4gIFNlbGVjdGVkTWFya3NDaGFuZ2VkID0gJ3NlbGVjdGVkLW1hcmtzLWNoYW5nZWQnLFxuICBTZXR0aW5nc0NoYW5nZWQgPSAnc2V0dGluZ3MtY2hhbmdlZCcsXG4gIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5LWRhdGEtY2hhbmdlZCcsXG4gIFRlc3RDb252ZXJzaW9uTm90aWZpY2F0aW9uID0gJ3Rlc3QtY29udmVyc2lvbi1ub3RpZmljYXRpb24nLFxuICBUb29sYmFyU3RhdGVDaGFuZ2VkID0gJ3Rvb2xiYXItc3RhdGUtY2hhbmdlZCcsXG4gIFZpekludGVyYWN0aXZlID0gJ3Zpei1pbnRlcmFjdGl2ZScsXG4gIEFza0RhdGFJbnRlcmFjdGl2ZSA9ICdhc2stZGF0YS1pbnRlcmFjdGl2ZScsXG4gIFdvcmtib29rUmVhZHlUb0Nsb3NlID0gJ3dvcmtib29rLXJlYWR5LXRvLWNsb3NlJyxcbiAgV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCA9ICd3b3JrYm9vay1mb3JtYXR0aW5nLWNoYW5nZWQnLFxuICBXb3JrYm9va1B1Ymxpc2hlZCA9ICd3b3JrYm9vay1wdWJsaXNoZWQnLFxuICBXb3JrYm9va1B1Ymxpc2hlZEFzID0gJ3dvcmtib29rLXB1Ymxpc2hlZC1hcycsXG4gIFdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkID0gJ3dvcmtzaGVldC1mb3JtYXR0aW5nLWNoYW5nZWQnLFxuICBVcmxBY3Rpb24gPSAndXJsLWFjdGlvbicsXG4gIFRhYlN3aXRjaGVkID0gJ3RhYi1zd2l0Y2hlZCcsXG4gIFN0b3J5UG9pbnRTd2l0Y2hlZCA9ICdzdG9yeS1wb2ludC1zd2l0Y2hlZCcsXG4gIFJlYWR5VG9SZWNlaXZlQXV0aFRva2VuID0gJ3JlYWR5LXRvLXJlY2VpdmUtYXV0aC10b2tlbicsXG59XG4iLCIvLyBQTEVBU0UgS0VFUCBJTiBBTFBIQUJFVElDQUwgT1JERVIuIFRoaXMgaGVscHMgd2l0aCB2aXN1YWxseSBmaW5kaW5nIGVudHJpZXMsIGtub3dpbmcgd2hlcmUgdG8gcHV0XG4vLyBuZXcgb25lcywgYW5kIG1lcmdlIGNvbmZsaWN0cy5cbmV4cG9ydCBlbnVtIFBhcmFtZXRlcklkIHtcbiAgQWN0aXZlVGFibGVzSW5mbyA9ICdhY3RpdmUtdGFibGVzLWluZm8nLFxuICBBbmNob3JEYXRlID0gJ2FuY2hvci1kYXRlJyxcbiAgQW5ub3RhdGVFbnVtID0gJ2Fubm90YXRlLWVudW0nLFxuICBBbm5vdGF0aW9uTGlzdCA9ICdhbm5vdGF0aW9uLWxpc3QnLFxuICBBcHBseVdvcmtzaGVldEZvcm1hdHRpbmcgPSAnYXBwbHktd29ya3NoZWV0LWZvcm1hdHRpbmcnLFxuXG4gIENhdGVnb3JpY2FsRG9tYWluID0gJ2NhdGVnb3JpY2FsLWRvbWFpbicsXG4gIENsaWNrVGhyb3VnaEVuYWJsZWQgPSAnY2xpY2stdGhyb3VnaC1lbmFibGVkJyxcbiAgQ29sdW1ucyA9ICdjb2x1bW5zJyxcbiAgQ29sdW1uc1RvSW5jbHVkZSA9ICdjb2x1bW5zLXRvLWluY2x1ZGUnLFxuICBDb2x1bW5zVG9JbmNsdWRlQnlJZCA9ICdjb2x1bW5zLXRvLWluY2x1ZGUtYnktaWQnLFxuICBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJpZXMgPSAnY29ubmVjdGlvbi1kZXNjcmlwdGlvbi1zdW1tYXJpZXMnLFxuICBDdXJyZW50U2hlZXRUeXBlID0gJ2N1cnJlbnQtc2hlZXQtdHlwZScsXG4gIEN1c3RvbVZpZXcgPSAnY3VzdG9tLXZpZXcnLFxuICBDdXN0b21WaWV3SXNEZWZhdWx0ID0gJ2N1c3RvbS12aWV3LWlzLWRlZmF1bHQnLFxuICBDdXN0b21WaWV3SXNQdWJsaWMgPSAnY3VzdG9tLXZpZXctaXMtcHVibGljJyxcbiAgQ3VzdG9tVmlld0x1aWQgPSAnY3VzdG9tLXZpZXctbHVpZCcsXG4gIEN1c3RvbVZpZXdOYW1lID0gJ2N1c3RvbS12aWV3LW5hbWUnLFxuICBDdXN0b21WaWV3cyA9ICdjdXN0b20tdmlld3MnLFxuXG4gIERhc2hib2FyZCA9ICdkYXNoYm9hcmQnLFxuICBEYXNoYm9hcmRGaWx0ZXJzID0gJ2Rhc2hib2FyZC1maWx0ZXJzJyxcbiAgRGFzaGJvYXJkTmFtZSA9ICdkYXNoYm9hcmQnLFxuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgPSAnZGFzaGJvYXJkLW9iamVjdC1wb3NpdGlvbi1hbmQtc2l6ZS11cGRhdGUnLFxuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVMaXN0ID0gJ2Rhc2hib2FyZC1vYmplY3QtcG9zaXRpb24tYW5kLXNpemUtdXBkYXRlLWxpc3QnLFxuICBEYXRhUm93SW5kZXggPSAnZGF0YS1yb3ctaW5kZXgnLFxuICBEYXRhU2NoZW1hID0gJ2RhdGEtc2NoZW1hJyxcbiAgRGF0YVNvdXJjZSA9ICdkYXRhLXNvdXJjZScsXG4gIERhdGFTb3VyY2VEYXRhVGFibGUgPSAnZGF0YS1zb3VyY2UtZGF0YS10YWJsZScsXG4gIERhdGFTb3VyY2VJZCA9ICdkYXRhLXNvdXJjZS1pZCcsXG4gIERhdGFTb3VyY2VOYW1lID0gJ2RhdGEtc291cmNlLW5hbWUnLFxuICBEYXRhVGFibGUgPSAnZGF0YS10YWJsZScsXG4gIERhdGFUYWJsZVJlYWRlciA9ICdkYXRhLXRhYmxlLXJlYWRlcicsXG4gIERhdGVSYW5nZVR5cGUgPSAnZGF0ZS1yYW5nZS10eXBlJyxcbiAgRGVsZXRlQ291bnQgPSAnZGVsZXRlLWNvdW50JyxcbiAgRGVsdGFUaW1lTXMgPSAnZGVsdGEtdGltZS1tcycsXG4gIERpbVZhbFNlbGVjdGlvbk1vZGVscyA9ICdkaW1lbnNpb25WYWx1ZVNlbGVjdGlvbk1vZGVscycsXG4gIERvbWFpblR5cGUgPSAnZG9tYWluLXR5cGUnLFxuXG4gIEVtYmVkZGluZ0Fic3RyYWN0UXVlcnkgPSAnZW1iZWRkaW5nLWFic3RyYWN0LXF1ZXJ5JyxcbiAgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbyA9ICdlbWJlZGRpbmctYm9vdHN0cmFwLWluZm8nLFxuICBFbmNvZGluZ1R5cGUgPSAnZW5jb2RpbmctdHlwZScsXG4gIEV4cG9ydENyb3NzdGFiU2hlZXRNYXAgPSAnZXhwb3J0LWNyb3NzdGFiLXNoZWV0LW1hcCcsXG4gIEV4cG9ydEZpbGUgPSAnZXhwb3J0LWZpbGUnLFxuICBFeHBvcnRPcmlnaW5VcmwgPSAnZXhwb3J0LW9yaWdpbi11cmwnLFxuICBFeHBvcnRQZGZPcHRpb25zID0gJ2V4cG9ydC1wZGYtb3B0aW9ucycsXG4gIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8gPSAnZXh0ZW5zaW9uLWJvb3RzdHJhcC1pbmZvJyxcbiAgRXh0ZW5zaW9uQ29udGV4dE1lbnVJZHMgPSAnZXh0ZW5zaW9uLWNvbnRleHQtbWVudS1pZHMnLFxuICBFeHRlbnNpb25EaWFsb2dIID0gJ2V4dGVuc2lvbi1kaWFsb2ctaGVpZ2h0JyxcbiAgRXh0ZW5zaW9uRGlhbG9nTWVzc2FnZSA9ICdleHRlbnNpb24tZGlhbG9nLW1lc3NhZ2UnLFxuICBFeHRlbnNpb25EaWFsb2dQYXlsb2FkID0gJ2V4dGVuc2lvbi1kaWFsb2ctcGF5bG9hZCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdCA9ICdleHRlbnNpb24tZGlhbG9nLXJlc3VsdCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1N0eWxlID0gJ2V4dGVuc2lvbi1kaWFsb2ctc3R5bGUnLFxuICBFeHRlbnNpb25EaWFsb2dVcmwgPSAnZXh0ZW5zaW9uLWRpYWxvZy11cmwnLFxuICBFeHRlbnNpb25EaWFsb2dXID0gJ2V4dGVuc2lvbi1kaWFsb2ctd2lkdGgnLFxuICBFeHRlbnNpb25Mb2NhdG9yID0gJ2V4dGVuc2lvbi1sb2NhdG9yJyxcbiAgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvID0gJ2V4dGVuc2lvbi1zZXR0aW5ncy1pbmZvJyxcbiAgRXh0ZW5zaW9uWm9uZUlkID0gJ2V4dGVuc2lvbi16b25lLWlkJyxcbiAgRXh0ZXJuYWxNZW51RGVzY3JpcHRpb24gPSAnZXh0ZXJuYWwtbWVudS1kZXNjcmlwdGlvbicsXG4gIEV4dGVybmFsTWVudUhlYWRlciA9ICdleHRlcm5hbC1tZW51LWhlYWRlcicsXG4gIEV4dGVybmFsTWVudUl0ZW1EaXNwbGF5TmFtZSA9ICdleHRlcm5hbC1tZW51LWl0ZW0tZGlzcGxheS1uYW1lJyxcbiAgRXh0ZXJuYWxNZW51SXRlbUlkID0gJ2V4dGVybmFsLW1lbnUtaXRlbS1pZCcsXG5cbiAgRmllbGQgPSAnZmllbGQnLFxuICBGaWVsZENvdW50ID0gJ2ZpZWxkLWNvdW50JyxcbiAgRmllbGRJZCA9ICdmaWVsZC1pZCcsXG4gIEZpZWxkTmFtZSA9ICdmaWVsZC1uYW1lJyxcbiAgRmlsdGVyTGV2ZWxzID0gJ2ZpbHRlci1sZXZlbHMnLFxuICBGaWx0ZXJSYW5nZU1heCA9ICdmaWx0ZXItcmFuZ2UtbWF4JyxcbiAgRmlsdGVyUmFuZ2VNaW4gPSAnZmlsdGVyLXJhbmdlLW1pbicsXG4gIEZpbHRlclJhbmdlTnVsbE9wdGlvbiA9ICdmaWx0ZXItcmFuZ2UtbnVsbC1vcHRpb24nLFxuICBGaWx0ZXJVcGRhdGVUeXBlID0gJ2ZpbHRlci11cGRhdGUtdHlwZScsXG4gIEZpbHRlclZhbHVlcyA9ICdmaWx0ZXItdmFsdWVzJyxcbiAgRm9udE5hbWVMaXN0SXRlbXMgPSAnZm9udC1uYW1lLWxpc3QtaXRlbXMnLFxuICBGb3JtYXR0ZWRUZXh0ID0gJ2Zvcm1hdHRlZC10ZXh0JyxcbiAgRnVuY3Rpb25OYW1lID0gJ2Z1bmN0aW9uLW5hbWUnLFxuICBGcm9tSW5kZXggPSAnZnJvbS1pbmRleCcsXG5cbiAgSGllclZhbFNlbGVjdGlvbk1vZGVscyA9ICdoaWVyYXJjaGljYWxWYWx1ZVNlbGVjdGlvbk1vZGVscycsXG4gIEhpZ2hsaWdodGVkRGF0YSA9ICdoaWdobGlnaHRlZC1kYXRhJyxcbiAgSG92ZXJUdXBsZUludGVyYWN0aW9uID0gJ2hvdmVyLXR1cGxlLWludGVyYWN0aW9uJyxcblxuICBJZ25vcmVBbGlhc2VzID0gJ2lnbm9yZS1hbGlhc2VzJyxcbiAgSWdub3JlU2VsZWN0aW9uID0gJ2lnbm9yZS1zZWxlY3Rpb24nLFxuICBJbmNsdWRlQWxsQ29sdW1ucyA9ICdpbmNsdWRlLWFsbC1jb2x1bW5zJyxcbiAgSW52YWxpZEFnZ0ZpZWxkTmFtZSA9ICdpbnZhbGlkLWFnZy1maWVsZC1uYW1lJyxcbiAgSW52YWxpZERhdGVzID0gJ2ludmFsaWQtZGF0ZXMnLFxuICBJbnZhbGlkRmllbGRDYXB0aW9uID0gJ2ludmFsaWQtZmllbGQtY2FwdGlvbicsXG4gIEludmFsaWRGaWVsZHMgPSAnaW52YWxpZC1maWVsZHMnLFxuICBJbnZhbGlkVmFsdWVzID0gJ2ludmFsaWQtdmFsdWVzJyxcbiAgSXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUgPSAnaXMtYW5hbHl0aWNzLWFzc2lzdGFudC1hdmFpbGFibGUnLFxuICBJc0V4Y2x1ZGVNb2RlID0gJ2lzLWV4Y2x1ZGUnLFxuICBJc0V4dGVuc2lvbkRpYWxvZyA9ICdpcy1leHRlbnNpb24tZGlhbG9nJyxcbiAgSXNGcm9tQ2FsY0RpYWxvZyA9ICdpcy1mcm9tLWNhbGMtZGlhbG9nJyxcblxuICBKb2luRGVzY3JpcHRpb24gPSAnam9pbi1kZXNjcmlwdGlvbicsXG5cbiAgTG9naWNhbFRhYmxlSWQgPSAnbG9naWNhbC10YWJsZS1pZCcsXG4gIExvZ2ljYWxUYWJsZUluZm9MaXN0ID0gJ2xvZ2ljYWwtdGFibGUtaW5mby1saXN0JyxcblxuICBNYXJrc0NhcmRJbmRleCA9ICdtYXJrcy1jYXJkLWluZGV4JyxcbiAgTWF4SGVpZ2h0ID0gJ21heC1oZWlnaHQnLFxuICBNYXhSb3dzID0gJ21heC1yb3dzJyxcbiAgTWF4V2lkdGggPSAnbWF4LXdpZHRoJyxcbiAgTWluSGVpZ2h0ID0gJ21pbi1oZWlnaHQnLFxuICBNaW5XaWR0aCA9ICdtaW4td2lkdGgnLFxuXG4gIFBhZ2VSb3dDb3VudCA9ICdwYWdlLXJvdy1jb3VudCcsXG4gIFBhcmFtZXRlckNhcHRpb24gPSAncGFyZW1ldGVyLWNhcHRpb24nLFxuICBQYXJhbWV0ZXJFcnJvciA9ICdwYXJhbWV0ZXItZXJyb3InLFxuICBQYXJhbWV0ZXJGaWVsZE5hbWUgPSAncGFyYW1ldGVyLWZpZWxkLW5hbWUnLFxuICBQYXJhbWV0ZXJJbmZvID0gJ3BhcmFtZXRlci1pbmZvJyxcbiAgUGFyYW1ldGVySW5mb3MgPSAncGFyYW1ldGVyLWluZm9zJyxcbiAgUGFyYW1ldGVyVmFsdWUgPSAncGFyYW1ldGVyLXZhbHVlJyxcbiAgUGVyaW9kVHlwZSA9ICdwZXJpb2QtdHlwZScsXG4gIFB1bHNlRmllbGROYW1lID0gJ2ZpZWxkTmFtZScsXG4gIFB1bHNlRmllbGROYW1lcyA9ICdmaWVsZE5hbWVzJyxcbiAgUHVsc2VGaWx0ZXJEb21haW5UeXBlID0gJ2RvbWFpblR5cGUnLFxuICBQdWxzZUZpbHRlckRvbWFpblNlYXJjaFRlcm0gPSAnc2VhcmNoVGVybScsXG4gIFB1bHNlUGFnZVNpemUgPSAncGFnZVNpemUnLFxuICBQdWxzZU5leHRQYWdlVG9rZW4gPSAnbmV4dFBhZ2VUb2tlbicsXG4gIFB1bHNlRmlsdGVycyA9ICdmaWx0ZXJzJyxcbiAgUHVsc2VUaW1lRGltZW5zaW9uID0gJ3RpbWVEaW1lbnNpb24nLFxuXG4gIFF1YW50aXRhdGl2ZURvbWFpbiA9ICdxdWFudGl0YXRpdmUtZG1haW4nLFxuICBRdWFudFJhbmdlU2VsZWN0aW9uTW9kZWxzID0gJ3F1YW50YXRpdmVSYW5nZVNlbGVjdGlvbk1vZGVscycsXG5cbiAgUmFuZ2VOID0gJ3JhbmdlLW4nLFxuICBSZXBsYXlTcGVlZCA9ICdyZXBsYXktc3BlZWQnLFxuXG4gIFNlbGVjdGVkRGF0YSA9ICdzZWxlY3RlZC1kYXRhJyxcbiAgU2VsZWN0ZWRTaGVldE5hbWVzID0gJ3NlbGVjdGVkLXNoZWV0LW5hbWVzJyxcbiAgU2VsZWN0aW9uID0gJ3NlbGVjdGlvbicsXG4gIFNlbGVjdGlvbkxpc3QgPSAnc2VsZWN0aW9uLWxpc3QnLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlID0gJ3NlbGVjdGlvblVwZGF0ZVR5cGUnLFxuICBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbiA9ICdzZWxlY3QtdHVwbGVzLWludGVyYWN0aW9uJyxcbiAgU2VuZE5vdGlmaWNhdGlvbnMgPSAnc2VuZC1ub3RpZmljYXRpb25zJyxcbiAgU2V0dGluZ3NWYWx1ZXMgPSAnc2V0dGluZ3MtdmFsdWVzJyxcbiAgU2hhcmVkRmlsdGVyU2hlZXRzID0gJ3NoYXJlZC1maWx0ZXItc2hlZXRzJyxcbiAgU2hhcmVkRmlsdGVyc0luZm8gPSAnc2hhcmVkLWZpbHRlcnMtaW5mbycsXG4gIFNoZWV0SWRlbnRpZmllciA9ICdzaGVldC1pZGVudGlmaWVyJyxcbiAgU2hlZXROYW1lID0gJ3NoZWV0LW5hbWUnLFxuICBTaGVldFBhdGggPSAnc2hlZXQtcGF0aCcsXG4gIFNob3VsZFJlZnJlc2hEUyA9ICdzaG91bGQtcmVmcmVzaC1kcycsXG4gIFNob3dEYXRhVGFibGVGb3JtYXQgPSAnc2hvdy1kYXRhLXRhYmxlLWZvcm1hdCcsXG4gIFN0YXJ0SW5kZXggPSAnc3RhcnQtaW5kZXgnLFxuICBTdGF0ZSA9ICdzdGF0ZScsXG4gIFN0b3J5UG9pbnRJbmRleCA9ICdzdG9yeS1wb2ludC1pbmRleCcsXG4gIFN0b3J5UG9pbnRJbmZvID0gJ3N0b3J5LXBvaW50LWluZm8nLFxuICBTd2l0Y2hUb1NoZWV0TmFtZSA9ICdzd2l0Y2gtdG8tc2hlZXQtbmFtZScsXG5cbiAgVGFyZ2V0UG9pbnQgPSAndGFyZ2V0LXBvaW50JyxcbiAgVGVzdENvbnZlcnNpb25QYXJhbWV0ZXIgPSAndGVzdC1jb252ZXJzaW9uLXBhcmFtZXRlcicsXG4gIFRleHQgPSAnZm9ybWF0dGVkLXRleHQnLFxuICBUb0luZGV4ID0gJ3RvLWluZGV4JyxcbiAgVG9vbHRpcENvbnRleHQgPSAndG9vbHRpcC1jb250ZXh0JyxcbiAgVG9vbHRpcFRleHRSZXF1ZXN0ID0gJ3Rvb2x0aXAtdGV4dC1yZXF1ZXN0JyxcbiAgVG9vbHRpcFRleHQgPSAndG9vbHRpcC10ZXh0JyxcblxuICBVbmRlcmx5aW5nRGF0YVRhYmxlID0gJ3VuZGVybHlpbmctZGF0YS10YWJsZScsXG4gIFVuZGVybHlpbmdTdW1tYXJ5RGF0YVRhYmxlID0gJ3VuZGVybHlpbmctc3VtbWFyeS1kYXRhLXRhYmxlJyxcbiAgVXJsID0gJ3VybCcsXG4gIFVzZVRhYkRlbGltaXRlcnMgPSAndXNlLXRhYi1kZWxpbWl0ZXJzJyxcblxuICBWaWV3RGF0YVRhYmxlQ2FjaGVJZCA9ICd2aWV3LWRhdGEtdGFibGUtY2FjaGUtaWQnLFxuICBWaWV3RGF0YVRhYmxlSWQgPSAndmlldy1kYXRhLXRhYmxlLWlkJyxcbiAgVmlzdWFsSWQgPSAndmlzdWFsLWlkJyxcbiAgVmlzdWFsU3BlY2lmaWNhdGlvbiA9ICd2aXN1YWwtc3BlY2lmaWNhdGlvbicsXG4gIFZpekFQSUlucHV0SnNvbiA9ICd2aXphcGktaW5wdXQtanNvbicsXG4gIFZpekFQSVN0YXRlV2l0aERhdGFNb2RlbCA9ICd2aXphcGktc3RhdGUtd2l0aC1kYXRhLW1vZGVsJyxcbiAgVml6QVBJU3RhdGVXYXJuaW5nTXNnID0gJ3ZpemFwaS1zdGF0ZS13YXJuaW5nLW1zZycsXG4gIFZpekFQSVNWRyA9ICd2aXphcGktc3ZnJyxcblxuICBXb3Jrc2hlZXROYW1lID0gJ3dvcmtzaGVldC1uYW1lJyxcbiAgV29ya3NoZWV0RmlsdGVycyA9ICd3b3Jrc2hlZXQtZmlsdGVycycsXG5cbiAgWm9uZUlkc1Zpc2liaWxpdHlNYXAgPSAnem9uZS1pZHMtdmlzaWJpbGl0eS1tYXAnLFxufVxuIiwiLy8gRGVjbGFyZSB0aGlzIGtleSB0eXBlIGFuZCBleHBvcnQgdGhlIE5vdGlmaWNhdGlvbklkIHRvIG1ha2UgdGhpcyBiZWhhdmUgbGlrZSBhIHN0cmluZyBlbnVtLlxuLy9cbi8vIFBMRUFTRSBLRUVQIElOIEFMUEhBQkVUSUNBTCBPUkRFUi4gVGhpcyBoZWxwcyB3aXRoIHZpc3VhbGx5IGZpbmRpbmcgZW50cmllcywga25vd2luZyB3aGVyZSB0byBwdXRcbi8vIG5ldyBvbmVzLCBhbmQgbWVyZ2UgY29uZmxpY3RzLlxuZXhwb3J0IGVudW0gVmVyYklkIHtcbiAgQWN0aXZhdGVOZXh0U3RvcnlQb2ludCA9ICdhY3RpdmF0ZS1uZXh0LXN0b3J5LXBvaW50JyxcbiAgQWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnQgPSAnYWN0aXZhdGUtcHJldmlvdXMtc3RvcnktcG9pbnQnLFxuICBBY3RpdmF0ZVNoZWV0ID0gJ2FjdGl2YXRlU2hlZXQnLFxuICBBY3RpdmF0ZVN0b3J5UG9pbnQgPSAnYWN0aXZhdGUtc3RvcnktcG9pbnQnLFxuICBBZGRNYXJrc0NhcmRGaWVsZHMgPSAnYWRkLW1hcmtzLWNhcmQtZmllbGRzJyxcbiAgQXBwZW5kRXh0ZXJuYWxNZW51SXRlbSA9ICdhcHBlbmQtZXh0ZXJuYWwtbWVudS1pdGVtJyxcbiAgQXBwbHlDYXRlZ29yaWNhbEZpbHRlciA9ICdjYXRlZ29yaWNhbC1maWx0ZXInLFxuICBBcHBseVB1bHNlRmlsdGVycyA9ICdhcHBseS1wdWxzZS1maWx0ZXJzJyxcbiAgQXBwbHlQdWxzZVRpbWVEaW1lbnNpb24gPSAnYXBwbHktcHVsc2UtdGltZS1kaW1lbnNpb24nLFxuICBBcHBseVJhbmdlRmlsdGVyID0gJ3JhbmdlLWZpbHRlcicsXG4gIEFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyID0gJ2FwcGx5LXJlbGF0aXZlLWRhdGUtRmlsdGVyJyxcbiAgQXV0aGVudGljYXRlID0gJ2F1dGhlbnRpY2F0ZScsXG5cbiAgQmxvY2tFeHRlbnNpb24gPSAnYmxvY2stZXh0ZW5zaW9uJyxcblxuICBDaGFuZ2VQYXJhbWV0ZXJWYWx1ZSA9ICdjaGFuZ2UtcGFyYW1ldGVyLXZhbHVlJyxcbiAgQ2hhbmdlU2hhcmVkRmlsdGVyID0gJ2NoYW5nZS1zaGFyZWQtZmlsdGVyJyxcbiAgQ2xlYXJBbGxQdWxzZUZpbHRlcnMgPSAnY2xlYXItYWxsLXB1bHNlLWZpbHRlcnMnLFxuICBDbGVhckZpbHRlciA9ICdjbGVhci1maWx0ZXInLFxuICBDbGVhclB1bHNlRmlsdGVycyA9ICdjbGVhci1wdWxzZS1maWx0ZXJzJyxcbiAgQ2xlYXJTZWxlY3RlZE1hcmtzID0gJ2NsZWFyLXNlbGVjdGVkLW1hcmtzJyxcbiAgQ2xvc2VEaWFsb2cgPSAnY2xvc2UtZGlhbG9nJyxcbiAgQ3JlYXRlQW5ub3RhdGlvbiA9ICdjcmVhdGUtYW5ub3RhdGlvbicsXG5cbiAgRGFzaGJvYXJkQ2F0ZWdvcmljYWxGaWx0ZXIgPSAnZGFzaGJvYXJkLWNhdGVnb3JpY2FsLWZpbHRlcicsXG4gIERpc3BsYXlEaWFsb2cgPSAnZGlzcGxheS1kaWFsb2cnLFxuICBEb3dubG9hZFdvcmtib29rID0gJ2Rvd25sb2FkLXdvcmtib29rJyxcblxuICBFZGl0QWxpYXNlc0RpYWxvZyA9ICdlZGl0LWFsaWFzZXMtZGlhbG9nJyxcbiAgRXhlY3V0ZUV4dGVybmFsTWVudUl0ZW0gPSAnZXhlY3V0ZS1leHRlcm5hbC1tZW51LWl0ZW0nLFxuICBFeHBvcnRDcm9zc3RhYiA9ICdleHBvcnQtY3Jvc3N0YWInLFxuICBFeHBvcnRDcm9zc3RhYkNzdkRvd25sb2FkID0gJ2V4cG9ydC1jcm9zc3RhYi1jc3YtZG93bmxvYWQnLFxuICBFeHBvcnRDcm9zc3RhYkV4Y2VsRG93bmxvYWQgPSAnZXhwb3J0LWNyb3NzdGFiLWV4Y2VsLWRvd25sb2FkJyxcbiAgRXhwb3J0RGF0YSA9ICdleHBvcnQtZGF0YScsXG4gIEV4cG9ydERhdGFEb3dubG9hZCA9ICdleHBvcnQtZGF0YS1kb3dubG9hZCcsXG4gIEV4cG9ydEltYWdlID0gJ2V4cG9ydC1pbWFnZScsXG4gIEV4cG9ydFBkZiA9ICdleHBvcnQtcGRmJyxcbiAgRXhwb3J0UGRmRG93bmxvYWQgPSAnZXhwb3J0LXBkZi1kb3dubG9hZCcsXG4gIEV4cG9ydFBvd2VycG9pbnQgPSAnZXhwb3J0LXBvd2VycG9pbnQnLFxuICBFeHBvcnRQb3dlcnBvaW50RG93bmxvYWQgPSAnZXhwb3J0LXBvd2VycG9pbnQtZG93bmxvYWQnLFxuXG4gIEZpbmRQYXJhbWV0ZXIgPSAnZmluZC1wYXJhbWV0ZXInLFxuXG4gIEdldEFjdGl2ZVRhYmxlcyA9ICdnZXQtYWN0aXZlLXRhYmxlcycsXG4gIEdldEFsbERhdGFTb3VyY2VzID0gJ2dldC1hbGwtZGF0YS1zb3VyY2VzJyxcbiAgR2V0QW5ub3RhdGlvbnMgPSAnZ2V0LWFubm90YXRpb25zJyxcbiAgR2V0Q2F0ZWdvcmljYWxEb21haW4gPSAnZ2V0LWNhdGVnb3JpY2FsLWRvbWFpbicsXG4gIEdldENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcmllcyA9ICdnZXQtY29ubmVjdGlvbi1kZXNjcmlwdGlvbi1zdW1tYXJpZXMnLFxuICBHZXRDdXJyZW50U3JjID0gJ2dldC1jdXJyZW50LXNyYycsXG4gIEdldEN1c3RvbVZpZXdzID0gJ2dldC1jdXN0b20tdmlld3MnLFxuICBHZXREYXNoYm9hcmRGaWx0ZXJzID0gJ2dldC1kYXNoYm9hcmQtZmlsdGVycycsXG4gIEdldERhdGFTb3VyY2UgPSAnZ2V0LWRhdGFzb3VyY2UnLFxuICBHZXREYXRhU291cmNlRGF0YSA9ICdnZXQtZGF0YXNvdXJjZS1kYXRhJyxcbiAgR2V0RGF0YVNvdXJjZXMgPSAnZ2V0LWRhdGEtc291cmNlcycsXG4gIEdldERhdGFTdW1tYXJ5RGF0YSA9ICdnZXQtc3VtbWFyeS1kYXRhJyxcbiAgR2V0RGF0YVN1bW1hcnlEYXRhUmVhZGVyID0gJ2dldC1zdW1tYXJ5LWRhdGEtcmVhZGVyJyxcbiAgR2V0RGF0YVRhYmxlUmVhZGVyUGFnZSA9ICdnZXQtZGF0YS10YWJsZS1yZWFkZXItcGFnZScsXG4gIEdldEVtYmVkZGluZ0Fic3RyYWN0UXVlcnlXaXRoRGF0YU1vZGVsID0gJ2dldC1lbWJlZGRpbmctYWJzdHJhY3QtcXVlcnktd2l0aC1kYXRhLW1vZGVsJyxcbiAgR2V0RW1iZWRkaW5nQ2xpZW50SW5mbyA9ICdnZXQtZW1iZWRkaW5nLWNsaWVudC1pbmZvJyxcbiAgR2V0Vml6U3RhdGVXaXRoRGF0YU1vZGVsID0gJ2dldC12aXotc3RhdGUtd2l0aC1kYXRhLW1vZGVsJyxcbiAgR2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcCA9ICdnZXQtZXhwb3J0LWNyb3NzdGFiLXNoZWV0LW1hcCcsXG4gIEdldEV4cG9ydFBkZk9wdGlvbnMgPSAnZ2V0LWV4cG9ydC1wZGYtb3B0aW9ucycsXG4gIEdldEZpZWxkID0gJ2dldC1maWVsZCcsXG4gIEdldEZpZWxkQW5kRGF0YVNvdXJjZSA9ICdnZXQtZmllbGQtYW5kLWRhdGFzb3VyY2UnLFxuICBHZXRWaXN1YWxTcGVjaWZpY2F0aW9uID0gJ2dldC12aXN1YWwtc3BlY2lmaWNhdGlvbicsXG4gIEdldEZpbHRlcnMgPSAnZ2V0LWZpbHRlcnMnLFxuICBHZXRGb250cyA9ICdnZXQtZm9udHMnLFxuICBHZXRIaWdobGlnaHRlZE1hcmtzID0gJ2dldC1oaWdobGlnaHRlZC1tYXJrcycsXG4gIEdldEpvaW5EZXNjcmlwdGlvbiA9ICdnZXQtam9pbi1kZXNjcmlwdGlvbicsXG4gIEdldExvZ2ljYWxUYWJsZURhdGEgPSAnZ2V0LWxvZ2ljYWwtdGFibGUtZGF0YScsXG4gIEdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXIgPSAnZ2V0LWxvZ2ljYWwtdGFibGUtZGF0YS1yZWFkZXInLFxuICBHZXRMb2dpY2FsVGFibGVzID0gJ2dldC1sb2dpY2FsLXRhYmxlcycsXG4gIEdldFBhcmFtZXRlcnNGb3JTaGVldCA9ICdnZXQtcGFyYW1ldGVycy1mb3Itc2hlZXQnLFxuICBHZXRQdWxzZUNhdGVnb3JpY2FsRG9tYWluID0gJ2dldC1wdWxzZS1jYXRlZ29yaWNhbC1kb21haW4nLFxuICBHZXRQdWxzZUZpbHRlcnMgPSAnZ2V0LXB1bHNlLWZpbHRlcnMnLFxuICBHZXRQdWxzZVRpbWVEaW1lbnNpb24gPSAnZ2V0LXB1bHNlLXRpbWUtZGltZW5zaW9uJyxcbiAgR2V0UmFuZ2VEb21haW4gPSAnZ2V0LXJhbmdlLWRvbWFpbicsXG4gIEdldFNlbGVjdGVkTWFya3MgPSAnZ2V0LXNlbGVjdGVkLW1hcmtzJyxcbiAgR2V0U2hhcmVkRmlsdGVyID0gJ2dldC1zaGFyZWQtZmlsdGVyJyxcbiAgR2V0VG9vbHRpcFRleHQgPSAnZ2V0LXRvb2x0aXAtdGV4dCcsXG4gIEdldFVuZGVybHlpbmdEYXRhID0gJ2dldC11bmRlcmx5aW5nLWRhdGEnLFxuICBHZXRVbmRlcmx5aW5nVGFibGVEYXRhID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlLWRhdGEnLFxuICBHZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlLWRhdGEtcmVhZGVyJyxcbiAgR2V0VW5kZXJseWluZ1RhYmxlcyA9ICdnZXQtdW5kZXJseWluZy10YWJsZXMnLFxuXG4gIEhpZXJhcmNoaWNhbEZpbHRlciA9ICdoaWVyYWNoaWNhbC1maWx0ZXInLFxuXG4gIEluaXRpYWxpemVFeHRlbnNpb24gPSAnaW5pdGlhbGl6ZS1leHRlbnNpb24nLFxuICBJc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZSA9ICdpcy1hbmFseXRpY3MtYXNzaXN0YW50LWF2YWlsYWJsZScsXG5cbiAgTGF1bmNoQW5hbHl0aWNzQXNzaXN0YW50ID0gJ2xhdW5jaC1hbmFseXRpY3MtYXNzaXN0YW50JyxcblxuICBNb3ZlQW5kUmVzaXplWm9uZXMgPSAnbW92ZS1hbmQtcmVzaXplLXpvbmVzJyxcbiAgTW92ZU1hcmtzQ2FyZEZpZWxkID0gJ21vdmUtbWFya3MtY2FyZC1maWVsZCcsXG5cbiAgUmFpc2VMZWF2ZU1hcmtOYXZOb3RpZmljYXRpb24gPSAncmFpc2UtbGVhdmUtbWFyay1uYXYtbm90aWZpY2F0aW9uJyxcbiAgUmFpc2VIb3ZlclR1cGxlTm90aWZpY2F0aW9uID0gJ3JhaXNlLWhvdmVyLXR1cGxlLW5vdGlmaWNhdGlvbicsXG4gIFJhaXNlU2VsZWN0VHVwbGVzTm90aWZpY2F0aW9uID0gJ3JhaXNlLXNlbGVjdC10dXBsZXMtbm90aWZpY2F0aW9uJyxcbiAgUmVkbyA9ICdyZWRvJyxcbiAgUmVmcmVzaERhdGFTb3VyY2UgPSAncmVmcmVzaC1kYXRhLXNvdXJjZScsXG4gIFJlbGVhc2VEYXRhVGFibGVSZWFkZXIgPSAncmVsZWFzZS1kYXRhLXRhYmxlLXJlYWRlcicsXG4gIFJlbW92ZUFubm90YXRpb24gPSAncmVtb3ZlLWFubm90YXRpb24nLFxuICBSZW1vdmVDdXN0b21WaWV3ID0gJ3JlbW92ZS1jdXN0b20tdmlldycsXG4gIFJlbW92ZUV4dGVybmFsTWVudUl0ZW0gPSAncmVtb3ZlLWV4dGVybmFsLW1lbnUtaXRlbScsXG4gIFJlbmFtZUV4dGVybmFsTWVudSA9ICdyZW5hbWUtZXh0ZXJuYWwtbWVudScsXG4gIFJlcGxheUFuaW1hdGlvbiA9ICdyZXBsYXktYW5pbWF0aW9uJyxcbiAgUmV2ZXJ0U3RvcnlQb2ludCA9ICdyZXZlcnQtc3RvcnktcG9pbnQnLFxuICBSZXZlcnRXb3JrYm9vayA9ICdyZXZlcnQtd29ya2Jvb2snLFxuXG4gIFNhdmVFeHRlbnNpb25TZXR0aW5ncyA9ICdzYXZlLWV4dGVuc2lvbi1zZXR0aW5ncycsXG4gIFNhdmVXb3JrYm9va0FzQ3VzdG9tVmlldyA9ICdzYXZlLXdvcmtib29rLWFzLWN1c3RvbS12aWV3JyxcbiAgU2VsZWN0QnlWYWx1ZSA9ICdzZWxlY3QtYnktdmFsdWUnLFxuICBTZXRBY3RpdmVDdXN0b21WaWV3QXNEZWZhdWx0ID0gJ3NldC1hY3RpdmUtY3VzdG9tLXZpZXctYXMtZGVmYXVsdCcsXG4gIFNldEF1dG9VcGRhdGUgPSAnc2V0LWF1dG8tdXBkYXRlJyxcbiAgU2V0Q2xpY2tUaHJvdWdoID0gJ3NldC1jbGljay10aHJvdWdoJyxcbiAgU2VuZERpYWxvZ01lc3NhZ2UgPSAnc2VuZC1kaWFsb2ctbWVzc2FnZScsXG4gIFNldFZpelN0YXRlV2l0aERhdGFNb2RlbCA9ICdzZXQtdml6LXN0YXRlLXdpdGgtZGF0YS1tb2RlbCcsXG4gIFNldFNoZWV0U2l6ZSA9ICdzZXQtc2hlZXQtc2l6ZScsXG4gIFNldFpvbmVWaXNpYmlsaXR5ID0gJ3NldC16b25lLXZpc2liaWxpdHknLFxuICBTaGFyZSA9ICdzaGFyZScsXG4gIFNob3dDdXN0b21WaWV3ID0gJ3Nob3ctY3VzdG9tLXZpZXcnLFxuICBTcGxpY2VNYXJrc0NhcmRGaWVsZHMgPSAnc3BsaWNlLW1hcmtzLWNhcmQtZmllbGRzJyxcblxuICBUZXN0Q29udmVyc2lvblZlcmIgPSAndGVzdC1jb252ZXJzaW9uLXZlcmInLFxuXG4gIFVuZG8gPSAndW5kbycsXG4gIFVwZGF0ZUN1c3RvbVZpZXcgPSAndXBkYXRlLWN1c3RvbS12aWV3JyxcblxuICBWaXpBUEkgPSAndml6LWFwaScsXG59XG4iLCJleHBvcnQgZW51bSBBc2tEYXRhT3B0aW9uTmFtZXMge1xuICB0b2tlbiA9ICd0b2tlbicsXG4gIG9yaWdpbiA9ICdvcmlnaW4nLFxuICBzaG93RW1iZWQgPSAnc2hvd0VtYmVkJyxcbiAgc2hvd1BpbiA9ICdzaG93UGluJyxcbiAgc2hvd1NhdmUgPSAnc2hvd1NhdmUnLFxuICBzaG93U2hhcmUgPSAnc2hvd1NoYXJlJyxcbiAgZGVidWcgPSAnOmpzZGVidWcnLFxuICBBcGlJRCA9ICc6YXBpSUQnLFxuICBBcGlFeHRlcm5hbFZlcnNpb24gPSAnOmFwaUV4dGVybmFsVmVyc2lvbicsXG4gIEFwaUludGVybmFsVmVyc2lvbiA9ICc6YXBpSW50ZXJuYWxWZXJzaW9uJyxcbiAgQXNrRGF0YVdlYkNvbXBvbmVudCA9ICc6YXNrRGF0YVdlYkNvbXBvbmVudCcsXG59XG4iLCJleHBvcnQgZW51bSBQdWxzZU9wdGlvbk5hbWVzIHtcbiAgZW1iZWQgPSAnZW1iZWQnLFxuICB0b2tlbiA9ICd0b2tlbicsXG4gIGRpc2FibGVFeHBsb3JlRmlsdGVyID0gJ2Rpc2FibGVFeHBsb3JlRmlsdGVyJyxcbiAgbGF5b3V0ID0gJ2VtYmVkX2xheW91dCcsXG4gIHRoZW1lID0gJ2VtYmVkX3RoZW1lJyxcbiAgQXBpRXh0ZXJuYWxWZXJzaW9uID0gJzphcGlFeHRlcm5hbFZlcnNpb24nLFxuICBBcGlJbnRlcm5hbFZlcnNpb24gPSAnOmFwaUludGVybmFsVmVyc2lvbicsXG4gIFB1bHNlV2ViQ29tcG9uZW50ID0gJzpwdWxzZVdlYkNvbXBvbmVudCcsXG59XG4iLCIvKipcbiAqIFRoZXNlIHN0cmluZ3Mgd2VyZSAqbWFudWFsbHkgY29waWVkKiBmcm9tIHRoZSBzZXJ2ZXIsXG4gKiB3b3JrZ3JvdXAvc3JjL3NpbG9zL3RhYmxlYXUtc2VydmVyL2xpYnJhcmllcy90YWItY29udHJvbGxlci12aXpxbC9zcmMvY29tL3RhYmxlYXVzb2Z0d2FyZS9cbiAqIGNvbnRyb2xsZXIvdml6cWwvY29uc3RhbnRzL1BhcmFtZXRlcktleXMuamF2YSNMOVxuICogc2hvdWxkIGJlIGV4cG9ydGVkIGluc3RlYWRcbiAqIHBhcmFtZXRlcnMgdGhhdCB2aXpxbCB3aWxsIGFjY2VwdCBpbiBhbiBlbWJlZGRpbmcgVVJMXG4gKiovXG5lbnVtIFZxbFBhcmFtZXRlck5hbWVzIHtcbiAgT05FID0gJzEnLFxuICBBTEVSVFMgPSAnOmFsZXJ0cycsXG4gIEFMSUFTID0gJ2FsaWFzJyxcbiAgQUxMT1dfREVGRVJSRURfQk9PVFNUUkFQID0gJzphbGxvd0RlZmVycmVkQm9vdHN0cmFwJyxcbiAgQUxMT1dfQVVUT0dFTl9XT1JLU0hFRVRfUEhPTkVfTEFZT1VUUyA9ICdhbGxvd0F1dG9nZW5Xb3Jrc2hlZXRQaG9uZUxheW91dHMnLFxuICBBUElfSUQgPSAnOmFwaUlEJyxcbiAgQVBQID0gJzphcHAnLFxuICBBVFRBQ0hNRU5UID0gJ2F0dGFjaG1lbnQnLFxuICBJU19JUEFEX0FQUCA9ICdhcHAnLFxuICBBTklNQVRFX1RSQU5TSVRJT04gPSAnOmFuaW1hdGVfdHJhbnNpdGlvbicsXG4gIEFTQ0VORElORyA9ICdhc2NlbmRpbmcnLFxuICBBVVRIRU5USUNBVElPTiA9ICdhdXRoZW50aWNhdGlvbicsXG4gIEFUVFJJQlVURVMgPSAnYXR0cmlidXRlcycsXG4gIEFVVEhPUklOR19TSEVFVCA9ICc6YXV0aFNoZWV0JyxcbiAgQVhJUyA9ICdheGlzJyxcbiAgQk9PVFNUUkFQX1dIRU5fTk9USUZJRUQgPSAnOmJvb3RzdHJhcFdoZW5Ob3RpZmllZCcsXG4gIEJST1dTRVJfQkFDS19CVVRUT05fVU5ETyA9ICc6YnJvd3NlckJhY2tCdXR0b25VbmRvJyxcbiAgQlJPV1NFUl9SRU5ERVJJTkdfT04gPSAnaXNCcm93c2VyUmVuZGVyaW5nJyxcbiAgQlJPV1NFUl9SRU5ERVJJTkdfVEhSRVNIT0xEID0gJ2Jyb3dzZXJSZW5kZXJpbmdUaHJlc2hvbGQnLFxuICBDSEFSU0VUID0gJ2NoYXJzZXQnLFxuICBDTElFTlRfRElNRU5TSU9OID0gJ2NsaWVudERpbWVuc2lvbicsXG4gIENMSUVOVF9JUCA9ICdjbGllbnRfaXAnLFxuICBDTElFTlRfTlVNID0gJ2NsaWVudE51bScsXG4gIENPTE9OX0VNQkVEREVEID0gJzplbWJlZGRlZCcsXG4gIENPTE9OX01PQklMRSA9ICc6bW9iaWxlJyxcbiAgQ09MT05fREVFUF9MSU5LSU5HX0RJU0FCTEVEID0gJzpkZWVwTGlua2luZ0Rpc2FibGVkJyxcbiAgQ09MT05fV0FURVJNQVJLID0gJzp3YXRlcm1hcmsnLFxuICBDT01NRU5UUyA9ICc6Y29tbWVudHMnLFxuICBDT01NRU5USU5HX0VOQUJMRUQgPSAnOmNvbW1lbnRpbmdFbmFibGVkJyxcbiAgQ09NTUVOVElOR19NRU5USU9OU19FTkFCTEVEID0gJzpjb21tZW50aW5nTWVudGlvbnMnLFxuICBDT05ORUNUSU9OID0gJ2Nvbm5lY3Rpb24nLFxuICBDUkVBVEVEX0JZX0ZFQVRVUkUgPSAnY3JlYXRlZEJ5RmVhdHVyZScsXG4gIENSWVBURURfUEFTU1dPUkQgPSAnY3J5cHRlZCcsXG4gIENTU0RFQlVHID0gJzpjc3NkZWJ1ZycsXG4gIENTViA9ICdjc3YnLFxuICBDVVNUT01fVklFV1MgPSAnOmN1c3RvbVZpZXdzJyxcbiAgQ1YgPSAnOmN2JyxcbiAgQ1ZfSUQgPSAnY3ZJZCcsXG4gIERBU0hCT0FSRF9QT1JUX1NJWkUgPSAnZGFzaGJvYXJkUG9ydFNpemUnLFxuICBEQVRBX0RFVEFJTFMgPSAnOmRhdGFEZXRhaWxzJyxcbiAgREFUQVNPVVJDRSA9ICdkYXRhc291cmNlJyxcbiAgREVCVUcgPSAnOmRlYnVnJyxcbiAgREVMQVkgPSAnOmRlbGF5JyxcbiAgREVQVEggPSAnZGVwdGgnLFxuICBERVZJQ0VfVFlQRSA9ICc6ZGV2aWNlJyxcbiAgREVWSUNFX1BJWEVMX1JBVElPID0gJ2RldmljZVBpeGVsUmF0aW8nLFxuICBERVZJQ0VfUFJFVklFV19NT0RFID0gJzpkZXZpY2VwcmV2aWV3bW9kZScsXG4gIERJTUVOU0lPTlMgPSAnOmRpbWVuc2lvbnMnLFxuICBESVNBQkxFX1NIQVJFRF9TRVNTSU9OUyA9ICc6ZGlzYWJsZV9zaGFyZWRfc2Vzc2lvbnMnLFxuICBESVNBQkxFX1VSTF9BQ1RJT05TX1BPUFVQUyA9ICc6ZGlzYWJsZVVybEFjdGlvbnNQb3B1cHMnLFxuICBESVJFQ1RJT04gPSAnZGlyZWN0aW9uJyxcbiAgRElTUExBWV9PVkVSTEFZID0gJzpkaXNwbGF5X292ZXJsYXknLFxuICBESVNQTEFZX1NIQVJFID0gJzpkaXNwbGF5X3NoYXJlJyxcbiAgRElTUExBWV9TUElOTkVSID0gJzpkaXNwbGF5X3NwaW5uZXInLFxuICBESVNQTEFZX1NUQVRJQ19JTUFHRSA9ICc6ZGlzcGxheV9zdGF0aWNfaW1hZ2UnLFxuICBESVNQTEFZX1RBQlMgPSAnZGlzcGxheV90YWJzJyxcbiAgRElTUExBWV9WSUVXX0NPVU5UID0gJzpkaXNwbGF5X2NvdW50JyxcbiAgSUdOT1JFX1NUSUNLWV9TRVNTSU9OID0gJzppZ25vcmVfc3RpY2t5X3Nlc3Npb24nLFxuICBJTkNSRU1FTlRfVklFV19DT1VOVCA9ICc6aW5jcmVtZW50X3ZpZXdfY291bnQnLFxuICBET0NNT0RFID0gJ2RvY21vZGUnLFxuICBET01BSU4gPSAnZG9tYWluJyxcbiAgRE9fV09SSyA9ICdkb193b3JrJyxcbiAgRFggPSAnZHgnLFxuICBEWSA9ICdkeScsXG4gIEVESVRfREFUQV9BTEVSVCA9ICc6ZWRpdERhdGFBbGVydCcsXG4gIEVNQkVEID0gJzplbWJlZCcsXG4gIEVNQkVEREVEID0gJ2VtYmVkZGVkJyxcbiAgRU5DUllQVEVEID0gJ2VuY3J5cHRlZCcsXG4gIEFQSV9FWFRFUk5BTF9WRVJTSU9OID0gJzphcGlFeHRlcm5hbFZlcnNpb24nLFxuICBBUElfSU5URVJOQUxfVkVSU0lPTiA9ICc6YXBpSW50ZXJuYWxWZXJzaW9uJyxcbiAgRVhDTFVERSA9ICdleGNsdWRlJyxcbiAgRVhQT1JUX0ZPUk1BVCA9ICc6ZXhwb3J0X2Zvcm1hdCcsXG4gIEZJRUxETkFNRSA9ICdmaWVsZG5hbWUnLFxuICBGSUVMRF9OQU1FID0gJ2ZpZWxkX25hbWUnLFxuICBGSUVMRF9TRVAgPSAnZmllbGRfc2VwJyxcbiAgRklMRSA9ICdmaWxlJyxcbiAgRklMVEVSX1RJTEVfU0laRSA9ICdmaWx0ZXJUaWxlU2l6ZScsXG4gIEZOID0gJ2ZuJyxcbiAgRk9DVVMgPSAnZm9jdXMnLFxuICBGT1JDRV9DQUNIRSA9ICdmb3JjZV9jYWNoZScsXG4gIEZPUk1BVCA9ICdmb3JtYXQnLFxuICBGT1JNQVRfREFUQV9WQUxVRV9MT0NBTExZID0gJ2Zvcm1hdERhdGFWYWx1ZUxvY2FsbHknLFxuICBGUk9NX1dHID0gJzpmcm9tX3dnJyxcbiAgR1JBUEhRTF9EQVRBQkFTRV9JRCA9ICc6Z3JhcGhRTERhdGFiYXNlSWQnLFxuICBHUkFQSFFMX1RBQkxFX0lEID0gJzpncmFwaFFMVGFibGVJZCcsXG4gIEdVSUQgPSAnOmd1aWQnLFxuICBIID0gJ2gnLFxuICBISURERU4gPSAnaGlkZGVuJyxcbiAgSElERV9DTE9TRV9CVVRUT04gPSAnOmhpZGVDbG9zZUJ1dHRvbicsXG4gIEhJREVfRURJVF9CVVRUT04gPSAnOmhpZGVFZGl0QnV0dG9uJyxcbiAgSElERV9FRElUX0lOX0RFU0tUT1BfQlVUVE9OID0gJzpoaWRlRWRpdEluRGVza3RvcEJ1dHRvbicsXG4gIEhJR0hfRFBJID0gJzpoaWdoZHBpJyxcbiAgSU1BR0VfU0laRV9MSU1JVCA9ICdpbWFnZVNpemVMaW1pdCcsXG4gIFRSQU5TUEFSRU5UX0xJTkVfTUFSS1NfTElNSVQgPSAndHJhbnNwYXJlbnRMaW5lTWFya0xpbWl0JyxcbiAgQ0xJRU5UX1JFTkRFUl9QSVhFTF9MSU1JVCA9ICdjbGllbnRSZW5kZXJQaXhlbExpbWl0JyxcbiAgSU4gPSAnaW4nLFxuICBJTlNUQU5DRV9JRCA9ICc6aWlkJyxcbiAgSVNfR1VFU1RfUkVESVJFQ1RfRlJPTV9WSVpQT1JUQUwgPSAnOmlzR3Vlc3RSZWRpcmVjdEZyb21WaXpwb3J0YWwnLFxuICBJU19NQVJLX0FOSU1BVElPTl9FTkFCTEVEID0gJ2lzTWFya0FuaW1hdGlvbkVuYWJsZWQnLFxuICBJU19WSVpQT1JUQUwgPSAnOmlzVml6UG9ydGFsJyxcbiAgSU5QVVRfID0gJ2lucHV0X3N0cmluZycsXG4gIEpTREVCVUcgPSAnOmpzZGVidWcnLFxuICBKU09OID0gJ2pzb24nLFxuICBKU09OX09OTFkgPSAnOmpzb25Pbmx5JyxcbiAgS0VFUEZJTEUgPSAna2VlcGZpbGUnLFxuICBLRVkgPSAna2V5JyxcbiAgTEFOR1VBR0UgPSAnbGFuZ3VhZ2UnLFxuICBMQU5HVUFHRV9SRVFVRVNURUQgPSAnOmxhbmd1YWdlJyxcbiAgTElOS1RBUkdFVCA9ICc6bGlua3RhcmdldCcsXG4gIExPQURfT1JERVJfSUQgPSAnOmxvYWRPcmRlcklEJywgLy8gdXNlZCBmb3IgUHVibGljXG4gIExPQURfTkVXRVNUX1JFVklTSU9OID0gJzpsb2FkTmV3ZXN0UmV2aXNpb24nLFxuICBMT0NBTF9QQVRIUyA9ICc6bG9jYWxQYXRocycsXG4gIExPQ0FMRSA9ICdsb2NhbGUnLFxuICBMT0NBVElPTl9JRCA9ICdsb2NhdGlvbmlkJyxcbiAgTE9DQVRJT05fVFlQRSA9ICdsb2NhdGlvbnR5cGUnLFxuICBXT1JLQk9PS19MT0NBTEUgPSAnd29ya2Jvb2tMb2NhbGUnLFxuICBNQVhST1dTID0gJ21heHJvd3MnLFxuICBNQVhfQUdFID0gJ21heEFnZScsXG4gIE1BWF9ST1dTID0gJ21heFJvd3MnLFxuICBNRVRIT0QgPSAnbWV0aG9kJyxcbiAgTU9CSUxFID0gJ21vYmlsZScsXG4gIE1PRElGSUVSID0gJ21vZGlmaWVyJyxcbiAgTkFNRSA9ICduYW1lJyxcbiAgTkFWX1RZUEUgPSAnbmF2VHlwZScsXG4gIE5BVl9TUkMgPSAnbmF2U3JjJyxcbiAgTk9BVFRBQ0hNRU5UID0gJ25vLWF0dGFjaG1lbnQnLFxuICBOT19PVkVSV1JJVEUgPSAnbm9fb3ZlcndyaXRlJyxcbiAgT1BFTl9BVVRIT1JJTkdfSU5fVE9QX1dJTkRPVyA9ICc6b3BlbkF1dGhvcmluZ0luVG9wV2luZG93JyxcbiAgT1BFTklEX0hEID0gJzpvcGVuaWRfaGQnLFxuICBPUEVOSURfTE9HSU5fSElOVCA9ICc6b3BlbmlkX2xvZ2luX2hpbnQnLFxuICBPQVVUSFJFUVVFU1QgPSAnb2F1dGhyZXF1ZXN0JyxcbiAgT0FVVEhfQ1JFREVOVElBTF9JRFMgPSAnb2F1dGhfY3JlZGVudGlhbF9pZHMnLFxuICBPRkZMSU5FX01PREUgPSAnOm9mZmxpbmVtb2RlJyxcbiAgT1JJR0lOID0gJzpvcmlnaW4nLFxuICBPVkVSTEFZID0gJzpvdmVybGF5JyxcbiAgUCA9ICdwJyxcbiAgUEFUSCA9ICdwYXRoJyxcbiAgUEFORV9SRVNPTFZFUl9YID0gJ3BhbmVSZXNvbHZlclgnLFxuICBQQU5FX1JFU09MVkVSX1kgPSAncGFuZVJlc29sdmVyWScsXG4gIFBBUkFNID0gJ3BhcmFtJyxcbiAgUEFSRU5UX0lEID0gJ3BhcmVudF9pZCcsXG4gIFBBU1NXT1JEID0gJ3Bhc3N3b3JkJyxcbiAgUEFUVEVSTiA9ICdwYXR0ZXJuJyxcbiAgUElYRUxfUkFUSU8gPSAnOnBpeGVscmF0aW8nLFxuICBQUkVGSVggPSAnOnByZWZpeCcsXG4gIFBSRVZJRVcgPSAnOnByZXZpZXcnLFxuICBQUklNQVJZX0NPTlRFTlRfVVJMID0gJ3ByaW1hcnlfY29udGVudF91cmwnLFxuICBQUk9KRUNUID0gJ3Byb2plY3QnLFxuICBQUk9UT0NPTCA9ICdwcm90b2NvbCcsXG4gIFBTRVVETyA9ICc6cHNldWRvJyxcbiAgUVVFUlkgPSAncXVlcnknLFxuICBSID0gJ3InLFxuICBSQU5HRV9UWVBFID0gJ3JhbmdlX3R5cGUnLFxuICBSRUNPUkRfU0VQID0gJ3JlY29yZF9zZXAnLFxuICBSRUNPUkRfQ0xJRU5UX1BFUkZPUk1BTkNFID0gJzpyZWNvcmRfY2xpZW50X3BlcmZvcm1hbmNlJyxcbiAgUkVDT1JEX1BFUkZPUk1BTkNFID0gJzpyZWNvcmRfcGVyZm9ybWFuY2UnLFxuICBSRUNPVkVSX09MRF9TRVNTSU9OX0lEID0gJzpyZWNvdmVyX29sZF9zZXNzaW9uX2lkJyxcbiAgUkVDT1ZFUl9TRVNTSU9OX1NUQVRFX1RJQ0tFVFMgPSAnOnJlY292ZXJfc2Vzc2lvbl9zdGF0ZV90aWNrZXRzJyxcbiAgUkVGUkVTSCA9ICc6cmVmcmVzaCcsXG4gIFJFRlJFU0hVTk1PRElGSUVEID0gJzpyZWZyZXNodW5tb2RpZmllZCcsXG4gIFJFR0lPTiA9ICdyZWdpb24nLFxuICBSRUxPQURfT05fQ1VTVE9NX1ZJRVdfU0FWRSA9ICc6cmVsb2FkT25DdXN0b21WaWV3U2F2ZScsXG4gIFJFTkRFUiA9ICc6cmVuZGVyJyxcbiAgUkVOREVSX01BUFNfQ0xJRU5UX1NJREUgPSAncmVuZGVyTWFwc0NsaWVudFNpZGUnLFxuICBSRVRSWSA9ICc6cmV0cnknLFxuICBSRVVTRSA9ICdyZXVzZScsXG4gIFJFVVNFX0ZPUkVWRVIgPSAncmV1c2VfZm9yZXZlcicsXG4gIFJFVkVSVCA9ICc6cmV2ZXJ0JyxcbiAgU0FWRV9EQl9QQVNTV09SRFMgPSAnc2F2ZV9kYl9wYXNzd29yZHMnLFxuICBTRUxFQ1RfWCA9ICdzZWxlY3RfeCcsXG4gIFNFTEVDVF9ZID0gJ3NlbGVjdF95JyxcbiAgU0VTU0lPTl9GRUFUVVJFX1BSRUZJWCA9ICc6ZmZfJyxcbiAgU0VTU0lPTl9GTEFHUyA9ICc6c2Vzc2lvbl9mZWF0dXJlX2ZsYWdzJyxcbiAgU0hBUkVfQlVUVE9OID0gJ3NoYXJlX2J1dHRvbicsXG4gIFNIRUVUX0lEID0gJ3NoZWV0X2lkJyxcbiAgU0hBUkVEID0gJ3NoYXJlZCcsXG4gIFNIT1dBTEwgPSAnc2hvd2FsbCcsXG4gIFNIT1dfQVBQX0JBTk5FUiA9ICc6c2hvd0FwcEJhbm5lcicsXG4gIFNIT1dfQVNLX0RBVEEgPSAnOnNob3dBc2tEYXRhJyxcbiAgU0hPV19QQVJBTVMgPSAnc2hvd1BhcmFtcycsXG4gIFNIT1dfU0hBUkVfT1BUSU9OUyA9ICc6c2hvd1NoYXJlT3B0aW9ucycsXG4gIFNJWkUgPSAnOnNpemUnLFxuICBTT1VSQ0UgPSAnc291cmNlJyxcbiAgU1RBVEUgPSAnc3RhdGUnLFxuICBTVElDS1lfU0VTU0lPTl9LRVkgPSAnc3RpY2t5U2Vzc2lvbktleScsXG4gIFNVQlNDUklQVElPTlMgPSAnOnN1YnNjcmlwdGlvbnMnLFxuICBTVU1NQVJZID0gJ3N1bW1hcnknLFxuICBTVVBQUkVTU19ERUZBVUxUX0VESVRfQkVIQVZJT1IgPSAnOnN1cHByZXNzRGVmYXVsdEVkaXRCZWhhdmlvcicsXG4gIFNZTkNfU0VTU0lPTiA9ICc6c3luY19zZXNzaW9uJyxcbiAgU1lOQ19TRVNTSU9OX1NUQVRFID0gJ3N5bmNfc2Vzc2lvbl9zdGF0ZScsXG4gIFRBQlMgPSAnOnRhYnMnLFxuICBUQVJHRVQgPSAndGFyZ2V0JyxcbiAgVEFSR0VUX1NJVEUgPSAndGFyZ2V0X3NpdGUnLFxuICBUT09MQkFSID0gJzp0b29sYmFyJyxcbiAgVE9PTFRJUCA9ICc6dG9vbHRpcCcsXG4gIFRTID0gJ3RzJyxcbiAgVU5ERVJMWUlOR19UQUJMRV9JRCA9ICd1bmRlcmx5aW5nX3RhYmxlX2lkJyxcbiAgVU5ERVJMWUlOR19UQUJMRV9DQVBUSU9OID0gJ3VuZGVybHlpbmdfdGFibGVfY2FwdGlvbicsXG4gIFVQREFURV9UWVBFID0gJ3VwZGF0ZV90eXBlJyxcbiAgVVNFX0dVRVNUID0gJzp1c2VHdWVzdCcsXG4gIFVTRV9JTkxJTkVfSU1BR0VTID0gJ3VzZV9pbmxpbmVfaW1hZ2VzJyxcbiAgVVNFUkFHRU5UID0gJ3VzZXJhZ2VudCcsXG4gIFVTRVJOQU1FID0gJ3VzZXJuYW1lJyxcbiAgVkFMVUUgPSAndmFsdWUnLFxuICBWRVJCT1NFX01PREUgPSAndmVyYm9zZU1vZGUnLFxuICBWSUVXX0lEID0gJ3ZpZXdzX2lkJyxcbiAgVklaX1NOQVBTSE9UX0lEID0gJ3Zpel9zbmFwc2hvdF9pZCcsXG4gIFZXID0gJzp2dycsXG4gIFcgPSAndycsXG4gIFdPUktTSEVFVF9QT1JUX1NJWkUgPSAnd29ya3NoZWV0UG9ydFNpemUnLFxuICBXQVRFUk1BUksgPSAnd2F0ZXJtYXJrJyxcbiAgV0FURVJNQVJLX01BUkdJTiA9ICc6d2F0ZXJtYXJrX21hcmdpbicsXG4gIFdCID0gJzp3YicsXG4gIFdISUNIID0gJ3doaWNoJyxcbiAgWCA9ICd4JyxcbiAgWSA9ICd5JyxcbiAgWklEID0gJ3ppZCcsXG4gIFpPTkVfSUQgPSAnem9uZV9pZCcsXG4gIEtFWUNIQUlOX1ZFUlNJT04gPSAna2V5Y2hhaW5fdmVyc2lvbicsXG4gIERBVEFTT1VSQ0VfSUQgPSAnZGF0YXNvdXJjZV9pZCcsXG4gIERBVEFTT1VSQ0VfTkFNRSA9ICdkYXRhc291cmNlX25hbWUnLFxuICBMRU5TX0lEID0gJ2xlbnNfaWQnLFxuICBXSURUSCA9ICd3aWR0aCcsXG4gIEhFSUdIVCA9ICdoZWlnaHQnLFxuXG4gIC8vIERlZmF1bHQgTGF5b3V0IHBhcmFtc1xuICBMQVlPVVRfVklFV1MgPSAndmlld3MnLFxuICBMQVlPVVRfTUVOVVMgPSAnbWVudXMnLFxuICBMQVlPVVRfR0VPTUVUUlkgPSAnZ2VvbWV0cnknLFxuICBMQVlPVVRfUEFHRVMgPSAncGFnZXMnLFxuICBMQVlPVVRfQ0FDSEVVUkwgPSAnY2FjaGV1cmwnLFxuICBMQVlPVVRfU0hFRVQgPSAnc2hlZXQnLFxuICBMQVlPVVRfREVQVEggPSAnZGVwdGgnLFxufVxuXG4vKipcbiAqIHBhcmFtZXRlcnMgdGhhdCBhcmUgb25seSByZWxldmFudCB3aGVuIHdvcmtpbmcgd2l0aCBUYWJsZWF1IFB1YmxpY1xuICogbWF5YmUgbm90IHJlYWxseSBuZWNlc3NyeSB0byBzcGxpdCB0aGVtIG91dFxuICovXG5lbnVtIFB1YmxpY1BhcmFtZXRlck5hbWVzIHtcbiAgU0hPV19WSVpfSE9NRSA9ICc6c2hvd1ZpekhvbWUnLFxuICAvLyBkaXNwbGF5IHZpZXcgY291bnRcbn1cblxuLyoqXG4gKiBNYXAgdGhlIHBhcmFtZXRlciBuYW1lcyBhcyB1c2VkIGluIHRoZSB1cmwgdG8gd2hhdCB3ZSBjYWxsIHRoZW0gcHVibGljbHkgaW4gdGhlIGVtYmVkZGluZyBsaWJyYXJ5LlxuICogVGhlIG9ubHkgcGFyYW1ldGVycyBsaXN0ZWQgaGVyZSBzaG91bGQgYmUgdGhlIG9uZXMgdGhhdCBnZXQgc2VudCB0byB2aXpxbFxuICogIC0gdGhpcyBzaG91bGQgbWF0Y2ggdGhlIGludGVyZmFjZSBhdCBleHRlcm5hbC1jb250cmFjdDpWaXpJbnRlcmZhY2VzOlZpelNldHRpbmdzXG4gKi9cbmV4cG9ydCBlbnVtIFZpek9wdGlvbk5hbWVzIHtcbiAgLy8gcHVibGljTmFtZSA9IGludGVybmFsU3RyaW5nVmFsdWVcbiAgU2l6ZSA9IFZxbFBhcmFtZXRlck5hbWVzLlNJWkUsXG4gIEVtYmVkID0gVnFsUGFyYW1ldGVyTmFtZXMuRU1CRUQsXG4gIEFwaUludGVybmFsVmVyc2lvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkFQSV9JTlRFUk5BTF9WRVJTSU9OLFxuICBBcGlFeHRlcm5hbFZlcnNpb24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5BUElfRVhURVJOQUxfVkVSU0lPTixcbiAgU2hvd1ZpekhvbWUgPSBQdWJsaWNQYXJhbWV0ZXJOYW1lcy5TSE9XX1ZJWl9IT01FLFxuICBKc2RlYnVnID0gVnFsUGFyYW1ldGVyTmFtZXMuSlNERUJVRyxcbiAgQm9vdHN0cmFwV2hlbk5vdGlmaWVkID0gVnFsUGFyYW1ldGVyTmFtZXMuQk9PVFNUUkFQX1dIRU5fTk9USUZJRUQsXG4gIE5hdlR5cGUgPSBWcWxQYXJhbWV0ZXJOYW1lcy5OQVZfVFlQRSxcbiAgTmF2U3JjID0gVnFsUGFyYW1ldGVyTmFtZXMuTkFWX1NSQyxcbiAgZGVidWcgPSBWcWxQYXJhbWV0ZXJOYW1lcy5KU0RFQlVHLFxuICBBcGlJRCA9IFZxbFBhcmFtZXRlck5hbWVzLkFQSV9JRCxcblxuICBkaXNhYmxlVXJsQWN0aW9uc1BvcHVwcyA9IFZxbFBhcmFtZXRlck5hbWVzLkRJU0FCTEVfVVJMX0FDVElPTlNfUE9QVVBTLFxuICBoaWRlVGFicyA9IFZxbFBhcmFtZXRlck5hbWVzLlRBQlMsXG4gIHRvb2xiYXIgPSBWcWxQYXJhbWV0ZXJOYW1lcy5UT09MQkFSLFxuICBkZXZpY2UgPSBWcWxQYXJhbWV0ZXJOYW1lcy5ERVZJQ0VfVFlQRSxcbiAgaW5zdGFuY2VJZFRvQ2xvbmUgPSBWcWxQYXJhbWV0ZXJOYW1lcy5JTlNUQU5DRV9JRCxcbiAgdG91Y2hPcHRpbWl6ZSA9IFZxbFBhcmFtZXRlck5hbWVzLk1PQklMRSxcbiAgaGlkZUVkaXRCdXR0b24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5ISURFX0VESVRfQlVUVE9OLFxuICBoaWRlRWRpdEluRGVza3RvcEJ1dHRvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkhJREVfRURJVF9JTl9ERVNLVE9QX0JVVFRPTixcbiAgc3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yID0gVnFsUGFyYW1ldGVyTmFtZXMuU1VQUFJFU1NfREVGQVVMVF9FRElUX0JFSEFWSU9SLFxuICBoaWRlQ2xvc2VCdXR0b24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5ISURFX0NMT1NFX0JVVFRPTixcbn1cbiIsImltcG9ydCAqIGFzIGd1aWQgZnJvbSAnZ3VpZCc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiwgTW9kZWwsIE5vdGlmaWNhdGlvbklkLCBWZXJiSWQsIFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25PcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlL0luaXRpYWxpemF0aW9uT3B0aW9ucyc7XG5pbXBvcnQgeyBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlIH0gZnJvbSAnLi9Dcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlJztcbmltcG9ydCB7XG4gIGlzQ29tbWFuZE1lc3NhZ2UsXG4gIGlzQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgaXNIYW5kc2hha2VNZXNzYWdlLFxuICBpc0luaXRNZXNzYWdlLFxuICBpc01lc3NhZ2UsXG4gIGlzTm90aWZpY2F0aW9uTWVzc2FnZSxcbn0gZnJvbSAnLi9NZXNzYWdlVHlwZUNoZWNrcyc7XG5pbXBvcnQge1xuICBDb21tYW5kTWVzc2FnZUhhbmRsZXIsXG4gIENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyLFxuICBIYW5kc2hha2VNZXNzYWdlSGFuZGxlcixcbiAgSW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyLFxuICBOb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcixcbn0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZUxpc3RlbmVyJztcbmltcG9ydCB7XG4gIENvbW1hbmRNZXNzYWdlLFxuICBDb21tYW5kUmVzcG9uc2VNZXNzYWdlLFxuICBIYW5kc2hha2VNZXNzYWdlLFxuICBJbml0aWFsaXplTWVzc2FnZSxcbiAgTWVzc2FnZSxcbiAgTWVzc2FnZVR5cGUsXG4gIE5vdGlmaWNhdGlvbk1lc3NhZ2UsXG59IGZyb20gJy4vaW50ZXJmYWNlL01lc3NhZ2VUeXBlcyc7XG5pbXBvcnQgeyBNZXNzZW5nZXIgfSBmcm9tICcuL2ludGVyZmFjZS9NZXNzZW5nZXInO1xuaW1wb3J0IHsgUHJlcGFyZWRNZXNzYWdlIH0gZnJvbSAnLi9pbnRlcmZhY2UvUHJlcGFyZWRNZXNzYWdlJztcblxuLyoqXG4gKiBUaGUgQ3Jvc3NGcmFtZU1lc3NlbmdlciBpcyB0aGUgcHJpbWFyeSBleHBvcnQgZnJvbSB0aGUgYXBpLW1lc3NhZ2luZyBtb2R1bGUuIEFuIGluc3RhbmNlIG9mXG4gKiB0aGlzIGNsYXNzIGNhbiBiZSBpbnN0YW50aWF0ZWQgb24gYm90aCBzaWRlcyBvZiBhIGZyYW1lIGJvdW5kYXJ5IHRvIGZhY2lsaXRhdGUgY29tbXVuaWNhdGlvblxuICogaW4gYm90aCBkaXJlY3Rpb25zIGJldHdlZW4gdGhlIGZyYW1lcy4gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGJvdGggdGhlIGRpc3BhdGNoZXIgYW5kIHRoZSBsaXN0ZW5lclxuICogcG9ydGlvbnMsIGJ1dCBkb2Vzbid0IHJlcXVpcmUgY2FsbGVycyB0byBjYXJlIGFib3V0IGJvdGguXG4gKi9cbmV4cG9ydCBjbGFzcyBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGltcGxlbWVudHMgTWVzc2VuZ2VyIHtcbiAgcHJpdmF0ZSB1bnJlZ2lzdGVyRnVuY3Rpb24/OiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIGluaXRpYWxpemVNZXNzYWdlSGFuZGxlcj86IEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcjtcbiAgcHJpdmF0ZSBjb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcj86IENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIGNvbW1hbmRNZXNzYWdlSGFuZGxlcj86IENvbW1hbmRNZXNzYWdlSGFuZGxlcjtcbiAgcHJpdmF0ZSBub3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcj86IE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIGhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyPzogSGFuZHNoYWtlTWVzc2FnZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ3Jvc3NGcmFtZU1lc3Nlbmdlci4gSWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRoZSBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGFzIGEgTWVzc2FnZUxpc3RlbmVyLFxuICAgKiBiZSBzdXJlIHRvIGNhbGwgU3RhcnRMaXN0ZW5pbmcgYW5kIHJlZ2lzdGVyIG1lc3NhZ2UgaGFuZGxlcnMuXG4gICAqIEBwYXJhbSB0aGlzV2luZG93IFRoZSB3aW5kb3cgb2JqZWN0IHdoaWNoIHRoZSBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGxpdmVzLiBBbiBvbk1lc3NhZ2UgbGlzdGVuZXIgd2lsbCBiZSBhZGRlZCBoZXJlLlxuICAgKiBAcGFyYW0gW290aGVyV2luZG93XSBPcHRpb25hbCBvdGhlcldpbmRvdyB3aGljaCBtZXNzYWdlcyB3aWxsIGJlIHBvc3RlZCB0by5cbiAgICogICAgICAgICAgICAgICAgICAgICAgSWYgZGVmaW5lZCwgaW5jb21pbmcgbWVzc2FnZXMgbXVzdCBvcmlnaW5hdGUgZnJvbSBvdGhlcldpbmRvdyB0byBiZSBwYXNzZWQgb25cbiAgICogQHBhcmFtIFtvdGhlcldpbmRvd09yaWdpbl0gVGhlIHRhcmdldCBvcmlnaW4gd2hpY2ggb3RoZXJXaW5kb3cgbXVzdCBoYXZlIGluIG9yZGVyIHRvIHJlY2VpdmUgZGlzcGF0Y2hlZCBtZXNzYWdlcy5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIGJlIHNlbnQgYXMgdGhlIHRhcmdldE9yaWdpbiBvZiBhIHBvc3RNZXNzYWdlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L3Bvc3RNZXNzYWdlKVxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgdGhpc1dpbmRvdzogV2luZG93LCBwcml2YXRlIG90aGVyV2luZG93PzogV2luZG93LCBwcml2YXRlIG90aGVyV2luZG93T3JpZ2luPzogc3RyaW5nKSB7XG4gICAgLy8gTWFrZSBzdXJlIHRvIGNhbGwgU3RhcnRMaXN0ZW5pbmdcbiAgfVxuXG4gIC8vLy8vIE1lc3NhZ2VMaXN0ZW5lciBJbXBsZW1lbnRhdGlvblxuXG4gIHB1YmxpYyBzdGFydExpc3RlbmluZygpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGFyZSBsaXN0ZW5pbmcsIGlmIG5vdCwgaG9vayB1cCBhIG1lc3NhZ2UgbGlzdGVuZXJcbiAgICBpZiAoIXRoaXMudW5yZWdpc3RlckZ1bmN0aW9uKSB7XG4gICAgICBjb25zdCBib3VuZEhhbmRsZXIgPSB0aGlzLm9uTWVzc2FnZVJlY2VpdmVkLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLnRoaXNXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGJvdW5kSGFuZGxlciwgdHJ1ZSk7XG4gICAgICB0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbiA9ICgpID0+IHRoaXMudGhpc1dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgYm91bmRIYW5kbGVyLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RvcExpc3RlbmluZygpOiB2b2lkIHtcbiAgICAvLyBTdG9wIGxpc3RlbmluZyBpZiB3ZSBoYXZlIHN0YXJ0ZWQgbGlzdGVuaW5nXG4gICAgaWYgKHRoaXMudW5yZWdpc3RlckZ1bmN0aW9uKSB7XG4gICAgICB0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbigpO1xuICAgICAgdGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogSW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsaXplTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuY29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldENvbW1hbmRNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogQ29tbWFuZE1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5jb21tYW5kTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBOb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMubm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBIYW5kc2hha2VNZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuaGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgLy8vLy8gTWVzc2FnZURpc3BhdGNoZXIgSW1wbGVtZW50YXRpb25cblxuICAvKipcbiAgICogQHBhcmFtIGFwaVZlcnNpb24gYXBpLWludGVybmFsLWNvbnRyYWN0LWpzIHZlcnNpb24gKGV4cG9ydGVkIGluIEpzQXBpSW50ZXJuYWxDb25udHJhY3QpXG4gICAqIEBwYXJhbSBjcm9zc0ZyYW1lVmVyc2lvbiBjcm9zc2ZyYW1lIG1lc3NhZ2luZyB2ZXJzaW9uIChleHBvcnRlZCBpbiBKc0FwaUludGVybmFsQ29ubnRyYWN0KVxuICAgKiBAcGFyYW0gb3B0aW9ucyBhZGRpdGlvbmFsIG9wdGlvbnMgdGhhdCBjYW4gYmUgcGFzc2VkIGF0IGluaXRpYWxpemF0aW9uIChpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVyc2lvbiBvZlxuICAgKiAgICAgICAgICAgICAgICBleHRlcm5hbCBiZWluZyB1c2VkIGZvciBleGFtcGxlKVxuICAgKi9cbiAgcHVibGljIHByZXBhcmVJbml0aWFsaXphdGlvbk1lc3NhZ2UoXG4gICAgYXBpVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBjcm9zc0ZyYW1lVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuICApOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IEluaXRpYWxpemVNZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLkluaXRpYWxpemUsXG4gICAgICBjcm9zc0ZyYW1lVmVyc2lvbjogY3Jvc3NGcmFtZVZlcnNpb24sXG4gICAgICBhcGlWZXJzaW9uOiBhcGlWZXJzaW9uLFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZUNvbW1hbmRNZXNzYWdlKHZlcmJJZDogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogQ29tbWFuZE1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuQ29tbWFuZCxcbiAgICAgIHZlcmJJZDogdmVyYklkLFxuICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZUNvbW1hbmRSZXNwb25zZU1lc3NhZ2UoY29tbWFuZEd1aWQ6IHN0cmluZywgZGF0YTogTW9kZWwgfCB1bmRlZmluZWQsIGVycm9yOiBNb2RlbCB8IHVuZGVmaW5lZCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2UsXG4gICAgICBjb21tYW5kR3VpZDogY29tbWFuZEd1aWQsXG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgIH07XG5cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIC8vIHN0cmluZ2lmeSBlcnJvciBvYmplY3QgdG8gcmVtb3ZlIHVuc2VyaWFsaXphYmxlIGZpZWxkcyBsaWtlIGZ1bmN0aW9ucyBhbmQgcHJldmVudCBzZXJpYWxpemF0aW9uIGVycm9yc1xuICAgICAgbWVzc2FnZS5lcnJvciA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVwYXJlTm90aWZpY2F0aW9uTWVzc2FnZShub3RpZmljYXRpb25JZDogTm90aWZpY2F0aW9uSWQsIGRhdGE6IE1vZGVsKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBOb3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLk5vdGlmaWNhdGlvbixcbiAgICAgIG5vdGlmaWNhdGlvbklkOiBub3RpZmljYXRpb25JZCxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIHByZXBhcmVBY2tNZXNzYWdlKCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogSGFuZHNoYWtlTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5BY2ssXG4gICAgICBwbGF0Zm9ybVZlcnNpb246IElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGEgcGVuZGluZyBtZXNzYWdlIGZvciBzZW5kaW5nIGFuZCByZXR1cm5zIHRoZSBwcmVwYXJlZCBtZXNzYWdlXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgVGhlIG1lc3NhZ2UgdG8gYmUgc2VudCB0byB0aGlzLm90aGVyV2luZG93XG4gICAqIEByZXR1cm5zIFRoZSBwcmVwYXJlZCBtZXNzYWdlXG4gICAqL1xuICBwcml2YXRlIHByZXBhcmVNZXNzYWdlKG1zZzogTWVzc2FnZSk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgaWYgKCF0aGlzLm90aGVyV2luZG93IHx8ICF0aGlzLm90aGVyV2luZG93T3JpZ2luKSB7XG4gICAgICB0aHJvdyAnT3RoZXIgd2luZG93IG5vdCBpbml0aWFsaXplZCwgY2Fubm90IGRpc3BhdGNoIG1lc3NhZ2VzJztcbiAgICB9XG5cbiAgICBjb25zdCBwcmVwYXJlZE1lc3NhZ2UgPSBuZXcgQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZShtc2csIHRoaXMub3RoZXJXaW5kb3csIHRoaXMub3RoZXJXaW5kb3dPcmlnaW4pO1xuICAgIHJldHVybiBwcmVwYXJlZE1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkLiBEb2VzIHNvbWUgdmFsaWRhdGlvbiBvZiB0aGUgbWVzc2FnZSwgYW5kIHRoZW5cbiAgICogY2FsbHMgYW4gYXBwcm9wcmlhdGUgbWVzc2FnZSBoYW5kbGVyIGlmIG9uZSBpcyBkZWZpbmVkXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCBUaGUgaW5jb21pbmcgTWVzc2FnZUV2ZW50XG4gICAqL1xuICBwcml2YXRlIG9uTWVzc2FnZVJlY2VpdmVkKGV2ZW50OiBNZXNzYWdlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGFuIG90aGVyV2luZG93IGRlZmluZWQsIG1ha2Ugc3VyZSB0aGUgbWVzc2FnZSBpcyBjb21pbmcgZnJvbSB0aGVyZVxuICAgIGlmICh0aGlzLm90aGVyV2luZG93ICYmIGV2ZW50LnNvdXJjZSAhPT0gdGhpcy5vdGhlcldpbmRvdykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERvIHNvbWUgdmFsaWRhdGlvbiBvbiBldmVudC5kYXRhIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgcmVjZWl2ZWQgYSByZWFsIG1lc3NhZ2VcbiAgICBpZiAoIWV2ZW50LmRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gZXZlbnQuZGF0YTtcbiAgICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHRoZSBkZWNsYXJlZCBtZXNzYWdlIHR5cGUsIHZhbGlkYXRlIHRoZSBtZXNzYWdlLCBhbmQgY2FsbCBhbiBhcHByb3ByaWF0ZSBoYW5kZXIgaWYgb25lIGV4aXN0c1xuICAgIHN3aXRjaCAobWVzc2FnZS5tc2dUeXBlKSB7XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLkluaXRpYWxpemU6IHtcbiAgICAgICAgaWYgKCFpc0luaXRNZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLmluaXRpYWxpemVNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2U6IHtcbiAgICAgICAgaWYgKCFpc0NvbW1hbmRSZXNwb25zZU1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMuY29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Db21tYW5kOiB7XG4gICAgICAgIGlmICghaXNDb21tYW5kTWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5jb21tYW5kTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbW1hbmRNZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uOiB7XG4gICAgICAgIGlmICghaXNOb3RpZmljYXRpb25NZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLm5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuSGFuZHNoYWtlOiB7XG4gICAgICAgIGlmICghaXNIYW5kc2hha2VNZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLmhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kc2hha2VNZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAvLyBKdXN0IGlnbm9yZSB0aGlzIHNpbmNlIHdlIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0aGUgbWVzc2FnZSB0eXBlXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldE90aGVyV2luZG93KG90aGVyV2luZG93OiBXaW5kb3cpOiB2b2lkIHtcbiAgICB0aGlzLm90aGVyV2luZG93ID0gb3RoZXJXaW5kb3c7XG4gIH1cblxuICBwdWJsaWMgc2V0T3RoZXJXaW5kb3dPcmlnaW4ob3JpZ2luOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm90aGVyV2luZG93T3JpZ2luID0gb3JpZ2luO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcbmltcG9ydCB7IFByZXBhcmVkTWVzc2FnZSB9IGZyb20gJy4vaW50ZXJmYWNlL1ByZXBhcmVkTWVzc2FnZSc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFByZXBhcmVkTWVzc2FnZSBpbnRlcmZhY2UgdXNlZCB0byBwb3N0IG1lc3NhZ2VzIGJldHdlZW5cbiAqIHR3byBmcmFtZXMgdXNpbmcgd2luZG93LnBvc3RNZXNzYWdlXG4gKi9cbmV4cG9ydCBjbGFzcyBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlIGltcGxlbWVudHMgUHJlcGFyZWRNZXNzYWdlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZS5cbiAgICogQHBhcmFtIF9tZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGJlIHNlbnRcbiAgICogQHBhcmFtIF90YXJnZXQgVGhlIHRhcmdldCB3aW5kb3cgd2hlcmUgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBzZW50XG4gICAqIEBwYXJhbSBfb3JpZ2luIFRoZSB0YXJnZXRPcmlnaW4gd2hlcmUgdGhpcyBtZXNzYWdlIGNhbiBiZSByZWNlaXZlZFxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX21lc3NhZ2U6IE1lc3NhZ2UsIHByaXZhdGUgX3RhcmdldDogV2luZG93LCBwcml2YXRlIF9vcmlnaW46IHN0cmluZykge31cblxuICBwdWJsaWMgZ2V0IG1lc3NhZ2VHdWlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2UubXNnR3VpZDtcbiAgfVxuXG4gIHB1YmxpYyBzZW5kKCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgdGhpcy5fdGFyZ2V0LnBvc3RNZXNzYWdlKHRoaXMuX21lc3NhZ2UsIHRoaXMuX29yaWdpbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIGd1aWQgZnJvbSAnZ3VpZCc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25JZCB9IGZyb20gJy4uL2NvbnRyYWN0L05vdGlmaWNhdGlvbnMnO1xuaW1wb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uL2ludGVyZmFjZS9WZXJzaW9uTnVtYmVyJztcbmltcG9ydCB7XG4gIENvbW1hbmRNZXNzYWdlLFxuICBDb21tYW5kUmVzcG9uc2VNZXNzYWdlLFxuICBIYW5kc2hha2VNZXNzYWdlLFxuICBJbml0aWFsaXplTWVzc2FnZSxcbiAgTWVzc2FnZSxcbiAgTWVzc2FnZVR5cGUsXG4gIE5vdGlmaWNhdGlvbk1lc3NhZ2UsXG59IGZyb20gJy4vaW50ZXJmYWNlL01lc3NhZ2VUeXBlcyc7XG5cbmNvbnN0IGV4cGVjdGVkRW1wdHlOb3RpZmljYXRpb25zID0gbmV3IFNldChbXG4gIE5vdGlmaWNhdGlvbklkLkVkaXRCdXR0b25DbGlja2VkLFxuICBOb3RpZmljYXRpb25JZC5FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZCxcbiAgTm90aWZpY2F0aW9uSWQuV29ya2Jvb2tQdWJsaXNoZWQsXG4gIE5vdGlmaWNhdGlvbklkLldvcmtib29rUmVhZHlUb0Nsb3NlLFxuICBOb3RpZmljYXRpb25JZC5SZWFkeVRvUmVjZWl2ZUF1dGhUb2tlbixcbl0pO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZSBuby1hbnkgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01lc3NhZ2UoZGF0YTogTWVzc2FnZSB8IGFueSk6IGRhdGEgaXMgTWVzc2FnZSB7XG4gIGlmICghZGF0YSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSBkYXRhIGFzIE1lc3NhZ2U7XG4gIGlmICghbWVzc2FnZSB8fCAhbWVzc2FnZS5tc2dHdWlkIHx8ICFtZXNzYWdlLm1zZ1R5cGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWd1aWQuaXNHdWlkKG1lc3NhZ2UubXNnR3VpZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIG1lc3NhZ2UubXNnVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtZXNzYWdlVHlwZXM6IEFycmF5PHN0cmluZz4gPSBbXG4gICAgTWVzc2FnZVR5cGUuQ29tbWFuZCxcbiAgICBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2UsXG4gICAgTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZSxcbiAgICBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb24sXG4gICAgTWVzc2FnZVR5cGUuSGFuZHNoYWtlLFxuICBdO1xuXG4gIGlmIChtZXNzYWdlVHlwZXMuaW5kZXhPZihtZXNzYWdlLm1zZ1R5cGUpIDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWZXJzaW9uKHZlcnNpb25OdW1iZXI6IFZlcnNpb25OdW1iZXIgfCBhbnkpOiB2ZXJzaW9uTnVtYmVyIGlzIFZlcnNpb25OdW1iZXIge1xuICBpZiAoIXZlcnNpb25OdW1iZXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB2ID0gdmVyc2lvbk51bWJlciBhcyBWZXJzaW9uTnVtYmVyO1xuXG4gIGlmICh0eXBlb2YgdiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIHYuZml4ICE9PSAnbnVtYmVyJyB8fCB0eXBlb2Ygdi5taW5vciAhPT0gJ251bWJlcicgfHwgdHlwZW9mIHYubWFqb3IgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0luaXRNZXNzYWdlKG1lc3NhZ2U6IEluaXRpYWxpemVNZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBJbml0aWFsaXplTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaW5pdE1lc3NhZ2UgPSBtZXNzYWdlIGFzIEluaXRpYWxpemVNZXNzYWdlO1xuICBpZiAoaW5pdE1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaW5pdE1lc3NhZ2UuYXBpVmVyc2lvbiB8fCAhaXNWZXJzaW9uKGluaXRNZXNzYWdlLmFwaVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFpbml0TWVzc2FnZS5jcm9zc0ZyYW1lVmVyc2lvbiB8fCAhaXNWZXJzaW9uKGluaXRNZXNzYWdlLmNyb3NzRnJhbWVWZXJzaW9uKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21tYW5kUmVzcG9uc2VNZXNzYWdlKG1lc3NhZ2U6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIENvbW1hbmRSZXNwb25zZU1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNyTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZTtcbiAgaWYgKGNyTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWd1aWQuaXNHdWlkKGNyTWVzc2FnZS5jb21tYW5kR3VpZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWNyTWVzc2FnZS5kYXRhICYmICFjck1lc3NhZ2UuZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tbWFuZE1lc3NhZ2UobWVzc2FnZTogQ29tbWFuZE1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIENvbW1hbmRNZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBjb21tYW5kTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ29tbWFuZE1lc3NhZ2U7XG4gIGlmIChjb21tYW5kTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Db21tYW5kKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFjb21tYW5kTWVzc2FnZS5wYXJhbWV0ZXJzIHx8IHR5cGVvZiBjb21tYW5kTWVzc2FnZS5wYXJhbWV0ZXJzICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghY29tbWFuZE1lc3NhZ2UudmVyYklkIHx8IHR5cGVvZiBjb21tYW5kTWVzc2FnZS52ZXJiSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05vdGlmaWNhdGlvbk1lc3NhZ2UobWVzc2FnZTogTm90aWZpY2F0aW9uTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgTm90aWZpY2F0aW9uTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZSA9IG1lc3NhZ2UgYXMgTm90aWZpY2F0aW9uTWVzc2FnZTtcbiAgaWYgKG5vdGlmaWNhdGlvbk1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFub3RpZmljYXRpb25NZXNzYWdlLmRhdGEgJiYgIWV4cGVjdGVkRW1wdHlOb3RpZmljYXRpb25zLmhhcyhub3RpZmljYXRpb25NZXNzYWdlLm5vdGlmaWNhdGlvbklkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCB8fCB0eXBlb2Ygbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSGFuZHNoYWtlTWVzc2FnZShtZXNzYWdlOiBIYW5kc2hha2VNZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBIYW5kc2hha2VNZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBoYW5kc2hha2VNZXNzYWdlID0gbWVzc2FnZSBhcyBIYW5kc2hha2VNZXNzYWdlO1xuICBpZiAoaGFuZHNoYWtlTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5IYW5kc2hha2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBNb2RlbCwgTm90aWZpY2F0aW9uSWQsIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvbk9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2UvSW5pdGlhbGl6YXRpb25PcHRpb25zJztcblxuLyoqXG4gKiBFbnVtIGRlZmluaW5nIHRoZSA0IGRpZmZlcmVudCB0eXBlcyBvZiBtZXNzYWdlcyB3ZSBoYXZlIGRlZmluZWRcbiAqL1xuZXhwb3J0IGVudW0gTWVzc2FnZVR5cGUge1xuICBJbml0aWFsaXplID0gJ2luaXRpYWxpemUnLFxuICBOb3RpZmljYXRpb24gPSAnbm90aWZpY2F0aW9uJyxcbiAgQ29tbWFuZCA9ICdjb21tYW5kJyxcbiAgQ29tbWFuZFJlc3BvbnNlID0gJ2NvbW1hbmQtcmVzcG9uc2UnLFxuICBIYW5kc2hha2UgPSAndi1oYW5kc2hha2UnLFxuICBBY2sgPSAndi1hY2snLFxufVxuXG4vKipcbiAqIFRoZSBNZXNzYWdlIGludGVyZmFjZSBpcyB0aGUgYmFzZSBpbnRlcmZhY2UgZm9yIGFsbCB0aGUgb3RoZXJcbiAqIG1lc3NhZ2UgdHlwZSBpbnRlcmZhY2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICAvKipcbiAgICogQSB1bmlxdWUgaWQgZm9yIHRoaXMgbWVzc2FnZVxuICAgKi9cbiAgbXNnR3VpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGlzIG1lc3NhZ2VcbiAgICovXG4gIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlO1xufVxuXG4vKipcbiAqIFRoZSBpbml0aWFsaXplIG1lc3NhZ2UgaXMgdGhlIGZpcnN0IG1lc3NhZ2Ugd2hpY2ggd2lsbCBiZSBzZW50XG4gKiBmcm9tIHRoZSBqYXZhc2NyaXB0IHRvIHNldCB1cCBjb21tdW5pY2F0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluaXRpYWxpemVNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgYXBpIHdoaWNoIHRoZSBzZW5kZXIgd2FudHMgdG8gdXNlXG4gICAqL1xuICBhcGlWZXJzaW9uOiBWZXJzaW9uTnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGlzIG1lc3NhZ2luZyBjb250cmFjdCB0byBiZSB1c2VkLiBGb3Igbm93LCB0aGVyZVxuICAgKiBzaG91bGQgb25seSBiZSBhIHNpbmdsZSB2ZXJzaW9uIGJ1dCBzZW5kaW5nIHRoaXMgYWxvbmcgc2hvdWxkIGhlbHBcbiAgICogaWYgd2UgbmVlZCB0byBhZGQgYSBuZXcgdmVyc2lvbiBpbiBhIGZ1dHVyZSByZWxlYXNlXG4gICAqL1xuICBjcm9zc0ZyYW1lVmVyc2lvbjogVmVyc2lvbk51bWJlcjtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBvcHRpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCBhdCB0aGUgdGltZSBvZiBpbml0aWFsaXphdGlvblxuICAgKi9cbiAgb3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucztcbn1cblxuLyoqXG4gKiBUaGlzIG1lc3NhZ2UgaXMgc2VudCB3aGVuIGEgbm90aWZpY2F0aW9uIG9jY3VycyBmcm9tIHRoZSBwcmVzbGF5ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb3RpZmljYXRpb25NZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgaWQgZm9yIHRoaXMgdHlwZSBvZiBub3RpZmljYXRpb25cbiAgICovXG4gIG5vdGlmaWNhdGlvbklkOiBOb3RpZmljYXRpb25JZDtcblxuICAvKipcbiAgICogVGhlIGRhdGEgd2hpY2ggY2FtZSBhbG9uZyB3aXRoIHRoZSBub3RpZmljYXRpb25cbiAgICovXG4gIGRhdGE6IE1vZGVsO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgY2FsbGluZyBhbiBpbnRlcm5hbCBjb250cmFjdCBjb21tYW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgY29tbWFuZCB3aGljaCBzaG91bGQgYmUgZXhlY3V0ZWRcbiAgICovXG4gIHZlcmJJZDogVmVyYklkO1xuXG4gIC8qKlxuICAgKiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGNvbW1hbmRcbiAgICovXG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzO1xufVxuXG4vKipcbiAqIFRoaXMgbWVzc2FnZSBpcyBzZW50IGluIHJlc3BvbnNlIHRvIGEgQ29tbWFuZE1lc3NhZ2Ugd2l0aCB0aGVcbiAqIHJlc3VsdCBvZiB0aGF0IGNvbW1hbmRzIGludm9jYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kUmVzcG9uc2VNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBHdWlkIG9mIHRoZSBDb21tYW5kTWVzc2FnZSB3aGljaCB0aGlzIGlzIGluIHJlc3BvbnNlIHRvXG4gICAqL1xuICBjb21tYW5kR3VpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmV0dXJuZWQgZnJvbSB0aGUgY29tbWFuZCwgdGhpcyB3aWxsIGJlIGRlZmluZWRcbiAgICogYW5kIGNvbnRhaW4gdGhlIGVycm9yXG4gICAqL1xuICBlcnJvcj86IE1vZGVsO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgY29tbWFuZCBleGVjdXRlZCBzdWNjZXNzZnVsbHksIHRoaXMgd2lsbCBjb250YWluIHRoZSBjb21tYW5kIHJlc3VsdFxuICAgKi9cbiAgZGF0YT86IE1vZGVsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRzaGFrZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIEludGVybmFsIEFQSSBjb250cmFjdCB2ZXJzaW9uXG4gICAqL1xuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXI7XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcblxuLyoqXG4gKiBUaGlzIHZlcnNpb24gY29udmVydGVyIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgYnV0IGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIHdlIGhhdmVcbiAqIGEgbWF0Y2hpbmcgcGxhdGZvcm0gYW5kIGludGVybmFsIHZlcnNpb24gbnVtYmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZUNhbGwodmVyYjogYW55LCBwYXJhbWV0ZXJzOiBhbnkpOiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcmI6IHZlcmIgYXMgVmVyYklkLFxuICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycyBhcyBFeGVjdXRlUGFyYW1ldGVycyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVSZXR1cm4oZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICBwdWJsaWMgZG93bmdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICByZXR1cm4gbm90aWZpY2F0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0ICogYXMgVHJhbnNsYXRpb25zIGZyb20gJy4vVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIGNvbnZlcnRlciBpcyBkZXNpZ25lZCB0byBhbGxvdyB0aGUgcGxhdGZvcm0gYW5kIGV4dGVybmFsIG1vZHVsZXNcbiAqIHRvIHNlZW1sZXNzbHkgY29tbXVuaWNhdGUgb3ZlciB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBpbnRlcm5hbCBBUEkuIFRoZSBvbmx5XG4gKiBtb2RlIGl0IHN1cHBvcnRzIGlzIGV4dGVybmFsJ3MgdmVyc2lvbiA8PSBwbGF0Zm9ybSdzIHZlcnNpb24uIFdoZW4gZXhlY3V0aW5nXG4gKiBjb21tYW5kcywgaXQgaXMgdXNlZCB0byB1cGdyYWRlIHRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbiB0byB3aGF0IHBsYXRmb3JtIGtub3dzIG9uIHRoZSB3YXkgaW5cbiAqIGFuZCBkb3duZ3JhZGUgdGhlIHJlcHJlc2VudGF0aW9ucyBvbiB0aGUgd2F5IG91dC4gU2ltaWxhcmx5IGZvciBub3RpZmljYXRpb25zLCBpdCBjYW5cbiAqIGRvd25ncmFkZSB0aG9zZSBvbiB0aGUgd2F5IGZyb20gcGxhdGZvcm0gdG8gZXh0ZXJuYWwuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXJcbiAgICpcbiAgICogQHBhcmFtIF9leHRlcm5hbFZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IGFwaS1leHRlcm5hbC1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3BsYXRmb3JtVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdGhlIGFwaS1wbGF0Zm9ybS1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3VwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB0aGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gd2hlbiB1cGdyYWRpbmcgY21kIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiBkb3duZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gYWZ0ZXIgYSBjbWRcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIGRvd25ncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBvbiBhIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRGF0YShcbiAgICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHVwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPixcbiAgICBkb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4sXG4gICAgZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPixcbiAgKTogU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIHtcbiAgICByZXR1cm4gbmV3IHRoaXMoXG4gICAgICBleHRlcm5hbFZlcnNpb24ubWFqb3IsXG4gICAgICBwbGF0Zm9ybVZlcnNpb24ubWFqb3IsXG4gICAgICB1cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyxcbiAgICAgIGRvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMsXG4gICAgICBkb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXJcbiAgICpcbiAgICogQHBhcmFtIF9leHRlcm5hbE1ham9yVmVyc2lvbiBUaGUgbWFqb3IgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgYXBpLWV4dGVybmFsLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfcGxhdGZvcm1NYWpvclZlcnNpb24gVGhlIG1ham9yIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHRoZSBhcGktcGxhdGZvcm0tanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF91cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdGhlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIHdoZW4gdXBncmFkaW5nIGNtZCBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBfZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgZG93bmdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGFmdGVyIGEgY21kXG4gICAqIEBwYXJhbSBfZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiBkb3duZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gb24gYSBub3RpZmljYXRpb25cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9leHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyLFxuICAgIHByaXZhdGUgX3BsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+LFxuICAgIHByaXZhdGUgX2Rvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgICBwcml2YXRlIF9kb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+LFxuICApIHtcbiAgICBpZiAodGhpcy5fZXh0ZXJuYWxNYWpvclZlcnNpb24gPiB0aGlzLl9wbGF0Zm9ybU1ham9yVmVyc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCBiZXR3ZWVuIGV4dGVybmFsIHZlcnNpb24gJHt0aGlzLl9leHRlcm5hbE1ham9yVmVyc2lvbn0gYW5kICR7dGhpcy5fcGxhdGZvcm1NYWpvclZlcnNpb259YCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiOiBhbnksIHBhcmFtZXRlcnM6IGFueSk6IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyB9IHtcbiAgICAvLyBQZXJmb3JtIHRoZSB1cGdyYWRlIG9mIHRoZSB2ZXJiIGFuZCBwYXJhbWV0ZXJzIHRvIHRoZSBsZXZlbCB0aGF0IHBsYXRmb3JtIGlzIHVzaW5nXG4gICAgbGV0IHVwZ3JhZGVkID0geyB2ZXJiOiB2ZXJiLCBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIH07XG4gICAgZm9yIChjb25zdCB1cGdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMpIHtcbiAgICAgIHVwZ3JhZGVkID0gdXBncmFkZVRyYW5zbGF0aW9uKHVwZ3JhZGVkLnZlcmIsIHVwZ3JhZGVkLnBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVFeGVjdXRlUmV0dXJuKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgICAvLyBEb3duZ3JhZGUgdGhlIHJlc3BvbnNlIHRvIHdoYXQgdGhlIGV4dGVybmFsIG1vZHVsZSBpcyBleHBlY3RpbmdcbiAgICBsZXQgZG93bmdyYWRlZCA9IGV4ZWN1dGVSZXNwb25zZTtcbiAgICBmb3IgKGNvbnN0IGRvd25ncmFkZVRyYW5zbGF0aW9uIG9mIHRoaXMuX2Rvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMpIHtcbiAgICAgIGRvd25ncmFkZWQgPSBkb3duZ3JhZGVUcmFuc2xhdGlvbihkb3duZ3JhZGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG93bmdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAgIC8vIERvd25ncmFkZSB0aGUgbm90aWZpY2F0aW9uIHRvIHdoYXQgdGhlIGV4dGVybmFsIG1vZHVsZSBpcyBleHBlY3RpbmdcbiAgICBsZXQgZG93bmdyYWRlZCA9IG5vdGlmaWNhdGlvbjtcbiAgICBmb3IgKGNvbnN0IGRvd25ncmFkZVRyYW5zbGF0aW9uIG9mIHRoaXMuX2Rvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucykge1xuICAgICAgZG93bmdyYWRlZCA9IGRvd25ncmFkZVRyYW5zbGF0aW9uKGRvd25ncmFkZWQpO1xuICAgIH1cblxuICAgIHJldHVybiBkb3duZ3JhZGVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9JbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL1N0YWNraW5nVmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnMgZnJvbSAnLi9WZXJzaW9uVHJhbnNsYXRpb25zJztcbmltcG9ydCB7XG4gIERvd25ncmFkZUV4dGVuc2lvbkVudmlyb25tZW50Q29udGV4dCxcbiAgRG93bmdyYWRlRmxpcGJvYXJkWm9uZUlELFxuICBEb3duZ3JhZGVXb3Jrc2hlZXRGb21hdHRpbmcxNzUsXG4gIERvd25ncmFkZVdvcmtzaGVldEZvbWF0dGluZ05vdGlmaWNhdGlvbjE3NSxcbiAgRG93bmdyYWRlV29ya3NoZWV0TmFtZXMsXG59IGZyb20gJy4vVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5cbi8qKlxuICogQHJldHVybnMgdHJ1ZSBpZiBsaHMgPCByaHMgKGlnbm9yaW5nIGZpeCBudW1iZXIpXG4gKiBAcGFyYW0gbGhzXG4gKiBAcGFyYW0gcmhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBWZXJzaW9uTGVzc1RoYW4obGhzOiBWZXJzaW9uTnVtYmVyLCByaHM6IFZlcnNpb25OdW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKGxocy5tYWpvciA+IHJocy5tYWpvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobGhzLm1ham9yIDwgcmhzLm1ham9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGxocy5taW5vciA8IHJocy5taW5vcjtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB0cnVlIGlmIGxocyA9PSByaHMgKGlnbm9yaW5nIGZpeCBudW1iZXIpXG4gKiBAcGFyYW0gbGhzXG4gKiBAcGFyYW0gcmhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBWZXJzaW9uRXF1YWxUbyhsaHM6IFZlcnNpb25OdW1iZXIsIHJoczogVmVyc2lvbk51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gbGhzLm1ham9yID09PSByaHMubWFqb3IgJiYgbGhzLm1pbm9yID09PSByaHMubWlub3I7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFqb3JNaW5vclRyYW5zbGF0b3JzPFQ+IHtcbiAgW21ham9yOiBudW1iZXJdOiB7IFttaW5vcjogbnVtYmVyXTogQXJyYXk8VD4gfTtcbn1cblxuLy8gQSBtYXBwaW5nIGZyb20gYW4gb2xkZXIgY2xpZW50IHZlcnNpb24gb2YgaW50ZXJuYWwtY29udHJhY3QgdG8gdGhlIGN1cnJlbnQgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGlzIGNvbnRyYWN0LlxuLy8gRWFjaCB2ZXJzaW9uIGJ1bXAgY2FuIGhhdmUgYW4gYXJyYXkgb2YgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gaW4gb3JkZXIuIE5vdGljZSB0aGF0IHRoaXMgaXNcbi8vIGRpZmZlcmVudCB0aGFuIHRoZSBtYWpvciB1cGdyYWRlcy9kb3duZ3JhZGVzIGFib3ZlIGJlY2F1c2UgaXQgaGFuZGxlcyBib3RoIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIGNoYW5nZXMuXG4vLyBBbHNvIHBsZWFzZSBub3RlOiBkb3duZ3JhZGVFeGVjdXRlQ2FsbCBpcyBoYW5kbGVkIG9uIHRoZSBjbGllbnQvZXh0ZXJuYWwgc2lkZSByYXRoZXIgdGhhbiBwbGF0Zm9ybSBzaWRlLlxuLy8gV2hlbiB1cGRhdGluZyB0aGUgbWFqb3Igb3IgbWlub3IgdmVyc2lvbiBvZiBvdXIgaW50ZXJuYWwtY29udHJhY3QsIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHRoZXNlIGRhdGEgc3RydWN0dXJlcy5cbi8vICogSWYgdGhlcmUgYXJlIHRyYW5zbGF0aW9ucyB0byBhZGQsIGFkZCB0aGVtIHRvIHRoZSB2ZXJzaW9uIHRvIFwidXBncmFkZSBmcm9tXCIgb3IgXCJkb3duZ3JhZGUgdG9cIi5cbmV4cG9ydCBjb25zdCBFeGVjdXRlTWlub3JVcGdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vckRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4gPSB7XG4gIDE6IHtcbiAgICA1OiBbRG93bmdyYWRlV29ya3NoZWV0TmFtZXNdLFxuICAgIDk6IFtdLFxuICAgIDE3NTogW0Rvd25ncmFkZVdvcmtzaGVldEZvbWF0dGluZzE3NV0sXG4gICAgMTgyOiBbRG93bmdyYWRlRXh0ZW5zaW9uRW52aXJvbm1lbnRDb250ZXh0XSxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBOb3RpZmljYXRpb25NaW5vckRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLFxuICAgIDEwOiBbRG93bmdyYWRlRmxpcGJvYXJkWm9uZUlEXSxcbiAgICAxNzU6IFtEb3duZ3JhZGVXb3Jrc2hlZXRGb21hdHRpbmdOb3RpZmljYXRpb24xNzVdLFxuICB9LFxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHdoaWNoIGhhcyB0aGUgYWJpbGl0eSB0byB1cGdyYWRlIGFuZCBkb3duZ3JhZGUgdGhlIGNvbnRyYWN0XG4gKiBiZXR3ZWVuIHRoZSB0d28gdmVyc2lvbnMsIHdoaWNoIGFyZSBzcGVjaWZpZWQuIElmIGV4dGVybmFsTWFqb3JWZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAqIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGJlY2F1c2Ugd2Ugd29uJ3Qga25vdyBob3cgdG8gZG8gdGhvc2UgY29udmVyc2lvbnMuXG4gKiBUaGlzIGNvbnZlcnRlciBjYW4gaGFuZGxlIGJvdGggbWFqb3IgYW5kIG1pbm9yIHVwZGF0ZXMgd2hlbiB0aGUgcGxhdGZvcm0gdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gZXh0ZXJuYWwgdmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gZXh0ZXJuYWxWZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIHVzaW5nXG4gKiBAcGFyYW0gcGxhdGZvcm1WZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVZlcnNpb25Db252ZXJ0ZXIoZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLCBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIpOiBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHJldHVybiBDcmVhdGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgRXhlY3V0ZU1pbm9yVXBncmFkZXMsXG4gICAgRXhlY3V0ZU1pbm9yRG93bmdyYWRlcyxcbiAgICBOb3RpZmljYXRpb25NaW5vckRvd25ncmFkZXMsXG4gICk7XG59XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgQ3JlYXRlVmVyc2lvbkNvbnZlcnRlci4gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgdXBncmFkZSwgZG93bmdyYWRlLCBhbmRcbiAqIG5vdGlmaWNhdGlvbiBhcnJheXMgc28gdGhhdCBhbGwgdGhlIGxvZ2ljIGNhbiBiZSB0ZXN0ZWQuXG4gKlxuICogQHBhcmFtIGV4dGVybmFsVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIHBsYXRmb3JtIGlzIHVzaW5nXG4gKiBAcGFyYW0gdXBncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciB1cGdyYWRlc1xuICogQHBhcmFtIGRvd25ncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciBkb3duZ3JhZGVzXG4gKiBAcGFyYW0gbm90aWZpY2F0aW9uRG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIG5vdGlmaWNhdGlvbiBkb3duZ3JhZGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgdXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPixcbiAgZG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgbm90aWZpY2F0aW9uRG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+LFxuKTogSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICBjb25zdCBleHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyID0gZXh0ZXJuYWxWZXJzaW9uLm1ham9yO1xuICBjb25zdCBleHRlcm5hbE1pbm9yVmVyc2lvbjogbnVtYmVyID0gZXh0ZXJuYWxWZXJzaW9uLm1pbm9yO1xuICBjb25zdCBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyID0gcGxhdGZvcm1WZXJzaW9uLm1ham9yO1xuXG4gIGlmIChleHRlcm5hbE1ham9yVmVyc2lvbiA+IHBsYXRmb3JtTWFqb3JWZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHRlcm5hbCB2ZXJzaW9uIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHBsYXRmb3JtIHZlcnNpb24uXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb249JHtleHRlcm5hbE1ham9yVmVyc2lvbn0gcGxhdGZvcm1NYWpvclZlcnNpb249JHtwbGF0Zm9ybU1ham9yVmVyc2lvbn1gKTtcbiAgfVxuXG4gIC8vIElmIHdlIGFyZSB1c2luZyB0aGUgZXhhY3Qgc2FtZSB2ZXJzaW9ucyAobWFqb3IubWlub3IpLCBqdXN0IHVzZSB0aGUgaWRlbnRpdHkgY29udmVydGVyXG4gIGlmIChWZXJzaW9uRXF1YWxUbyhleHRlcm5hbFZlcnNpb24sIHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcigpO1xuICB9XG5cbiAgLy8gV2FsayB0aGUgc3BhbiBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyB3ZSBoYXZlIGhlcmUgYW5kIGNvbGxlY3QgdGhlIHVwZ3JhZGUgYW5kIGRvd25ncmFkZXMgbmVjZXNzYXJ5XG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVVcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4gPSBHZXROZWVkZWRUcmFuc2xhdGlvbnMoXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgZXh0ZXJuYWxNaW5vclZlcnNpb24sXG4gICAgdXBncmFkZXMsXG4gICk7XG5cbiAgY29uc3QgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPiA9IEdldE5lZWRlZFRyYW5zbGF0aW9ucyhcbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBleHRlcm5hbE1pbm9yVmVyc2lvbixcbiAgICBkb3duZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+ID0gR2V0TmVlZGVkVHJhbnNsYXRpb25zKFxuICAgIGV4dGVybmFsTWFqb3JWZXJzaW9uLFxuICAgIHBsYXRmb3JtTWFqb3JWZXJzaW9uLFxuICAgIGV4dGVybmFsTWlub3JWZXJzaW9uLFxuICAgIG5vdGlmaWNhdGlvbkRvd25ncmFkZXMsXG4gICk7XG5cbiAgLy8gV2Ugd2FudCB0byBhcHBseSB0aGUgZG93bmdyYWRlcyBpbiByZXZlcnNlIG9yZGVyIGluIGNhc2Ugb2YgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlbVxuICBuZWVkZWRFeGVjdXRlRG93bmdyYWRlcy5yZXZlcnNlKCk7XG4gIG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXMucmV2ZXJzZSgpO1xuXG4gIHJldHVybiBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIuZnJvbURhdGEoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBuZWVkZWRFeGVjdXRlVXBncmFkZXMsXG4gICAgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXMsXG4gICAgbmVlZGVkTm90aWZpY2F0aW9uRG93bmdyYWRlcyxcbiAgKTtcbn1cblxuZnVuY3Rpb24gR2V0TmVlZGVkVHJhbnNsYXRpb25zPFQ+KFxuICBleHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBleHRlcm5hbE1pbm9yVmVyc2lvbjogbnVtYmVyLFxuICBtYWpvck1pbm9yVHJhbnNsYXRvcnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUPixcbik6IEFycmF5PFQ+IHtcbiAgY29uc3QgbmVlZGVkVHJhbnNsYXRpb25zOiBBcnJheTxUPiA9IFtdO1xuXG4gIGZvciAobGV0IG1ham9yID0gZXh0ZXJuYWxNYWpvclZlcnNpb247IG1ham9yIDw9IHBsYXRmb3JtTWFqb3JWZXJzaW9uOyBtYWpvcisrKSB7XG4gICAgaWYgKG1ham9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9ycykge1xuICAgICAgY29uc3Qgc3RhcnQgPSBtYWpvciA9PT0gZXh0ZXJuYWxNYWpvclZlcnNpb24gPyBleHRlcm5hbE1pbm9yVmVyc2lvbiA6IDA7XG4gICAgICBjb25zdCBtYXhpbXVtTWlub3JWZXJzaW9uID0gR2V0TWF4aW11bU1pbm9ySW5kZXgoT2JqZWN0LmtleXMobWFqb3JNaW5vclRyYW5zbGF0b3JzW21ham9yXSkpO1xuICAgICAgZm9yIChsZXQgbWlub3IgPSBzdGFydDsgbWlub3IgPD0gbWF4aW11bU1pbm9yVmVyc2lvbjsgbWlub3IrKykge1xuICAgICAgICBpZiAobWlub3IgaW4gbWFqb3JNaW5vclRyYW5zbGF0b3JzW21ham9yXSkge1xuICAgICAgICAgIG5lZWRlZFRyYW5zbGF0aW9ucy5wdXNoKC4uLm1ham9yTWlub3JUcmFuc2xhdG9yc1ttYWpvcl1bbWlub3JdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkZWRUcmFuc2xhdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBHZXRNYXhpbXVtTWlub3JJbmRleChtaW5vclZlcnNpb25zOiBBcnJheTxzdHJpbmc+KTogbnVtYmVyIHtcbiAgcmV0dXJuIG1pbm9yVmVyc2lvbnMubWFwKChhKSA9PiBOdW1iZXIoYSkpLnJlZHVjZSgoYSwgYikgPT4gKGEgPiBiID8gYSA6IGIpKTtcbn1cbiIsImltcG9ydCB7XG4gIENsYXNzTmFtZUtleSxcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4ZWN1dGVSZXNwb25zZSxcbiAgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbyxcbiAgRXh0ZW5zaW9uQ29udGV4dCxcbiAgTm90aWZpY2F0aW9uLFxuICBWZXJiSWQsXG59IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBWaXN1YWxJZCwgV29ya2Jvb2tGb3JtYXR0aW5nIH0gZnJvbSAnLi4vY29udHJhY3QvTW9kZWxzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnLi4vY29udHJhY3QvTm90aWZpY2F0aW9ucyc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIG9sZCB2ZXJzIGFuZCBwYXJhbWV0ZXJzIGZyb20gdGhlIGV4dGVybmFsIGJlZm9yZSB3ZSBzZW5kIGl0IHRvIHBsYXRmb3JtICovXG5leHBvcnQgdHlwZSBVcGdyYWRlRXhlY3V0ZUNhbGwgPSAodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycykgPT4geyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH07XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmVkIGEgcmVzcG9uc2UgYmFjayBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbmV4cG9ydCB0eXBlIERvd25ncmFkZUV4ZWN1dGVSZXR1cm4gPSAoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+IEV4ZWN1dGVSZXNwb25zZTtcblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbmV4cG9ydCB0eXBlIERvd25ncmFkZU5vdGlmaWNhdGlvbiA9IChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikgPT4gTm90aWZpY2F0aW9uO1xuXG4vLyBUaGlzIGlzIHdoZXJlIHdlIHdpbGwgc3RhcnQgdG8gZGVmaW5lIHNvbWUgb2YgdGhlc2UgdHJhbnNsYXRpb25zLlxuLy8gV2hlbiBtb2RpZnlpbmcgZXhpc3RpbmcgbW9kZWxzLCBhZGQgdGhlIHJlcXVpc2l0ZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBoZXJlLCB0aGVuIHVzZSB0aGVtXG4vLyBpbiB0aGUgVmVyc2lvbkNvbnZlcnRlckZhY3RvcnkgaW1wbGVtZW50YXRpb24uIEltcG9ydCBvbGQgdmVyc2lvbnMgYXMgeW91IHdvdWxkIGFueSBvdGhlciBtb2R1bGVcblxuLy8gMCA8LT4gVHJhbnNsYXRpb25zXG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGltcG9ydCBmcm9tIHRoZSBWMCBkZWZpbml0aW9uIG9mIHRoZSBBUElcbi8vIGltcG9ydCAqIGFzIFYwIGZyb20gJ0B0YWJsZWF1LWFwaS1pbnRlcm5hbC1jb250cmFjdC1qc192MCc7XG5cbi8vIDEgPC0+IDIgVHJhbnNsYXRpb25zXG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGltcG9ydCBmcm9tIHRoZSBWMSBkZWZpbml0aW9uIG9mIHRoZSBBUElcbi8vIGltcG9ydCAqIGFzIFYxIGZyb20gJ0B0YWJsZWF1LWFwaS1pbnRlcm5hbC1jb250cmFjdC1qc192MSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVXb3Jrc2hlZXROYW1lcyhleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gIC8vIEZpeCB0aGUgZGFzaGJvYXJkIGZyaWVuZGx5IG5hbWUgaXNzdWUuIFRoZSBzdHJ1Y3R1cmVzIGFyZSBjb21wYXRpYmxlLFxuICAvLyBzbyB3ZSBzdGlsbCByZXR1cm4gdGhlIG9yaWdpbmFsIHJlcGx5LCBidXQgd2UgY29weSB0aGUgU2hlZXRJbmZvLm5hbWVcbiAgLy8gaW50byB0aGUgRGFzaGJvYXJkWm9uZS5uYW1lLCB3aGVyZSB2MSB3YW50cyB0byBmaW5kIGl0LlxuXG4gIGNvbnN0IGJvb3RzdHJhcEluZm8gPSBleGVjdXRlUmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkJvb3RzdHJhcEluZm87XG4gIGlmIChib290c3RyYXBJbmZvLmV4dGVuc2lvbkRhc2hib2FyZEluZm8gIT09IHVuZGVmaW5lZCkge1xuICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRGFzaGJvYXJkSW5mby56b25lcy5mb3JFYWNoKCh6b25lKSA9PiB7XG4gICAgICBpZiAoem9uZS5zaGVldEluZm8pIHtcbiAgICAgICAgem9uZS5uYW1lID0gem9uZS5zaGVldEluZm8ubmFtZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVGbGlwYm9hcmRab25lSUQobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAvLyBGaXggdGhlIEZsaXBib2FyZFpvbmVJZCBpc3N1ZS4gT2xkZXIgZXh0ZXJuYWwgdmVyc2lvbnMgc3RpbGwgY2hlY2sgZm9yIGZsaXBib2FyZFpvbmVJRHMuXG4gIC8vIFdoZW4gcnVubmluZyBhZ2FpbnN0IGEgbmV3ZXIgc2VydmVyLCBpZiBmbGlwYm9hcmRab25lSWQgaXMgYWJzZW50LCBzZXQgaXQgdG8gZGVmYXVsdCgwKS5cblxuICBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbklkID09PSBOb3RpZmljYXRpb25JZC5TZWxlY3RlZE1hcmtzQ2hhbmdlZCkge1xuICAgIGNvbnN0IHZpc3VhbE1vZGVsID0gbm90aWZpY2F0aW9uLmRhdGEgYXMgVmlzdWFsSWQ7XG4gICAgaWYgKHZpc3VhbE1vZGVsLmZsaXBib2FyZFpvbmVJRCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2aXN1YWxNb2RlbC5mbGlwYm9hcmRab25lSUQgPSAwO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub3RpZmljYXRpb247XG59XG5cbi8vIEZpbHRlciBvdXQgZm9ybWF0dGluZyBzaGVldHMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSBjbGFzc05hbWVzIGxpc3RcbmZ1bmN0aW9uIERvd25ncmFkZVdvcmtzaGVldEZvcm1hdHRpbmcoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIGNsYXNzTmFtZXM6IENsYXNzTmFtZUtleVtdKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgY29uc3QgYm9vdHN0cmFwSW5mbyA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbztcblxuICBpZiAoYm9vdHN0cmFwSW5mbz8uZXh0ZW5zaW9uV29ya3NoZWV0SW5mbz8uZm9ybWF0dGluZylcbiAgICBib290c3RyYXBJbmZvLmV4dGVuc2lvbldvcmtzaGVldEluZm8uZm9ybWF0dGluZy5mb3JtYXR0aW5nU2hlZXRzID1cbiAgICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uV29ya3NoZWV0SW5mby5mb3JtYXR0aW5nLmZvcm1hdHRpbmdTaGVldHMuZmlsdGVyKCh4KSA9PiAhY2xhc3NOYW1lcy5pbmNsdWRlcyh4LmNsYXNzTmFtZUtleSkpO1xuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG4vLyBGaWx0ZXIgb3V0IGZvcm1hdHRpbmcgc2hlZXRzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgY2xhc3NOYW1lcyBsaXN0XG4vLyBGaWx0ZXIgb3V0IGZvcm1hdHRpbmcgc2hlZXRzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgY2xhc3NOYW1lcyBsaXN0XG5mdW5jdGlvbiBEb3duZ3JhZGVXb3Jrc2hlZXRGb3JtYXR0aW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uLCBjbGFzc05hbWVzOiBDbGFzc05hbWVLZXlbXSk6IE5vdGlmaWNhdGlvbiB7XG4gIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWQgPT09IE5vdGlmaWNhdGlvbklkLldvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkKSB7XG4gICAgY29uc3QgZm9ybWF0dGluZyA9IG5vdGlmaWNhdGlvbi5kYXRhIGFzIFdvcmtib29rRm9ybWF0dGluZztcbiAgICBub3RpZmljYXRpb24uZGF0YSA9IGZvcm1hdHRpbmcuZm9ybWF0dGluZ1NoZWV0cy5maWx0ZXIoKHgpID0+ICFjbGFzc05hbWVzLmluY2x1ZGVzKHguY2xhc3NOYW1lS2V5KSk7XG4gIH1cblxuICByZXR1cm4gbm90aWZpY2F0aW9uO1xufVxuXG4vLyBXZSBhZGRlZCBuZXcgZW51bSB2YWx1ZXMgZm9yIENsYXNzTmFtZUtleXMgZW51bSBpbiAxNzYuIE5lZWQgdG8gZmlsdGVyIHRoZW0gb3V0IGlmIHRoZSBjbGllbnQgdmVyc2lvbiBpcyA8MTc2XG5jb25zdCBDbGFzc05hbWVLZXlzVG9GaWx0ZXIxNzUgPSBbQ2xhc3NOYW1lS2V5LlJvd0RpdmlkZXJzLCBDbGFzc05hbWVLZXkuQ29sdW1uRGl2aWRlcnMsIENsYXNzTmFtZUtleS5QYW5lXTtcblxuZXhwb3J0IGNvbnN0IERvd25ncmFkZVdvcmtzaGVldEZvbWF0dGluZzE3NSA9IChyZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKSA9PlxuICBEb3duZ3JhZGVXb3Jrc2hlZXRGb3JtYXR0aW5nKHJlc3BvbnNlLCBDbGFzc05hbWVLZXlzVG9GaWx0ZXIxNzUpO1xuZXhwb3J0IGNvbnN0IERvd25ncmFkZVdvcmtzaGVldEZvbWF0dGluZ05vdGlmaWNhdGlvbjE3NSA9IChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikgPT5cbiAgRG93bmdyYWRlV29ya3NoZWV0Rm9ybWF0dGluZ05vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIENsYXNzTmFtZUtleXNUb0ZpbHRlcjE3NSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVFeHRlbnNpb25FbnZpcm9ubWVudENvbnRleHQoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAvLyBGaXggdGhlIGV4dGVuc2lvbiBlbnZpcm9ubWVudCBjb250ZXh0IGlzc3VlLiBSZXBsYWNlcyBuZXcgZW51bSB2YWx1ZXMgdGhhdCBnbyB1bnJlY29nbml6ZWRcbiAgLy8gYnkgb2xkZXIgZXh0ZW5zaW9ucyB3aXRoIHRoZWlyIHJlc3BlY3RpdmUgb2xkZXIgZW51bSB2YWx1ZXMuXG4gIGNvbnN0IGJvb3RzdHJhcEluZm8gPSBleGVjdXRlUmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkJvb3RzdHJhcEluZm87XG5cbiAgaWYgKGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRW52aXJvbm1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBib290c3RyYXBJbmZvLmV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkNvbnRleHQ7XG4gICAgaWYgKGNvbnRleHQgPT09IEV4dGVuc2lvbkNvbnRleHQuUHVibGljV2ViIHx8IGNvbnRleHQgPT09IEV4dGVuc2lvbkNvbnRleHQuQ2xvdWQpIHtcbiAgICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uQ29udGV4dCA9IEV4dGVuc2lvbkNvbnRleHQuU2VydmVyO1xuICAgIH0gZWxzZSBpZiAoY29udGV4dCA9PT0gRXh0ZW5zaW9uQ29udGV4dC5QdWJsaWNEZXNrdG9wKSB7XG4gICAgICBib290c3RyYXBJbmZvLmV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkNvbnRleHQgPSBFeHRlbnNpb25Db250ZXh0LkRlc2t0b3A7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkIH0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKipcbiAqIFRoaXMgdmVyc2lvbiBjb252ZXJ0ZXIgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyBidXQgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIG9yIHdoZW4gd2UgaGF2ZVxuICogYSBtYXRjaGluZyBwbGF0Zm9ybSBhbmQgZXh0ZXJuYWwgdmVyc2lvbiBudW1iZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICBwdWJsaWMgZG93bmdyYWRlRXhlY3V0ZUNhbGwodmVyYjogYW55LCBwYXJhbWV0ZXJzOiBhbnkpOiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcmI6IHZlcmIgYXMgVmVyYklkLFxuICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycyBhcyBFeGVjdXRlUGFyYW1ldGVycyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVFeGVjdXRlUmV0dXJuKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCB2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAgIHJldHVybiBub3RpZmljYXRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkLCBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnMgZnJvbSAnLi9FeHRlcm5hbFZlcnNpb25UcmFuc2xhdGlvbnMnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcbi8qKlxuICogVGhlIHZlcnNpb24gY29udmVydGVyIGlzIGRlc2lnbmVkIHRvIGFsbG93IHRoZSBwbGF0Zm9ybSBhbmQgZXh0ZXJuYWwgbW9kdWxlc1xuICogdG8gc2VlbWxlc3NseSBjb21tdW5pY2F0ZSBvdmVyIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIGludGVybmFsIEFQSS4gVGhpcyBjb252ZXJ0ZXJcbiAqIHN1cHBvcnRzIGV4dGVybmFsJ3MgdmVyc2lvbihtaW5vcikgPj0gcGxhdGZvcm0ncyB2ZXJzaW9uKG1pbm9yKS4gV2hlbiBleGVjdXRpbmdcbiAqIGNvbW1hbmRzLCBpdCBpcyB1c2VkIHRvIGRvd25ncmFkZSB0aGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gdG8gd2hhdCBwbGF0Zm9ybSBrbm93cyBvbiB0aGUgd2F5IGluXG4gKiBhbmQgdXBncmFkZSB0aGUgcmVwcmVzZW50YXRpb25zIG9uIHRoZSB3YXkgb3V0LlxuICovXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXJcbiAgICpcbiAgICogQHBhcmFtIF9leHRlcm5hbFZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IGFwaS1leHRlcm5hbC1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3BsYXRmb3JtVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdGhlIGFwaS1wbGF0Zm9ybS1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX2Rvd25ncmFkZUV4ZWN1dGVDYWxsVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB0aGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gd2hlbiBkb3duZ3JhZGluZyBjbWQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gX3VwZ3JhZGVFeGVjdXRlUmV0dXJuVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB1cGdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGFmdGVyIGEgY21kIGlzIGV4ZWN1dGVkXG4gICAqIEBwYXJhbSBfdXBncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdXBncmFkZSBub3RmaWNhdGlvbnMgdG8gcGVyZm9ybSBvbiBldmVudHNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9leHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgcHJpdmF0ZSBfcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHByaXZhdGUgX2Rvd25ncmFkZUV4ZWN1dGVDYWxsVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZUNhbGw+LFxuICAgIHByaXZhdGUgX3VwZ3JhZGVFeGVjdXRlUmV0dXJuVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVSZXR1cm4+LFxuICAgIHByaXZhdGUgX3VwZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlTm90aWZpY2F0aW9uPixcbiAgKSB7XG4gICAgaWYgKHRoaXMuX2V4dGVybmFsVmVyc2lvbi5tYWpvciA+IHRoaXMuX3BsYXRmb3JtVmVyc2lvbi5tYWpvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCBiZXR3ZWVuIGV4dGVybmFsIHZlcnNpb24gJHt0aGlzLl9leHRlcm5hbFZlcnNpb24ubWFqb3J9XG4gICAgICBhbmQgJHt0aGlzLl9wbGF0Zm9ybVZlcnNpb24ubWFqb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH0ge1xuICAgIC8vIFBlcmZvcm0gdGhlIGRvd25ncmFkZSBvZiB0aGUgdmVyYiBhbmQgcGFyYW1ldGVycyB0byB0aGUgbGV2ZWwgdGhhdCBwbGF0Zm9ybSBpcyB1c2luZ1xuICAgIGxldCBkb3duZ3JhZGVkID0geyB2ZXJiOiB2ZXJiLCBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIH07XG4gICAgZm9yIChjb25zdCBkb3duZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl9kb3duZ3JhZGVFeGVjdXRlQ2FsbFRyYW5zbGF0aW9ucykge1xuICAgICAgZG93bmdyYWRlZCA9IGRvd25ncmFkZVRyYW5zbGF0aW9uKGRvd25ncmFkZWQudmVyYiwgZG93bmdyYWRlZC5wYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG93bmdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgdmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgLy8gUGVyZm9ybSB0aGUgdXBncmFkZSBvZiB0aGUgcmVzcG9uc2UgdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCB1cGdyYWRlZCA9IGV4ZWN1dGVSZXNwb25zZTtcbiAgICBmb3IgKGNvbnN0IHVwZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl91cGdyYWRlRXhlY3V0ZVJldHVyblRyYW5zbGF0aW9ucykge1xuICAgICAgdXBncmFkZWQgPSB1cGdyYWRlVHJhbnNsYXRpb24odXBncmFkZWQsIHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICAvLyBQZXJmb3JtIHRoZSB1cGdyYWRlIG9mIG5vdGlmaWNhdGlvbiB0byB3aGF0IHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgZXhwZWN0aW5nXG4gICAgbGV0IHVwZ3JhZGVkID0gbm90aWZpY2F0aW9uO1xuICAgIGZvciAoY29uc3QgdXBncmFkZU5vdGlmaWNhdGlvbiBvZiB0aGlzLl91cGdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zKSB7XG4gICAgICB1cGdyYWRlZCA9IHVwZ3JhZGVOb3RpZmljYXRpb24odXBncmFkZWQpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGdyYWRlZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBHZXRNYXhpbXVtTWlub3JJbmRleCwgTWFqb3JNaW5vclRyYW5zbGF0b3JzLCBWZXJzaW9uRXF1YWxUbyB9IGZyb20gJy4uL1ZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5JztcbmltcG9ydCB7IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0V4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9uc0V4dGVybmFsIGZyb20gJy4vRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gQSBtYXBwaW5nIGZyb20gdGhlIGN1cnJlbnQgY2xpZW50IHZlcnNpb24gb2YgaW50ZXJuYWwtY29udHJhY3QgdG8gYW4gb2xkZXIgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGUgY29udHJhY3QuXG4vLyBFYWNoIHZlcnNpb24gYnVtcCBjYW4gaGF2ZSBhbiBhcnJheSBvZiB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBpbiBvcmRlci5cbi8vIFRoZXNlIHRyYW5zbGF0aW9ucyBoYW5kbGUgZG93bmdyYWRlRXhlY3V0ZUNhbGwgYW5kIHVwZ3JhZGVFeGVjdXRlUmV0dXJuIGFuZCBhcmUgbWVhbnQgdG8gYmUgY2FsbGVkIG9uIHRoZVxuLy8gY2xpZW50L2V4dGVybmFsIHNpZGUuXG4vLyBXaGVuIHVwZGF0aW5nIHRoZSBtYWpvciBvciBtaW5vciB2ZXJzaW9uIG9mIG91ciBpbnRlcm5hbC1jb250cmFjdCwgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzLlxuLy8gKiBJZiB0aGVyZSBhcmUgdHJhbnNsYXRpb25zIHRvIGFkZCwgYWRkIHRoZW0gdG8gdGhlIHZlcnNpb24gdG8gJ3VwZ3JhZGUgZnJvbScgb3IgJ2Rvd25ncmFkZSB0bycuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuRG93bmdyYWRlRXhlY3V0ZUNhbGw+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgZG93bmdyYWRlcyBmcm9tIDEuMTAgdG8gMS45IGluIHRoZSBbMV1bOV0gYnVja2V0XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yVXBncmFkZVJldHVybkV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vclVwZ3JhZGVOb3RpZmljYXRpb246IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlTm90aWZpY2F0aW9uPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLCAvLyBOb3RlIHRoYXQgd2UgcHV0IHVwZ3JhZGVzIGZyb20gMS45IHRvIDEuMTAgaW4gdGhlIFsxXVs5XSBidWNrZXRcbiAgfSxcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB3aGljaCBoYXMgdGhlIGFiaWxpdHkgdG8gdXBncmFkZSBhbmQgZG93bmdyYWRlXG4gKiB0aGUgY29udHJhY3QgYmV0d2VlbiB0aGUgdHdvIHZlcnNpb25zIHdoaWNoIGFyZSBzcGVjaWZpZWQuIElmIGV4dGVybmFsTWFqb3JWZXJzaW9uIGlzIGxlc3MgdGhhblxuICogcGxhdGZvcm1NYWpvclZlcnNpb24sIGFuIEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBIYW5kbGVzIHVwZ3JhZGUvZG93bmdyYWRlIGZvciBib3RoIG1ham9yIGFuZCBtaW5vciB1cGRhdGVzLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgdXNpbmdcbiAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBwbGF0Zm9ybSBpcyB1c2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlRXh0ZXJuYWxDb21wYXRpYmxlVmVyc2lvbkNvbnZlcnRlcihcbiAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHJldHVybiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsLFxuICAgIEV4ZWN1dGVNaW5vclVwZ3JhZGVSZXR1cm5FeHRlcm5hbCxcbiAgICBFeGVjdXRlTWlub3JVcGdyYWRlTm90aWZpY2F0aW9uLFxuICApO1xufVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXJXaXRoVHJhbnNsYXRvcnMuXG4gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB1cGdyYWRlLCBkb3duZ3JhZGUgYXJyYXlzIHNvIHRoYXQgYWxsIHRoZSBsb2dpYyBjYW4gYmUgdGVzdGVkLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3Qgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqIEBwYXJhbSB1cGdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIHJlc3BvbnNlIHVwZ3JhZGVzXG4gKiBAcGFyYW0gZG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIGV4ZWN1dGUgY2FsbCBkb3duZ3JhZGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgZG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9uc0V4dGVybmFsLkRvd25ncmFkZUV4ZWN1dGVDYWxsPixcbiAgdXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlRXhlY3V0ZVJldHVybj4sXG4gIHVwZ3JhZGVOb3RpZmljYXRpb25zOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZU5vdGlmaWNhdGlvbj4sXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIGNvbnN0IGV4dGVybmFsTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBleHRlcm5hbFZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWlub3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWlub3I7XG5cbiAgLy8gVGhpcyBjaGVjayBpcyBwcmVzZW50IGluIFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LiBXZSB0aHJvdyB0aGUgc2FtZSBlcnJvciBoZXJlIGFzIHdlbGwuXG4gIC8vIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgbWlub3IgdmVyc2lvbnMgZm9yIHRyYW5zbGF0aW9ucy5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uID4gcGxhdGZvcm1NYWpvclZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4dGVybmFsIHZlcnNpb24gbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcGxhdGZvcm0gdmVyc2lvbi5cbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbj0ke2V4dGVybmFsTWFqb3JWZXJzaW9ufSBwbGF0Zm9ybU1ham9yVmVyc2lvbj0ke3BsYXRmb3JtTWFqb3JWZXJzaW9ufWApO1xuICB9XG5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uIDwgcGxhdGZvcm1NYWpvclZlcnNpb24gfHwgVmVyc2lvbkVxdWFsVG8oZXh0ZXJuYWxWZXJzaW9uLCBwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIG5ldyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcigpO1xuICB9XG5cbiAgLy8gV2FsayB0aGUgc3BhbiBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyB3ZSBoYXZlIGhlcmUgYW5kIGNvbGxlY3QgdGhlIHVwZ3JhZGUgYW5kIGRvd25ncmFkZXMgbmVjZXNzYXJ5XG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVDYWxsRG93bmdyYWRlOiBBcnJheTxUcmFuc2xhdGlvbnNFeHRlcm5hbC5Eb3duZ3JhZGVFeGVjdXRlQ2FsbD4gPSBHZXROZWVkZWRFeHRlcm5hbFRyYW5zbGF0aW9ucyhcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1pbm9yVmVyc2lvbixcbiAgICBkb3duZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVSZXR1cm5VcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZXMsXG4gICk7XG5cbiAgY29uc3QgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9uc0V4dGVybmFsLlVwZ3JhZGVOb3RpZmljYXRpb24+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZU5vdGlmaWNhdGlvbnMsXG4gICk7XG5cbiAgLy8gUmV2ZXJzZSB0aGUgZG93bmdyYWRlIGNhbGxzLCBzbyB0aGF0IHdlIHN0YXJ0IHRoZSBkb3duZ3JhZGUgZnJvbSB0aGUgZXh0ZXJuYWwgdmVyc2lvbiB0byB0aGUgcGxhdGZvcm0gdmVyc2lvblxuICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZS5yZXZlcnNlKCk7XG4gIHJldHVybiBuZXcgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZSxcbiAgICBuZWVkZWRFeGVjdXRlUmV0dXJuVXBncmFkZXMsXG4gICAgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXMsXG4gICk7XG59XG5cbmZ1bmN0aW9uIEdldE5lZWRlZEV4dGVybmFsVHJhbnNsYXRpb25zPFQ+KFxuICBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBwbGF0Zm9ybU1pbm9yVmVyc2lvbjogbnVtYmVyLFxuICBtYWpvck1pbm9yVHJhbnNsYXRvcnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUPixcbik6IEFycmF5PFQ+IHtcbiAgY29uc3QgbmVlZGVkVHJhbnNsYXRpb25zOiBBcnJheTxUPiA9IFtdO1xuXG4gIGlmIChwbGF0Zm9ybU1ham9yVmVyc2lvbiBpbiBtYWpvck1pbm9yVHJhbnNsYXRvcnMpIHtcbiAgICBjb25zdCBzdGFydCA9IHBsYXRmb3JtTWlub3JWZXJzaW9uO1xuICAgIGNvbnN0IG1heGltdW1NaW5vclZlcnNpb24gPSBHZXRNYXhpbXVtTWlub3JJbmRleChPYmplY3Qua2V5cyhtYWpvck1pbm9yVHJhbnNsYXRvcnNbcGxhdGZvcm1NYWpvclZlcnNpb25dKSk7XG4gICAgZm9yIChsZXQgbWlub3IgPSBzdGFydDsgbWlub3IgPD0gbWF4aW11bU1pbm9yVmVyc2lvbjsgbWlub3IrKykge1xuICAgICAgaWYgKG1pbm9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9yc1twbGF0Zm9ybU1ham9yVmVyc2lvbl0pIHtcbiAgICAgICAgbmVlZGVkVHJhbnNsYXRpb25zLnB1c2goLi4ubWFqb3JNaW5vclRyYW5zbGF0b3JzW3BsYXRmb3JtTWFqb3JWZXJzaW9uXVttaW5vcl0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkZWRUcmFuc2xhdGlvbnM7XG59XG4iLCIvLyBFeHBvcnQgZXZlcnl0aGluZyB3aGljaCBoYWQgYmVlbiBwcmV2aW91c2x5IGluIHRoZSBhcGktc2hhcmVkIG1vZHVsZVxuXG5leHBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnLi9BcGlTaGFyZWQvQXBpVmVyc2lvbic7XG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVCb290c3RyYXAnO1xuZXhwb3J0IHsgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgfSBmcm9tICcuL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVEaXNwYXRjaGVyJztcbmV4cG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9EYXRhU291cmNlJztcbmV4cG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4vQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuZXhwb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi9BcGlTaGFyZWQvRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5leHBvcnQgeyBFdmVudExpc3RlbmVyTWFuYWdlciB9IGZyb20gJy4vQXBpU2hhcmVkL0V2ZW50TGlzdGVuZXJNYW5hZ2VyJztcbmV4cG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9BcGlTaGFyZWQvRmllbGQnO1xuZXhwb3J0IHsgQ3VzdG9tVmlld0ltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0N1c3RvbVZpZXdJbXBsJztcbmV4cG9ydCB7IERhc2hib2FyZEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZEltcGwnO1xuZXhwb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5leHBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGF0YVNvdXJjZUltcGwnO1xuZXhwb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvUGFyYW1ldGVySW1wbCc7XG5leHBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NoZWV0SW1wbCc7XG5leHBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TaGVldEluZm9JbXBsJztcbmV4cG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlckltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NpbmdsZUV2ZW50TWFuYWdlckltcGwnO1xuZXhwb3J0IHsgU3RvcnlJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TdG9yeUltcGwnO1xuZXhwb3J0IHsgU3RvcnlQb2ludEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbXBsJztcbmV4cG9ydCB7IFN0b3J5UG9pbnRJbmZvSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvU3RvcnlQb2ludEluZm9JbXBsJztcbmV4cG9ydCB7IFdvcmtib29rSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvV29ya2Jvb2tJbXBsJztcbmV4cG9ydCB7IFdvcmtzaGVldEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1dvcmtzaGVldEltcGwnO1xuZXhwb3J0IHsgUG9pbnQgfSBmcm9tICcuL0FwaVNoYXJlZC9Qb2ludCc7XG5leHBvcnQgeyBBbm5vdGF0aW9uU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0Fubm90YXRpb25TZXJ2aWNlJztcbmV4cG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuZXhwb3J0IHsgRXhwb3J0U2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0V4cG9ydFNlcnZpY2UnO1xuZXhwb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuZXhwb3J0IHsgR2V0RGF0YVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlLCBVbnJlZ2lzdGVyRm4gfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9Ob3RpZmljYXRpb25TZXJ2aWNlJztcbmV4cG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvUGFyYW1ldGVyc1NlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvUmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcyc7XG5leHBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU2VsZWN0aW9uU2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuZXhwb3J0IHsgU2l6ZVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TaXplU2VydmljZSc7XG5leHBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU3RvcnlBY3RpdmF0aW9uU2VydmljZSc7XG5leHBvcnQgeyBWaXpTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvVml6U2VydmljZSc7XG5leHBvcnQgeyBDbGllbnRJbmZvU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0NsaWVudEluZm9TZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwnO1xuZXhwb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlLCBSZWdpc3RyYXRpb24gfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgeyBTaXplU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NpemVTZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU3RvcnlBY3RpdmF0aW9uU2VydmljZUltcGwnO1xuZXhwb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2luZ2xlRXZlbnRNYW5hZ2VyJztcbmV4cG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vQXBpU2hhcmVkL1RhYmxlYXVFcnJvcic7XG5leHBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0RlZmVycmVkJztcbmV4cG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0Vycm9ySGVscGVycyc7XG5leHBvcnQgeyBFeHBvcnRIZWxwZXJzIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvRXhwb3J0SGVscGVycyc7XG5leHBvcnQgeyBTaGVldFV0aWxzIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvU2hlZXRVdGlscyc7XG5leHBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9BcGlTaGFyZWQvVmVyc2lvbk51bWJlcic7XG5leHBvcnQgeyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgfSBmcm9tICcuL1ZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlcic7XG4iLCJpbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9WZXJzaW9uTnVtYmVyJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXJDb250cmFjdCB9IGZyb20gJy4vVmVyc2lvbk51bWJlckNvbnRyYWN0JztcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGV0b24gd3JhcHBlciBvZiBWZXJzaW9uTnVtYmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBBcGlWZXJzaW9uIHtcbiAgLy8gVXNpbmcgc29tZSB3ZWJwYWNrIHRyaWNrcywgd2UgY2FuIGluamVjdCB0aGlzIHZlcnNpb24gaW50byBvdXIgY29kZSAoa2luZGEgbGlrZSBjKysgcHJlcHJvY2Vzc29yIHN0dWZmKVxuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFZlcnNpb25OdW1iZXJDb250cmFjdDtcblxuICAvKipcbiAgICogR2V0cyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSB2ZXJzaW9uIG51bWJlci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFZlcnNpb25OdW1iZXJDb250cmFjdCB7XG4gICAgcmV0dXJuIEFwaVZlcnNpb24uX2luc3RhbmNlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBTZXRWZXJzaW9uTnVtYmVyKG51bVN0cmluZzogc3RyaW5nLCBpc0FscGhhOiBib29sZWFuKTogdm9pZCB7XG4gICAgQXBpVmVyc2lvbi5faW5zdGFuY2UgPSBuZXcgVmVyc2lvbk51bWJlcihudW1TdHJpbmcsIGlzQWxwaGEpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSBjb25uZWN0aW9uIHN1bW1hcnkuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uU3VtbWFyeSBpbXBsZW1lbnRzIENvbnRyYWN0LkNvbm5lY3Rpb25TdW1tYXJ5IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Nvbm5lY3Rpb25JbmZvOiBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5KSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VydmVyVVJJKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25JbmZvLnNlcnZlclVSSTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby50eXBlO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgQ3Jvc3NGcmFtZU1lc3NlbmdlcixcbiAgSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuICBNRVNTQUdJTkdfVkVSU0lPTiBhcyBBcGlNZXNzYWdpbmdWZXJzaW9uLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgfSBmcm9tICcuL0Nyb3NzRnJhbWVEaXNwYXRjaGVyJztcblxuLy8gQ2hlY2tzIHRvIHNlZSBpZiB3ZSBhcmUgcnVubmluZyBpbiBhbiBpZnJhbWUgY3VycmVudGx5OiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzI2MDc2Lzg4MjExNTNcbmZ1bmN0aW9uIGluSWZyYW1lKHRoaXNXaW5kb3c6IFdpbmRvdyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiB0aGlzV2luZG93LnNlbGYgIT09IHRoaXNXaW5kb3cucGFyZW50O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byBib290c3RyYXAgdGhlIGV4dGVuc2lvbiB3aXRoIGEgY3Jvc3MtZnJhbWUgcGFyZW50IHdoZXJlIFRhYmxlYXUgaXMgcnVubmluZ1xuICpcbiAqIEBwYXJhbSB0aGlzV2luZG93IFRoZSB3aW5kb3cgd2hpY2ggd2UgYXJlIHJ1bm5pbmcgaW4gKGluamVjdGVkIGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMpXG4gKiBAcGFyYW0gaW50ZXJuYWxDb250cmFjdFZlcnNpb24gVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3ZSBhcmUgdXNpbmdcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCBpcyBkb2luZyB0aGUgYWN0dWFsIGJvb3RzdHJhcHBpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcChcbiAgdGhpc1dpbmRvdzogV2luZG93LFxuICBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbjogQ29udHJhY3QuVmVyc2lvbk51bWJlcixcbiAgb3B0aW9uczogSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuKTogUHJvbWlzZTxDb250cmFjdC5JbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxDb250cmFjdC5JbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IHBhcmVudDogV2luZG93O1xuXG4gICAgLy8gTm9ybWFsbHksIHdlIGFyZSBydW5uaW5nIGluc2lkZSBhbiBpZnJhbWUuICBUaGUgZXhjZXB0aW9uIHRvIHRoaXMgaXNcbiAgICAvLyB3aGVuIHdlIGFyZSBydW5uaW5nIGFzIGFuIGV4dGVuc2lvbiBpbnNpZGUgYSBkaWFsb2cgYXMgcGFydCBvZiB0aGUgVUlOYW1lc3BhY2VcbiAgICAvLyBmdW5jdGlvbmFsaXR5LiAgSW4gdGhhdCBjYXNlLCB3ZSB3YW50IHRoZSBvcGVuZXIgb2YgdGhpcyB3aW5kb3cgcmF0aGVyIHRoYW4gdGhlIHBhcmVudC5cbiAgICBpZiAoIWluSWZyYW1lKHRoaXNXaW5kb3cpKSB7XG4gICAgICBwYXJlbnQgPSB0aGlzV2luZG93Lm9wZW5lcjtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50ID0gdGhpc1dpbmRvdy5wYXJlbnQ7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJlamVjdCgnVGhpcyBleHRlbnNpb24gaXMgbm90IHJ1bm5pbmcgaW5zaWRlIGFuIGlmcmFtZSwgZGVza3RvcCwgb3IgcG9wdXAgd2luZG93LiBJbml0aWFsaXphdGlvbiBmYWlsZWQuJyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBtZXNzZW5nZXIgd2hpY2ggd2lsbCBkbyBoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhpcyB3aW5kb3cgYW5kIG91ciBwYXJlbnRcbiAgICAvLyBTaW5jZSB3ZSBkb24ndCBrbm93IHdoZXJlIHdlIGFyZSBydW5uaW5nIHlldCwgd2UgaGF2ZSB0byBtYWtlIHRoaXMgaW5pdGlhbCBvcmlnaW4gJyonLiBPbmNlXG4gICAgLy8gd2UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgb3VyIGV4dGVuc2lvbiwgd2Ugd2lsbCBsaW1pdCB3aGVyZSB3ZSBzZW5kIG1lc3NhZ2VzXG4gICAgY29uc3QgbWVzc2VuZ2VyID0gbmV3IENyb3NzRnJhbWVNZXNzZW5nZXIodGhpc1dpbmRvdywgcGFyZW50LCAnKicpO1xuXG4gICAgLy8gUHJlcGFyZSB0byBzZW5kIGFuIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UgdG8gdGhlIHBhcmVudCBmcmFtZVxuICAgIGNvbnN0IGluaXRpYWxpemF0aW9uTWVzc2FnZSA9IG1lc3Nlbmdlci5wcmVwYXJlSW5pdGlhbGl6YXRpb25NZXNzYWdlKGludGVybmFsQ29udHJhY3RWZXJzaW9uLCBBcGlNZXNzYWdpbmdWZXJzaW9uLCBvcHRpb25zKTtcblxuICAgIC8vIFdoZW4gd2UgcmVjZWl2ZSBhIHJlc3BvbnNlIGJhY2sgZnJvbSB0aGUgcGFyZW50LCB3ZSBjaGVjayB0byBtYWtlIHN1cmUgdGhlIGd1aWRzIG1hdGNoIGFuZCB0aGVuIHdlIGtub3dcbiAgICAvLyB0aGF0IHRoZSBwYXJlbnQgaXMgYXdhcmUgb2YgdXMgYW5kIHdlIGNhbiBzdGFydCBjb21tdW5pY2F0aW5nXG4gICAgbWVzc2VuZ2VyLnNldENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKGZ1bmN0aW9uIChtc2c6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UpOiB2b2lkIHtcbiAgICAgIC8vIFZlcmlmeSB3ZSBhcmUgZ2V0dGluZyBhIHJlc3BvbnNlIGZyb20gb3VyIGluaXRpYWxpemUgbWVzc2FnZVxuICAgICAgaWYgKG1zZy5jb21tYW5kR3VpZCA9PT0gaW5pdGlhbGl6YXRpb25NZXNzYWdlLm1lc3NhZ2VHdWlkKSB7XG4gICAgICAgIC8vIFRoZSB2ZXJzaW9uaW5nIG9mIHRoZSBkaXNwYXRjaGVyIGhhcHBlbnMgb24gdGhlIG90aGVyIHNpZGUgb2Ygb3VyIGZyYW1lLCBhbmRcbiAgICAgICAgLy8gaW4gYSB3cmFwcGVyIG9uIHRoaXMgc2lkZS4gVGhpcyBvbmUgZG9lc24ndCBoYXZlIGFueSB2ZXJzaW9uIGtub3dsZWRnZS5cbiAgICAgICAgY29uc3QgZGlzcGF0Y2hlckZhY3RvcnkgPSAoKSA9PiBuZXcgQ3Jvc3NGcmFtZURpc3BhdGNoZXIobWVzc2VuZ2VyKTtcbiAgICAgICAgcmVzb2x2ZShkaXNwYXRjaGVyRmFjdG9yeSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBOb3cgdGhhdCBvdXIgaGFuZGxlcnMgYXJlIHJlYWR5LCBzdGFydCBsaXN0ZW5pbmcgYW5kIHNlbmQgb3VyIGluaXRpYWxpemF0aW9uIG1lc3NhZ2VcbiAgICBtZXNzZW5nZXIuc3RhcnRMaXN0ZW5pbmcoKTtcbiAgICBpbml0aWFsaXphdGlvbk1lc3NhZ2Uuc2VuZCgpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IEVtYmVkZGluZ0Vycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4ZWN1dGVSZXNwb25zZSxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBNZXNzZW5nZXIsXG4gIE1vZGVsLFxuICBOb3RpZmljYXRpb25IYW5kbGVyLFxuICBOb3RpZmljYXRpb25NZXNzYWdlLFxuICBWZXJiSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEludGVybmFsQXBpRGlzcGF0Y2hlciBpbnRlcmZhY2Ugd2hpY2ggZnVuY3Rpb25zIGJ5IHBhc3NpbmcgbWVzc2FnZXNcbiAqIGFjcm9zcyBhIGZyYW1lIGJvdW5kYXJ5LiBUaGlzIGlzIHVzdWFsbHkgYmV0d2VlbiB0aGUgY29kZSB3aGVyZSBvdXIgamF2c2NyaXB0IGxpYnJhcnkgaGFzIGJlZW4gaW5jbHVkZWRcbiAqIGJ5IGEgM3JkIHBhcnR5IGRldiBhbmQgYW5vdGhlciBmcmFtZSB3aGVyZSBUYWJsZWF1IHNlcnZlciBoYXMgY29udGVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRnJhbWVEaXNwYXRjaGVyIGltcGxlbWVudHMgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIHtcbiAgLy8gQ29sbGVjdGlvbiBvZiBwZW5kaW5nIHByb21pc2VzIHdoaWNoIGFyZSB3YWl0aW5nIHRvIGJlIHJlc29sdmVkLiBXaGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gdGhlIG90aGVyIGZyYW1lLFxuICAvLyB0aGVzZSBwcm9taXNlcyBjYW4gYmUgZWl0aGVyIHJlc29sdmVkIG9yIHJlamVjdGVkXG4gIHByaXZhdGUgX3BlbmRpbmdQcm9taXNlczogeyBbbWVzc2FnZUd1aWQ6IHN0cmluZ106IHsgcmVzb2x2ZTogKHJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+IHZvaWQ7IHJlamVjdDogKGVycm9yOiBNb2RlbCkgPT4gdm9pZCB9IH0gPVxuICAgIHt9O1xuXG4gIC8vIFRoZSBjb2xsZWN0aW9uIG9mIG5vdGlmaWNhdGlvbiBoYW5kbGVycyB3aGljaCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZGlzcGF0Y2hlclxuICBwcml2YXRlIF9ub3RpZmljYXRpb25IYW5kbGVyczogQXJyYXk8Tm90aWZpY2F0aW9uSGFuZGxlcj4gPSBbXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lRGlzcGF0Y2hlciB3aGljaCB3aWxsIHVzZSB0aGUgZ2l2ZW4gbWVzc2VuZ2VyIHRvIGNvbW11bmljYXRlXG4gICAqIEBwYXJhbSBfbWVzc2VuZ2VyIGFuIGluc3RhbnRpYXRlZCBhbmQgbGlzdGVuaW5nIG1lc3NlbmdlciBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9tZXNzZW5nZXI6IE1lc3Nlbmdlcikge1xuICAgIGlmICghdGhpcy5fbWVzc2VuZ2VyKSB7XG4gICAgICB0aHJvdyAnTWlzc2luZyBtZXNzZW5nZXIgb2JqZWN0JztcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgb3VyIG1lc3NhZ2UgaGFuZGxlcnMuIFdlIG9ubHkgY2FyZSBhYm91dCBpbmNvbWluZyBub3RpZmljYXRpb25zIGFuZCBjb21tYW5kIHJlc3BvbnNlc1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXRDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcih0aGlzLm9uQ29tbWFuZFJlc3BvbnNlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXROb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcih0aGlzLm9uTm90aWZpY2F0aW9uLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLy8vLy8vIFN0YXJ0IEludGVybmFsQXBpRGlzcGF0Y2hlciBpbXBsZW1lbnRhdGlvblxuXG4gIHB1YmxpYyBleGVjdXRlKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgIC8vIFRvIGV4ZWN1dGUgYSB2ZXJiLCB3ZSBmaXJzdCBwcmVwYXJlIGEgY29tbWFuZCBtZXNzYWdlIGFuZCB0aGVuIGRlZmluZSBhIHByb21pc2UuXG4gICAgY29uc3QgcHJlcGFyZWRNZXNzYWdlID0gdGhpcy5fbWVzc2VuZ2VyLnByZXBhcmVDb21tYW5kTWVzc2FnZSh2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBTYXZlIG9mZiB0aGUgcGVuZGluZyBwcm9taXNlIGJ5IHRoZSBtZXNzYWdlR3VpZCB3ZSBhcmUgYWJvdXQgdG8gc2VuZC4gV2hlbiBhIHJlc3BvbnNlIGlzXG4gICAgICAvLyByZWNlaXZlZCwgd2UnbGwgYmUgYWJsZSB0byByZXNvbHZlIHRoaXMgcHJvbWlzZSB3aXRoIHRoZSByZXN1bHRcbiAgICAgIHRoaXMuX3BlbmRpbmdQcm9taXNlc1twcmVwYXJlZE1lc3NhZ2UubWVzc2FnZUd1aWRdID0geyByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWN0dWFsbHkgc2VuZCB0aGUgbWVzc2FnZSBhbmQgcmV0dXJuIHRoZSBwcm9taXNlXG4gICAgcHJlcGFyZWRNZXNzYWdlLnNlbmQoKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgdW5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzID0gdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZmlsdGVyKChoKSA9PiBoICE9PSBoYW5kbGVyKTtcbiAgfVxuXG4gIC8vLy8vLyBFbmQgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIGltcGxlbWVudGF0aW9uXG5cbiAgcHJpdmF0ZSBvbkNvbW1hbmRSZXNwb25zZShyZXNwb25zZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSk6IHZvaWQge1xuICAgIC8vIFdlIGdvdCBhIGNvbW1hbmQgcmVzcG9uc2UsIGxvb2sgdGhyb3VnaCB0aGUgcGVuZGluZyBwcm9taXNlcyBhbmQgcmVzb2x2ZVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9wZW5kaW5nUHJvbWlzZXMpLmluZGV4T2YocmVzcG9uc2UuY29tbWFuZEd1aWQpIDwgMCkge1xuICAgICAgcmV0dXJuOyAvLyBXZSBkb24ndCBoYXZlIGFueSByZWZlcmVuY2UgdG8gdGhpcyBjb21tYW5kLCBqdXN0IHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBlbmRpbmdQcm9taXNlID0gdGhpcy5fcGVuZGluZ1Byb21pc2VzW3Jlc3BvbnNlLmNvbW1hbmRHdWlkXTtcblxuICAgIC8vIElmIHdlIGhhdmUgYW4gZXJyb3IgZGVmaW5lZCwgcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICBwZW5kaW5nUHJvbWlzZS5yZWplY3QocmVzcG9uc2UuZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgZGF0YSBkZWZpbmVkLCByZXNvbHZlIHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgIHBlbmRpbmdQcm9taXNlLnJlc29sdmUoeyByZXN1bHQ6IHJlc3BvbnNlLmRhdGEgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgb3VyIHBlbmRpbmcgcHJvbWlzZXMgb2JqZWN0XG4gICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdQcm9taXNlc1tyZXNwb25zZS5jb21tYW5kR3VpZF07XG4gIH1cblxuICBwcml2YXRlIG9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2U6IE5vdGlmaWNhdGlvbk1lc3NhZ2UpOiB2b2lkIHtcbiAgICAvLyBHbyB0aHJvdWdoIGVhY2ggbm90aWZpY2F0aW9uIGhhbmRsZXIgd2UgaGF2ZSByZWdpc3RlcmVkIGFuZCBsZXQgdGhlbSBrbm93IGEgbm90aWZpY2F0aW9uIGNhbWUgaW5cbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXIoeyBub3RpZmljYXRpb25JZDogbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCwgZGF0YTogbm90aWZpY2F0aW9uTWVzc2FnZS5kYXRhIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJbmNhc2Ugb2YgYSBJbmNvbXBhdGlibGVWZXJzaW9uRXJyb3IsIHJlLXRocm93IHRoZSBlcnJvci5cbiAgICAgICAgaWYgKChlIGFzIFRhYmxlYXVFcnJvcikuZXJyb3JDb2RlID09PSBFbWJlZGRpbmdFcnJvckNvZGVzLkluY29tcGF0aWJsZVZlcnNpb25FcnJvcikge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRWxzZSBJZ25vcmUgIHNvIGlmIG9uZSBoYW5kbGVyIGVycm9ycywgdGhlIG90aGVyIHN0aWxsIGdldCB0aGUgbWVzc2FnZS5cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vSW1wbC9EYXRhU291cmNlSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXRhU291cmNlSW1wbDogRGF0YVNvdXJjZUltcGwpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZHMoKTogQXJyYXk8Q29udHJhY3QuRmllbGQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZmllbGRzO1xuICB9XG5cbiAgcHVibGljIGdldCBleHRyYWN0VXBkYXRlVGltZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5leHRyYWN0VXBkYXRlVGltZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNFeHRyYWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc0V4dHJhY3Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUHVibGlzaGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc1B1Ymxpc2hlZDtcbiAgfVxuXG4gIHB1YmxpYyBwdWJsaXNoZWRVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwucHVibGlzaGVkVXJsKCk7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5yZWZyZXNoQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LlRhYmxlU3VtbWFyeT4+IHtcbiAgICBjb25zb2xlLndhcm4oJ0RhdGFTb3VyY2UuZ2V0QWN0aXZlVGFibGVzQXN5bmMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZXNBc3luYy4nKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0QWN0aXZlVGFibGVzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeT4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ0RhdGFTb3VyY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlICcgK1xuICAgICAgICAnRGF0YVNvdXJjZS5nZXRMb2dpY2FsVGFibGVzQXN5bmMgYW5kIERhdGFTb3VyY2UuZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jLicsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5nZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMobG9naWNhbFRhYmxlSWQsIHBhZ2VSb3dDb3VudCwgb3B0aW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIERhdGVSYW5nZVR5cGUgYXMgRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEaWFsb2dTdHlsZSBhcyBFeHRlcm5hbERpYWxvZ1N0eWxlLFxuICBGaWx0ZXJEb21haW5UeXBlIGFzIEV4dGVybmFsRG9tYWluVHlwZSxcbiAgRmlsdGVyTnVsbE9wdGlvbiBhcyBFeHRlcm5hbE51bGxPcHRpb24sXG4gIEZpbHRlclVwZGF0ZVR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgUGVyaW9kVHlwZSxcbiAgUmVwbGF5U3BlZWRUeXBlLFxuICBTaGVldFR5cGUgYXMgRXh0ZXJuYWxTaGVldFR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNob3dEYXRhVGFibGVGb3JtYXQsXG4gIERhdGVSYW5nZVR5cGUgYXMgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEYXRlU3RlcFBlcmlvZCxcbiAgRGlhbG9nU3R5bGUgYXMgSW50ZXJuYWxEaWFsb2dTdHlsZSxcbiAgRmlsdGVyRG9tYWluVHlwZSBhcyBJbnRlcm5hbERvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24gYXMgSW50ZXJuYWxOdWxsT3B0aW9uLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEludGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEludGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRW51bUNvbnZlcnRlciB9IGZyb20gJy4uL1V0aWxzL0VudW1Db252ZXJ0ZXInO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTp0eXBlZGVmIC0gRGlzYWJsZSB0aGlzIHRvIG1ha2UgZGVjbGFyaW5nIHRoZXNlIGNsYXNzZXMgYSBiaXQgZWFzaWVyICovXG4vKipcbiAqIE1hcHMgZW51bXMgdXNlZCBieSB0aGUgZXh0ZXJuYWwtYXBpLWNvbnRyYWN0IHRvIHRoZSBlbnVtcyB1c2VkXG4gKiBpbiB0aGUgaW50ZXJuYWwtYXBpLWNvbnRyYWN0LCB3aGljaCBkZXZlbG9wZXJzIGNvZGUgYWdhaW5zdC5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB7XG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyRG9tYWluVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRG9tYWluVHlwZSwgSW50ZXJuYWxEb21haW5UeXBlPih7XG4gICAgW0V4dGVybmFsRG9tYWluVHlwZS5SZWxldmFudF06IEludGVybmFsRG9tYWluVHlwZS5SZWxldmFudCxcbiAgICBbRXh0ZXJuYWxEb21haW5UeXBlLkRhdGFiYXNlXTogSW50ZXJuYWxEb21haW5UeXBlLkRhdGFiYXNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIG51bGxPcHRpb25zID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxOdWxsT3B0aW9uLCBJbnRlcm5hbE51bGxPcHRpb24+KHtcbiAgICBbRXh0ZXJuYWxOdWxsT3B0aW9uLkFsbFZhbHVlc106IEludGVybmFsTnVsbE9wdGlvbi5BbGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5Ob25OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk5vbk51bGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk51bGxWYWx1ZXMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyVXBkYXRlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSwgSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlPih7XG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGRdOiBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWRkLFxuICAgIFtFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFsbCxcbiAgICBbRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZV06IEludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZW1vdmUsXG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZXBsYWNlXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2UsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2V0VmlzaWJpbGl0eVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxab25lVmlzaWJpbGl0eVR5cGUsIGJvb2xlYW4+KHtcbiAgICBbWm9uZVZpc2liaWxpdHlUeXBlLlNob3ddOiB0cnVlLFxuICAgIFtab25lVmlzaWJpbGl0eVR5cGUuSGlkZV06IGZhbHNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNldFJlcGxheVNwZWVkVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFJlcGxheVNwZWVkVHlwZSwgbnVtYmVyPih7XG4gICAgLy8gdGhlc2UgbnVtYmVycyBhcmUgZHVyYXRpb24gbXVsdGlwbGllcnNcbiAgICAvLyAyLjAsIGZvciBleGFtcGxlLCBkb3VibGVzIHRoZSBkdXJhdGlvbiBvZiB0aGUgcmVwbGF5LCBzbG93aW5nIGl0IGRvd24gdG8gMC41eCBzcGVlZFxuICAgIFtSZXBsYXlTcGVlZFR5cGUuU2xvd106IDIuMCxcbiAgICBbUmVwbGF5U3BlZWRUeXBlLk5vcm1hbF06IDEuMCxcbiAgICBbUmVwbGF5U3BlZWRUeXBlLkZhc3RdOiAwLjUsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hlZXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxTaGVldFR5cGUsIEludGVybmFsU2hlZXRUeXBlPih7XG4gICAgW0V4dGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZF06IEludGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICBbRXh0ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0XTogSW50ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0LFxuICAgIFtFeHRlcm5hbFNoZWV0VHlwZS5TdG9yeV06IEludGVybmFsU2hlZXRUeXBlLlN0b3J5LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNob3dEYXRhVGFibGVGb3JtYXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sIEFwaVNob3dEYXRhVGFibGVGb3JtYXQ+KHtcbiAgICBbSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzXTogQXBpU2hvd0RhdGFUYWJsZUZvcm1hdC5OYXRpdmVBbmRGb3JtYXR0ZWRWYWx1ZXMsXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlOYXRpdmVWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0Lk5hdGl2ZVZhbHVlc09ubHksXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlGb3JtYXR0ZWRWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0LkZvcm1hdHRlZFZhbHVlc09ubHksXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgcGVyaW9kVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFBlcmlvZFR5cGUsIERhdGVTdGVwUGVyaW9kPih7XG4gICAgW1BlcmlvZFR5cGUuWWVhcnNdOiBEYXRlU3RlcFBlcmlvZC5ZZWFycyxcbiAgICBbUGVyaW9kVHlwZS5RdWFydGVyc106IERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzLFxuICAgIFtQZXJpb2RUeXBlLk1vbnRoc106IERhdGVTdGVwUGVyaW9kLk1vbnRocyxcbiAgICBbUGVyaW9kVHlwZS5XZWVrc106IERhdGVTdGVwUGVyaW9kLldlZWtzLFxuICAgIFtQZXJpb2RUeXBlLkRheXNdOiBEYXRlU3RlcFBlcmlvZC5EYXlzLFxuICAgIFtQZXJpb2RUeXBlLkhvdXJzXTogRGF0ZVN0ZXBQZXJpb2QuSG91cnMsXG4gICAgW1BlcmlvZFR5cGUuTWludXRlc106IERhdGVTdGVwUGVyaW9kLk1pbnV0ZXMsXG4gICAgW1BlcmlvZFR5cGUuU2Vjb25kc106IERhdGVTdGVwUGVyaW9kLlNlY29uZHMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZVJhbmdlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRGF0ZVJhbmdlVHlwZSwgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlPih7XG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0XTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3QsXG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0Tl06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0TixcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHRdOiBJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dCxcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROXTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROLFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuQ3VycmVudF06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5DdXJyZW50LFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlXTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLlRvRGF0ZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkaWFsb2dTdHlsZXMgPSBuZXcgRW51bUNvbnZlcnRlcjxFeHRlcm5hbERpYWxvZ1N0eWxlLCBJbnRlcm5hbERpYWxvZ1N0eWxlPih7XG4gICAgW0V4dGVybmFsRGlhbG9nU3R5bGUuV2luZG93XTogSW50ZXJuYWxEaWFsb2dTdHlsZS5XaW5kb3csXG4gICAgW0V4dGVybmFsRGlhbG9nU3R5bGUuTW9kYWxdOiBJbnRlcm5hbERpYWxvZ1N0eWxlLk1vZGFsLFxuICAgIFtFeHRlcm5hbERpYWxvZ1N0eWxlLk1vZGVsZXNzXTogSW50ZXJuYWxEaWFsb2dTdHlsZS5Nb2RlbGVzcyxcbiAgfSk7XG59XG4vKiB0c2xpbnQ6ZW5hYmxlOnR5cGVkZWYgKi9cbiIsImltcG9ydCB7XG4gIEFubm90YXRpb25UeXBlIGFzIEV4dGVybmFsQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSBhcyBFeHRlcm5hbENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSBhcyBFeHRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhVHlwZSBhcyBFeHRlcm5hbERhdGFUeXBlLFxuICBQZXJpb2RUeXBlIGFzIEV4dGVybmFsRGF0ZVBlcmlvZCxcbiAgRGF0ZVJhbmdlVHlwZSBhcyBFeHRlcm5hbERhdGVSYW5nZVR5cGUsXG4gIEVycm9yQ29kZXMgYXMgRXh0ZXJuYWxFcnJvckNvZGVzLFxuICBFeHRlbnNpb25Db250ZXh0IGFzIEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUgYXMgRXh0ZXJuYWxFeHRlbnNpb25zTW9kZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUgYXMgRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSBhcyBFeHRlcm5hbEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlclR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSBhcyBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIE1hcmtUeXBlIGFzIEV4dGVybmFsTWFya1R5cGUsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSBhcyBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEV4dGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQW5ub3RhdGVFbnVtIGFzIEludGVybmFsQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSBhcyBJbnRlcm5hbENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSBhcyBJbnRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhVHlwZSBhcyBJbnRlcm5hbERhdGFUeXBlLFxuICBEYXRlUmFuZ2VUeXBlIGFzIEludGVybmFsRGF0ZVJhbmdlVHlwZSxcbiAgRGF0ZVN0ZXBQZXJpb2QgYXMgSW50ZXJuYWxEYXRlU3RlcFBlcmlvZCxcbiAgRG9tYWluUmVzdHJpY3Rpb25UeXBlIGFzIEludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLFxuICBFcnJvckNvZGVzIGFzIEludGVybmFsRXJyb3JDb2RlcyxcbiAgRXh0ZW5zaW9uQ29udGV4dCBhcyBJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LFxuICBFeHRlbnNpb25Nb2RlIGFzIEludGVybmFsRXh0ZW5zaW9uc01vZGUsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlIGFzIEludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUgYXMgSW50ZXJuYWxGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJUeXBlIGFzIEludGVybmFsRmlsdGVyVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSBhcyBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUgYXMgSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLFxuICBNYXJrVHlwZSBhcyBJbnRlcm5hbE1hcmtUeXBlLFxuICBTaGVldFR5cGUgYXMgSW50ZXJuYWxTaGVldFR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vVXRpbHMvRW51bUNvbnZlcnRlcic7XG5cbi8qIHRzbGludDpkaXNhYmxlOnR5cGVkZWYgLSBEaXNhYmxlIHRoaXMgdG8gbWFrZSBkZWNsYXJpbmcgdGhlc2UgY2xhc3NlcyBhIGJpdCBlYXNpZXIgKi9cbi8qKlxuICogTWFwcyBlbnVtcyB1c2VkIGJ5IHRoZSBpbnRlcm5hbC1hcGktY29udHJhY3QgdG8gdGhlIGVudW1zIHVzZWRcbiAqIGluIHRoZSBleHRlcm5hbC1hcGktY29udHJhY3QsIHdoaWNoIGRldmVsb3BlcnMgY29kZSBhZ2FpbnN0LlxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIHtcbiAgcHVibGljIHN0YXRpYyBleHRlbnNpb25Db250ZXh0ID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dCwgRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dD4oe1xuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3BdOiBFeHRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3AsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuU2VydmVyXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5TZXJ2ZXIsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuUHVibGljV2ViXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5QdWJsaWNXZWIsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuUHVibGljRGVza3RvcF06IEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuUHVibGljRGVza3RvcCxcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5DbG91ZF06IEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuQ2xvdWQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZXh0ZW5zaW9uTW9kZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRXh0ZW5zaW9uc01vZGUsIEV4dGVybmFsRXh0ZW5zaW9uc01vZGU+KHtcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zTW9kZS5BdXRob3JpbmddOiBFeHRlcm5hbEV4dGVuc2lvbnNNb2RlLkF1dGhvcmluZyxcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zTW9kZS5WaWV3aW5nXTogRXh0ZXJuYWxFeHRlbnNpb25zTW9kZS5WaWV3aW5nLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGNvbHVtblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbENvbHVtblR5cGUsIEV4dGVybmFsQ29sdW1uVHlwZT4oe1xuICAgIFtJbnRlcm5hbENvbHVtblR5cGUuQ29udGludW91c106IEV4dGVybmFsQ29sdW1uVHlwZS5Db250aW51b3VzLFxuICAgIFtJbnRlcm5hbENvbHVtblR5cGUuRGlzY3JldGVdOiBFeHRlcm5hbENvbHVtblR5cGUuRGlzY3JldGUsXG4gICAgW0ludGVybmFsQ29sdW1uVHlwZS5Vbmtub3duXTogRXh0ZXJuYWxDb2x1bW5UeXBlLlVua25vd24sXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmllbGRBZ2dyZWdhdGlvblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLCBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlPih7XG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5BdmddOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkF2ZyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db2xsZWN0XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db2xsZWN0LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudGRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50ZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5EYXldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkRheSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5FbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkVuZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ib3VyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ib3VyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkluT3V0XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Jbk91dCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5LdXJ0b3Npc106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuS3VydG9zaXMsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWF4XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NYXgsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWR5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZHksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWVkaWFuXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZWRpYW4sXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWluXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW4sXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWludXRlXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW51dGUsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTW9udGhZZWFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Nb250aFllYXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTm9uZV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTm9uZSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdHJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDFdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0MSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDNdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0MyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TZWNvbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlNlY29uZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ta2V3bmVzc106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU2tld25lc3MsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXZdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2cF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXZwLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN1bV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3VtLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jRGF5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0RheSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0hvdXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jSG91cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY01pbnV0ZV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNaW51dGUsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNb250aF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNb250aCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1F0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNRdHIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNTZWNvbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jU2Vjb25kLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jV2Vla106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNXZWVrLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jWWVhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNZZWFyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlVzZXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlVzZXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5WYXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFycF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFycCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWtkYXldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWtkYXksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuWWVhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuWWVhcixcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWVsZFJvbGVUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWVsZFJvbGVUeXBlLCBFeHRlcm5hbEZpZWxkUm9sZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWVsZFJvbGVUeXBlLkRpbWVuc2lvbl06IEV4dGVybmFsRmllbGRSb2xlVHlwZS5EaW1lbnNpb24sXG4gICAgW0ludGVybmFsRmllbGRSb2xlVHlwZS5NZWFzdXJlXTogRXh0ZXJuYWxGaWVsZFJvbGVUeXBlLk1lYXN1cmUsXG4gICAgW0ludGVybmFsRmllbGRSb2xlVHlwZS5Vbmtub3duXTogRXh0ZXJuYWxGaWVsZFJvbGVUeXBlLlVua25vd24sXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hlZXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxTaGVldFR5cGUsIEV4dGVybmFsU2hlZXRUeXBlPih7XG4gICAgW0ludGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZF06IEV4dGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICBbSW50ZXJuYWxTaGVldFR5cGUuU3RvcnldOiBFeHRlcm5hbFNoZWV0VHlwZS5TdG9yeSxcbiAgICBbSW50ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0XTogRXh0ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGRhc2hib2FyZE9iamVjdFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUsIEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZT4oe1xuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuRXh0ZW5zaW9uXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkV4dGVuc2lvbixcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2UsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5MZWdlbmRdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuTGVnZW5kLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFnZUZpbHRlcl06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYWdlRmlsdGVyLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFyYW1ldGVyQ29udHJvbF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYXJhbWV0ZXJDb250cm9sLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXJdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXIsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UZXh0XTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlRleHQsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZV06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldlYlBhZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuV2ViUGFnZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0YVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhdGFUeXBlLCBFeHRlcm5hbERhdGFUeXBlPih7XG4gICAgW0ludGVybmFsRGF0YVR5cGUuQm9vbF06IEV4dGVybmFsRGF0YVR5cGUuQm9vbCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5EYXRlXTogRXh0ZXJuYWxEYXRhVHlwZS5EYXRlLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLkRhdGVUaW1lXTogRXh0ZXJuYWxEYXRhVHlwZS5EYXRlVGltZSxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5GbG9hdF06IEV4dGVybmFsRGF0YVR5cGUuRmxvYXQsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuSW50XTogRXh0ZXJuYWxEYXRhVHlwZS5JbnQsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuU3BhdGlhbF06IEV4dGVybmFsRGF0YVR5cGUuU3BhdGlhbCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5TdHJpbmddOiBFeHRlcm5hbERhdGFUeXBlLlN0cmluZyxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJVcGRhdGVUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLCBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFkZF06IEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGQsXG4gICAgW0ludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BbGxdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsLFxuICAgIFtJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVtb3ZlXTogRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZSxcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2VdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVwbGFjZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBhbGxvd2FibGVWYWx1ZXMgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERvbWFpblJlc3RyaWN0aW9uVHlwZSwgRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUuQWxsXTogRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGUuQWxsLFxuICAgIFtJbnRlcm5hbERvbWFpblJlc3RyaWN0aW9uVHlwZS5MaXN0XTogRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGUuTGlzdCxcbiAgICBbSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUuUmFuZ2VdOiBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZS5SYW5nZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRlU3RlcFBlcmlvZCA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0ZVN0ZXBQZXJpb2QsIEV4dGVybmFsRGF0ZVBlcmlvZD4oe1xuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlllYXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlllYXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlF1YXJ0ZXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLk1vbnRoc106IEV4dGVybmFsRGF0ZVBlcmlvZC5Nb250aHMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuV2Vla3NdOiBFeHRlcm5hbERhdGVQZXJpb2QuV2Vla3MsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuRGF5c106IEV4dGVybmFsRGF0ZVBlcmlvZC5EYXlzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLkhvdXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLkhvdXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLk1pbnV0ZXNdOiBFeHRlcm5hbERhdGVQZXJpb2QuTWludXRlcyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5TZWNvbmRzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlNlY29uZHMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZVJhbmdlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0ZVJhbmdlVHlwZSwgRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlPih7XG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5DdXJyZW50XTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkN1cnJlbnQsXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0XTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3QsXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0Tl06IEV4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0TixcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHRdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dCxcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROXTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROLFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlXTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLlRvRGF0ZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBlcnJvckNvZGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEVycm9yQ29kZXMsIEV4dGVybmFsRXJyb3JDb2Rlcz4oXG4gICAge1xuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5JTklUSUFMSVpBVElPTl9FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5JTlRFUk5BTF9FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5NSVNTSU5HX0VOVU1fTUFQUElOR106IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5NSVNTSU5HX1BBUkFNRVRFUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5QRVJNSVNTSU9OX0RFTklFRF06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5QUkVTX01PREVMX1BBUlNJTkdfRVJST1JdOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuVU5LTk9XTl9WRVJCX0lEXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlZFUlNJT05fTk9UX0NPTkZJR1VSRURdOiBFeHRlcm5hbEVycm9yQ29kZXMuQVBJTm90SW5pdGlhbGl6ZWQsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlZJU0lCSUxJVFlfRVJST1JdOiBFeHRlcm5hbEVycm9yQ29kZXMuVmlzaWJpbGl0eUVycm9yLFxuICAgIH0sXG4gICAgRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWx0ZXJUeXBlLCBFeHRlcm5hbEZpbHRlclR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWx0ZXJUeXBlLkNhdGVnb3JpY2FsXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLkNhdGVnb3JpY2FsLFxuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuUmFuZ2VdOiBFeHRlcm5hbEZpbHRlclR5cGUuUmFuZ2UsXG4gICAgW0ludGVybmFsRmlsdGVyVHlwZS5SZWxhdGl2ZURhdGVdOiBFeHRlcm5hbEZpbHRlclR5cGUuUmVsYXRpdmVEYXRlLFxuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuSGllcmFyY2hpY2FsXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLkhpZXJhcmNoaWNhbCxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBjbGFzc05hbWVLZXkgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbENsYXNzTmFtZUtleSwgRXh0ZXJuYWxDbGFzc05hbWVLZXk+KHtcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuRGFzaGJvYXJkVGl0bGVdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5EYXNoYm9hcmRUaXRsZSxcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuU3RvcnlUaXRsZV06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlN0b3J5VGl0bGUsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LlRvb2x0aXBdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Ub29sdGlwLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXRdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXQsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldFRpdGxlXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0VGl0bGUsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LlBhbmVdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5QYW5lLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5Sb3dEaXZpZGVyc106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlJvd0RpdmlkZXJzLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5Db2x1bW5EaXZpZGVyc106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LkNvbHVtbkRpdmlkZXJzLFxuICAgIC8vIFRlbXBvcmFyeSB1bnRpbCB3ZSBmaXggMTMxNzI2NiAtIFBsYXRmb3JtIGhhc24ndCBiZWVuIHVwZGF0ZWQgY3VycmVudGx5IGJlY2F1c2UgbmVhciBicmFuY2ggaXMgY2xvc2VkXG4gICAgWydkYXNoYm9hcmQtdGl0bGUnXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuRGFzaGJvYXJkVGl0bGUsXG4gICAgWydzdG9yeS10aXRsZSddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5TdG9yeVRpdGxlLFxuICAgIFsndG9vbHRpcCddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Ub29sdGlwLFxuICAgIFsnd29ya3NoZWV0J106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldCxcbiAgICBbJ3dvcmtzaGVldC10aXRsZSddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXRUaXRsZSxcbiAgICBbJ3BhbmUnXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuUGFuZSxcbiAgICBbJ3Jvdy1kaXZpZGVycyddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Sb3dEaXZpZGVycyxcbiAgICBbJ2NvbHVtbi1kaXZpZGVycyddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Db2x1bW5EaXZpZGVycyxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBoaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlID0gbmV3IEVudW1Db252ZXJ0ZXI8XG4gICAgSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLFxuICAgIEV4dGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZVxuICA+KHtcbiAgICBbSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLkFsbFNlbGVjdGVkXTogRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLkFsbFNlbGVjdGVkLFxuICAgIFtJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuTm9uZVNlbGVjdGVkXTogRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLk5vbmVTZWxlY3RlZCxcbiAgICBbSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLlNvbWVTZWxlY3RlZF06IEV4dGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Tb21lU2VsZWN0ZWQsXG4gICAgW0ludGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Vbmtub3duU2VsZWN0ZWRdOiBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuVW5rbm93blNlbGVjdGVkLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGFubm90YXRpb25UeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxBbm5vdGF0aW9uVHlwZSwgRXh0ZXJuYWxBbm5vdGF0aW9uVHlwZT4oe1xuICAgIFtJbnRlcm5hbEFubm90YXRpb25UeXBlLkFyZWFdOiBFeHRlcm5hbEFubm90YXRpb25UeXBlLkFyZWEsXG4gICAgW0ludGVybmFsQW5ub3RhdGlvblR5cGUuTWFya106IEV4dGVybmFsQW5ub3RhdGlvblR5cGUuTWFyayxcbiAgICBbSW50ZXJuYWxBbm5vdGF0aW9uVHlwZS5Qb2ludF06IEV4dGVybmFsQW5ub3RhdGlvblR5cGUuUG9pbnQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgbWFya1R5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbE1hcmtUeXBlLCBFeHRlcm5hbE1hcmtUeXBlPih7XG4gICAgW0ludGVybmFsTWFya1R5cGUuQXJlYV06IEV4dGVybmFsTWFya1R5cGUuQXJlYSxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5CYXJdOiBFeHRlcm5hbE1hcmtUeXBlLkJhcixcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5DaXJjbGVdOiBFeHRlcm5hbE1hcmtUeXBlLkNpcmNsZSxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5HYW50dEJhcl06IEV4dGVybmFsTWFya1R5cGUuR2FudHRCYXIsXG4gICAgW0ludGVybmFsTWFya1R5cGUuSGVhdG1hcF06IEV4dGVybmFsTWFya1R5cGUuSGVhdG1hcCxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5MaW5lXTogRXh0ZXJuYWxNYXJrVHlwZS5MaW5lLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLk1hcF06IEV4dGVybmFsTWFya1R5cGUuTWFwLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlBpZV06IEV4dGVybmFsTWFya1R5cGUuUGllLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlBvbHlnb25dOiBFeHRlcm5hbE1hcmtUeXBlLlBvbHlnb24sXG4gICAgW0ludGVybmFsTWFya1R5cGUuU2hhcGVdOiBFeHRlcm5hbE1hcmtUeXBlLlNoYXBlLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlNxdWFyZV06IEV4dGVybmFsTWFya1R5cGUuU3F1YXJlLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlRleHRdOiBFeHRlcm5hbE1hcmtUeXBlLlRleHQsXG4gICAgW0ludGVybmFsTWFya1R5cGUuVml6RXh0ZW5zaW9uXTogRXh0ZXJuYWxNYXJrVHlwZS5WaXpFeHRlbnNpb24sXG4gIH0pO1xufVxuLyogdHNsaW50OmVuYWJsZTp0eXBlZGVmICovXG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcywgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaW5nbGVFdmVudE1hbmFnZXIgfSBmcm9tICcuL1NpbmdsZUV2ZW50TWFuYWdlcic7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuL1RhYmxlYXVFcnJvcic7XG5cbi8qKlxuICogQ2xhc3MgZGVzaWduZWQgdG8gcmVnaXN0ZXIgYW5kIHVucmVnaXN0ZXIgaGFuZGxlcnMgZnJvbSBhIHVzZXIuIE9ubHkgdGhvc2UgZXZlbnRzXG4gKiB3aGljaCBhcmUgYWRkZWQgdmlhIEFkZE5ld0V2ZW50VHlwZSB3aWxsIGJlIHN1cHBvcnRlZCBieSB0aGlzIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudExpc3RlbmVyTWFuYWdlciBpbXBsZW1lbnRzIENvbnRyYWN0LkV2ZW50TGlzdGVuZXJNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBfZXZlbnRMaXN0ZW5lck1hbmFnZXJzOiB7IFt0YWJsZWF1RXZlbnRUeXBlOiBzdHJpbmddOiBTaW5nbGVFdmVudE1hbmFnZXIgfTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzID0ge307XG4gIH1cblxuICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIGhhbmRsZXI6IENvbnRyYWN0LlRhYmxlYXVFdmVudEhhbmRsZXJGbik6IENvbnRyYWN0LlRhYmxlYXVFdmVudFVucmVnaXN0ZXJGbiB7XG4gICAgaWYgKCF0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnMuaGFzT3duUHJvcGVydHkoZXZlbnRUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLlVuc3VwcG9ydGVkRXZlbnROYW1lLCBgQ2Fubm90IGFkZCBldmVudCwgdW5zdXBwb3J0ZWQgZXZlbnQgdHlwZTogJHtldmVudFR5cGV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vyc1tldmVudFR5cGVdLmFkZEV2ZW50TGlzdGVuZXIoaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIGhhbmRsZXI6IENvbnRyYWN0LlRhYmxlYXVFdmVudEhhbmRsZXJGbik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzLmhhc093blByb3BlcnR5KGV2ZW50VHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5VbnN1cHBvcnRlZEV2ZW50TmFtZSwgYENhbm5vdCByZW1vdmUgZXZlbnQsIHVuc3VwcG9ydGVkIGV2ZW50IHR5cGU6ICR7ZXZlbnRUeXBlfWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnNbZXZlbnRUeXBlXS5yZW1vdmVFdmVudExpc3RlbmVyKGhhbmRsZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZE5ld0V2ZW50VHlwZShldmVudE1hbmFnZXI6IFNpbmdsZUV2ZW50TWFuYWdlcik6IHZvaWQge1xuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vyc1tldmVudE1hbmFnZXIuZXZlbnRUeXBlXSA9IGV2ZW50TWFuYWdlcjtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IENvbHVtblR5cGUsIERhdGFUeXBlLCBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSwgRmllbGRSb2xlVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBGaWVsZEltcGwgfSBmcm9tICcuL0ltcGwvRmllbGRJbXBsJztcblxuZXhwb3J0IGNsYXNzIEZpZWxkIGltcGxlbWVudHMgQ29udHJhY3QuRmllbGQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZmllbGRJbXBsOiBGaWVsZEltcGwpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogRGF0YVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuZGF0YVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFnZ3JlZ2F0aW9uKCk6IEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmFnZ3JlZ2F0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhU291cmNlKCk6IENvbnRyYWN0LkRhdGFTb3VyY2Uge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuZGF0YVNvdXJjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcm9sZSgpOiBGaWVsZFJvbGVUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLnJvbGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbHVtblR5cGUoKTogQ29sdW1uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5jb2x1bW5UeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0NhbGN1bGF0ZWRGaWVsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzQ2FsY3VsYXRlZEZpZWxkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0NvbWJpbmVkRmllbGQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc0NvbWJpbmVkRmllbGQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzR2VuZXJhdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNHZW5lcmF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzR2Vvc3BhdGlhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzR2Vvc3BhdGlhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc0hpZGRlbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNQcmVzZW50T25QdWJsaXNoZWREYXRhc291cmNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNQcmVzZW50T25QdWJsaXNoZWREYXRhc291cmNlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDdXN0b21WaWV3TW9kZWwgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMsIFZpelNlcnZpY2UgfSBmcm9tICcuLi8uLi9BcGlTaGFyZWQnO1xuZXhwb3J0IGNsYXNzIEN1c3RvbVZpZXdJbXBsIHtcbiAgcHJpdmF0ZSBfbHVpZDogc3RyaW5nO1xuICBwcml2YXRlIF9uYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgX3NoYXJlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfaXNEZWZhdWx0OiBib29sZWFuO1xuICBwcml2YXRlIF9vd25lck5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfdXJsOiBzdHJpbmc7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihjdXN0b21WaWV3TW9kZWw6IEN1c3RvbVZpZXdNb2RlbCwgcHJpdmF0ZSBfcmVnaXN0cnlJZDogbnVtYmVyKSB7XG4gICAgdGhpcy5fbHVpZCA9IGN1c3RvbVZpZXdNb2RlbC5sdWlkO1xuICAgIHRoaXMuX25hbWUgPSBjdXN0b21WaWV3TW9kZWwubmFtZTtcbiAgICB0aGlzLl9zaGFyZWQgPSBjdXN0b21WaWV3TW9kZWwuc2hhcmVkO1xuICAgIHRoaXMuX2lzRGVmYXVsdCA9IGN1c3RvbVZpZXdNb2RlbC5pc0RlZmF1bHQ7XG4gICAgdGhpcy5fb3duZXJOYW1lID0gY3VzdG9tVmlld01vZGVsLm93bmVyLnVzZXJGcmllbmRseU5hbWU7XG4gICAgdGhpcy5fdXJsID0gY3VzdG9tVmlld01vZGVsLnVybDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbHVpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbHVpZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9uYW1lID0gbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hhcmVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zaGFyZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNoYXJlZChzaGFyZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaGFyZWQgPSBzaGFyZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNEZWZhdWx0O1xuICB9XG5cbiAgcHVibGljIHNldCBpc0RlZmF1bHQoaXNEZWZhdWx0OiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNEZWZhdWx0ID0gaXNEZWZhdWx0O1xuICB9XG5cbiAgcHVibGljIGdldCBvd25lck5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX293bmVyTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXJsKCkge1xuICAgIHJldHVybiB0aGlzLl91cmw7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUFzeW5jKCk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGw+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFZpelNlcnZpY2U+KFNlcnZpY2VOYW1lcy5WaXopO1xuICAgIHJldHVybiBzZXJ2aWNlLnNhdmVBc3luYyh0aGlzKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIERhc2hib2FyZExheW91dENoYW5nZSxcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyxcbiAgRXJyb3JDb2RlcyxcbiAgU2hhcmVkRXJyb3JDb2RlcyxcbiAgU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0VHlwZSwgRGFzaGJvYXJkWm9uZSwgU2hlZXRQYXRoLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vUG9pbnQnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0FuaW1hdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9ab25lU2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdEltcGwgfSBmcm9tICcuL0Rhc2hib2FyZE9iamVjdEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbXBsIH0gZnJvbSAnLi9TaGVldEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vU2hlZXRJbmZvSW1wbCc7XG5pbXBvcnQgeyBTdG9yeVBvaW50SW1wbCB9IGZyb20gJy4vU3RvcnlQb2ludEltcGwnO1xuaW1wb3J0IHsgV29ya3NoZWV0SW1wbCB9IGZyb20gJy4vV29ya3NoZWV0SW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRJbXBsIGV4dGVuZHMgU2hlZXRJbXBsIHtcbiAgcHJpdmF0ZSBfd29ya3NoZWV0c0ltcGw6IEFycmF5PFdvcmtzaGVldEltcGw+O1xuICBwcml2YXRlIF9vYmplY3RzOiBBcnJheTxEYXNoYm9hcmRPYmplY3RJbXBsPjtcbiAgcHJpdmF0ZSB6b25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgX3NoZWV0SW5mbzogU2hlZXRJbmZvSW1wbCxcbiAgICBwcml2YXRlIF96b25lczogQXJyYXk8RGFzaGJvYXJkWm9uZT4sXG4gICAgcHJpdmF0ZSBfc2hlZXRQYXRoOiBTaGVldFBhdGgsXG4gICAgX3JlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9wYXJlbnRTdG9yeVBvaW50SW1wbDogU3RvcnlQb2ludEltcGwgfCBudWxsLFxuICAgIHByaXZhdGUgX2FjdGl2ZURhc2hib2FyZE9iamVjdElkOiBudW1iZXIgPSAwLFxuICApIHtcbiAgICBzdXBlcihfc2hlZXRJbmZvLCBfcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldHNJbXBsKCk6IEFycmF5PFdvcmtzaGVldEltcGw+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0c0ltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9iamVjdHMoKTogQXJyYXk8RGFzaGJvYXJkT2JqZWN0SW1wbD4ge1xuICAgIHJldHVybiB0aGlzLl9vYmplY3RzO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJlbnRTdG9yeVBvaW50KCk6IFN0b3J5UG9pbnRJbXBsIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFN0b3J5UG9pbnRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmVEYXNoYm9hcmRPYmplY3RJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVEYXNoYm9hcmRPYmplY3RJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRGFzaGJvYXJkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zaGVldFBhdGguc2hlZXROYW1lO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcygpOiB2b2lkIHtcbiAgICB0aGlzLl93b3Jrc2hlZXRzSW1wbCA9IG5ldyBBcnJheTxXb3Jrc2hlZXRJbXBsPigpO1xuICAgIHRoaXMuX29iamVjdHMgPSBuZXcgQXJyYXk8RGFzaGJvYXJkT2JqZWN0SW1wbD4oKTtcbiAgICB0aGlzLnpvbmVNYXAgPSBuZXcgTWFwPG51bWJlciwgRGFzaGJvYXJkT2JqZWN0SW1wbD4oKTtcblxuICAgIC8vIFByb2Nlc3MgYWxsIHRoZSB6b25lcyB3aGljaCBhcmUgY29udGFpbmVkIGluIHRoaXMgZGFzaGJvYXJkXG4gICAgZm9yIChjb25zdCB6b25lIG9mIHRoaXMuX3pvbmVzKSB7XG4gICAgICBsZXQgd29ya3NoZWV0SW1wbDogV29ya3NoZWV0SW1wbCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3Qgem9uZVNpemU6IENvbnRyYWN0LlNpemUgPSB7IHdpZHRoOiB6b25lLndpZHRoLCBoZWlnaHQ6IHpvbmUuaGVpZ2h0IH07XG4gICAgICAvLyBBcyB0aGUgZGFzaGJvYXJkIGlzIGFjdGl2ZSwgYWxsIG90aGVyIHpvbmVzIGluIHRoZSBkYXNoYm9hcmQgYXJlIGluYWN0aXZlLlxuICAgICAgY29uc3QgaXNBY3RpdmUgPSBmYWxzZTtcblxuICAgICAgaWYgKHpvbmUuem9uZVR5cGUgPT09IERhc2hib2FyZE9iamVjdFR5cGUuV29ya3NoZWV0IHx8IHpvbmUuem9uZVR5cGUgPT09IERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXIpIHtcbiAgICAgICAgbGV0IHdvcmtzaGVldE5hbWUgPSAnJztcbiAgICAgICAgbGV0IHdvcmtzaGVldFVybCA9ICcnO1xuICAgICAgICBsZXQgaXNIaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKHpvbmUuc2hlZXRJbmZvKSB7XG4gICAgICAgICAgLy8gem9uZS5zaGVldEluZm8gd2FzIG5vdCBpbml0aWFsaXplZCBwcmlvciB0byBpbnRlcm5hbC1jb250cmFjdCAxLjYuMFxuICAgICAgICAgIHdvcmtzaGVldE5hbWUgPSB6b25lLnNoZWV0SW5mby5uYW1lO1xuXG4gICAgICAgICAgLy8gd29ya3NoZWV0VXJsICYgaXNIaWRkZW4gaXMgZm9yIEVtYmVkZGluZyBvbmx5XG4gICAgICAgICAgd29ya3NoZWV0VXJsID0gem9uZS5zaGVldEluZm8udXJsIHx8ICcnO1xuICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYSB1cmwsIHRoZW4gaXQncyBub3QgaGlkZGVuXG4gICAgICAgICAgaXNIaWRkZW4gPSB3b3Jrc2hlZXRVcmwgPT09ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdvcmtzaGVldE5hbWUgPSB6b25lLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW5kZXhlcywgaXNBY3RpdmUgYW5kIHNvbWUgbW9yZSBwcm9wZXJ0aWVzIGluIHNoZWV0SW5mb0ltcGwgYXJlIGVtYmVkZGluZyBzcGVjaWZpYy5cbiAgICAgICAgLy8gQnV0IHdlIGluaXQgdGhlbSBmb3IgYm90aCBleHRlbnNpb25zIGFuZCBlbWJlZGRpbmcgYXMgdGhlIE1vZGVscyB3aWxsIG9ubHkgdXNlIHdoYXQgaXMgcmVsZXZhbnQuXG4gICAgICAgIGNvbnN0IHNoZWV0SW5mb0ltcGwgPSBuZXcgU2hlZXRJbmZvSW1wbChcbiAgICAgICAgICB3b3Jrc2hlZXROYW1lLFxuICAgICAgICAgIFNoZWV0VHlwZS5Xb3Jrc2hlZXQsXG4gICAgICAgICAgem9uZVNpemUsXG4gICAgICAgICAgdGhpcy5fd29ya3NoZWV0c0ltcGwubGVuZ3RoLFxuICAgICAgICAgIGlzQWN0aXZlLFxuICAgICAgICAgIGlzSGlkZGVuLFxuICAgICAgICAgIHdvcmtzaGVldFVybCxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB2aXpJZDogVmlzdWFsSWQgPSB7XG4gICAgICAgICAgd29ya3NoZWV0OiB3b3Jrc2hlZXROYW1lLFxuICAgICAgICAgIGRhc2hib2FyZDogdGhpcy5fc2hlZXRJbmZvSW1wbC5uYW1lLFxuICAgICAgICAgIHN0b3J5Ym9hcmQ6IHRoaXMuX3NoZWV0UGF0aC5zdG9yeWJvYXJkLFxuICAgICAgICAgIGZsaXBib2FyZFpvbmVJRDogdGhpcy5fc2hlZXRQYXRoLmZsaXBib2FyZFpvbmVJRCxcbiAgICAgICAgICBzdG9yeVBvaW50SUQ6IHRoaXMuX3NoZWV0UGF0aC5zdG9yeVBvaW50SUQsXG4gICAgICAgIH07XG5cbiAgICAgICAgd29ya3NoZWV0SW1wbCA9IG5ldyBXb3Jrc2hlZXRJbXBsKHNoZWV0SW5mb0ltcGwsIHRoaXMuX3JlZ2lzdHJ5SWQsIHZpeklkLCB0aGlzLCB0aGlzLl9wYXJlbnRTdG9yeVBvaW50SW1wbCk7XG4gICAgICAgIGlmICh6b25lLnpvbmVUeXBlID09PSBEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldCkge1xuICAgICAgICAgIHRoaXMuX3dvcmtzaGVldHNJbXBsLnB1c2god29ya3NoZWV0SW1wbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgem9uZVBvaW50ID0gbmV3IFBvaW50KHpvbmUueCwgem9uZS55KTtcblxuICAgICAgY29uc3QgZGFzaGJvYXJkT2JqZWN0SW1wbCA9IG5ldyBEYXNoYm9hcmRPYmplY3RJbXBsKFxuICAgICAgICB0aGlzLFxuICAgICAgICBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuZGFzaGJvYXJkT2JqZWN0VHlwZS5jb252ZXJ0KHpvbmUuem9uZVR5cGUpLFxuICAgICAgICB6b25lUG9pbnQsXG4gICAgICAgIHpvbmVTaXplLFxuICAgICAgICB3b3Jrc2hlZXRJbXBsLFxuICAgICAgICB6b25lLm5hbWUsXG4gICAgICAgIHpvbmUuaXNGbG9hdGluZyAhPT0gdW5kZWZpbmVkID8gem9uZS5pc0Zsb2F0aW5nIDogZmFsc2UsIC8vIGJlZm9yZSAxLjYuMCB3ZSBkaWRuJ3QgaGF2ZSBpc0Zsb2F0aW5nLCBzbyB3ZSBhc3N1bWUgZmFsc2VcbiAgICAgICAgem9uZS5pc1Zpc2libGUgIT09IHVuZGVmaW5lZCA/IHpvbmUuaXNWaXNpYmxlIDogdHJ1ZSwgLy8gYmVmb3JlIDEuNi4wIHdlIGRpZG4ndCBoYXZlIGlzVmlzaWJsZSwgc28gd2UgYXNzdW1lIHRydWVcbiAgICAgICAgem9uZS56b25lSWQsXG4gICAgICAgIHpvbmUuZmllbGRJZCxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuX29iamVjdHMucHVzaChkYXNoYm9hcmRPYmplY3RJbXBsKTtcbiAgICAgIHRoaXMuem9uZU1hcC5zZXQoem9uZS56b25lSWQsIGRhc2hib2FyZE9iamVjdEltcGwpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXREYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5QXN5bmMoZGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcDogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcCB8IG9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHpvbmVTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFpvbmVTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuWm9uZSk7XG5cbiAgICByZXR1cm4gem9uZVNlcnZpY2Uuc2V0VmlzaWJpbGl0eUFzeW5jKC8qRGFzaGJvYXJkIE5hbWUqLyB0aGlzLm5hbWUsIHRoaXMuem9uZU1hcCwgZGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGFzaGJvYXJkT2JqZWN0QnlJZChkYXNoYm9hcmRPYmplY3RJZDogbnVtYmVyKTogRGFzaGJvYXJkT2JqZWN0SW1wbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuem9uZU1hcC5nZXQoZGFzaGJvYXJkT2JqZWN0SWQpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVpvbmVzKG5ld1pvbmVzOiBBcnJheTxEYXNoYm9hcmRab25lPiwgbmV3QWN0aXZlWm9uZUlkID0gMCwgbmV3QWN0aXZlRGFzaGJvYXJkTmFtZSA9ICcnKTogRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyB7XG4gICAgLy8gZ2V0dGluZyBwcmV2aW91cyBkYXNoYm9hcmQgb2JqZWN0cywgYWN0aXZlIHpvbmUgSUQgYW5kIGFjdGl2ZSBkYXNoYm9hcmQgbmFtZVxuICAgIGNvbnN0IG9sZERhc2hib2FyZE9iamVjdHMgPSB0aGlzLl9vYmplY3RzO1xuICAgIGNvbnN0IG9sZFpvbmVNYXAgPSB0aGlzLnpvbmVNYXA7XG4gICAgY29uc3Qgb2xkQWN0aXZlWm9uZUlkID0gdGhpcy5fYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQ7XG4gICAgY29uc3Qgb2xkQWN0aXZlRGFzaGJvYXJkTmFtZSA9IHRoaXMuX3NoZWV0UGF0aC5zaGVldE5hbWU7XG4gICAgLy8gdXBkYXRpbmcgem9uZXMgYW5kIHJlaW5pdGlhbGl6aW5nIGluc3RhbmNlIHZhcmlhYmxlc1xuICAgIHRoaXMuX3pvbmVzID0gbmV3Wm9uZXM7XG4gICAgdGhpcy5fYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQgPSBuZXdBY3RpdmVab25lSWQ7XG4gICAgaWYgKG5ld0FjdGl2ZURhc2hib2FyZE5hbWUpIHtcbiAgICAgIHRoaXMuX3NoZWV0UGF0aC5zaGVldE5hbWUgPSBuZXdBY3RpdmVEYXNoYm9hcmROYW1lO1xuICAgICAgdGhpcy5fc2hlZXRJbmZvSW1wbC5uYW1lID0gbmV3QWN0aXZlRGFzaGJvYXJkTmFtZTtcbiAgICB9XG4gICAgdGhpcy5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoKTtcbiAgICAvLyBnZXR0aW5nIG5ldyBkYXNoYm9hcmQgb2JqZWN0c1xuICAgIGNvbnN0IG5ld0Rhc2hib2FyZE9iamVjdHMgPSB0aGlzLl9vYmplY3RzO1xuICAgIGNvbnN0IG5ld1pvbmVNYXAgPSB0aGlzLnpvbmVNYXA7XG4gICAgLy8gaW5pdGlhbGl6aW5nIG1hcCBmb3IgY2hhbmdlc1xuICAgIGNvbnN0IHpvbmVDaGFuZ2VzOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzID0gbmV3IE1hcCgpO1xuXG4gICAgLy8gY29tcGFyaW5nIG9sZCBkYXNoYm9hcmQgb2JqZWN0cyB3aXRoIG5ldyBvbmVzXG4gICAgb2xkRGFzaGJvYXJkT2JqZWN0cy5mb3JFYWNoKChvbGRPYmplY3QpID0+IHtcbiAgICAgIGNvbnN0IG9sZElkOiBudW1iZXIgPSBvbGRPYmplY3QuaWQ7XG5cbiAgICAgIC8vIGNoZWNraW5nIGlmIHpvbmUgd2FzIHJlbW92ZWRcbiAgICAgIGlmICghbmV3Wm9uZU1hcC5oYXMob2xkSWQpKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLlJlbW92ZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld09iamVjdCA9IG5ld1pvbmVNYXAuZ2V0KG9sZElkKTtcbiAgICAgIGlmIChvbGRPYmplY3QuaXNGbG9hdGluZyAhPT0gbmV3T2JqZWN0IS5pc0Zsb2F0aW5nKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLklzRmxvYXRpbmdDaGFuZ2VkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZE9iamVjdC5pc1Zpc2libGUgIT09IG5ld09iamVjdCEuaXNWaXNpYmxlKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLklzVmlzaWJsZUNoYW5nZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkT2JqZWN0Lm5hbWUgIT09IG5ld09iamVjdCEubmFtZSkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5OYW1lQ2hhbmdlZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRPYmplY3QucG9zaXRpb24ueCAhPT0gbmV3T2JqZWN0IS5wb3NpdGlvbi54IHx8IG9sZE9iamVjdC5wb3NpdGlvbi55ICE9PSBuZXdPYmplY3QhLnBvc2l0aW9uLnkpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuUG9zaXRpb25DaGFuZ2VkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZE9iamVjdC5zaXplLndpZHRoICE9PSBuZXdPYmplY3QhLnNpemUud2lkdGggfHwgb2xkT2JqZWN0LnNpemUuaGVpZ2h0ICE9PSBuZXdPYmplY3QhLnNpemUuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLlNpemVDaGFuZ2VkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENoZWNraW5nIGZvciBhbnkgYWRkZWQgem9uZXNcbiAgICBuZXdEYXNoYm9hcmRPYmplY3RzLmZvckVhY2goKG5ld09iamVjdCkgPT4ge1xuICAgICAgaWYgKCFvbGRab25lTWFwLmhhcyhuZXdPYmplY3QuaWQpKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG5ld09iamVjdC5pZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5BZGRlZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDaGVja2luZyBpZiB6b25lIHNlbGVjdGlvbiBoYXMgY2hhbmdlZFxuICAgIGlmIChvbGRBY3RpdmVab25lSWQgIT09IG5ld0FjdGl2ZVpvbmVJZCkge1xuICAgICAgaWYgKG5ld0FjdGl2ZVpvbmVJZCAhPT0gMCkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShuZXdBY3RpdmVab25lSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuU2VsZWN0ZWQpO1xuICAgICAgfVxuICAgICAgaWYgKG9sZEFjdGl2ZVpvbmVJZCAhPT0gMCkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRBY3RpdmVab25lSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuRGVzZWxlY3RlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2tpbmcgaWYgc3dpdGNoZWQgdG8gYW5vdGhlciBkYXNoYm9hcmRcbiAgICBpZiAobmV3QWN0aXZlRGFzaGJvYXJkTmFtZSAmJiBvbGRBY3RpdmVEYXNoYm9hcmROYW1lICE9PSBuZXdBY3RpdmVEYXNoYm9hcmROYW1lKSB7XG4gICAgICB0aGlzLmFkZENoYW5nZSgwLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLkRhc2hib2FyZENoYW5nZWQpO1xuICAgIH1cblxuICAgIHJldHVybiB6b25lQ2hhbmdlcztcbiAgfVxuXG4gIHByaXZhdGUgYWRkQ2hhbmdlKHpvbmVJZDogbnVtYmVyLCB6b25lQ2hhbmdlczogRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscywgY2hhbmdlOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UpOiB2b2lkIHtcbiAgICBpZiAoIXpvbmVDaGFuZ2VzLmhhcyh6b25lSWQpKSB7XG4gICAgICB6b25lQ2hhbmdlcy5zZXQoem9uZUlkLCBbXSk7XG4gICAgfVxuXG4gICAgem9uZUNoYW5nZXMuZ2V0KHpvbmVJZCkhLnB1c2goY2hhbmdlKTtcbiAgfVxuXG4gIHB1YmxpYyBtb3ZlQW5kUmVzaXplRGFzaGJvYXJkT2JqZWN0c0FzeW5jKFxuICAgIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5OiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgem9uZVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Wm9uZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5ab25lKTtcblxuICAgIHJldHVybiB6b25lU2VydmljZS5tb3ZlQW5kUmVzaXplQXN5bmMoLypEYXNoYm9hcmQgTmFtZSovIHRoaXMubmFtZSwgdGhpcy56b25lTWFwLCBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSk7XG4gIH1cblxuICBwdWJsaWMgcmVwbGF5QW5pbWF0aW9uQXN5bmMocmVwbGF5U3BlZWQ6IENvbnRyYWN0LlJlcGxheVNwZWVkVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFuaW1hdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5pbWF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLkFuaW1hdGlvbik7XG5cbiAgICByZXR1cm4gYW5pbWF0aW9uU2VydmljZS5yZXBsYXlBc3luYyhyZXBsYXlTcGVlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXRPckVtYmVkZGVkSW5BY3RpdmVTdG9yeVBvaW50KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldERhc2hib2FyZEZpbHRlcnNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgb3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGU+KHVwZGF0ZVR5cGUsIENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsICdGaWx0ZXJVcGRhdGVUeXBlJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVN0cmluZ1BhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICd2YWx1ZXMgcGFyYW1ldGVyIGZvciBhcHBseURhc2hib2FyZEZpbHRlckFzeW5jIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldE9yRW1iZWRkZWRJbkFjdGl2ZVN0b3J5UG9pbnQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlEYXNoYm9hcmRGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyBAVy0xMjk4NjQzOTogcmVtb3ZlIG9uY2UgaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzIGlzIG1vdmVkIHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhpcyBjbGFzc1xuICAvLyBUaGlzIG1ldGhvZCBvbmx5IGV4aXN0cyBzaW5jZSB3b3Jrc2hlZXRzSW1wbCBjYW4gYmUgdW5kZWZpbmVkLCBidXQgd2UgbmVlZCB0aGUgd29ya3NoZWV0IG5hbWVzIGluIHRoZSBFeHBvcnQgQVBJc1xuICBwdWJsaWMgZ2V0V29ya3NoZWV0TmFtZXNGcm9tWm9uZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgY29uc3Qgd29ya3NoZWV0TmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCB6b25lIG9mIHRoaXMuX3pvbmVzKSB7XG4gICAgICBpZiAoem9uZS56b25lVHlwZSAhPT0gRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyB6b25lLnNoZWV0SW5mbyB3YXMgbm90IGluaXRpYWxpemVkIHByaW9yIHRvIGludGVybmFsLWNvbnRyYWN0IDEuNi4wXG4gICAgICBjb25zdCB3b3Jrc2hlZXROYW1lID0gem9uZS5zaGVldEluZm8gPyB6b25lLnNoZWV0SW5mby5uYW1lIDogem9uZS5uYW1lO1xuICAgICAgd29ya3NoZWV0TmFtZXMucHVzaCh3b3Jrc2hlZXROYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd29ya3NoZWV0TmFtZXM7XG4gIH1cblxuICBwcml2YXRlIHZlcmlmeUFjdGl2ZVNoZWV0T3JFbWJlZGRlZEluQWN0aXZlU3RvcnlQb2ludCgpIHtcbiAgICBjb25zdCBpc1Jvb3RBbmRBY3RpdmVEYXNoYm9hcmQgPSB0aGlzLmFjdGl2ZTtcbiAgICBjb25zdCBpc1dpdGhpbkFjdGl2ZVN0b3J5UG9pbnQgPSB0aGlzLnBhcmVudFN0b3J5UG9pbnQgIT0gbnVsbCAmJiB0aGlzLnBhcmVudFN0b3J5UG9pbnQuYWN0aXZlO1xuICAgIGlmICghaXNSb290QW5kQWN0aXZlRGFzaGJvYXJkICYmICFpc1dpdGhpbkFjdGl2ZVN0b3J5UG9pbnQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5Ob3RBY3RpdmVTaGVldCwgJ09wZXJhdGlvbiBub3QgYWxsb3dlZCBvbiBub24tYWN0aXZlIHNoZWV0Jyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRJbXBsIH0gZnJvbSAnLi9EYXNoYm9hcmRJbXBsJztcbmltcG9ydCB7IFdvcmtzaGVldEltcGwgfSBmcm9tICcuL1dvcmtzaGVldEltcGwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkYXNoYm9hcmQgb2JqZWN0cyAtIHRoZSB6b25lcyBpbiBhIGRhc2hib2FyZC5cbiAqIFRoaXMgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgaXQgaXMganVzdCBhIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIERhc2hib2FyZE9iamVjdEltcGwge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZGFzaGJvYXJkSW1wbDogRGFzaGJvYXJkSW1wbCxcbiAgICBwcml2YXRlIF90eXBlOiBEYXNoYm9hcmRPYmplY3RUeXBlLFxuICAgIHByaXZhdGUgX3Bvc2l0aW9uOiBDb250cmFjdC5Qb2ludCxcbiAgICBwcml2YXRlIF9zaXplOiBDb250cmFjdC5TaXplLFxuICAgIHByaXZhdGUgX3dvcmtzaGVldEltcGw6IFdvcmtzaGVldEltcGwgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgX2lzRmxvYXRpbmc6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNWaXNpYmxlOiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfZmllbGRJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICApIHt9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmRJbXBsKCk6IERhc2hib2FyZEltcGwge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IERhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBwb3NpdGlvbigpOiBDb250cmFjdC5Qb2ludCB7XG4gICAgcmV0dXJuIHRoaXMuX3Bvc2l0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBzaXplKCk6IENvbnRyYWN0LlNpemUge1xuICAgIHJldHVybiB0aGlzLl9zaXplO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXRJbXBsKCk6IFdvcmtzaGVldEltcGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRmxvYXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRmxvYXRpbmc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNWaXNpYmxlO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZElkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgSW50ZXJuYWxDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvblN1bW1hcnkgfSBmcm9tICcuLi9Db25uZWN0aW9uU3VtbWFyeSc7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4uL0ZpZWxkJztcbmltcG9ydCB7IExvZ2ljYWxUYWJsZSB9IGZyb20gJy4uL0xvZ2ljYWxUYWJsZSc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0RhdGFTb3VyY2VTZXJ2aWNlJztcbmltcG9ydCB7IEdldERhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvR2V0RGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgVGFibGVTdW1tYXJ5IH0gZnJvbSAnLi4vVGFibGVTdW1tYXJ5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBGaWVsZEltcGwgfSBmcm9tICcuL0ZpZWxkSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlSW1wbCB7XG4gIHByaXZhdGUgX2ZpZWxkczogQXJyYXk8RmllbGQ+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXRhU291cmNlSW5mbzogSW50ZXJuYWxDb250cmFjdC5EYXRhU291cmNlLCBwcml2YXRlIF9yZWdpc3RyeUlkOiBudW1iZXIpIHtcbiAgICB0aGlzLl9maWVsZHMgPSBfZGF0YVNvdXJjZUluZm8uZmllbGRzLm1hcCgoZmllbGRNb2RlbCkgPT4ge1xuICAgICAgY29uc3QgZmllbGRJbXBsID0gbmV3IEZpZWxkSW1wbChmaWVsZE1vZGVsLCB0aGlzKTtcbiAgICAgIHJldHVybiBuZXcgRmllbGQoZmllbGRJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXh0cmFjdFVwZGF0ZVRpbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uZXh0cmFjdFVwZGF0ZVRpbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBBcnJheTxDb250cmFjdC5GaWVsZD4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXh0cmFjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uaXNFeHRyYWN0O1xuICB9XG5cbiAgcHVibGljIGdldCBpc1B1Ymxpc2hlZCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uaXNQdWJsaXNoZWQ7XG4gIH1cblxuICBwdWJsaWMgcHVibGlzaGVkVXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbmZvLnB1Ymxpc2hlZFVybDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXhQYWdlUm93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLnJlZnJlc2hBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuQ29ubmVjdGlvblN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLmdldENvbm5lY3Rpb25TdW1tYXJpZXNBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCkudGhlbjxDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeVtdPigoc3VtbWFyaWVzKSA9PiB7XG4gICAgICByZXR1cm4gc3VtbWFyaWVzLm1hcCgoc3VtbWFyeSkgPT4gbmV3IENvbm5lY3Rpb25TdW1tYXJ5KHN1bW1hcnkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LlRhYmxlU3VtbWFyeT4+IHtcbiAgICBjb25zdCBkYXRhU291cmNlU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcblxuICAgIHJldHVybiBkYXRhU291cmNlU2VydmljZS5nZXRBY3RpdmVUYWJsZXNBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCkudGhlbjxBcnJheTxDb250cmFjdC5UYWJsZVN1bW1hcnk+PigodGFibGVJbmZvcykgPT4ge1xuICAgICAgcmV0dXJuIHRhYmxlSW5mb3MubWFwKCh0YWJsZUluZm8pID0+IG5ldyBUYWJsZVN1bW1hcnkodGFibGVJbmZvKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgZ2V0RGF0YVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHJldHVybiBnZXREYXRhU2VydmljZS5nZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgICAgdGhpcy5pZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsIC8vIDAgYW5kIFtdIGFyZSBkZWZhdWx0c1xuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlIHx8IFtdLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jKGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBnZXREYXRhU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIGdldERhdGFTZXJ2aWNlLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhcbiAgICAgIHRoaXMuaWQsXG4gICAgICBsb2dpY2FsVGFibGVJZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsIC8vIDAgYW5kIFtdIGFyZSBkZWZhdWx0c1xuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlIHx8IFtdLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIGNvbnN0IGdldERhdGFTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICByZXR1cm4gZ2V0RGF0YVNlcnZpY2UuZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgICAgdGhpcy5pZCxcbiAgICAgIGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgcGFnZVJvd0NvdW50IHx8IHRoaXMuZ2V0TWF4UGFnZVJvd0xpbWl0KCksXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcyhkYXRhU291cmNlOiBDb250cmFjdC5EYXRhU291cmNlKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUludGVybmFsVmFsdWUoZGF0YVNvdXJjZSwgJ2RhdGFTb3VyY2UnKTtcblxuICAgIHRoaXMuX2ZpZWxkcyA9IHRoaXMuX2RhdGFTb3VyY2VJbmZvLmZpZWxkcy5tYXAoKGZpZWxkTW9kZWwpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkSW1wbCA9IG5ldyBGaWVsZEltcGwoZmllbGRNb2RlbCwgZGF0YVNvdXJjZSk7XG4gICAgICByZXR1cm4gbmV3IEZpZWxkKGZpZWxkSW1wbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLmdldExvZ2ljYWxUYWJsZXNBc3luYyh0aGlzLmlkKS50aGVuPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+KChsb2dpY2FsVGFibGVJbmZvcykgPT4ge1xuICAgICAgcmV0dXJuIGxvZ2ljYWxUYWJsZUluZm9zLm1hcCgobG9naWNhbFRhYmxlSW5mbykgPT4gbmV3IExvZ2ljYWxUYWJsZShsb2dpY2FsVGFibGVJbmZvKSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcblxuZXhwb3J0IGNsYXNzIEZpZWxkSW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9maWVsZEluZm86IEludGVybmFsQ29udHJhY3QuRmllbGQsIHByaXZhdGUgX3BhcmVudERhdGFTb3VyY2U/OiBDb250cmFjdC5EYXRhU291cmNlKSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uZGVzY3JpcHRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IENvbnRyYWN0LkRhdGFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmRhdGFUeXBlID8/IENvbnRyYWN0LkRhdGFUeXBlLlVua25vd247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFnZ3JlZ2F0aW9uKCk6IENvbnRyYWN0LkZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICByZXR1cm4gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmZpZWxkQWdncmVnYXRpb25UeXBlLmNvbnZlcnQodGhpcy5fZmllbGRJbmZvLmFnZ3JlZ2F0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVNvdXJjZSgpOiBDb250cmFjdC5EYXRhU291cmNlIHtcbiAgICBpZiAoIXRoaXMuX3BhcmVudERhdGFTb3VyY2UpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEYXRhIHNvdXJjZSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGlzIGZpZWxkLiBQbGVhc2UgdXNlIGdldEZpZWxkQXN5bmMgbWV0aG9kIHRvIGdldCBmaWVsZCdzIGRhdGEgc291cmNlIGluZm9ybWF0aW9uYCxcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudERhdGFTb3VyY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJvbGUoKTogQ29udHJhY3QuRmllbGRSb2xlVHlwZSB7XG4gICAgcmV0dXJuIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5maWVsZFJvbGVUeXBlLmNvbnZlcnQodGhpcy5fZmllbGRJbmZvLnJvbGUpO1xuICB9XG5cbiAgcHVibGljIGdldCBjb2x1bW5UeXBlKCk6IENvbnRyYWN0LkNvbHVtblR5cGUge1xuICAgIGxldCBkZWZpbmVkVmFsdWU6IEludGVybmFsQ29udHJhY3QuQ29sdW1uVHlwZSA9IHRoaXMuX2ZpZWxkSW5mby5jb2x1bW5UeXBlIHx8IEludGVybmFsQ29udHJhY3QuQ29sdW1uVHlwZS5Vbmtub3duO1xuICAgIHJldHVybiBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuY29sdW1uVHlwZS5jb252ZXJ0KGRlZmluZWRWYWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ2FsY3VsYXRlZEZpZWxkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNDYWxjdWxhdGVkRmllbGQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ29tYmluZWRGaWVsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlzQ29tYmluZWRGaWVsZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNHZW5lcmF0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc0dlbmVyYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNHZW9zcGF0aWFsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNHZW9zcGF0aWFsO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0hpZGRlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlzSGlkZGVuO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1ByZXNlbnRPblB1Ymxpc2hlZERhdGFzb3VyY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc1ByZXNlbnRPblB1Ymxpc2hlZERhdGFzb3VyY2U7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhVHlwZSwgUGFyYW1ldGVyVmFsdWVUeXBlLCBQZXJpb2RUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFBhcmFtZXRlckluZm8gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBEYXRhVmFsdWUgfSBmcm9tICcuLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1BhcmFtZXRlcnNTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IERhdGFWYWx1ZUZhY3RvcnkgfSBmcm9tICcuLi9VdGlscy9EYXRhVmFsdWVGYWN0b3J5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uL1V0aWxzL1BhcmFtJztcblxuZXhwb3J0IGNsYXNzIFBhcmFtZXRlckltcGwge1xuICBwcml2YXRlIF9hbGxvd2FibGVWYWx1ZXM6IENvbnRyYWN0LlBhcmFtZXRlckRvbWFpblJlc3RyaWN0aW9uO1xuICBwcml2YXRlIF9nbG9iYWxGaWVsZE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfcGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbztcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbywgcHJpdmF0ZSBfcmVnaXN0cnlJZDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQYXJhbWV0ZXJJbmZvKHBhcmFtZXRlckluZm8pO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlckluZm8ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFZhbHVlKCk6IERhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVBhcmFtZXRlckRhdGFWYWx1ZSh0aGlzLl9wYXJhbWV0ZXJJbmZvLmN1cnJlbnRWYWx1ZSwgdGhpcy5fcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IERhdGFUeXBlIHtcbiAgICByZXR1cm4gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmRhdGFUeXBlLmNvbnZlcnQodGhpcy5fcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2dsb2JhbEZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWxsb3dhYmxlVmFsdWVzKCk6IENvbnRyYWN0LlBhcmFtZXRlckRvbWFpblJlc3RyaWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dhYmxlVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVZhbHVlQXN5bmMobmV3VmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlKTogUHJvbWlzZTxEYXRhVmFsdWU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKG5ld1ZhbHVlLCAnbmV3VmFsdWUnKTtcblxuICAgIGNvbnN0IGNvZXJjZWRWYWx1ZSA9IFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKG5ld1ZhbHVlKTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBwYXJhbWV0ZXJzU2VydmljZS5jaGFuZ2VQYXJhbWV0ZXJWYWx1ZUFzeW5jKHRoaXMuX2dsb2JhbEZpZWxkTmFtZSwgY29lcmNlZFZhbHVlKS50aGVuKChwYXJhbWV0ZXJJbmZvKSA9PiB7XG4gICAgICB0aGlzLnNldFBhcmFtZXRlckluZm8ocGFyYW1ldGVySW5mbyk7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50VmFsdWU7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldFBhcmFtZXRlckluZm8ocGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbyk6IHZvaWQge1xuICAgIHRoaXMuX3BhcmFtZXRlckluZm8gPSBwYXJhbWV0ZXJJbmZvO1xuICAgIHRoaXMuX2dsb2JhbEZpZWxkTmFtZSA9IHBhcmFtZXRlckluZm8uZmllbGROYW1lO1xuXG4gICAgY29uc3QgdHlwZSA9IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5hbGxvd2FibGVWYWx1ZXMuY29udmVydChwYXJhbWV0ZXJJbmZvLmFsbG93YWJsZVZhbHVlc1R5cGUpO1xuICAgIGxldCBsaXN0VmFsdWVzOiBBcnJheTxEYXRhVmFsdWU+IHwgdW5kZWZpbmVkO1xuICAgIGxldCBtaW5WYWx1ZTogRGF0YVZhbHVlIHwgdW5kZWZpbmVkO1xuICAgIGxldCBtYXhWYWx1ZTogRGF0YVZhbHVlIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdGVwU2l6ZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGxldCBkYXRlU3RlcFBlcmlvZDogUGVyaW9kVHlwZSB8IHVuZGVmaW5lZDtcblxuICAgIGlmICh0eXBlID09PSBQYXJhbWV0ZXJWYWx1ZVR5cGUuTGlzdCkge1xuICAgICAgY29uc3QgdmFsdWVzID0gcGFyYW1ldGVySW5mby5hbGxvd2FibGVWYWx1ZXMgfHwgW107XG4gICAgICBsaXN0VmFsdWVzID0gdmFsdWVzLm1hcCgodmFsKSA9PiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUodmFsLCBwYXJhbWV0ZXJJbmZvLmRhdGFUeXBlKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBQYXJhbWV0ZXJWYWx1ZVR5cGUuUmFuZ2UpIHtcbiAgICAgIG1pblZhbHVlID0gcGFyYW1ldGVySW5mby5taW5WYWx1ZSAmJiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUocGFyYW1ldGVySW5mby5taW5WYWx1ZSwgcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gICAgICBtYXhWYWx1ZSA9IHBhcmFtZXRlckluZm8ubWF4VmFsdWUgJiYgRGF0YVZhbHVlRmFjdG9yeS5NYWtlUGFyYW1ldGVyRGF0YVZhbHVlKHBhcmFtZXRlckluZm8ubWF4VmFsdWUsIHBhcmFtZXRlckluZm8uZGF0YVR5cGUpO1xuICAgICAgc3RlcFNpemUgPSBwYXJhbWV0ZXJJbmZvLnN0ZXBTaXplO1xuICAgICAgZGF0ZVN0ZXBQZXJpb2QgPSBwYXJhbWV0ZXJJbmZvLmRhdGVTdGVwUGVyaW9kICYmIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5kYXRlU3RlcFBlcmlvZC5jb252ZXJ0KHBhcmFtZXRlckluZm8uZGF0ZVN0ZXBQZXJpb2QpO1xuICAgIH1cblxuICAgIHRoaXMuX2FsbG93YWJsZVZhbHVlcyA9IHtcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBhbGxvd2FibGVWYWx1ZXM6IGxpc3RWYWx1ZXMsXG4gICAgICBtaW5WYWx1ZTogbWluVmFsdWUsXG4gICAgICBtYXhWYWx1ZTogbWF4VmFsdWUsXG4gICAgICBzdGVwU2l6ZTogc3RlcFNpemUsXG4gICAgICBkYXRlU3RlcFBlcmlvZDogZGF0ZVN0ZXBQZXJpb2QsXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNoZWV0UGF0aCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDbGllbnRJbmZvU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0NsaWVudEluZm9TZXJ2aWNlJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvUGFyYW1ldGVyc1NlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2l6ZVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9TaXplU2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi4vVXRpbHMvUGFyYW0nO1xuaW1wb3J0IHsgU2hlZXRVdGlscyB9IGZyb20gJy4uL1V0aWxzL1NoZWV0VXRpbHMnO1xuaW1wb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4vUGFyYW1ldGVySW1wbCc7XG5pbXBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9TaGVldEluZm9JbXBsJztcblxuaW50ZXJmYWNlIFBhcnRpYWxTaGVldFNpemUge1xuICAvKipcbiAgICogQ29udGFpbnMgYW4gZW51bWVyYXRpb24gdmFsdWUgb2Ygb25lIG9mIHRoZSBmb2xsb3dpbmc6IEFVVE9NQVRJQywgRVhBQ1RMWSwgUkFOR0UsIEFUTEVBU1QsIGFuZCBBVE1PU1QuXG4gICAqL1xuICByZWFkb25seSBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqICBUaGlzIGlzIG9ubHkgZGVmaW5lZCB3aGVuIGJlaGF2aW9yIGlzIEVYQUNUTFksIFJBTkdFLCBvciBBVExFQVNULlxuICAgKi9cbiAgcmVhZG9ubHkgbWluU2l6ZT86IFBhcnRpYWw8Q29udHJhY3QuU2l6ZT47XG5cbiAgLyoqXG4gICAqICBUaGlzIGlzIG9ubHkgZGVmaW5lZCB3aGVuIGJlaGF2aW9yIGlzIEVYQUNUTFksIFJBTkdFIG9yIEFUTU9TVC5cbiAgICovXG4gIHJlYWRvbmx5IG1heFNpemU/OiBQYXJ0aWFsPENvbnRyYWN0LlNpemU+O1xufVxuXG5leHBvcnQgY2xhc3MgU2hlZXRJbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfc2hlZXRJbmZvSW1wbDogU2hlZXRJbmZvSW1wbCwgcHJvdGVjdGVkIF9yZWdpc3RyeUlkOiBudW1iZXIpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hlZXRUeXBlKCk6IENvbnRyYWN0LlNoZWV0VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuc2hlZXRUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFBhdGgoKTogU2hlZXRQYXRoIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5zaGVldFBhdGg7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpemUoKTogQ29udHJhY3QuU2l6ZSB8IENvbnRyYWN0LlNoZWV0U2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuc2hlZXRTaXplO1xuICB9XG5cbiAgcHVibGljIGdldCBoaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX3NoZWV0SW5mb0ltcGwuaXNIaWRkZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuaXNIaWRkZW47XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgaXNIaWRkZW4gbm90IGltcGxlbWVudGVkYCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fc2hlZXRJbmZvSW1wbC5pc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5pc0FjdGl2ZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBhY3RpdmUgbm90IGltcGxlbWVudGVkYCk7XG4gIH1cblxuICBwdWJsaWMgc2V0IGFjdGl2ZShhY3RpdmU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5fc2hlZXRJbmZvSW1wbC5pc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9zaGVldEluZm9JbXBsLmFjdGl2ZSA9IGFjdGl2ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX3NoZWV0SW5mb0ltcGwuaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuaW5kZXg7XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgaW5kZXggbm90IGltcGxlbWVudGVkYCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl9zaGVldEluZm9JbXBsLnVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC51cmw7XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgdXJsIG5vdCBpbXBsZW1lbnRlZGApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTaGVldFNpemUoKTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBpZiAoIVNoZWV0VXRpbHMuaXNWYWxpZFNoZWV0U2l6ZSh0aGlzLnNpemUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3NpemUgaXMgbm90IG9mIHR5cGUgU2hlZXRTaXplJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQXN5bmMocGFyYW1ldGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTxQYXJhbWV0ZXJJbXBsIHwgdW5kZWZpbmVkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lLCAncGFyYW1ldGVyTmFtZScpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBzZXJ2aWNlLmZpbmRQYXJhbWV0ZXJCeU5hbWVBc3luYyhwYXJhbWV0ZXJOYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxQYXJhbWV0ZXJJbXBsPj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8UGFyYW1ldGVyc1NlcnZpY2U+KFNlcnZpY2VOYW1lcy5QYXJhbWV0ZXJzKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRQYXJhbWV0ZXJzRm9yU2hlZXRBc3luYyh0aGlzLnNoZWV0UGF0aCk7XG4gIH1cblxuICBwdWJsaWMgY2hhbmdlU2l6ZUFzeW5jKG5ld1NpemU6IENvbnRyYWN0LlNoZWV0U2l6ZSk6IFByb21pc2U8Q29udHJhY3QuU2hlZXRTaXplPiB7XG4gICAgY29uc3QgaW52YWxpZFNpemVFcnJvciA9IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkU2l6ZSwgJ0ludmFsaWQgc2hlZXQgc2l6ZSBwYXJhbWV0ZXInKTtcbiAgICBpZiAoIW5ld1NpemUgfHwgIW5ld1NpemUuYmVoYXZpb3IpIHtcbiAgICAgIHRocm93IGludmFsaWRTaXplRXJyb3I7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydGlhbFNoZWV0U2l6ZSA9IHRoaXMubm9ybWFsaXplU2hlZXRTaXplKG5ld1NpemUpO1xuXG4gICAgY29uc3QgaXNBdXRvbWF0aWMgPSBwYXJ0aWFsU2hlZXRTaXplLmJlaGF2aW9yID09PSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWM7XG4gICAgaWYgKCFpc0F1dG9tYXRpYyAmJiAhcGFydGlhbFNoZWV0U2l6ZS5taW5TaXplICYmICFwYXJ0aWFsU2hlZXRTaXplLm1heFNpemUpIHtcbiAgICAgIHRocm93IGludmFsaWRTaXplRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKCFpc0F1dG9tYXRpYyAmJiB0aGlzLnNoZWV0VHlwZSA9PT0gQ29udHJhY3QuU2hlZXRUeXBlLldvcmtzaGVldCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkU2l6ZUJlaGF2aW9yT25Xb3Jrc2hlZXQsXG4gICAgICAgICdPbmx5IFNoZWV0U2l6ZUJlaGF2aW9yLkF1dG9tYXRpYyBpcyBhbGxvd2VkIG9uIFdvcmtzaGVldHMnLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNBdXRvbWF0aWMgJiYgdGhpcy5nZXRTaGVldFNpemUoKS5iZWhhdmlvciA9PT0gcGFydGlhbFNoZWV0U2l6ZS5iZWhhdmlvcikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXdTaXplKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9jZXNzZWROZXdTaXplID0gdGhpcy5wcm9jZXNzTmV3U2l6ZShwYXJ0aWFsU2hlZXRTaXplKTtcblxuICAgIGNvbnN0IHNpemVTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNpemVTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2l6ZSk7XG4gICAgcmV0dXJuIHNpemVTZXJ2aWNlLmNoYW5nZVNpemVBc3luYyh0aGlzLm5hbWUsIHByb2Nlc3NlZE5ld1NpemUpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgY2xpZW50SW5mb1NlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Q2xpZW50SW5mb1NlcnZpY2U+KFNlcnZpY2VOYW1lcy5DbGllbnRJbmZvKTtcblxuICAgICAgcmV0dXJuIGNsaWVudEluZm9TZXJ2aWNlLmdldENsaWVudEluZm9Bc3luYygpLnRoZW4oKGJvb3RzdHJhcEluZm8pID0+IHtcbiAgICAgICAgY29uc3Qgc2hlZXQgPSBib290c3RyYXBJbmZvLnB1Ymxpc2hlZFNoZWV0cy5maW5kKChzKSA9PiBzLm5hbWUgPT09IHRoaXMubmFtZSk7XG4gICAgICAgIGlmICghc2hlZXQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYENhbid0IGZpbmQgc2hlZXQgd2l0aCBuYW1lICR7dGhpcy5uYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2hlZXRTaXplID0gU2hlZXRVdGlscy5nZXRTaGVldFNpemVGcm9tU2l6ZUNvbnN0cmFpbnRzKHNoZWV0LnNpemVDb25zdHJhaW50KTtcbiAgICAgICAgdGhpcy5fc2hlZXRJbmZvSW1wbC5zaGVldFNpemUgPSBzaGVldFNpemU7XG5cbiAgICAgICAgcmV0dXJuIHNoZWV0U2l6ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVTaGVldFNpemUobmV3U2l6ZTogQ29udHJhY3QuU2hlZXRTaXplKTogUGFydGlhbFNoZWV0U2l6ZSB7XG4gICAgY29uc3QgeyBiZWhhdmlvciB9ID0gbmV3U2l6ZTtcblxuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3I+KGJlaGF2aW9yLCBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvciwgJ1NoZWV0U2l6ZUJlaGF2aW9yJyk7XG5cbiAgICBjb25zdCBtaW5TaXplID0gU2hlZXRJbXBsLnBhcnNlRGltZW5zaW9ucyhuZXdTaXplLm1pblNpemUpO1xuICAgIGNvbnN0IG1heFNpemUgPSBTaGVldEltcGwucGFyc2VEaW1lbnNpb25zKG5ld1NpemUubWF4U2l6ZSk7XG5cbiAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSwgbWF4U2l6ZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzTmV3U2l6ZShuZXdTaXplOiBQYXJ0aWFsU2hlZXRTaXplKTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBjb25zdCB7IGJlaGF2aW9yLCBtaW5TaXplOiBtaW5TaXplTWF5YmUsIG1heFNpemU6IG1heFNpemVNYXliZSB9ID0gbmV3U2l6ZTtcblxuICAgIGNvbnN0IGhhc01pbldpZHRoID0gIVBhcmFtLmlzTnVsbE9yVW5kZWZpbmVkKG1pblNpemVNYXliZT8ud2lkdGgpO1xuICAgIGNvbnN0IGhhc01pbkhlaWdodCA9ICFQYXJhbS5pc051bGxPclVuZGVmaW5lZChtaW5TaXplTWF5YmU/LmhlaWdodCk7XG4gICAgY29uc3QgaGFzTWF4V2lkdGggPSAhUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQobWF4U2l6ZU1heWJlPy53aWR0aCk7XG4gICAgY29uc3QgaGFzTWF4SGVpZ2h0ID0gIVBhcmFtLmlzTnVsbE9yVW5kZWZpbmVkKG1heFNpemVNYXliZT8uaGVpZ2h0KTtcbiAgICBjb25zdCBoYXNWYWxpZE1pblNpemUgPSBoYXNNaW5XaWR0aCAmJiBoYXNNaW5IZWlnaHQ7XG4gICAgY29uc3QgaGFzVmFsaWRNYXhTaXplID0gaGFzTWF4V2lkdGggJiYgaGFzTWF4SGVpZ2h0O1xuXG4gICAgc3dpdGNoIChiZWhhdmlvcikge1xuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWM6IHtcbiAgICAgICAgcmV0dXJuIHsgYmVoYXZpb3IgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdE1vc3Q6IHtcbiAgICAgICAgaWYgKCFtYXhTaXplTWF5YmUgfHwgIWhhc1ZhbGlkTWF4U2l6ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5NaXNzaW5nTWF4U2l6ZSwgJ01pc3NpbmcgbWF4U2l6ZSBmb3IgU2hlZXRTaXplQmVoYXZpb3IuQXRNb3N0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXhTaXplID0geyB3aWR0aDogbWF4U2l6ZU1heWJlLndpZHRoISwgaGVpZ2h0OiBtYXhTaXplTWF5YmUuaGVpZ2h0ISB9O1xuICAgICAgICBpZiAobWF4U2l6ZS53aWR0aCA8IDAgfHwgbWF4U2l6ZS5oZWlnaHQgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnU2l6ZSB2YWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtYXhTaXplIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuQXRMZWFzdDoge1xuICAgICAgICBpZiAoIW1pblNpemVNYXliZSB8fCAhaGFzVmFsaWRNaW5TaXplKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLk1pc3NpbmdNaW5TaXplLCAnTWlzc2luZyBtaW5TaXplIGZvciBTaGVldFNpemVCZWhhdmlvci5BdExlYXN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtaW5TaXplID0geyB3aWR0aDogbWluU2l6ZU1heWJlLndpZHRoISwgaGVpZ2h0OiBtaW5TaXplTWF5YmUuaGVpZ2h0ISB9O1xuICAgICAgICBpZiAobWluU2l6ZS53aWR0aCA8IDAgfHwgbWluU2l6ZS5oZWlnaHQgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnU2l6ZSB2YWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2U6IHtcbiAgICAgICAgaWYgKCFtaW5TaXplTWF5YmUgfHwgIW1heFNpemVNYXliZSB8fCAhaGFzVmFsaWRNaW5TaXplIHx8ICFoYXNWYWxpZE1heFNpemUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuTWlzc2luZ01pbk1heFNpemUsICdNaXNzaW5nIG1pblNpemUgb3IgbWF4U2l6ZSBmb3IgU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1pblNpemUgPSB7IHdpZHRoOiBtaW5TaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1pblNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgIGNvbnN0IG1heFNpemUgPSB7IHdpZHRoOiBtYXhTaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1heFNpemVNYXliZS5oZWlnaHQhIH07XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1pblNpemUud2lkdGggPCAwIHx8XG4gICAgICAgICAgbWluU2l6ZS5oZWlnaHQgPCAwIHx8XG4gICAgICAgICAgbWF4U2l6ZS53aWR0aCA8IDAgfHxcbiAgICAgICAgICBtYXhTaXplLmhlaWdodCA8IDAgfHxcbiAgICAgICAgICBtaW5TaXplLndpZHRoID4gbWF4U2l6ZS53aWR0aCB8fFxuICAgICAgICAgIG1pblNpemUuaGVpZ2h0ID4gbWF4U2l6ZS5oZWlnaHRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnTWlzc2luZyBtaW5TaXplIG9yIG1heFNpemUgZm9yIFNoZWV0U2l6ZUJlaGF2aW9yLlJhbmdlJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSwgbWF4U2l6ZSB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlIENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLkV4YWN0bHk6IHtcbiAgICAgICAgaWYgKG1pblNpemVNYXliZSAmJiBtYXhTaXplTWF5YmUpIHtcbiAgICAgICAgICBpZiAoaGFzVmFsaWRNaW5TaXplICYmIGhhc1ZhbGlkTWF4U2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgbWluU2l6ZSA9IHsgd2lkdGg6IG1pblNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWluU2l6ZU1heWJlLmhlaWdodCEgfTtcbiAgICAgICAgICAgIGNvbnN0IG1heFNpemUgPSB7IHdpZHRoOiBtYXhTaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1heFNpemVNYXliZS5oZWlnaHQhIH07XG5cbiAgICAgICAgICAgIGlmIChtaW5TaXplLndpZHRoICE9PSBtYXhTaXplLndpZHRoIHx8IG1pblNpemUuaGVpZ2h0ICE9PSBtYXhTaXplLmhlaWdodCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW52YWxpZFNpemUsICdDb25mbGljdGluZyBzaXplIHZhbHVlcyBmb3IgU2hlZXRTaXplQmVoYXZpb3IuRXhhY3RseScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSwgbWF4U2l6ZSB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNWYWxpZE1pblNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pblNpemUgPSB7IHdpZHRoOiBtaW5TaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1pblNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSwgbWF4U2l6ZTogbWluU2l6ZSB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNWYWxpZE1heFNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1heFNpemUgPSB7IHdpZHRoOiBtYXhTaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1heFNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZTogbWF4U2l6ZSwgbWF4U2l6ZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkU2l6ZSwgJ0ludmFsaWQgc2hlZXQgc2l6ZSBwYXJhbWV0ZXInKTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFVuc3VwcG9ydGVkIHNoZWV0IHNpemUgYmVoYXZpb3I6ICR7YmVoYXZpb3J9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VEaW1lbnNpb25zID0gKHNpemU6IENvbnRyYWN0LlNpemUgfCB1bmRlZmluZWQpOiBQYXJ0aWFsPENvbnRyYWN0LlNpemU+ID0+IHtcbiAgICBjb25zdCBlbXB0eSA9IHsgd2lkdGg6IHVuZGVmaW5lZCwgaGVpZ2h0OiB1bmRlZmluZWQgfTtcblxuICAgIGlmICghc2l6ZSkge1xuICAgICAgcmV0dXJuIGVtcHR5O1xuICAgIH1cblxuICAgIGNvbnN0IHsgc3VjY2Vzczogd2lkdGhQYXJzZWQsIHBhcnNlZDogcGFyc2VkV2lkdGggfSA9IFBhcmFtLnRyeVBhcnNlTnVtYmVyKHNpemUud2lkdGgpO1xuICAgIGNvbnN0IHsgc3VjY2VzczogaGVpZ2h0UGFyc2VkLCBwYXJzZWQ6IHBhcnNlZEhlaWdodCB9ID0gUGFyYW0udHJ5UGFyc2VOdW1iZXIoc2l6ZS5oZWlnaHQpO1xuXG4gICAgaWYgKHdpZHRoUGFyc2VkICYmIGhlaWdodFBhcnNlZCkge1xuICAgICAgcmV0dXJuIHsgd2lkdGg6IHBhcnNlZFdpZHRoISwgaGVpZ2h0OiBwYXJzZWRIZWlnaHQhIH07XG4gICAgfVxuXG4gICAgaWYgKHdpZHRoUGFyc2VkKSB7XG4gICAgICByZXR1cm4geyB3aWR0aDogcGFyc2VkV2lkdGghIH07XG4gICAgfVxuXG4gICAgaWYgKGhlaWdodFBhcnNlZCkge1xuICAgICAgcmV0dXJuIHsgaGVpZ2h0OiBwYXJzZWRIZWlnaHQhIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGVtcHR5O1xuICB9O1xufVxuIiwiaW1wb3J0IHsgU2hlZXRTaXplIGFzIEVtYmVkZGluZ1NoZWV0U2l6ZSwgU2l6ZSBhcyBFeHRlbnNpb25TaGVldFNpemUsIFNoZWV0VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaGVldFBhdGggfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgU2hlZXRJbmZvSW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9uYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfc2hlZXRUeXBlOiBTaGVldFR5cGUsXG4gICAgcHJpdmF0ZSBfc2hlZXRTaXplOiBFeHRlbnNpb25TaGVldFNpemUgfCBFbWJlZGRpbmdTaGVldFNpemUsXG4gICAgcHJpdmF0ZSBfaW5kZXg/OiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfaXNBY3RpdmU/OiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lzSGlkZGVuPzogYm9vbGVhbixcbiAgICBwcml2YXRlIF91cmw/OiBzdHJpbmcsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbmFtZShzaGVldE5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuX25hbWUgPSBzaGVldE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0U2l6ZSgpOiBFeHRlbnNpb25TaGVldFNpemUgfCBFbWJlZGRpbmdTaGVldFNpemUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldFNpemU7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNoZWV0U2l6ZSh2YWx1ZTogRXh0ZW5zaW9uU2hlZXRTaXplIHwgRW1iZWRkaW5nU2hlZXRTaXplKSB7XG4gICAgdGhpcy5fc2hlZXRTaXplID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0VHlwZSgpOiBTaGVldFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0UGF0aCgpOiBTaGVldFBhdGgge1xuICAgIHJldHVybiB7XG4gICAgICBzaGVldE5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGlzRGFzaGJvYXJkOiB0aGlzLnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICAgIC8vIFRPRE8gLSBTdG9yaWVzXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faW5kZXg7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQWN0aXZlKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc0FjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgYWN0aXZlKGFjdGl2ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzQWN0aXZlID0gYWN0aXZlO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0hpZGRlbigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXNIaWRkZW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVybCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91cmw7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlciB9IGZyb20gJy4uL1NpbmdsZUV2ZW50TWFuYWdlcic7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBTaW5nbGVFdmVudE1hbmFnZXIgaW50ZXJmYWNlIGZvciBhIHNpbmdsZSB0eXBlIG9mIFRhYmxlYXUgZXZlbnRcbiAqXG4gKiBAdGVtcGxhdGUgVEV2ZW50VHlwZSBUaGUgVGFibGVhdSBldmVudCB0eXBlIHRoaXMgY2xhc3Mgc3BlY2lhbGl6ZXNcbiAqL1xuZXhwb3J0IGNsYXNzIFNpbmdsZUV2ZW50TWFuYWdlckltcGw8VEV2ZW50VHlwZSBleHRlbmRzIENvbnRyYWN0LlRhYmxlYXVFdmVudD4gaW1wbGVtZW50cyBTaW5nbGVFdmVudE1hbmFnZXIge1xuICBwcml2YXRlIF9ldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGU7XG4gIHByaXZhdGUgX2hhbmRsZXJzOiBBcnJheTwoZXZlbnRPYmo6IFRFdmVudFR5cGUpID0+IHZvaWQ+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGUpIHtcbiAgICB0aGlzLl9ldmVudFR5cGUgPSBldmVudFR5cGU7XG4gICAgdGhpcy5faGFuZGxlcnMgPSBbXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXZlbnRUeXBlKCk6IFRhYmxlYXVFdmVudFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9ldmVudFR5cGU7XG4gIH1cblxuICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcihoYW5kbGVyOiAoZXZlbnRPYmo6IFRFdmVudFR5cGUpID0+IHZvaWQpOiBDb250cmFjdC5UYWJsZWF1RXZlbnRVbnJlZ2lzdGVyRm4ge1xuICAgIHRoaXMuX2hhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gICAgcmV0dXJuICgpID0+IHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihoYW5kbGVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVFdmVudExpc3RlbmVyKGhhbmRsZXI6IChldmVudE9iajogVEV2ZW50VHlwZSkgPT4gdm9pZCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJlZm9yZUNvdW50ID0gdGhpcy5faGFuZGxlcnMubGVuZ3RoO1xuICAgIHRoaXMuX2hhbmRsZXJzID0gdGhpcy5faGFuZGxlcnMuZmlsdGVyKChoKSA9PiBoICE9PSBoYW5kbGVyKTtcbiAgICByZXR1cm4gYmVmb3JlQ291bnQgPiB0aGlzLl9oYW5kbGVycy5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgdHJpZ2dlckV2ZW50KGV2ZW50R2VuZXJhdG9yOiAoKSA9PiBURXZlbnRUeXBlKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHRoaXMuX2hhbmRsZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBldmVudE1vZGVsID0gZXZlbnRHZW5lcmF0b3IoKTtcbiAgICAgICAgaGFuZGxlcihldmVudE1vZGVsKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gU2luY2UgdGhpcyBoYW5kbGVyIGNvdWxkIGJlIG91dHNpZGUgb3VyIGNvbnRyb2wsIGp1c3QgY2F0Y2ggYW55dGhpbmcgaXQgdGhyb3dzIGFuZCBjb250aW51ZSBvblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaGVldEluZm8sIFN0b3J5TW9kZWwsIFN0b3J5UG9pbnRNb2RlbCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvU3RvcnlBY3RpdmF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFNob3J0TGl2ZWREZWZlcnJlZCB9IGZyb20gJy4uL1V0aWxzL1Nob3J0TGl2ZWREZWZlcnJlZCc7XG5pbXBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL1NoZWV0SW1wbCc7XG5pbXBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9TaGVldEluZm9JbXBsJztcbmltcG9ydCB7IFN0b3J5UG9pbnRJbXBsIH0gZnJvbSAnLi9TdG9yeVBvaW50SW1wbCc7XG5pbXBvcnQgeyBTdG9yeVBvaW50SW5mb0ltcGwgfSBmcm9tICcuL1N0b3J5UG9pbnRJbmZvSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBTdG9yeUltcGwgZXh0ZW5kcyBTaGVldEltcGwge1xuICBwcml2YXRlIF9hY3RpdmVTdG9yeVBvaW50SW1wbDogU3RvcnlQb2ludEltcGw7XG4gIHByaXZhdGUgX3N0b3J5UG9pbnRJbmZvSW1wbHM6IEFycmF5PFN0b3J5UG9pbnRJbmZvSW1wbD4gPSBbXTtcbiAgcHJpdmF0ZSBfZGVmZXJyZWQ6IFNob3J0TGl2ZWREZWZlcnJlZDxTdG9yeVBvaW50SW1wbD47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBfc2hlZXRJbmZvSW1wbDogU2hlZXRJbmZvSW1wbCxcbiAgICBzdG9yeU1vZGVsOiBTdG9yeU1vZGVsLFxuICAgIHByaXZhdGUgX3B1Ymxpc2hlZFNoZWV0SW5mb3M6IEFycmF5PFNoZWV0SW5mbz4sXG4gICAgcHJvdGVjdGVkIF9yZWdpc3RyeUlkOiBudW1iZXIsXG4gICkge1xuICAgIHN1cGVyKF9zaGVldEluZm9JbXBsLCBfcmVnaXN0cnlJZCk7XG4gICAgdGhpcy5fZGVmZXJyZWQgPSBuZXcgU2hvcnRMaXZlZERlZmVycmVkPFN0b3J5UG9pbnRJbXBsPigpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVN0b3J5KHN0b3J5TW9kZWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU3Rvcnkoc3RvcnlNb2RlbDogU3RvcnlNb2RlbCkge1xuICAgIHN0b3J5TW9kZWwuc3RvcnlQb2ludHMuZm9yRWFjaCgoc3RvcnlQb2ludE1vZGVsKSA9PiB7XG4gICAgICBjb25zdCBpc0FjdGl2ZSA9IHN0b3J5UG9pbnRNb2RlbC5pbmRleCA9PT0gc3RvcnlNb2RlbC5hY3RpdmVTdG9yeVBvaW50SW5kZXg7XG4gICAgICBjb25zdCBzdG9yeVBvaW50SW5mb0ltcGwgPSBuZXcgU3RvcnlQb2ludEluZm9JbXBsKFxuICAgICAgICBzdG9yeVBvaW50TW9kZWwuY2FwdGlvbixcbiAgICAgICAgc3RvcnlQb2ludE1vZGVsLmluZGV4LFxuICAgICAgICBzdG9yeVBvaW50TW9kZWwuc3RvcnlQb2ludElkLFxuICAgICAgICBpc0FjdGl2ZSxcbiAgICAgICAgc3RvcnlQb2ludE1vZGVsLnVwZGF0ZWQsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgICAgdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5wdXNoKHN0b3J5UG9pbnRJbmZvSW1wbCk7XG5cbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICB0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbCA9IG5ldyBTdG9yeVBvaW50SW1wbChcbiAgICAgICAgICBzdG9yeVBvaW50SW5mb0ltcGwsXG4gICAgICAgICAgdGhpcy5fcHVibGlzaGVkU2hlZXRJbmZvcyxcbiAgICAgICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgICAgIHN0b3J5UG9pbnRNb2RlbC5jb250YWluZWRTaGVldEluZm8sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0b3J5SW5mbyhpbmRleDogbnVtYmVyLCBzdG9yeVBvaW50TW9kZWw6IFN0b3J5UG9pbnRNb2RlbCkge1xuICAgIGlmICghdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBzdG9yeUluZm9JbXBsID0gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsc1tpbmRleF07XG4gICAgaWYgKHN0b3J5SW5mb0ltcGwuc3RvcnlQb2ludElkICE9PSBzdG9yeVBvaW50TW9kZWwuc3RvcnlQb2ludElkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLlN0b3J5UG9pbnRJZE1pc21hdGNoLFxuICAgICAgICBgV2Ugc2hvdWxkIG5vdCBiZSB1cGRhdGluZyBhIHN0b3J5IHBvaW50IHdoZW4gdGhlIElEcyBkb24ndCBtYXRjaC4gRXhpc3Rpbmcgc3RvcnlQb2ludElEPSR7c3RvcnlJbmZvSW1wbC5zdG9yeVBvaW50SWR9LCBuZXdTdG9yeVBvaW50SUQ9JHtzdG9yeVBvaW50TW9kZWwuc3RvcnlQb2ludElkfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBzdG9yeUluZm9JbXBsLmNhcHRpb24gPSBzdG9yeVBvaW50TW9kZWwuY2FwdGlvbjtcbiAgICBzdG9yeUluZm9JbXBsLnVwZGF0ZWQgPSBzdG9yeVBvaW50TW9kZWwudXBkYXRlZDtcblxuICAgIGlmICh0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbC5zdG9yeVBvaW50SWQgPT09IHN0b3J5UG9pbnRNb2RlbC5zdG9yeVBvaW50SWQpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsLnVwZGF0ZWQgPSBzdG9yeUluZm9JbXBsLnVwZGF0ZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZVN0b3J5KHN0b3J5UG9pbnRNb2RlbDogU3RvcnlQb2ludE1vZGVsKSB7XG4gICAgaWYgKCF0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5mb3JFYWNoKChzdG9yeVBvaW50SW5mb0ltcGwpID0+IHtcbiAgICAgIGNvbnN0IGlzQWN0aXZlID0gc3RvcnlQb2ludEluZm9JbXBsLnN0b3J5UG9pbnRJZCA9PT0gc3RvcnlQb2ludE1vZGVsLnN0b3J5UG9pbnRJZDtcbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICAvLyB1cGRhdGUgdGhlIHN0YXRlXG4gICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbC5jYXB0aW9uID0gc3RvcnlQb2ludE1vZGVsLmNhcHRpb247XG4gICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbC5pbmRleCA9IHN0b3J5UG9pbnRNb2RlbC5pbmRleDtcbiAgICAgICAgc3RvcnlQb2ludEluZm9JbXBsLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbC51cGRhdGVkID0gc3RvcnlQb2ludE1vZGVsLnVwZGF0ZWQ7XG5cbiAgICAgICAgLy8gcmUtaW5pdGlhbGl6ZSBhY3RpdmVTdG9yeVBvaW50SW1wbFxuICAgICAgICB0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbCA9IG5ldyBTdG9yeVBvaW50SW1wbChcbiAgICAgICAgICBzdG9yeVBvaW50SW5mb0ltcGwsXG4gICAgICAgICAgdGhpcy5fcHVibGlzaGVkU2hlZXRJbmZvcyxcbiAgICAgICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgICAgIHN0b3J5UG9pbnRNb2RlbC5jb250YWluZWRTaGVldEluZm8sXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzZXQgb2xkIG9uZXMgdG8gZmFsc2VcbiAgICAgICAgc3RvcnlQb2ludEluZm9JbXBsLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuYWN0aXZlU3RvcnlQb2ludCkge1xuICAgICAgdGhpcy5fZGVmZXJyZWQucmVzb2x2ZSh0aGlzLmFjdGl2ZVN0b3J5UG9pbnQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlU3RvcnlQb2ludCgpOiBTdG9yeVBvaW50SW1wbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBzdG9yeVBvaW50c0luZm8oKTogQXJyYXk8U3RvcnlQb2ludEluZm9JbXBsPiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLmFjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5fc2hlZXRJbmZvSW1wbC5pc0hpZGRlbjtcbiAgfVxuXG4gIHB1YmxpYyBhY3RpdmF0ZU5leHRTdG9yeVBvaW50QXN5bmMoKTogUHJvbWlzZTxTdG9yeVBvaW50SW1wbD4ge1xuICAgIGlmICh0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbC5pbmRleCA9PT0gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsKTtcbiAgICB9XG5cbiAgICBsZXQgcHJvbWlzZSA9IHRoaXMuX2RlZmVycmVkLmdldE5ld1Byb21pc2VPclRocm93SWZCdXN5KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFN0b3J5QWN0aXZhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TdG9yeUFjdGl2YXRpb24pO1xuICAgIHNlcnZpY2UuYWN0aXZhdGVOZXh0U3RvcnlQb2ludEFzeW5jKCk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgYWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnRBc3luYygpOiBQcm9taXNlPFN0b3J5UG9pbnRJbXBsPiB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsLmluZGV4ID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsKTtcbiAgICB9XG5cbiAgICBsZXQgcHJvbWlzZSA9IHRoaXMuX2RlZmVycmVkLmdldE5ld1Byb21pc2VPclRocm93SWZCdXN5KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFN0b3J5QWN0aXZhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TdG9yeUFjdGl2YXRpb24pO1xuICAgIHNlcnZpY2UuYWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnRBc3luYygpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlU3RvcnlQb2ludEFzeW5jKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPFN0b3J5UG9pbnRJbXBsPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihpbmRleCwgJ2luZGV4Jyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlclR5cGUoaW5kZXgsICdudW1iZXInLCAnaW5kZXgnKTtcblxuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbmRleE91dE9mUmFuZ2UsICdUaGUgaW5kZXggcGFzc2VkIHRvIHRoaXMgY29tbWFuZCBpcyBvdXQgb2YgcmFuZ2UuJyk7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID09PSB0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbC5pbmRleCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbCk7XG4gICAgfVxuXG4gICAgbGV0IHByb21pc2UgPSB0aGlzLl9kZWZlcnJlZC5nZXROZXdQcm9taXNlT3JUaHJvd0lmQnVzeSgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTdG9yeUFjdGl2YXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU3RvcnlBY3RpdmF0aW9uKTtcbiAgICBzZXJ2aWNlLmFjdGl2YXRlU3RvcnlQb2ludEFzeW5jKGluZGV4KTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZXZlcnRTdG9yeVBvaW50QXN5bmMoaW5kZXg6IG51bWJlcik6IFByb21pc2U8U3RvcnlQb2ludEluZm9JbXBsPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihpbmRleCwgJ2luZGV4Jyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlclR5cGUoaW5kZXgsICdudW1iZXInLCAnaW5kZXgnKTtcblxuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbmRleE91dE9mUmFuZ2UsICdUaGUgaW5kZXggcGFzc2VkIHRvIHRoaXMgY29tbWFuZCBpcyBvdXQgb2YgcmFuZ2UuJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTdG9yeUFjdGl2YXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU3RvcnlBY3RpdmF0aW9uKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLnJldmVydFN0b3J5UG9pbnRBc3luYyhpbmRleCkudGhlbjxTdG9yeVBvaW50SW5mb0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVTdG9yeUluZm8ocmVzcG9uc2UuaW5kZXgsIHJlc3BvbnNlKTtcbiAgICAgIGNvbnN0IHN0b3J5UG9pbnRJbmZvSW1wbCA9IG5ldyBTdG9yeVBvaW50SW5mb0ltcGwoXG4gICAgICAgIHJlc3BvbnNlLmNhcHRpb24sXG4gICAgICAgIHJlc3BvbnNlLmluZGV4LFxuICAgICAgICByZXNwb25zZS5zdG9yeVBvaW50SWQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICByZXNwb25zZS51cGRhdGVkLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBzdG9yeVBvaW50SW5mb0ltcGw7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJQZW5kaW5nUHJvbWlzZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2RlZmVycmVkKSB7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZWplY3QoJ0FsbCBwZW5kaW5nIHByb21pc2VzIGNsZWFyZWQnKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDb250YWluZWRTaGVldEluZm9Nb2RlbCwgU2hlZXRJbmZvLCBTaGVldFBhdGgsIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBTaGVldFV0aWxzIH0gZnJvbSAnLi4vVXRpbHMvU2hlZXRVdGlscyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRJbXBsIH0gZnJvbSAnLi9EYXNoYm9hcmRJbXBsJztcbmltcG9ydCB7IFNoZWV0SW1wbCB9IGZyb20gJy4vU2hlZXRJbXBsJztcbmltcG9ydCB7IFNoZWV0SW5mb0ltcGwgfSBmcm9tICcuL1NoZWV0SW5mb0ltcGwnO1xuaW1wb3J0IHsgU3RvcnlJbXBsIH0gZnJvbSAnLi9TdG9yeUltcGwnO1xuaW1wb3J0IHsgU3RvcnlQb2ludEluZm9JbXBsIH0gZnJvbSAnLi9TdG9yeVBvaW50SW5mb0ltcGwnO1xuaW1wb3J0IHsgV29ya3NoZWV0SW1wbCB9IGZyb20gJy4vV29ya3NoZWV0SW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBTdG9yeVBvaW50SW1wbCB7XG4gIHByaXZhdGUgX2NvbnRhaW5lZFNoZWV0SW1wbDogU2hlZXRJbXBsO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9zdG9yeVBvaW50SW5mb0ltcGw6IFN0b3J5UG9pbnRJbmZvSW1wbCxcbiAgICBzaGVldEluZm9zOiBBcnJheTxTaGVldEluZm8+LFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBjb250YWluZWRTaGVldEluZm8/OiBDb250YWluZWRTaGVldEluZm9Nb2RlbCxcbiAgKSB7XG4gICAgaWYgKGNvbnRhaW5lZFNoZWV0SW5mbykge1xuICAgICAgdGhpcy5fY29udGFpbmVkU2hlZXRJbXBsID0gdGhpcy5jcmVhdGVDb250YWluZWRTaGVldChjb250YWluZWRTaGVldEluZm8sIHNoZWV0SW5mb3MsIHJlZ2lzdHJ5SWQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLmluZGV4O1xuICB9XG5cbiAgcHVibGljIGdldCBjYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC5jYXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC5hY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVwZGF0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC51cGRhdGVkO1xuICB9XG5cbiAgcHVibGljIHNldCB1cGRhdGVkKHVwZGF0ZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGwudXBkYXRlZCA9IHVwZGF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudFN0b3J5KCk6IFN0b3J5SW1wbCB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC5wYXJlbnRTdG9yeTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29udGFpbmVkU2hlZXQoKTogU2hlZXRJbXBsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGFpbmVkU2hlZXRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBzdG9yeVBvaW50SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLnN0b3J5UG9pbnRJZDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ29udGFpbmVkU2hlZXQoY29udGFpbmVkU2hlZXRJbmZvOiBDb250YWluZWRTaGVldEluZm9Nb2RlbCwgc2hlZXRJbmZvczogQXJyYXk8U2hlZXRJbmZvPiwgcmVnaXN0cnlJZDogbnVtYmVyKTogU2hlZXRJbXBsIHtcbiAgICBjb25zdCBjb250YWluZWRTaGVldElkeCA9IC0xO1xuXG4gICAgY29uc3QgcHVibGlzaGVkU2hlZXRJbmZvID0gU2hlZXRVdGlscy5nZXRQdWJsaXNoZWRTaGVldEluZm9CeU5hbWUoY29udGFpbmVkU2hlZXRJbmZvLm5hbWUsIHNoZWV0SW5mb3MpO1xuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0U2l6ZSA9IFNoZWV0VXRpbHMuY3JlYXRlQXV0b21hdGljU2l6ZSgpO1xuICAgIGNvbnN0IGlzQ29udGFpbmVkU2hlZXRIaWRkZW4gPSBwdWJsaXNoZWRTaGVldEluZm8gPT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb250YWluZWRTaGVldFVybCA9IHB1Ymxpc2hlZFNoZWV0SW5mbyA/IHB1Ymxpc2hlZFNoZWV0SW5mby51cmwgOiAnJztcbiAgICAvLyBDb250YWluZWQgc2hlZXRzIGFyZW4ndCBhY3RpdmUgLSB0aGUgY29udGFpbmluZyBzaGVldCBpcyBhY3RpdmUuXG4gICAgY29uc3QgY29udGFpbmVkU2hlZXRBY3RpdmUgPSBmYWxzZTtcblxuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwgPSBuZXcgU2hlZXRJbmZvSW1wbChcbiAgICAgIGNvbnRhaW5lZFNoZWV0SW5mby5uYW1lLFxuICAgICAgU2hlZXRVdGlscy5nZXRTaGVldFR5cGVFbnVtKGNvbnRhaW5lZFNoZWV0SW5mby5zaGVldFR5cGUpLFxuICAgICAgY29udGFpbmVkU2hlZXRTaXplLFxuICAgICAgY29udGFpbmVkU2hlZXRJZHgsXG4gICAgICBjb250YWluZWRTaGVldEFjdGl2ZSxcbiAgICAgIGlzQ29udGFpbmVkU2hlZXRIaWRkZW4sXG4gICAgICBjb250YWluZWRTaGVldFVybCxcbiAgICApO1xuXG4gICAgbGV0IHNoZWV0SW1wbDogU2hlZXRJbXBsO1xuICAgIHN3aXRjaCAoY29udGFpbmVkU2hlZXRJbmZvSW1wbC5zaGVldFR5cGUpIHtcbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRUeXBlLldvcmtzaGVldDoge1xuICAgICAgICBjb25zdCB2aXpJZDogVmlzdWFsSWQgPSB7XG4gICAgICAgICAgd29ya3NoZWV0OiBjb250YWluZWRTaGVldEluZm9JbXBsLm5hbWUsXG4gICAgICAgIH07XG5cbiAgICAgICAgc2hlZXRJbXBsID0gbmV3IFdvcmtzaGVldEltcGwoY29udGFpbmVkU2hlZXRJbmZvSW1wbCwgcmVnaXN0cnlJZCwgdml6SWQsIG51bGwsIHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRUeXBlLkRhc2hib2FyZDoge1xuICAgICAgICBjb25zdCBzaGVldFBhdGg6IFNoZWV0UGF0aCA9IHtcbiAgICAgICAgICBzaGVldE5hbWU6IGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwubmFtZSxcbiAgICAgICAgICBpc0Rhc2hib2FyZDogdHJ1ZSxcbiAgICAgICAgfTtcblxuICAgICAgICBzaGVldEltcGwgPSBuZXcgRGFzaGJvYXJkSW1wbChjb250YWluZWRTaGVldEluZm9JbXBsLCBjb250YWluZWRTaGVldEluZm8uZGFzaGJvYXJkWm9uZXMsIHNoZWV0UGF0aCwgcmVnaXN0cnlJZCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuU2VydmVyRXJyb3IsICdJbnZhbGlkIFNoZWV0VHlwZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaGVldEltcGw7XG4gIH1cbn1cbiIsImltcG9ydCB7IFN0b3J5SW1wbCB9IGZyb20gJy4vU3RvcnlJbXBsJztcblxuZXhwb3J0IGNsYXNzIFN0b3J5UG9pbnRJbmZvSW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9jYXB0aW9uOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfaW5kZXg6IG51bWJlcixcbiAgICBwcml2YXRlIF9zdG9yeVBvaW50SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9hY3RpdmU6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfdXBkYXRlZDogYm9vbGVhbixcbiAgICBwcml2YXRlIF9wYXJlbnRTdG9yeUltcGw6IFN0b3J5SW1wbCxcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgY2FwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fY2FwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgY2FwdGlvbihjYXB0aW9uOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jYXB0aW9uID0gY2FwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2luZGV4O1xuICB9XG5cbiAgcHVibGljIHNldCBpbmRleChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5faW5kZXggPSBpbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc3RvcnlQb2ludElkKCkge1xuICAgIHJldHVybiB0aGlzLl9zdG9yeVBvaW50SWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICB9XG5cbiAgcHVibGljIHNldCBhY3RpdmUoaXNBY3RpdmU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9hY3RpdmUgPSBpc0FjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXBkYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXBkYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdXBkYXRlZChpc1VwZGF0ZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl91cGRhdGVkID0gaXNVcGRhdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJlbnRTdG9yeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50U3RvcnlJbXBsO1xuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgV29ya2Jvb2tJbXBsIHt9XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpTWVudVR5cGUsXG4gIENvbnRleHRNZW51T3B0aW9ucyxcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRXJyb3JDb2RlcyxcbiAgRmlsdGVyTnVsbE9wdGlvbixcbiAgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gIFBlcmlvZFR5cGUsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG4gIFRvb2x0aXBDb250ZXh0LFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNjaGVtYSwgRGF0YVNvdXJjZSBhcyBEYXRhU291cmNlSW5mbywgVmlzdWFsSWQsIFdvcmtzaGVldERhdGFTb3VyY2VJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuLi9EYXRhU291cmNlJztcbmltcG9ydCB7IExvZ2ljYWxUYWJsZSB9IGZyb20gJy4uL0xvZ2ljYWxUYWJsZSc7XG5pbXBvcnQgeyBBY2Nlc3NpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0FjY2Vzc2liaWxpdHlTZXJ2aWNlJztcbmltcG9ydCB7IEFubm90YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvQW5ub3RhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9EYXRhU291cmNlU2VydmljZSc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlJztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9GaWx0ZXJTZXJ2aWNlJztcbmltcG9ydCB7IEdldERhdGFTZXJ2aWNlLCBHZXREYXRhVHlwZSB9IGZyb20gJy4uL1NlcnZpY2VzL0dldERhdGFTZXJ2aWNlJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZWxlY3Rpb25TZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFZpc3VhbE1vZGVsU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1Zpc3VhbE1vZGVsU2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IERhc2hib2FyZEltcGwgfSBmcm9tICcuL0Rhc2hib2FyZEltcGwnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZUltcGwgfSBmcm9tICcuL0RhdGFTb3VyY2VJbXBsJztcbmltcG9ydCB7IFNoZWV0SW1wbCB9IGZyb20gJy4vU2hlZXRJbXBsJztcbmltcG9ydCB7IFNoZWV0SW5mb0ltcGwgfSBmcm9tICcuL1NoZWV0SW5mb0ltcGwnO1xuaW1wb3J0IHsgU3RvcnlQb2ludEltcGwgfSBmcm9tICcuL1N0b3J5UG9pbnRJbXBsJztcblxuZXhwb3J0IGNsYXNzIFdvcmtzaGVldEltcGwgZXh0ZW5kcyBTaGVldEltcGwge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgc2hlZXRJbmZvSW1wbDogU2hlZXRJbmZvSW1wbCxcbiAgICBfcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX3Zpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBwcml2YXRlIF9wYXJlbnREYXNoYm9hcmRJbXBsOiBEYXNoYm9hcmRJbXBsIHwgbnVsbCxcbiAgICBwcml2YXRlIF9wYXJlbnRTdG9yeVBvaW50SW1wbDogU3RvcnlQb2ludEltcGwgfCBudWxsLFxuICAgIHByaXZhdGUgX2JhY2tncm91bmRDb2xvcjogc3RyaW5nIHwgbnVsbCA9IG51bGwsXG4gICAgcHJpdmF0ZSBfZm9ybWF0dGluZzogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nIHwgbnVsbCA9IG51bGwsXG4gICkge1xuICAgIHN1cGVyKHNoZWV0SW5mb0ltcGwsIF9yZWdpc3RyeUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50RGFzaGJvYXJkKCk6IERhc2hib2FyZEltcGwgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50U3RvcnlQb2ludCgpOiBTdG9yeVBvaW50SW1wbCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRTdG9yeVBvaW50SW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmlzdWFsSWQoKTogVmlzdWFsSWQge1xuICAgIHJldHVybiB0aGlzLl92aXN1YWxJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXhQYWdlUm93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJhY2tncm91bmRDb2xvcigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYmFja2dyb3VuZENvbG9yO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JtYXR0aW5nKCk6IENvbnRyYWN0LldvcmtzaGVldEZvcm1hdHRpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlPih1cGRhdGVUeXBlLCBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLCAnQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZScpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmllbGROYW1lLCAnZmllbGROYW1lJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWx0ZXJPcHRpb25zLCAnZmlsdGVyT3B0aW9ucycpO1xuICAgIGlmIChmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24pIHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RmlsdGVyTnVsbE9wdGlvbj4oZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uLCBGaWx0ZXJOdWxsT3B0aW9uLCAnRmlsdGVyTnVsbE9wdGlvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5UmFuZ2VQYXJhbVR5cGUoZmlsdGVyT3B0aW9ucy5taW4sIGZpbHRlck9wdGlvbnMubWF4KTtcbiAgICB9XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5hcHBseVJhbmdlRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lLCBmaWx0ZXJPcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUhpZXJhcmNoaWNhbEZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPiB8IENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVscyxcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHZhbHVlcywgJ3ZhbHVlcycpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZT4odXBkYXRlVHlwZSwgQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSwgJ0NvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUnKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSAmJiAhdmFsdWVzLmxldmVscykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAndmFsdWVzIHBhcmFtZXRlciBmb3IgYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyBtdXN0IGJlIGFuIGFycmF5IG9yIGNvbnRhaW4gYSBsZXZlbHMga2V5JyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmNsZWFyRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U3RyaW5nUGFyYW1ldGVyKGZpZWxkTmFtZSwgJ2ZpZWxkTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIob3B0aW9ucywgJ29wdGlvbnMnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFBlcmlvZFR5cGU+KG9wdGlvbnMucGVyaW9kVHlwZSwgUGVyaW9kVHlwZSwgJ1BlcmlvZFR5cGUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPERhdGVSYW5nZVR5cGU+KG9wdGlvbnMucmFuZ2VUeXBlLCBEYXRlUmFuZ2VUeXBlLCAnRGF0ZVJhbmdlVHlwZScpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RGF0YVNvdXJjZXNBc3luYyh0aGlzLnZpc3VhbElkKS50aGVuPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PigocmVzdWx0KSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hOiBEYXRhU2NoZW1hID0gcmVzdWx0O1xuICAgICAgY29uc3Qgd29ya3NoZWV0RGF0YVNvdXJjZUluZm86IFdvcmtzaGVldERhdGFTb3VyY2VJbmZvID0gZGF0YVNjaGVtYS53b3Jrc2hlZXREYXRhU2NoZW1hTWFwW3RoaXMubmFtZV07XG5cbiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzOiBBcnJheTxDb250cmFjdC5EYXRhU291cmNlPiA9IFtdO1xuXG4gICAgICAvLyBGaXJzdCwgYWRkIHRoZSBwcmltYXJ5IGRhdGFzb3VyY2UuICBCeSBjb252ZW50aW9uLCBpdCBjb21lcyBmaXJzdCBpbiB0aGUgcmV0dXJuZWQgYXJyYXkuXG4gICAgICBjb25zdCBwcmltYXJ5SWQ6IHN0cmluZyA9IHdvcmtzaGVldERhdGFTb3VyY2VJbmZvLnByaW1hcnlEYXRhU291cmNlO1xuICAgICAgZGF0YVNvdXJjZXMucHVzaCh0aGlzLmNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU2NoZW1hLmRhdGFTb3VyY2VzW3ByaW1hcnlJZF0pKTtcblxuICAgICAgLy8gVGhlbiwgbG9vcCB0aHJvdWdoIGFueSBzZWNvbmRhcnkgZGF0YSBzb3VyY2VzIGFuZCBhZGQgdGhlbS5cbiAgICAgIGZvciAoY29uc3Qgc2Vjb25kYXJ5SWQgb2Ygd29ya3NoZWV0RGF0YVNvdXJjZUluZm8ucmVmZXJlbmNlZERhdGFTb3VyY2VMaXN0KSB7XG4gICAgICAgIGlmIChzZWNvbmRhcnlJZCAhPT0gcHJpbWFyeUlkKSB7XG4gICAgICAgICAgZGF0YVNvdXJjZXMucHVzaCh0aGlzLmNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU2NoZW1hLmRhdGFTb3VyY2VzW3NlY29uZGFyeUlkXSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhU291cmNlcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRGaWx0ZXJzQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFNlbGVjdGVkTWFya3NBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhQXN5bmMob3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgICAgdGhpcy52aXN1YWxJZCxcbiAgICAgIEdldERhdGFUeXBlLlN1bW1hcnksXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVTZWxlY3Rpb24sXG4gICAgICB0cnVlLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgICBvcHRpb25zLmFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyA/PyBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMocGFnZVJvd0NvdW50OiBudW1iZXIsIG9wdGlvbnM6IENvbnRyYWN0LkdldFN1bW1hcnlEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBwYWdlUm93Q291bnQgfHwgdGhpcy5nZXRNYXhQYWdlUm93TGltaXQoKSxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgIHRydWUsIC8vIGluY2x1ZGVBbGxDb2x1bW5zIChjYW4gYmUgb3ZlcnJpZGRlbiBieSBjb2x1bW5zVG9JbmNsdWRlQnlJZClcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICAgIG9wdGlvbnMuYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nID8/IGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGFkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jKFxuICAgIG1hcmtzQ2FyZEluZGV4OiBudW1iZXIsXG4gICAgZW5jb2RpbmdUeXBlOiBDb250cmFjdC5FbmNvZGluZ1R5cGUsXG4gICAgY29sdW1uczogQXJyYXk8Q29udHJhY3QuQ29sdW1uPixcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuYWRkTWFya3NDYXJkRmllbGRzQXN5bmModGhpcy52aXN1YWxJZCwgbWFya3NDYXJkSW5kZXgsIGVuY29kaW5nVHlwZSwgY29sdW1ucywgc3RhcnRJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgbW92ZU1hcmtzQ2FyZEZpZWxkQXN5bmMobWFya3NDYXJkSW5kZXg6IG51bWJlciwgZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlciwgZmllbGRDb3VudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxWaXN1YWxNb2RlbFNlcnZpY2U+KFNlcnZpY2VOYW1lcy5WaXN1YWxNb2RlbCk7XG5cbiAgICByZXR1cm4gc2VydmljZS5tb3ZlTWFya3NDYXJkRmllbGRBc3luYyh0aGlzLnZpc3VhbElkLCBtYXJrc0NhcmRJbmRleCwgZnJvbUluZGV4LCB0b0luZGV4LCBmaWVsZENvdW50KTtcbiAgfVxuXG4gIHB1YmxpYyBzcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyhcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGVuY29kaW5nVHlwZTogQ29udHJhY3QuRW5jb2RpbmdUeXBlLFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgICBkZWxldGVDb3VudDogbnVtYmVyLFxuICAgIGNvbHVtbnM6IEFycmF5PENvbnRyYWN0LkNvbHVtbj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2Uuc3BsaWNlTWFya3NDYXJkRmllbGRzQXN5bmModGhpcy52aXN1YWxJZCwgbWFya3NDYXJkSW5kZXgsIGVuY29kaW5nVHlwZSwgc3RhcnRJbmRleCwgZGVsZXRlQ291bnQsIGNvbHVtbnMpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdEYXRhQXN5bmMoXG4gICAgICB0aGlzLnZpc3VhbElkLFxuICAgICAgR2V0RGF0YVR5cGUuVW5kZXJseWluZyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgICEhb3B0aW9ucy5pbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICAgb3B0aW9ucy5hcHBseVdvcmtzaGVldEZvcm1hdHRpbmcgPz8gZmFsc2UsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRVbmRlcmx5aW5nVGFibGVzQXN5bmModGhpcy52aXN1YWxJZCkudGhlbjxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PigobG9naWNhbFRhYmxlSW5mb3MpID0+IHtcbiAgICAgIHJldHVybiBsb2dpY2FsVGFibGVJbmZvcy5tYXAoKGxvZ2ljYWxUYWJsZUluZm8pID0+IG5ldyBMb2dpY2FsVGFibGUobG9naWNhbFRhYmxlSW5mbykpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICAgICAgdGhpcy52aXN1YWxJZCxcbiAgICAgIGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgISFvcHRpb25zLmluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgICBvcHRpb25zLmFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyA/PyBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIHBhZ2VSb3dDb3VudD86IG51bWJlcixcbiAgICBvcHRpb25zPzogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgICB0aGlzLnZpc3VhbElkLFxuICAgICAgbG9naWNhbFRhYmxlSWQsXG4gICAgICBwYWdlUm93Q291bnQgfHwgdGhpcy5nZXRNYXhQYWdlUm93TGltaXQoKSxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgICEhb3B0aW9ucy5pbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICAgIG9wdGlvbnMuYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nID8/IGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5jbGVhclNlbGVjdGVkTWFya3NBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5VmFsdWVBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5TZWxlY3Rpb25Dcml0ZXJpYT4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNlbGVjdGlvbnMsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFNlbGVjdGlvblVwZGF0ZVR5cGU+KHNlbGVjdGlvblVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUsICdTZWxlY3Rpb25VcGRhdGVUeXBlJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5zZWxlY3RNYXJrc0J5VmFsdWVBc3luYyh0aGlzLnZpc3VhbElkLCBzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5SWRBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNlbGVjdGlvbnMsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFNlbGVjdGlvblVwZGF0ZVR5cGU+KHNlbGVjdGlvblVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUsICdTZWxlY3Rpb25VcGRhdGVUeXBlJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5zZWxlY3RNYXJrc0J5SWRBc3luYyh0aGlzLnZpc3VhbElkLCBzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBhbm5vdGF0ZU1hcmtBc3luYyhtYXJrOiBDb250cmFjdC5NYXJrSW5mbywgYW5ub3RhdGlvblRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIobWFyaywgJ21hcmsnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEFubm90YXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuQW5ub3RhdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYW5ub3RhdGVNYXJrQXN5bmModGhpcy52aXN1YWxJZCwgbWFyaywgYW5ub3RhdGlvblRleHQpO1xuICB9XG5cbiAgcHVibGljIGdldEFubm90YXRpb25zQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5ub3RhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRBbm5vdGF0aW9uc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFubm90YXRpb25Bc3luYyhhbm5vdGF0aW9uOiBDb250cmFjdC5Bbm5vdGF0aW9uKSB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihhbm5vdGF0aW9uLCAnYW5ub3RhdGlvbicpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5ub3RhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5yZW1vdmVBbm5vdGF0aW9uQXN5bmModGhpcy52aXN1YWxJZCwgYW5ub3RhdGlvbik7XG4gIH1cblxuICBwdWJsaWMgYXBwZW5kQ29udGV4dE1lbnVBc3luYyh0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgY29uZmlnOiBDb250ZXh0TWVudU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51KTtcbiAgICByZXR1cm4gc2VydmljZS5hcHBlbmRDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBjb25maWcpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUNvbnRleHRNZW51QXN5bmModGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVJdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51KTtcbiAgICByZXR1cm4gc2VydmljZS5yZW1vdmVDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBtZW51SXRlbUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBleGVjdXRlQ29udGV4dE1lbnVBc3luYyh0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgbWVudUl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLmV4ZWN1dGVDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBtZW51SXRlbUlkKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5hbWVDb250ZXh0TWVudUFzeW5jKHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SGVhZGVyOiBzdHJpbmcsIG1lbnVEZXNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLnJlbmFtZUNvbnRleHRNZW51QXN5bmModGhpcy52aXN1YWxJZC53b3Jrc2hlZXQsIHRhcmdldE1lbnUsIG1lbnVIZWFkZXIsIG1lbnVEZXNjcmlwdGlvbik7XG4gIH1cblxuICBwdWJsaWMgaG92ZXJUdXBsZUFzeW5jKGhvdmVyZWRUdXBsZT86IG51bWJlciwgdG9vbHRpcD86IFRvb2x0aXBDb250ZXh0IHwgbnVsbCwgYWxsb3dIb3ZlckFjdGlvbnM/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNJbnNpZGVEYXNoYm9hcmRFeHRlbnNpb24oKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYGhvdmVyVHVwbGVBc3luYyBpcyBub3Qgc3VwcG9ydGVkIGluIGRhc2hib2FyZCBleHRlbnNpb25zYCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2UuaG92ZXJUdXBsZUFzeW5jKHRoaXMudmlzdWFsSWQsIGhvdmVyZWRUdXBsZSwgdG9vbHRpcCwgYWxsb3dIb3ZlckFjdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdFR1cGxlc0FzeW5jKHNlbGVjdGVkVHVwbGVzOiBBcnJheTxudW1iZXI+LCBzZWxlY3RPcHRpb246IENvbnRyYWN0LlNlbGVjdE9wdGlvbnMsIHRvb2x0aXA/OiBUb29sdGlwQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBzZWxlY3RUdXBsZXNBc3luYyBpcyBub3Qgc3VwcG9ydGVkIGluIGRhc2hib2FyZCBleHRlbnNpb25zYCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2Uuc2VsZWN0VHVwbGVzQXN5bmModGhpcy52aXN1YWxJZCwgc2VsZWN0ZWRUdXBsZXMsIHNlbGVjdE9wdGlvbiwgdG9vbHRpcCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9vbHRpcFRleHRBc3luYyh0dXBsZUlkOiBudW1iZXIpOiBQcm9taXNlPFN0cmluZz4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBnZXRUb29sdGlwVGV4dEFzeW5jIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZGFzaGJvYXJkIGV4dGVuc2lvbnNgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QWNjZXNzaWJpbGl0eVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5BY2Nlc3NpYmlsaXR5KTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRUb29sdGlwVGV4dEFzeW5jKHRoaXMudmlzdWFsSWQsIHR1cGxlSWQpO1xuICB9XG5cbiAgcHVibGljIGxlYXZlTWFya05hdmlnYXRpb25Bc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0luc2lkZURhc2hib2FyZEV4dGVuc2lvbigpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgICAgQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLFxuICAgICAgICAgIGBsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMgaXMgbm90IHN1cHBvcnRlZCBpbiBkYXNoYm9hcmQgZXh0ZW5zaW9uc2AsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEFjY2Vzc2liaWxpdHlTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuQWNjZXNzaWJpbGl0eSk7XG4gICAgcmV0dXJuIHNlcnZpY2UubGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGVkaXRBbGlhc2VzRGlhbG9nQXN5bmMoZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFZpc3VhbE1vZGVsU2VydmljZT4oU2VydmljZU5hbWVzLlZpc3VhbE1vZGVsKTtcbiAgICByZXR1cm4gc2VydmljZS5lZGl0QWxpYXNlc0RpYWxvZ0FzeW5jKGZpZWxkTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU291cmNlSW5mbzogRGF0YVNvdXJjZUluZm8pOiBDb250cmFjdC5EYXRhU291cmNlIHtcbiAgICBjb25zdCBkYXRhU291cmNlSW1wbCA9IG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlSW5mbywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEYXRhU291cmNlKGRhdGFTb3VyY2VJbXBsKTtcbiAgICBkYXRhU291cmNlSW1wbC5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoZGF0YVNvdXJjZSk7XG4gICAgcmV0dXJuIGRhdGFTb3VyY2U7XG4gIH1cblxuICBwcml2YXRlIHZlcmlmeUFjdGl2ZVNoZWV0KCkge1xuICAgIGNvbnN0IGlzUm9vdEFuZEFjdGl2ZVdvcmtzaGVldCA9IHRoaXMuYWN0aXZlO1xuICAgIGNvbnN0IGlzSW5zaWRlQWN0aXZlRGFzaGJvYXJkID0gdGhpcy5pc0luc2lkZUFjdGl2ZURhc2hib2FyZCgpO1xuICAgIGNvbnN0IGlzSW5zaWRlQWN0aXZlU3RvcnlQb2ludCA9IHRoaXMuaXNJbnNpZGVBY3RpdmVTdG9yeVBvaW50KCk7XG5cbiAgICBpZiAoIWlzUm9vdEFuZEFjdGl2ZVdvcmtzaGVldCAmJiAhaXNJbnNpZGVBY3RpdmVEYXNoYm9hcmQgJiYgIWlzSW5zaWRlQWN0aXZlU3RvcnlQb2ludCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLk5vdEFjdGl2ZVNoZWV0LCAnT3BlcmF0aW9uIG5vdCBhbGxvd2VkIG9uIG5vbi1hY3RpdmUgc2hlZXQnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzSW5zaWRlQWN0aXZlU3RvcnlQb2ludCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50U3RvcnlQb2ludEltcGwgJiYgdGhpcy5fcGFyZW50U3RvcnlQb2ludEltcGwuYWN0aXZlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0luc2lkZUFjdGl2ZURhc2hib2FyZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbCAmJiB0aGlzLl9wYXJlbnREYXNoYm9hcmRJbXBsLmFjdGl2ZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbnNpZGVEYXNoYm9hcmRFeHRlbnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudERhc2hib2FyZEltcGwgIT09IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBMb2dpY2FsVGFibGVJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIGxvZ2ljYWwgdGFibGUuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dpY2FsVGFibGUgaW1wbGVtZW50cyBDb250cmFjdC5Mb2dpY2FsVGFibGUge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbG9naWNhbFRhYmxlOiBMb2dpY2FsVGFibGVJbmZvKSB7fVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbG9naWNhbFRhYmxlLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBjYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2ljYWxUYWJsZS5jYXB0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBUb29sdGlwVGV4dFJlcXVlc3QsIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIFRvb2x0aXBUZXh0UmVxdWVzdE1vZGVsIGltcGxlbWVudHMgVG9vbHRpcFRleHRSZXF1ZXN0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyB2aXN1YWxJZFByZXNNb2RlbDogVmlzdWFsSWQsIHB1YmxpYyB0dXBsZUlkOiBudW1iZXIpIHt9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlVHlwZSwgRmlsdGVyRG9tYWluVHlwZSwgRmlsdGVyVHlwZSwgUGVyaW9kVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL2xpYi9zcmMvRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1JztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcblxuZXhwb3J0IGNsYXNzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LkZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgX3dvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX2ZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICBwcm90ZWN0ZWQgX2ZpZWxkSWQ6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX3JlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlclR5cGUoKTogRmlsdGVyVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlclR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmllbGRBc3luYygpOiBQcm9taXNlPENvbnRyYWN0LkZpZWxkPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRGaWVsZEFzeW5jKHRoaXMuX2ZpZWxkSWQpO1xuICB9XG5cbiAgcHVibGljIGdldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkSWQpO1xuICB9XG5cbiAgcHVibGljIHNldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoYXBwbHlUb1dvcmtzaGVldHM6IEFycmF5PHN0cmluZz4pOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGFwcGx5VG9Xb3Jrc2hlZXRzLCAnYXBwbHlUb1dvcmtzaGVldHMnKTtcbiAgICBjb25zdCB1bmlxdWVXb3Jrc2hlZXRzID0gbmV3IFNldChhcHBseVRvV29ya3NoZWV0cyk7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5zZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkTmFtZSwgdGhpcy5fZmllbGRJZCwgQXJyYXkuZnJvbSh1bmlxdWVXb3Jrc2hlZXRzKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhdGVnb3JpY2FsRmlsdGVyIGV4dGVuZHMgRmlsdGVyIGltcGxlbWVudHMgQ29udHJhY3QuQ2F0ZWdvcmljYWxGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9hcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+LFxuICAgIHByaXZhdGUgX2lzRXhjbHVkZU1vZGU6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNBbGxTZWxlY3RlZD86IGJvb2xlYW4sXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzQWxsU2VsZWN0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwcGxpZWRWYWx1ZXMoKTogQXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwcGxpZWRWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXhjbHVkZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRXhjbHVkZU1vZGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RG9tYWluQXN5bmMoZG9tYWluVHlwZT86IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPiB7XG4gICAgaWYgKCFkb21haW5UeXBlKSB7XG4gICAgICBkb21haW5UeXBlID0gRmlsdGVyRG9tYWluVHlwZS5SZWxldmFudDtcbiAgICB9XG5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPEZpbHRlckRvbWFpblR5cGU+KGRvbWFpblR5cGUsIEZpbHRlckRvbWFpblR5cGUsICdGaWx0ZXJEb21haW5UeXBlJyk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldENhdGVnb3JpY2FsRG9tYWluQXN5bmModGhpcy5fd29ya3NoZWV0TmFtZSwgdGhpcy5fZmllbGRJZCwgZG9tYWluVHlwZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoaWNhbERhdGFWYWx1ZSBpbXBsZW1lbnRzIENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlckRhdGFWYWx1ZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF92YWx1ZTogQ29udHJhY3QuRGF0YVZhbHVlLCBwcml2YXRlIF9oaWVyYXJjaGljYWxQYXRoOiBzdHJpbmcsIHByaXZhdGUgX2xldmVsOiBudW1iZXIpIHt9XG5cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGllcmFyY2hpY2FsUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9oaWVyYXJjaGljYWxQYXRoO1xuICB9XG5cbiAgcHVibGljIGdldCBsZXZlbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9sZXZlbDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWwgaW1wbGVtZW50cyBDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9uYW1lOiBzdHJpbmcsIHByaXZhdGUgX2xldmVsU2VsZWN0aW9uU3RhdGU6IEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxldmVsU2VsZWN0aW9uU3RhdGUoKTogSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2xldmVsU2VsZWN0aW9uU3RhdGU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoaWNhbEZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2RpbWVuc2lvbk5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9oaWVyYXJjaHlDYXB0aW9uOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfbnVtYmVyT2ZMZXZlbHM6IG51bWJlcixcbiAgICBwcml2YXRlIF9sZXZlbERldGFpbHM6IEFycmF5PENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVsRGV0YWlsPixcbiAgICBwcml2YXRlIF9hcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXJEYXRhVmFsdWU+LFxuICAgIHByaXZhdGUgX2lzQWxsU2VsZWN0ZWQ6IGJvb2xlYW4sXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cbiAgZ2V0RG9tYWluQXN5bmMoZG9tYWluVHlwZT86IENvbnRyYWN0LkZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgcHVibGljIGdldCBkaW1lbnNpb25OYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpbWVuc2lvbk5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhpZXJhcmNoeUNhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faGllcmFyY2h5Q2FwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbnVtYmVyT2ZMZXZlbHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbnVtYmVyT2ZMZXZlbHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxldmVsRGV0YWlscygpOiBDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbFtdIHtcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWxEZXRhaWxzO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0FsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0FsbFNlbGVjdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBhcHBsaWVkVmFsdWVzKCk6IEFycmF5PENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlckRhdGFWYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLl9hcHBsaWVkVmFsdWVzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSYW5nZUZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LlJhbmdlRmlsdGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICByZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfbWluOiBDb250cmFjdC5EYXRhVmFsdWUsXG4gICAgcHJpdmF0ZSBfbWF4OiBDb250cmFjdC5EYXRhVmFsdWUsXG4gICAgcHJpdmF0ZSBfaW5jbHVkZU51bGxWYWx1ZXM6IGJvb2xlYW4sXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1pblZhbHVlKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWF4VmFsdWUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG5cbiAgcHVibGljIGdldCBpbmNsdWRlTnVsbFZhbHVlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW5jbHVkZU51bGxWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0RG9tYWluQXN5bmMoZG9tYWluVHlwZT86IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LlJhbmdlRG9tYWluPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICBpZiAoIWRvbWFpblR5cGUpIHtcbiAgICAgIGRvbWFpblR5cGUgPSBGaWx0ZXJEb21haW5UeXBlLlJlbGV2YW50O1xuICAgIH1cblxuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RmlsdGVyRG9tYWluVHlwZT4oZG9tYWluVHlwZSwgRmlsdGVyRG9tYWluVHlwZSwgJ0ZpbHRlckRvbWFpblR5cGUnKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLmdldFJhbmdlRG9tYWluQXN5bmModGhpcy5fd29ya3NoZWV0TmFtZSwgdGhpcy5fZmllbGRJZCwgZG9tYWluVHlwZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlbGF0aXZlRGF0ZUZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2FuY2hvckRhdGU6IENvbnRyYWN0LkRhdGFWYWx1ZSxcbiAgICBwcml2YXRlIF9wZXJpb2RUeXBlOiBQZXJpb2RUeXBlLFxuICAgIHByaXZhdGUgX3JhbmdlVHlwZTogRGF0ZVJhbmdlVHlwZSxcbiAgICBwcml2YXRlIF9yYW5nZU46IG51bWJlcixcbiAgKSB7XG4gICAgc3VwZXIod29ya3NoZWV0TmFtZSwgZmllbGROYW1lLCBmaWx0ZXJUeXBlLCBmaWVsZElkLCByZWdpc3RyeUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYW5jaG9yRGF0ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9hbmNob3JEYXRlO1xuICB9XG5cbiAgcHVibGljIGdldCBwZXJpb2RUeXBlKCk6IFBlcmlvZFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9wZXJpb2RUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCByYW5nZVR5cGUoKTogRGF0ZVJhbmdlVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3JhbmdlVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmFuZ2VOKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JhbmdlTjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2F0ZWdvcmljYWxEb21haW4gaW1wbGVtZW50cyBDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF92YWx1ZXM6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4sIHByaXZhdGUgX2RvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpIHt9XG5cbiAgcHVibGljIGdldCB2YWx1ZXMoKTogQXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBGaWx0ZXJEb21haW5UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZG9tYWluVHlwZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFuZ2VEb21haW4gaW1wbGVtZW50cyBDb250cmFjdC5SYW5nZURvbWFpbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9taW46IENvbnRyYWN0LkRhdGFWYWx1ZSwgcHJpdmF0ZSBfbWF4OiBDb250cmFjdC5EYXRhVmFsdWUsIHByaXZhdGUgX2RvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpIHt9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IEZpbHRlckRvbWFpblR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kb21haW5UeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBtaW4oKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG5cbiAgcHVibGljIGdldCBtYXgoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVR5cGUsIE1hcmtUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZSBpbXBsZW1lbnRzIENvbnRyYWN0LkRhdGFUYWJsZSB7XG4gIHByaXZhdGUgX25hbWU6IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZGF0YTogQXJyYXk8QXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPj4sXG4gICAgcHJpdmF0ZSBfY29sdW1uczogQXJyYXk8Q29udHJhY3QuQ29sdW1uPixcbiAgICBwcml2YXRlIF90b3RhbFJvd0NvdW50OiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfaXNUb3RhbFJvd0NvdW50TGltaXRlZDogYm9vbGVhbixcbiAgICBwcml2YXRlIF9pc1N1bW1hcnlEYXRhOiBib29sZWFuLFxuICAgIHByaXZhdGUgX21hcmtzSW5mbz86IEFycmF5PE1hcmtJbmZvPixcbiAgKSB7XG4gICAgdGhpcy5fbmFtZSA9IF9pc1N1bW1hcnlEYXRhID8gJ1N1bW1hcnkgRGF0YSBUYWJsZScgOiAnVW5kZXJseWluZyBEYXRhIFRhYmxlJztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhKCk6IEFycmF5PEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sdW1ucygpOiBBcnJheTxDb250cmFjdC5Db2x1bW4+IHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWFya3NJbmZvKCk6IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21hcmtzSW5mbztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdG90YWxSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFJvd0NvdW50O1xuICB9XG5cbiAgcHVibGljIGdldCBpc1RvdGFsUm93Q291bnRMaW1pdGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc1RvdGFsUm93Q291bnRMaW1pdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1N1bW1hcnlEYXRhKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc1N1bW1hcnlEYXRhO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXJrSW5mbyBpbXBsZW1lbnRzIENvbnRyYWN0Lk1hcmtJbmZvIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3R5cGU6IE1hcmtUeXBlLCBwcml2YXRlIF9jb2xvcjogc3RyaW5nLCBwcml2YXRlIF90dXBsZUlkPzogbnVtYmVyKSB7fVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBNYXJrVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbG9yO1xuICB9XG5cbiAgcHVibGljIGdldCB0dXBsZUlkKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3R1cGxlSWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbHVtbiBpbXBsZW1lbnRzIENvbnRyYWN0LkNvbHVtbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9maWVsZE5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9maWVsZElkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfZGF0YVR5cGU6IERhdGFUeXBlLFxuICAgIHByaXZhdGUgX2lzUmVmZXJlbmNlZDogYm9vbGVhbixcbiAgICBwcml2YXRlIF9pbmRleDogbnVtYmVyLFxuICApIHt9XG5cbiAgcHVibGljIGdldCBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IERhdGFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUmVmZXJlbmNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNSZWZlcmVuY2VkO1xuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pbmRleDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGF0YVZhbHVlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgLyogdHNsaW50OmRpc2FibGU6bm8tYW55ICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF92YWx1ZTogYW55LFxuICAgIHByaXZhdGUgX25hdGl2ZVZhbHVlOiBhbnksXG4gICAgcHJpdmF0ZSBfZm9ybWF0dGVkVmFsdWU/OiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfYWxpYXNWYWx1ZT86IHN0cmluZyxcbiAgICBwcml2YXRlIF9oYXNBbGlhcz86IGJvb2xlYW4sXG4gICkge31cblxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBuYXRpdmVWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9uYXRpdmVWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGVkVmFsdWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGVkVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsaWFzVmFsdWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYWxpYXNWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzQWxpYXMoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc0FsaWFzO1xuICB9XG4gIC8qIHRzbGludDplbmFibGU6bm8tYW55ICovXG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlUmVhZGVyIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVRhYmxlUmVhZGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfaWQ6IHN0cmluZywgcHJvdGVjdGVkIF90b3RhbFJvd0NvdW50OiBudW1iZXIsIHByb3RlY3RlZCBfcGFnZVJvd0NvdW50LCBwcml2YXRlIF9yZWdpc3RyeUlkOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wYWdlQ291bnQgPSBNYXRoLmNlaWwoX3RvdGFsUm93Q291bnQgLyBfcGFnZVJvd0NvdW50KTtcbiAgfVxuICBwcm90ZWN0ZWQgX3BhZ2VDb3VudDogbnVtYmVyO1xuXG4gIHB1YmxpYyBnZXQgdG90YWxSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFJvd0NvdW50O1xuICB9XG5cbiAgcHVibGljIGdldCBwYWdlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUNvdW50O1xuICB9XG5cbiAgcHVibGljIGdldFBhZ2VBc3luYyhwYWdlTnVtYmVyOiBudW1iZXIpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlSYW5nZShwYWdlTnVtYmVyLCAwLCB0aGlzLl9wYWdlQ291bnQpO1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRQYWdlQXN5bmModGhpcy5faWQsIHBhZ2VOdW1iZXIsIHRoaXMuX3BhZ2VSb3dDb3VudCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QWxsUGFnZXNBc3luYyhtYXhSb3dzPzogbnVtYmVyKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBmaXJzdFBhZ2U6IENvbnRyYWN0LkRhdGFUYWJsZSA9IGF3YWl0IHRoaXMuZ2V0UGFnZUFzeW5jKDApO1xuICAgIG1heFJvd3MgPSBtYXhSb3dzIHx8IHRoaXMudG90YWxSb3dDb3VudDtcbiAgICBjb25zdCByb3dzUmVxdWVzdGVkID0gTWF0aC5taW4obWF4Um93cywgdGhpcy50b3RhbFJvd0NvdW50KTtcbiAgICBjb25zdCBwYWdlc1JlcXVlc3RlZCA9IE1hdGguY2VpbChyb3dzUmVxdWVzdGVkIC8gdGhpcy5fcGFnZVJvd0NvdW50KTtcblxuICAgIC8vIEZldGNoIHVwIHRvIDQwMCBwYWdlcywgd2l0aCBhIGRlZmF1bHQgb2YgMTAsMDAwIHBhZ2VSb3dDb3VudCB0aGF0IGdpdmVzIHVzIDQsMDAwLDAwMCByb3dzXG4gICAgY29uc3QgcGFnZXNUb0ZldGNoID0gTWF0aC5taW4ocGFnZXNSZXF1ZXN0ZWQsIDQwMCk7XG4gICAgY29uc3QgaXNEYXRhTGltaXRlZCA9IHBhZ2VzVG9GZXRjaCA8IHBhZ2VzUmVxdWVzdGVkO1xuICAgIGxldCByZW1haW5pbmdEYXRhOiBBcnJheTxBcnJheTxBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+Pj4gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhZ2VzVG9GZXRjaDsgaSsrKSB7XG4gICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGhpcy5nZXRQYWdlQXN5bmMoaSk7XG4gICAgICByZW1haW5pbmdEYXRhLnB1c2gocGFnZS5kYXRhKTtcbiAgICB9XG5cbiAgICBsZXQgZnVsbERhdGEgPSBmaXJzdFBhZ2UuZGF0YS5jb25jYXQoLi4ucmVtYWluaW5nRGF0YSk7XG4gICAgLy8gVGhpcyBzbGljZXMgdGhlIGFycmF5IG9ubHkgaWYgbWF4Um93cyBoYXMgYmVlbiBzZXQgYW5kIGlzIGxlc3MgdGhhbiB0b3RhbFJvd0NvdW50XG4gICAgZnVsbERhdGEubGVuZ3RoID0gcm93c1JlcXVlc3RlZDtcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBmaXJzdFBhZ2UubmFtZSxcbiAgICAgIGRhdGE6IGZ1bGxEYXRhLFxuICAgICAgY29sdW1uczogZmlyc3RQYWdlLmNvbHVtbnMsXG4gICAgICB0b3RhbFJvd0NvdW50OiBpc0RhdGFMaW1pdGVkID8gcGFnZXNUb0ZldGNoICogdGhpcy5fcGFnZVJvd0NvdW50IDogcm93c1JlcXVlc3RlZCxcbiAgICAgIGlzVG90YWxSb3dDb3VudExpbWl0ZWQ6IGlzRGF0YUxpbWl0ZWQsXG4gICAgICBpc1N1bW1hcnlEYXRhOiBmaXJzdFBhZ2UuaXNTdW1tYXJ5RGF0YSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHJlbGVhc2VBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UucmVsZWFzZUFzeW5jKHRoaXMuX2lkKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVG9vbHRpcENvbnRleHQgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSG92ZXJUdXBsZUludGVyYWN0aW9uLCBTZWxlY3RPcHRpb25zLCBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbiwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIFNlbGVjdGlvbiBNb2RlbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdGlvbk1vZGVsIHtcbiAgcHVibGljIHF1YWxpZmllZEZpZWxkQ2FwdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFZhbHVlIGJhc2VkIHNlbGVjdGlvbiBtb2RlbC4gTWVhbnQgZm9yIGhpZXJhcmNoaWNhbCwgcmFuZ2UgYW5kIGNhdGVnb3JpY2FsIHNlbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgc2VsZWN0VmFsdWVzOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbi8qKlxuICogSGllcmFyY2hpY2FsIHZhbHVlIHNlbGVjdGlvbiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgSGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWwgZXh0ZW5kcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIHt9XG5cbi8qKlxuICogUmFuZ2UgYmFzZWQgdmFsdWUgc2VsZWN0aW9uIG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW5nZVNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgbWluVmFsdWU6IHN0cmluZztcbiAgcHVibGljIG1heFZhbHVlOiBzdHJpbmc7XG4gIHB1YmxpYyBpbmNsdWRlZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIERpbWVuc2lvbiB2YWx1ZSBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIERpbWVuc2lvblNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgVmFsdWVTZWxlY3Rpb25Nb2RlbCB7fVxuLyoqXG4gKiBUdXBsZSBiYXNlZCBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFR1cGxlU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgc2VsZWN0aW9uVHlwZTogc3RyaW5nO1xuICBwdWJsaWMgb2JqZWN0SWRzOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbi8qKlxuICogQ29udGFpbmVyIGNsYXNzIHRvIHBvcHVsYXRlIGFsbCB0aGUgc2VsZWN0aW9uIG1vZGVscyB3aGVuIHBhcnNpbmcgaW5wdXRcbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciB7XG4gIHB1YmxpYyBoaWVyTW9kZWxBcnI6IEFycmF5PEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsPiA9IFtdO1xuICBwdWJsaWMgZGltTW9kZWxBcnI6IEFycmF5PERpbWVuc2lvblNlbGVjdGlvbk1vZGVsPiA9IFtdO1xuICBwdWJsaWMgcXVhbnRNb2RlbEFycjogQXJyYXk8UmFuZ2VTZWxlY3Rpb25Nb2RlbD4gPSBbXTtcbiAgcHVibGljIHNlbGVjdGlvbjogVHVwbGVTZWxlY3Rpb25Nb2RlbDtcbn1cblxuZXhwb3J0IGNsYXNzIFNlbGVjdFR1cGxlc0ludGVyYWN0aW9uTW9kZWwgaW1wbGVtZW50cyBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdmlzdWFsSWRQcmVzTW9kZWw6IFZpc3VhbElkLFxuICAgIHB1YmxpYyB0dXBsZUlkczogQXJyYXk8bnVtYmVyPiA9IFtdLFxuICAgIHB1YmxpYyBzZWxlY3RPcHRpb25zOiBTZWxlY3RPcHRpb25zLFxuICAgIHB1YmxpYyB0b29sdGlwQ29udGV4dD86IFRvb2x0aXBDb250ZXh0LFxuICApIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBIb3ZlclR1cGxlSW50ZXJhY3Rpb25Nb2RlbCBpbXBsZW1lbnRzIEhvdmVyVHVwbGVJbnRlcmFjdGlvbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdmlzdWFsSWRQcmVzTW9kZWw6IFZpc3VhbElkLFxuICAgIHB1YmxpYyB0dXBsZUlkOiBudW1iZXIsXG4gICAgcHVibGljIHRvb2x0aXBDb250ZXh0PzogVG9vbHRpcENvbnRleHQgfCBudWxsLFxuICAgIHB1YmxpYyBhbGxvd0hvdmVyQWN0aW9ucz86IGJvb2xlYW4sXG4gICkge31cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBQb2ludCBpbXBsZW1lbnRzIENvbnRyYWN0LlBvaW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3g6IG51bWJlciwgcHJpdmF0ZSBfeTogbnVtYmVyKSB7fVxuXG4gIHB1YmxpYyBnZXQgeCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl94O1xuICB9XG5cbiAgcHVibGljIGdldCB5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3k7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi9TZXJ2aWNlUmVnaXN0cnknO1xuXG4vKipcbiAqIERlZmluZXMgd2hpY2ggdHlwZSBvZiBnZXREYXRhIGNhbGwgdG8gbWFrZS5cbiAqL1xuZXhwb3J0IGVudW0gR2V0RGF0YVR5cGUge1xuICBTdW1tYXJ5ID0gJ3N1bW1hcnknLFxuICBVbmRlcmx5aW5nID0gJ3VuZGVybHlpbmcnLFxufVxuXG4vKipcbiAqIFNlcnZpY2UgZm9yIGltcGxlbWVudGluZyB0aGUgbG9naWMgZm9yIHZhcmlvdXMgZ2V0RGF0YSBjYWxsc1xuICpcbiAqIEBpbnRlcmZhY2UgR2V0RGF0YVNlcnZpY2VcbiAqIEBleHRlbmRzIHtBcGlTZXJ2aWNlfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldERhdGFTZXJ2aWNlIGV4dGVuZHMgQXBpU2VydmljZSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaW1pdCBvZiByb3dzIGZvciBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jXG4gICAqL1xuICBnZXRNYXhSb3dMaW1pdCgpOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVuZGVybHlpbmcgZGF0YSBmb3IgYSBwYXJ0aWN1bGFyIHZpc3VhbFxuICAgKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcGFyYW0ge0dldERhdGFUeXBlfSBnZXRUeXBlICBUaGUgdHlwZSBvZiBnZXREYXRhIGNhbGwgdG8gbWFrZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgb3Igbm90IGFsaWFzZXMgc2hvdWxkIGJlIGlnbm9yZWRcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVTZWxlY3Rpb24gIFdoZXRoZXIgb3Igbm90IHNlbGVjdGlvbiBzaG91bGQgYmUgaWdub3JlZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVBbGxDb2x1bW5zICBTaG91bGQgYWxsIGNvbHVtbnMgYmUgaW5jbHVkZWRcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1ucy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgIE1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0dXJuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBnZXRUeXBlOiBHZXREYXRhVHlwZSxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICAgIGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZVJvd0NvdW50IFRoZSBudW1iZXIgb2Ygcm93cyBwZXIgcGFnZS4gVGhlIGRlZmF1bHQgYW5kIG1heGltdW0gaXMgMTAsMDAwIHJvd3MuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVTZWxlY3Rpb24gIFdoZXRoZXIgc2VsZWN0aW9ucyBpbiB0aGlzIHZpeiBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVBbGxDb2x1bW5zICBTaG91bGQgYWxsIGNvbHVtbnMgYmUgaW5jbHVkZWRcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+fSAgRGF0YSB0YWJsZSByZWFkZXIgdG8gYWNjZXNzIHRoZSB1bmRlcmx5aW5nIGRhdGFcbiAgICovXG4gIGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgICBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmc6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1hcmtzIGZvciBhIGdpdmVuIHZpc3VhbFxuICAgKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBY3RpdmVNYXJrcz59ICBDb2xsZWN0aW9uIG9mIGRhdGEgdGFibGVzIHdpdGggdGhlIGFjdGl2ZSBtYXJrc1xuICAgKi9cbiAgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudGx5IGhpZ2hsaWdodGVkIG1hcmtzIGZvciBhIGdpdmVuIHZpc3VhbFxuICAgKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBY3RpdmVNYXJrcz59ICBDb2xsZWN0aW9uIG9mIGRhdGEgdGFibGVzIHdpdGggdGhlIGFjdGl2ZSBtYXJrc1xuICAgKi9cbiAgZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFzb3VyY2VJZCAgVGhlIGlkIG9mIHRoZSBkYXRhc291cmNlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBjYXB0aW9uLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGVCeUlkIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBuYW1lLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0RGF0YVNvdXJjZURhdGFBc3luYyhcbiAgICBkYXRhc291cmNlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YXNvdXJjZUlkICBUaGUgaWQgb2YgdGhlIGRhdGFzb3VyY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2ljYWxUYWJsZUlkICBUaGUgaWQgb2YgdGhlIGxvZ2NpYWwgdGFibGVcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Um93cyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGUgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IGNhcHRpb24uIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IG5hbWUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YXNvdXJjZUlkICBUaGUgaWQgb2YgdGhlIGRhdGFzb3VyY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2ljYWxUYWJsZUlkICBUaGUgaWQgb2YgdGhlIGxvZ2NpYWwgdGFibGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2VSb3dDb3VudCBUaGUgbnVtYmVyIG9mIHJvd3MgcGVyIHBhZ2UuIFRoZSBkZWZhdWx0IGFuZCBtYXhpbXVtIGlzIDEwLDAwMCByb3dzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IG5hbWUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9naWNhbFRhYmxlSWQgIFRoZSBpZCBvZiB0aGUgbG9nY2lhbCB0YWJsZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlU2VsZWN0aW9uICBXaGV0aGVyIHNlbGVjdGlvbnMgaW4gdGhpcyB2aXogc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQWxsQ29sdW1ucyAgV2hldGhlciB0byBpbmNsdWRlIGFsbCBjb2x1bW5zIG9yIG9ubHkgdGhlIHJlZmVyZW5jZWQgY29sdW1uc1xuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBPdmVycmlkZXMgaW5jbHVkZUFsbENvbHVtbnMsIGxpc3RzIHRoZSBjb2x1bW5zIHRvIGluY2x1ZGUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Um93cyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nOiBib29sZWFuLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpY2FsVGFibGVJZCAgVGhlIGlkIG9mIHRoZSBsb2djaWFsIHRhYmxlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlUm93Q291bnQgVGhlIG51bWJlciBvZiByb3dzIHBlciBwYWdlLiBUaGUgZGVmYXVsdCBhbmQgbWF4aW11bSBpcyAxMCwwMDAgcm93cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBzZWxlY3Rpb25zIGluIHRoaXMgdml6IHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFdoZXRoZXIgdG8gaW5jbHVkZSBhbGwgY29sdW1ucyBvciBvbmx5IHRoZSByZWZlcmVuY2VkIGNvbHVtbnNcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqL1xuICBnZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkNvbHVtbj4+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gdGFibGVJZCAgICAgVGhlIHRhYmxlIGlkIHVzZWQgdG8gZmV0Y2ggZGF0YS5cbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgIFRoZSBwYWdlIG51bWJlciAoemVyby1iYXNlZCkuXG4gICAqIEBwYXJhbSBwYWdlU2l6ZSAgICBUaGUgcGFnZSBzaXplIG9mIHRoZSBvd25pbmcgRGF0YVRhYmxlUmVhZGVyXG4gICAqIEByZXR1cm5zICAgICAgICAgICBBIERhdGFUYWJsZSBjb250YWluaW5nIHRoZSByZXF1ZXN0ZWQgcGFnZS4gVGhlIG51bWJlciBvZiByb3dzIHJldHVybmVkXG4gICAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgbGVzcyB0aGFuIHJlcXVlc3RlZCBhdCB0aGUgZW5kIG9mIHRoZSBkYXRhLlxuICAgKi9cbiAgZ2V0UGFnZUFzeW5jKHRhYmxlSWQ6IHN0cmluZywgcGFnZU51bWJlcjogbnVtYmVyLCBwYWdlU2l6ZTogbnVtYmVyKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gdGFibGVJZCAgICAgVGhlIHRhYmxlIGlkIHVzZWQgdG8gZmV0Y2ggZGF0YS5cbiAgICovXG4gIHJlbGVhc2VBc3luYyh0YWJsZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSB9IGZyb20gJy4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9BY2Nlc3NpYmlsaXR5U2VydmljZUltcGwnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvQW5pbWF0aW9uU2VydmljZUltcGwnO1xuaW1wb3J0IHsgQW5ub3RhdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0Fubm90YXRpb25TZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvRGF0YVNvdXJjZVNlcnZpY2VJbXBsJztcbmltcG9ydCB7IEV4cG9ydFNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0V4cG9ydFNlcnZpY2VJbXBsJztcbmltcG9ydCB7IEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9FeHRlcm5hbENvbnRleHRNZW51U2VydmljZUltcGwnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvRmlsdGVyU2VydmljZUltcGwnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0dldERhdGFTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvUGFyYW1ldGVyc1NlcnZpY2VJbXBsJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1NlbGVjdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFNpemVTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9TaXplU2VydmljZUltcGwnO1xuaW1wb3J0IHsgVmlzdWFsTW9kZWxTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9WaXN1YWxNb2RlbFNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFZpelNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1ZpelNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFpvbmVTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9ab25lU2VydmljZUltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQ6IG51bWJlcik6IHZvaWQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgQW5pbWF0aW9uU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgRGF0YVNvdXJjZVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEV4cG9ydFNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEdldERhdGFTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBGaWx0ZXJTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBQYXJhbWV0ZXJzU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgU2VsZWN0aW9uU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgQW5ub3RhdGlvblNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFpvbmVTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBTaXplU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgVmlzdWFsTW9kZWxTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBWaXpTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcblxuLyoqXG4gKiBCYXNlIGludGVyZmFjZSBmb3IgYW4gYXBpIHNlcnZpY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIG5hbWUgZm9yIHRoaXMgc2VydmljZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29sbGVjdGlvbiBvZiBzZXJ2aWNlIG5hbWUgd2hpY2ggd2lsbCBiZSByZWdpc3RlcmVkIGluIHRoZSBhcGktc2hhcmVkIHByb2plY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gU2VydmljZU5hbWVzIHtcbiAgQWNjZXNzaWJpbGl0eSA9ICdhY2Nlc3NpYmlsaXR5JyxcbiAgQXV0aGVudGljYXRpb24gPSAnYXV0aGVudGljYXRpb24nLFxuICBDbGllbnRJbmZvID0gJ2NsaWVudC1pbmZvLXNlcnZpY2UnLFxuICBEYXRhU291cmNlU2VydmljZSA9ICdkYXRhLXNvdXJjZS1zZXJ2aWNlJyxcbiAgR2V0RGF0YSA9ICdnZXQtZGF0YS1zZXJ2aWNlJyxcbiAgRmlsdGVyID0gJ2ZpbHRlci1zZXJ2aWNlJyxcbiAgTm90aWZpY2F0aW9uID0gJ25vdGlmaWNhdGlvbi1zZXJ2aWNlJyxcbiAgUGFyYW1ldGVycyA9ICdwYXJhbWV0ZXJzLXNlcnZpY2UnLFxuICBTZWxlY3Rpb24gPSAnc2VsZWN0aW9uLXNlcnZpY2UnLFxuICBBbm5vdGF0aW9uID0gJ2Fubm90YXRpb24tc2VydmljZScsXG4gIFpvbmUgPSAnem9uZS1zZXJ2aWNlJyxcbiAgQW5pbWF0aW9uID0gJ2FuaW1hdGlvbi1zZXJ2aWNlJyxcbiAgVml6ID0gJ3Zpei1zZXJ2aWNlJyxcbiAgRXh0ZXJuYWxDb250ZXh0TWVudSA9ICdleHRlcm5hbC1jb250ZXh0LW1lbnUtc2VydmljZScsXG4gIEluaXRpYWxpemF0aW9uID0gJ2luaXRpYWxpemF0aW9uLXNlcnZpY2UnLFxuICBTdG9yeUFjdGl2YXRpb24gPSAnc3RvcnktYWN0aXZhdGlvbi1zZXJ2aWNlJyxcbiAgU2l6ZSA9ICdzaXplLXNlcnZpY2UnLFxuICBFeHBvcnQgPSAnZXhwb3J0LXNlcnZpY2UnLFxuICBWaXN1YWxNb2RlbCA9ICd2aXN1YWwtbW9kZWwtc2VydmljZScsXG59XG5cbi8qKlxuICogRG8gc29tZSBnbG9iYWwgZGVjbGFyYXRpb25zIHNvIHdlIGNhbiBjcmVhdGUgYSBzaW5nbGV0b24gb24gdGhlIHdpbmRvdyBvYmplY3RcbiAqL1xuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBfX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnk6IHsgW3JlZ2lzdHJ5SWQ6IG51bWJlcl06IFNlcnZpY2VSZWdpc3RyeSB9O1xuICB9XG59XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5ID0gd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSB8fCB7fTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlUmVnaXN0cnkge1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbmV3IHNlcnZpY2UgaW50byB0aGUgc2VydmljZSByZWdpc3RyeS4gQW55IGV4aXN0aW5nIG9uZSB3aWxsXG4gICAqIGJlIG92ZXJ3cml0dGVuLiB0aGUgc2VydmljZSBpcyByZWdpc3RlcmVkIHVuZGVyIHNlcnZpY2Uuc2VydmljZU5hbWVcbiAgICpcbiAgICogQHBhcmFtIHtBcGlTZXJ2aWNlfSBzZXJ2aWNlIFRoZSBzZXJ2aXZlIHRvIHJlZ2lzdGVyXG4gICAqL1xuICByZWdpc3RlclNlcnZpY2Uoc2VydmljZTogQXBpU2VydmljZSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgZ2l2ZW4gc2VydmljZSBmcm9tIHRoZSByZWdpc3RyeS4gSWYgdGhlcmUgaXMgbm90IGFcbiAgICogc2VydmljZSByZWdpc3RlcmVkIHVuZGVyIHRoYXQgbmFtZSwgdGhyb3dzIGFuZCBlcnJvclxuICAgKlxuICAgKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgc2VydmljZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VydmljZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UuXG4gICAqIEByZXR1cm5zIHtUfSBUaGUgcmVxdWVzdGVkIHNlcnZpY2VcbiAgICovXG4gIGdldFNlcnZpY2U8VCBleHRlbmRzIEFwaVNlcnZpY2U+KHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBUO1xufVxuXG5jbGFzcyBTZXJ2aWNlUmVnaXN0cnlJbXBsIGltcGxlbWVudHMgU2VydmljZVJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBfc2VydmljZXM6IHsgW3NlcnZpY2VOYW1lOiBzdHJpbmddOiBBcGlTZXJ2aWNlIH07XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3NlcnZpY2VzID0ge307XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJTZXJ2aWNlKHNlcnZpY2U6IEFwaVNlcnZpY2UpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXJ2aWNlc1tzZXJ2aWNlLnNlcnZpY2VOYW1lXSA9IHNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VydmljZTxUIGV4dGVuZHMgQXBpU2VydmljZT4oc2VydmljZU5hbWU6IHN0cmluZyk6IFQge1xuICAgIGlmICghdGhpcy5fc2VydmljZXMuaGFzT3duUHJvcGVydHkoc2VydmljZU5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFNlcnZpY2Ugbm90IHJlZ2lzdGVyZWQ6ICR7c2VydmljZU5hbWV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3NlcnZpY2VzW3NlcnZpY2VOYW1lXSBhcyBUO1xuICB9XG59XG5cbi8qKlxuICogU3RhdGljIGNsYXNzIHVzZWQgZm9yIGdldHRpbmcgYWNjZXNzIHRvIHRoZSBzaW5nbGUgaW5zdGFuY2VcbiAqIG9mIHRoZSBBcGlTZXJ2aWNlUmVnaXN0cnkgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWdpc3RyeUlkLlxuICpcbiAqIEV4dGVuc2lvbnMgYnkgZGVzaWduIGRvbid0IG5lZWQgdG8gc3RvcmUvYWNjZXNzIG11bHRpcGxlIHNlcnZpY2UgcmVnaXN0cmllcy4gVGhlaXIgc2luZ2xlIGluc3RhbmNlIG9mIFNlcnZpY2VSZWdpc3RyeSBpc1xuICogc3RvcmVkL2FjY2VzcyB3aXRoIHJlZ2lzdHJ5SWQgPSAwLlxuICpcbiAqIFdoZXJlYXMgRW1iZWRkaW5nIG5lZWRzIHRvIGJlIGF3YXJlIG9mIHdoaWNoIFNlcnZpY2VSZWdpc3RyeSB0byB1c2Ugd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgdml6emVzIGVtYmVkZGVkLlxuICogQW4gZXhhbXBsZSBvZiBob3cgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSB3aWxsIGxvb2sgd2hlbiB0aGVyZSBhcmUgdHdvIHZpenplczogeyAwIDogU2VydmljZVJlZ2lzdHJ5LCAxIDogU2VydmljZVJlZ2lzdHJ5fVxuICogd2hlcmUgcmVnaXN0cnkgSUQgb2YgMCAmIDEgcmVmZXJzIHRvIHZpeidzIGludGVybmFsIGlkZW50aWZpZXIgKHdoaWNoIGlzIGdlbmVyYXRlZCBieSBWaXpNYW5hZ2VyKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwaVNlcnZpY2VSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIFNlcnZpY2VSZWdpc3RyeVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXQocmVnaXN0cnlJZDogbnVtYmVyKTogU2VydmljZVJlZ2lzdHJ5IHtcbiAgICBpZiAoIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnkgfHwgIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnlbcmVnaXN0cnlJZF0pIHtcbiAgICAgIEFwaVNlcnZpY2VSZWdpc3RyeS5zZXRJbnN0YW5jZShyZWdpc3RyeUlkLCBuZXcgU2VydmljZVJlZ2lzdHJ5SW1wbCgpKTtcbiAgICB9XG5cbiAgICBpZiAoIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnlbcmVnaXN0cnlJZF0pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnU2VydmljZSByZWdpc3RyeSBmYWlsZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeVtyZWdpc3RyeUlkXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHRoYXQgc2V0cyB0aGUgc2VydmljZSByZWdpc3RyeSBpbnN0YW5jZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0cnlJZC4gQ2FuIGJlIHVzZWQgYnkgdW5pdCB0ZXN0c1xuICAgKlxuICAgKiBAcGFyYW0ge1NlcnZpY2VSZWdpc3RyeX0gc2VydmljZVJlZ2lzdHJ5IFRoZSBuZXcgcmVnaXN0cnlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0SW5zdGFuY2UocmVnaXN0cnlJZDogbnVtYmVyLCBzZXJ2aWNlUmVnaXN0cnk6IFNlcnZpY2VSZWdpc3RyeSk6IHZvaWQge1xuICAgIGlmICghd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSkge1xuICAgICAgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSA9IHt9O1xuICAgIH1cbiAgICB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5W3JlZ2lzdHJ5SWRdID0gc2VydmljZVJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIE9ubHkgdXNlZCBieSB1bml0IHRlc3RzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNsZWFyUmVnaXN0cnkoKTogdm9pZCB7XG4gICAgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSA9IHt9O1xuICB9XG5cbiAgLy8gUHJpdmF0ZSB0byBhdm9pZCBhbnlvbmUgY29uc3RydWN0aW5nIHRoaXNcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVG9vbHRpcFRleHRSZXF1ZXN0TW9kZWwgfSBmcm9tICcuLi8uLi9Nb2RlbHMvQWNjZXNzaWJpbGl0eU1vZGVscyc7XG5pbXBvcnQgeyBBY2Nlc3NpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL0FjY2Vzc2liaWxpdHlTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBBY2Nlc3NpYmlsaXR5U2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBBY2Nlc3NpYmlsaXR5U2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkFjY2Vzc2liaWxpdHk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9vbHRpcFRleHRBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIHR1cGxlSWQ6IG51bWJlcik6IFByb21pc2U8U3RyaW5nPiB7XG4gICAgbGV0IHRvb2x0aXBUZXh0UmVxdWVzdCA9IG5ldyBUb29sdGlwVGV4dFJlcXVlc3RNb2RlbCh2aXN1YWxJZCwgdHVwbGVJZCk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0VG9vbHRpcFRleHRBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVG9vbHRpcFRleHRSZXF1ZXN0XTogdG9vbHRpcFRleHRSZXF1ZXN0LFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRUb29sdGlwVGV4dCwgcGFyYW1ldGVycykudGhlbjxTdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBTdHJpbmc7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJhaXNlTGVhdmVNYXJrTmF2Tm90aWZpY2F0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBSZXBsYXlTcGVlZFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRXh0ZXJuYWxFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi8uLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZSB9IGZyb20gJy4uL0FuaW1hdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEFuaW1hdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgQW5pbWF0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkFuaW1hdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyByZXBsYXlBc3luYyhyZXBsYXlTcGVlZDogUmVwbGF5U3BlZWRUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5SZXBsYXlTcGVlZF06IDEuMCxcbiAgICB9O1xuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxSZXBsYXlTcGVlZFR5cGU+KHJlcGxheVNwZWVkLCBSZXBsYXlTcGVlZFR5cGUsICdSZXBsYXlTcGVlZFR5cGUnKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlJlcGxheVNwZWVkXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5zZXRSZXBsYXlTcGVlZFR5cGUuY29udmVydChyZXBsYXlTcGVlZCk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZXBsYXlBbmltYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBbm5vdGF0ZUVudW0sIEFubm90YXRpb24sIEV4ZWN1dGVQYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJZCwgVmVyYklkLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciwgVHVwbGVTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJy4uLy4uL01vZGVscy9TZWxlY3Rpb25Nb2RlbHMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IEFubm90YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vQW5ub3RhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEFubm90YXRpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEFubm90YXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuQW5ub3RhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gYW5ub3RhdGUgYSBtYXJrIG9uIHRoZSBnaXZlbiB3b3Jrc2hlZXQuXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcGFyYW0gbWFya1xuICAgKiBAcGFyYW0gYW5ub3RhdGlvblRleHRcbiAgICovXG4gIHB1YmxpYyBhbm5vdGF0ZU1hcmtBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIG1hcms6IENvbnRyYWN0Lk1hcmtJbmZvLCBhbm5vdGF0aW9uVGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IHRoaXMucGFyc2VNYXJrU2VsZWN0aW9uSWRzKFttYXJrXSk7XG4gICAgY29uc3QgZHVtbXlUYXJnZXRQb2ludCA9IHsgeDogMCwgeTogMCB9O1xuICAgIGNvbnN0IGZvcm1hdHRlZFRleHQgPSBgPGZvcm1hdHRlZC10ZXh0PjxydW4+JHthbm5vdGF0aW9uVGV4dH08L3J1bj48L2Zvcm1hdHRlZC10ZXh0PmA7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYW5ub3RhdGVNYXJrQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuQW5ub3RhdGVFbnVtXTogQW5ub3RhdGVFbnVtLk1hcmssXG4gICAgICBbUGFyYW1ldGVySWQuVGFyZ2V0UG9pbnRdOiBkdW1teVRhcmdldFBvaW50LFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvbkxpc3RdOiBbc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uXSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Gb3JtYXR0ZWRUZXh0XTogZm9ybWF0dGVkVGV4dCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNyZWF0ZUFubm90YXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBFeHBlY3RpbmcgYW4gZW1wdHkgbW9kZWwgYW5kIGhlbmNlIHRoZSB2b2lkIHJlc3BvbnNlLlxuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byByZXRyaWV2ZSBhbm5vdGF0aW9ucyBmb3IgdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PEFubm90YXRpb24+Pn1cbiAgICovXG4gIHB1YmxpYyBnZXRBbm5vdGF0aW9uc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0QW5ub3RhdGlvbnNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEFubm90YXRpb25zLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+PigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGFubm90YXRpb25zTGlzdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxBbm5vdGF0aW9uPjtcbiAgICAgIHJldHVybiB0aGlzLmFubm90YXRpb25GaWx0ZXJNYXAoYW5ub3RhdGlvbnNMaXN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcmVtb3ZlIGFuIGFubm90YXRpb24gZnJvbSBhIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBhbm5vdGF0aW9uXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlQW5ub3RhdGlvbkFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgYW5ub3RhdGlvbjogQ29udHJhY3QuQW5ub3RhdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSB0aGlzLnBhcnNlQW5ub3RhdGlvblNlbGVjdGlvbklkcyhbYW5ub3RhdGlvbl0pO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbW92ZUFubm90YXRpb25Bc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3Rpb25MaXN0XTogW3NlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbl0sXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZW1vdmVBbm5vdGF0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgLy8gRXhwZWN0aW5nIGFuIGVtcHR5IG1vZGVsIGFuZCBoZW5jZSB0aGUgdm9pZCByZXNwb25zZS5cbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSBNYXJrc0luZm9cbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlTWFya1NlbGVjdGlvbklkcyhtYXJrczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+KTogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyIHtcbiAgICBjb25zdCBpZHM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gbmV3IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lcigpO1xuICAgIG1hcmtzLmZvckVhY2goKG1hcmspID0+IHtcbiAgICAgIGNvbnN0IHR1cGxlSWQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IG1hcmsudHVwbGVJZDtcbiAgICAgIGlmICh0dXBsZUlkICE9PSB1bmRlZmluZWQgJiYgdHVwbGVJZCAhPT0gbnVsbCAmJiB0dXBsZUlkID4gMCkge1xuICAgICAgICBpZHMucHVzaCh0dXBsZUlkLnRvU3RyaW5nKCkpOyAvLyBjb2xsZWN0IHRoZSB0dXBsZSBpZHNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnaW52YWxpZCB0dXBsZUlkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IDApIHtcbiAgICAgIC8vIHR1cGxlIGlkcyBiYXNlZCBzZWxlY3Rpb25cbiAgICAgIGNvbnN0IHR1cGxlU2VsZWN0aW9uTW9kZWw6IFR1cGxlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVHVwbGVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb25UeXBlID0gJ3R1cGxlcyc7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLm9iamVjdElkcyA9IGlkcztcbiAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbiA9IHR1cGxlU2VsZWN0aW9uTW9kZWw7XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSBNYXJrQW5ub3RhdGlvbkluZm9cbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlQW5ub3RhdGlvblNlbGVjdGlvbklkcyhhbm5vdGF0aW9uczogQXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4pOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICAgIGNvbnN0IGlkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG4gICAgYW5ub3RhdGlvbnMuZm9yRWFjaCgoYW5ub3RhdGlvbikgPT4ge1xuICAgICAgY29uc3QgYW5ub3RhdGlvbklkOiBudW1iZXIgfCB1bmRlZmluZWQgPSBhbm5vdGF0aW9uLmFubm90YXRpb25JZDtcbiAgICAgIGlmIChhbm5vdGF0aW9uSWQgIT09IHVuZGVmaW5lZCAmJiBhbm5vdGF0aW9uSWQgIT09IG51bGwgJiYgYW5ub3RhdGlvbklkID49IDApIHtcbiAgICAgICAgaWRzLnB1c2goYW5ub3RhdGlvbklkLnRvU3RyaW5nKCkpOyAvLyBjb2xsZWN0IHRoZSBhbm5vdGF0aW9uIGlkc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdpbnZhbGlkIGFubm90YXRpb25JZCcpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAvLyBhbm5vdGF0aW9uIGlkcyBiYXNlZCBzZWxlY3Rpb25cbiAgICAgIGNvbnN0IHR1cGxlU2VsZWN0aW9uTW9kZWw6IFR1cGxlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVHVwbGVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb25UeXBlID0gJ2Fubm90YXRpb25zJztcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwub2JqZWN0SWRzID0gaWRzO1xuICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uID0gdHVwbGVTZWxlY3Rpb25Nb2RlbDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBtYXAgQW5ub3RhdGlvbiB0byBNYXJrQW5ub3RhdGlvbkluZm9cbiAgICogQHBhcmFtIGFubm90YXRpb25cbiAgICogQHJldHVybnMge0Fubm90YXRpb259XG4gICAqL1xuICBwcml2YXRlIG1hcEFubm90YXRpb24oYW5ub3RhdGlvbjogQW5ub3RhdGlvbik6IENvbnRyYWN0LkFubm90YXRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBhbm5vdGF0aW9uSFRNTDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uVGV4dCxcbiAgICAgIGFubm90YXRpb25JZDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uSWQsXG4gICAgICBhbm5vdGF0aW9uVGV4dDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uUGxhaW5UZXh0LFxuICAgICAgYW5ub3RhdGlvblR5cGU6IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5hbm5vdGF0aW9uVHlwZS5jb252ZXJ0KGFubm90YXRpb24uYW5ub3RhdGVFbnVtKSxcbiAgICAgIHR1cGxlSWQ6IGFubm90YXRpb24udHVwbGVJZCEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgdGhlIEFubm90YXRpb25zIHRvIE1hcmsgQW5ub3RhdGlvbnMsIGFuZCBtYXAgdGhlbSB0byBNYXJrQW5ub3RhdGlvbkluZm9cbiAgICogQHBhcmFtIGFubm90YXRpb25zXG4gICAqIEByZXR1cm5zIHtBcnJheTxBbm5vdGF0aW9uPn1cbiAgICovXG4gIHByaXZhdGUgYW5ub3RhdGlvbkZpbHRlck1hcChhbm5vdGF0aW9uczogQXJyYXk8QW5ub3RhdGlvbj4pOiBBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPiB7XG4gICAgY29uc3QgYW5ub3RhdGlvbkluZm9zID0gYW5ub3RhdGlvbnMubWFwKChhbm5vdGF0aW9uKSA9PiB0aGlzLm1hcEFubm90YXRpb24oYW5ub3RhdGlvbikpO1xuXG4gICAgcmV0dXJuIGFubm90YXRpb25JbmZvcztcbiAgfVxufVxuIiwiaW1wb3J0IHsgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbywgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ2xpZW50SW5mb1NlcnZpY2UgfSBmcm9tICcuLi9DbGllbnRJbmZvU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgQ2xpZW50SW5mb1NlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgQ2xpZW50SW5mb1NlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5DbGllbnRJbmZvO1xuICB9XG5cbiAgcHVibGljIGdldENsaWVudEluZm9Bc3luYygpOiBQcm9taXNlPEVtYmVkZGluZ0Jvb3RzdHJhcEluZm8+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldEVtYmVkZGluZ0NsaWVudEluZm87XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldENsaWVudEluZm9Bc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxFbWJlZGRpbmdCb290c3RyYXBJbmZvPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudEluZm8gPSByZXNwb25zZS5yZXN1bHQgYXMgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbztcbiAgICAgIHJldHVybiBjbGllbnRJbmZvO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5LFxuICBEYXRhU2NoZW1hLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBMb2dpY2FsVGFibGVJbmZvLFxuICBQYXJhbWV0ZXJJZCxcbiAgVGFibGVJbmZvLFxuICBUYWJsZUluZm9zLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL0RhdGFTb3VyY2UnO1xuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuLi8uLi9GaWVsZCc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvRGF0YVNvdXJjZUltcGwnO1xuaW1wb3J0IHsgRmllbGRJbXBsIH0gZnJvbSAnLi4vLi4vSW1wbC9GaWVsZEltcGwnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBEYXRhU291cmNlU2VydmljZSB7XG4gIC8vIFNpbmNlIE9iamVjdCBNb2RlbCBpcyBzdXBwb3J0ZWQgc2luY2UgVGFibGVhdSAyMDIwLjIsIERhdGFTb3VyY2VTZXJ2aWNlSW1wbCBjYW4gYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGVcbiAgLy8gcGxhdGZvcm0gdmVyc2lvbiB3aGVuIE9NIHdhcyBzdXBwb3J0ZWQuIE9uY2Ugd2UgZHJvcCBzdXBwb3J0IGZvciBUYWJsZWF1IHZlcnNpb25zIDw9IDIwMjAuMSwgYWxsIGFkZGl0aW9uYWxcbiAgLy8gY29kZSBpbiBoZXJlIGZvciBPYmplY3QgTW9kZWwgY2FuIGJlIHJlbW92ZWQuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQ6IG51bWJlcikge1xuICAgIHN1cGVyKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpO1xuICB9XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIHJlZnJlc2hBc3luYyhkYXRhU291cmNlSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVmcmVzaEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EZWx0YVRpbWVNc106IDAsXG4gICAgICBbUGFyYW1ldGVySWQuU2hvdWxkUmVmcmVzaERTXTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgLy8gT24gc2VydmVyOiBOb3QgcGFzc2luZyB0aGUgZGF0YXNvdXJjZSBpZCB3aWxsIHJlZnJlc2ggYWxsIGRhdGFzb3VyY2VzLlxuICAgIGlmIChkYXRhU291cmNlSWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXSA9IGRhdGFTb3VyY2VJZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZWZyZXNoRGF0YVNvdXJjZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYyhkYXRhU291cmNlSWQ6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8VGFibGVJbmZvPj4ge1xuICAgIGNvbnN0IGpvaW5QYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0QWN0aXZlVGFibGVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICB9O1xuXG4gICAgLy8gR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdGFibGVzIHVzZWQgYnkgdGhpcyBjb25uZWN0aW9uXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0QWN0aXZlVGFibGVzLCBqb2luUGFyYW1ldGVycykudGhlbjxBcnJheTxUYWJsZUluZm8+Pigoam9pblJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZUluZm9zID0gam9pblJlc3BvbnNlLnJlc3VsdCBhcyBUYWJsZUluZm9zO1xuXG4gICAgICAvLyBnZXRBY3RpdmVUYWJsZXMgaXMgdW5zdXBwb3J0ZWQgZm9yIGN1YmVzIGFuZCBHQS4gV2UgZG8gbm90IGhhdmUgYSBjb25uZWN0aW9uIHR5cGUgcHJvcGVydHlcbiAgICAgIC8vIGF2YWlsYWJsZSBmcm9tIHRoZSBwbGF0Zm9ybSAoaW50ZW50aW9uYWxseSwgdG8gcmVkdWNlIGNvZGUgY2h1cm4gYXMgbmV3IGNvbm5lY3Rpb25zIGFyZSBhZGRlZCkuXG4gICAgICAvLyBJbnN0ZWFkLGp1c3QgY2hlY2sgaWYgYW55IHRhYmxlcyBhcmUgcmV0dXJuZWQuIFRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eSBmb3IgYW55IG5vbi10YWJsZSBiYXNlZCBkYXRhc291cmNlLlxuICAgICAgaWYgKHRhYmxlSW5mb3MudGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuVW5zdXBwb3J0ZWRNZXRob2RGb3JEYXRhU291cmNlVHlwZSwgYGdldEFjdGl2ZVRhYmxlcyBpcyBub3Qgc3VwcG9ydGVkIGZvcjogJHtkYXRhU291cmNlSWR9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZUluZm9zLnRhYmxlcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8RGF0YVNjaGVtYT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXRhU291cmNlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0RGF0YVNvdXJjZXMsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVNjaGVtYT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFTY2hlbWE7XG4gICAgICByZXR1cm4gZGF0YVNjaGVtYTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGxEYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8RGF0YVNjaGVtYT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRBbGxEYXRhU291cmNlc0FzeW5jJyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEFsbERhdGFTb3VyY2VzLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFTY2hlbWE+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBEYXRhU2NoZW1hO1xuICAgICAgcmV0dXJuIGRhdGFTY2hlbWE7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKGRhdGFTb3VyY2VJZDogc3RyaW5nKTogUHJvbWlzZTxDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5W10+IHtcbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICB9O1xuXG4gICAgLy8gR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdGFibGVzIHVzZWQgYnkgdGhpcyBjb25uZWN0aW9uXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0Q29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyaWVzLCBwYXJhbXMpLnRoZW48Q29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeVtdPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uU3VtbWFyaWVzID0gcmVzcG9uc2UucmVzdWx0IGFzIENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnlbXTtcbiAgICAgIHJldHVybiBkZXNjcmlwdGlvblN1bW1hcmllcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWVsZEFzeW5jKGdsb2JhbGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb250cmFjdC5GaWVsZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RmllbGRBbmREYXRhU291cmNlO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRGaWVsZEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5GaWVsZElkXTogZ2xvYmFsZmllbGROYW1lLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuRmllbGQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IHJlc3BvbnNlLnJlc3VsdFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlXSBhcyBJbnRlcm5hbENvbnRyYWN0LkRhdGFTb3VyY2U7XG4gICAgICBjb25zdCBmaWVsZCA9IHJlc3BvbnNlLnJlc3VsdFtQYXJhbWV0ZXJJZC5GaWVsZF0gYXMgRmllbGQ7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RmllbGQoZmllbGQsIHRoaXMuY29udmVydERhdGFTb3VyY2UoZGF0YVNvdXJjZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZXNBc3luYyhkYXRhU291cmNlSWQ6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+IHtcbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRMb2dpY2FsVGFibGVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldExvZ2ljYWxUYWJsZXMsIHBhcmFtcykudGhlbjxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PExvZ2ljYWxUYWJsZUluZm8+O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZXNBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PiB7XG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0VW5kZXJseWluZ1RhYmxlcywgcGFyYW1zKS50aGVuPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8TG9naWNhbFRhYmxlSW5mbz47XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRGaWVsZChmaWVsZDogSW50ZXJuYWxDb250cmFjdC5GaWVsZCwgZGF0YVNvdXJjZTogQ29udHJhY3QuRGF0YVNvdXJjZSk6IENvbnRyYWN0LkZpZWxkIHtcbiAgICByZXR1cm4gbmV3IEZpZWxkKG5ldyBGaWVsZEltcGwoZmllbGQsIGRhdGFTb3VyY2UpKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydERhdGFTb3VyY2UoZGF0YVNvdXJjZTogSW50ZXJuYWxDb250cmFjdC5EYXRhU291cmNlKTogQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRhU291cmNlKG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlLCB0aGlzLl9yZWdpc3RyeUlkKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeHBvcnRDcm9zc3RhYlNoZWV0TWFwLFxuICBFeHBvcnRGaWxlLFxuICBFeHBvcnRQREZPcHRpb25zIGFzIEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgUGFyYW1ldGVySWQsXG4gIFZlcmJJZCxcbiAgVmlzdWFsSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDcm9zc3RhYkZpbGVGb3JtYXQsXG4gIEV4cG9ydERhdGFPcHRpb25zLFxuICBFeHBvcnRQREZPcHRpb25zIGFzIEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCxcbiAgU2hhcmVkRXJyb3JDb2RlcyxcbiAgU2hlZXRUeXBlIGFzIEV4dGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBFeHBvcnRIZWxwZXJzIH0gZnJvbSAnLi4vLi4vVXRpbHMvRXhwb3J0SGVscGVycyc7XG5pbXBvcnQgeyBFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vRXhwb3J0U2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBFeHBvcnRTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEV4cG9ydFNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5FeHBvcnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcEFzeW5jKGN1cnJlbnRTaGVldFR5cGU6IEV4dGVybmFsU2hlZXRUeXBlKTogUHJvbWlzZTxFeHBvcnRDcm9zc3RhYlNoZWV0TWFwPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRFeHBvcnRDcm9zc3RhYlNoZWV0TWFwO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRFeHBvcnRDcm9zc3RhYlNoZWV0TWFwQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1cnJlbnRTaGVldFR5cGVdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hlZXRUeXBlLmNvbnZlcnQoY3VycmVudFNoZWV0VHlwZSksXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgRXhwb3J0Q3Jvc3N0YWJTaGVldE1hcDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZXhwb3J0Q3Jvc3N0YWJBc3luYyhcbiAgICBzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmb3JtYXQ6IENyb3NzdGFiRmlsZUZvcm1hdCxcbiAgICBleHBvcnRhYmxlV29ya3NoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sXG4gICAgY3VycmVudFNoZWV0VHlwZTogRXh0ZXJuYWxTaGVldFR5cGUsXG4gICk6IFByb21pc2U8RXhwb3J0RmlsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlTaGVldE5hbWUoZXhwb3J0YWJsZVdvcmtzaGVldE5hbWVzLCBzaGVldE5hbWUpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q3Jvc3N0YWJGaWxlRm9ybWF0Pihmb3JtYXQsIENyb3NzdGFiRmlsZUZvcm1hdCwgJ0Nyb3NzdGFiRmlsZUZvcm1hdCcpO1xuXG4gICAgLy8gVGhlIHByZXMgbGF5ZXIgY29tbWFuZCBmb3IgZXhwb3J0aW5nIENyb3NzdGFiIHVzZXMgU2ltcGxlU2hlZXRJZGVudGlmaWVycyBpbnN0ZWFkIG9mIHNoZWV0IG5hbWVzLlxuICAgIC8vIFRoZSBleHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpIGN1cnJlbnQgZG9lcyBub3Qgc3RvcmUgcmVmZXJlbmNlcyB0byB0aGUgU2ltcGxlU2hlZXRJZGVudGlmaWVycyBvZiBpdHMgc2hlZXRzXG4gICAgLy8gc28gd2UgY2FsbCBhIHByZXMgbGF5ZXIgY29tbWFuZCB0aGF0IGdpdmVzIHVzIHRoZSBTaW1wbGVTaGVldElkZW50aWZpZXIgZm9yIGVhY2ggc2hlZXQgbmFtZSB0aGF0IGFwcGVhcnMgaW4gdGhlXG4gICAgLy8gZXhwb3J0IENyb3NzdGFiIGRpYWxvZyBwb3B1cC5cbiAgICBjb25zdCBzaGVldE5hbWVUb0lkTWFwID0gYXdhaXQgdGhpcy5nZXRFeHBvcnRDcm9zc3RhYlNoZWV0TWFwQXN5bmMoY3VycmVudFNoZWV0VHlwZSk7XG4gICAgaWYgKCFzaGVldE5hbWVUb0lkTWFwW3NoZWV0TmFtZV0pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnbWlzc2luZyBzaGVldCBkb2MgaWQgZnJvbSBzaGVldE1hcCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdleHBvcnRDcm9zc3RhYkFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaGVldElkZW50aWZpZXJdOiBzaGVldE5hbWVUb0lkTWFwW3NoZWV0TmFtZV0sXG4gICAgICBbUGFyYW1ldGVySWQuU2VuZE5vdGlmaWNhdGlvbnNdOiB0cnVlLCAvLyBzZW5kIG5vdGlmaWNhdGlvbiBvbiBwcmVzIGxheWVyIHRoYXQgdHJpZ2dlcnMgZmlsZSBkb3dubG9hZFxuICAgIH07XG5cbiAgICAvLyBwcmVzIGxheWVyIGNvbW1hbmQgaW52b2tlZCBkZXBlbmRzIG9uIHRoZSBjcm9zc3RhYiBmaWxlIGZvcm1hdFxuICAgIGxldCB2ZXJiO1xuICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICBjYXNlIENyb3NzdGFiRmlsZUZvcm1hdC5DU1Y6XG4gICAgICAgIHZlcmIgPSBWZXJiSWQuRXhwb3J0Q3Jvc3N0YWJDc3ZEb3dubG9hZDtcbiAgICAgICAgLy8gQ1NWIG9ubHkgcGFyYW1ldGVyOiBzZWUgYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1jcm9zc3RhYi1vcHRpb25zLWRpYWxvZyByZXBvXG4gICAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVXNlVGFiRGVsaW1pdGVyc10gPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ3Jvc3N0YWJGaWxlRm9ybWF0LkV4Y2VsOlxuICAgICAgICB2ZXJiID0gVmVyYklkLkV4cG9ydENyb3NzdGFiRXhjZWxEb3dubG9hZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3Vuc3VwcG9ydGVkIENyb3NzdGFiIGZpbGUgZm9ybWF0LicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycylcbiAgICAgIC50aGVuPEV4cG9ydEZpbGU+KChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgRXhwb3J0RmlsZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuQ3Jvc3N0YWJDcmVhdGlvbkVycm9yLCAnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3aGlsZSBnZW5lcmF0aW5nIHRoZSBkb2N1bWVudC4nKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGV4cG9ydERhdGFBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIG9wdGlvbnM6IEV4cG9ydERhdGFPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUV4cG9ydERhdGFPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgLy8gUmVtb3ZlIGFueSBkdXBsaWNhdGVzIGZyb20gdGhlIGlucHV0IGFycmF5XG4gICAgY29uc3QgY29sdW1uc0FzU2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQob3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCk7XG4gICAgY29uc3QgY29sdW1uc1RvSW5jbHVkZUJ5SWQgPSBBcnJheS5mcm9tKGNvbHVtbnNBc1NldCk7XG5cbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkV4cG9ydERhdGFEb3dubG9hZDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhwb3J0RGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBvcHRpb25zLmlnbm9yZUFsaWFzZXMgPz8gZmFsc2UsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdOiBjb2x1bW5zVG9JbmNsdWRlQnlJZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKVxuICAgICAgLnRoZW48dm9pZD4oKCkgPT4ge30pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuRGF0YUNyZWF0aW9uRXJyb3IsICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGRvY3VtZW50LicpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZXhwb3J0UG93ZXJQb2ludEFzeW5jKHNoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sIGV4cG9ydFNjZW5hcmlvczogRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCk6IFByb21pc2U8RXhwb3J0RmlsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlTaGVldE5hbWVzRm9yUERGQW5kUFBUKHNoZWV0TmFtZXMsIGV4cG9ydFNjZW5hcmlvcyk7XG5cbiAgICAvLyBOb3RlOiB0aGUgRXhwb3J0T3JpZ2luVXJsIHBhcmFtIGlzIGxpc3RlZCBhcyBvcHRpb25hbCBmb3IgdGhlIHByZXMgbGF5ZXIgY29tbWFuZCB3ZSBhcmUgaW52b2tpbmc7IGhvd2V2ZXIsXG4gICAgLy8gcmVjZW50IGNoYW5nZXMgd2VyZSBtYWRlIHRoYXQgZW5mb3JjZWQgdGhlIHVzZSBvZiB0aGUgZW1wdHkgc3RyaW5nIHdoZW4gaW52b2tpbmcgdGhpcyBjb21tYW5kIHdpdGggbm8gRXhwb3J0T3JpZ2luVXJsLlxuICAgIC8vIHNlZSBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBvd2VycG9pbnQtb3B0aW9ucy1kaWFsb2cgcmVwby5cbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkV4cG9ydFBvd2VycG9pbnREb3dubG9hZDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhwb3J0UG93ZXJQb2ludEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHBvcnRPcmlnaW5VcmxdOiAnJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3RlZFNoZWV0TmFtZXNdOiBzaGVldE5hbWVzLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpXG4gICAgICAudGhlbjxFeHBvcnRGaWxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4cG9ydEZpbGU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgICBTaGFyZWRFcnJvckNvZGVzLlBvd2VyUG9pbnRDcmVhdGlvbkVycm9yLFxuICAgICAgICAgICdBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZ2VuZXJhdGUgdGhlIFBvd2VyUG9pbnQgZmlsZS4nLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZXhwb3J0UERGQXN5bmMoXG4gICAgc2hlZXROYW1lczogQXJyYXk8c3RyaW5nPixcbiAgICBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBleHBvcnRTY2VuYXJpb3M6IEV4cG9ydFNjZW5hcmlvc0ZvclBERkFuZFBvd2VyUG9pbnQsXG4gICk6IFByb21pc2U8RXhwb3J0RmlsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFeHBvcnRQREZPcHRpb25zKGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVNoZWV0TmFtZXNGb3JQREZBbmRQUFQoc2hlZXROYW1lcywgZXhwb3J0U2NlbmFyaW9zKTtcblxuICAgIGNvbnN0IGludGVybmFsRXhwb3J0UGRmT3B0aW9uczogSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zID0gYXdhaXQgdGhpcy5nZXRFeHBvcnRQREZPcHRpb25zQXN5bmMoKTtcbiAgICBFeHBvcnRIZWxwZXJzLnVwZGF0ZUludGVybmFsRXhwb3J0UERGT3B0aW9ucyhpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMsIGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucywgc2hlZXROYW1lcyk7XG5cbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkV4cG9ydFBkZkRvd25sb2FkO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdleHBvcnRQREZBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRXhwb3J0UGRmT3B0aW9uc106IGludGVybmFsRXhwb3J0UGRmT3B0aW9ucyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKVxuICAgICAgLnRoZW48RXhwb3J0RmlsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHBvcnRGaWxlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5QREZDcmVhdGlvbkVycm9yLCAnVW5hYmxlIHRvIGNyZWF0ZSBQREYgYmVjYXVzZSBzb21ldGhpbmcgd2VudCB3cm9uZy4gVHJ5IGFnYWluLicpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RXhwb3J0UERGT3B0aW9uc0FzeW5jKCk6IFByb21pc2U8SW50ZXJuYWxFeHBvcnRQREZPcHRpb25zPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRFeHBvcnRQZGZPcHRpb25zO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRFeHBvcnRQZGZPcHRpb25zQXN5bmMnLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEludGVybmFsRXhwb3J0UERGT3B0aW9ucz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQXBpTWVudVR5cGUsIENvbnRleHRNZW51T3B0aW9ucyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZSB9IGZyb20gJy4uL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnU7XG4gIH1cblxuICBwdWJsaWMgYXBwZW5kQ29udGV4dE1lbnVBc3luYyhzaGVldE5hbWU6IHN0cmluZywgdGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIGNvbmZpZzogQ29udGV4dE1lbnVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFwcGVuZEV4dGVybmFsTWVudUl0ZW07XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGVuZENvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SXRlbURpc3BsYXlOYW1lXTogY29uZmlnLmRpc3BsYXlOYW1lLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IG5ld01lbnVJdGVtSWQgPSByZXNwb25zZS5yZXN1bHQgYXMgc3RyaW5nO1xuICAgICAgcmV0dXJuIG5ld01lbnVJdGVtSWQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQ29udGV4dE1lbnVBc3luYyhzaGVldE5hbWU6IHN0cmluZywgdGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVJdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuUmVtb3ZlRXh0ZXJuYWxNZW51SXRlbTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVtb3ZlQ29udGV4dE1lbnVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuV29ya3NoZWV0TmFtZV06IHNoZWV0TmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVJdGVtSWRdOiBtZW51SXRlbUlkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZXhlY3V0ZUNvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkV4ZWN1dGVFeHRlcm5hbE1lbnVJdGVtO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdleGVjdXRlQ29udGV4dE1lbnVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuV29ya3NoZWV0TmFtZV06IHNoZWV0TmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVJdGVtSWRdOiBtZW51SXRlbUlkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVuYW1lQ29udGV4dE1lbnVBc3luYyhzaGVldE5hbWU6IHN0cmluZywgdGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVIZWFkZXI6IHN0cmluZywgbWVudURlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLlJlbmFtZUV4dGVybmFsTWVudTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVuYW1lQ29udGV4dE1lbnVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuV29ya3NoZWV0TmFtZV06IHNoZWV0TmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVIZWFkZXJdOiBtZW51SGVhZGVyLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVybmFsTWVudURlc2NyaXB0aW9uXTogbWVudURlc2NyaXB0aW9uLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBEYXRlUmFuZ2VUeXBlLFxuICBFbWJlZGRpbmdFcnJvckNvZGVzLFxuICBFcnJvckNvZGVzLFxuICBGaWx0ZXJEb21haW5UeXBlLFxuICBGaWx0ZXJUeXBlIGFzIEV4dGVybmFsRmlsdGVyVHlwZSxcbiAgU2hhcmVkRXJyb3JDb2Rlcyxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBGaWx0ZXJUeXBlLCBQYXJhbWV0ZXJJZCwgVmVyYklkLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi8uLi9BcGlTaGFyZWQnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIGFzIEV4dGVybmFsRW51bUNvbnZlcnRlciB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIGFzIEludGVybmFsRW51bUNvbnZlcnRlciB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHtcbiAgQ2F0ZWdvcmljYWxEb21haW4sXG4gIENhdGVnb3JpY2FsRmlsdGVyLFxuICBIaWVyYXJjaGljYWxEYXRhVmFsdWUsXG4gIEhpZXJhcmNoaWNhbEZpbHRlcixcbiAgSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWwsXG4gIFJhbmdlRG9tYWluLFxuICBSYW5nZUZpbHRlcixcbiAgUmVsYXRpdmVEYXRlRmlsdGVyLFxufSBmcm9tICcuLi8uLi9Nb2RlbHMvRmlsdGVyTW9kZWxzJztcbmltcG9ydCB7IERhdGFWYWx1ZSB9IGZyb20gJy4uLy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcbmltcG9ydCB7IERhdGFWYWx1ZUZhY3RvcnkgfSBmcm9tICcuLi8uLi9VdGlscy9EYXRhVmFsdWVGYWN0b3J5JztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi4vLi4vVXRpbHMvUGFyYW0nO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEZpbHRlclNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgRmlsdGVyU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkZpbHRlcjtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4sXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQXBwbHlDYXRlZ29yaWNhbEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICd2YWx1ZXMgcGFyYW1ldGVyIGZvciBhcHBseUZpbHRlckFzeW5jIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJWYWx1ZXNdID0gdmFsdWVzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVXBkYXRlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyVXBkYXRlVHlwZS5jb252ZXJ0KHVwZGF0ZVR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSXNFeGNsdWRlTW9kZV0gPVxuICAgICAgZmlsdGVyT3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IGZpbHRlck9wdGlvbnMuaXNFeGNsdWRlTW9kZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBmaWx0ZXJPcHRpb25zLmlzRXhjbHVkZU1vZGU7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZE5hbWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgZmllbGROYW1lOiBzdHJpbmcsIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LlJhbmdlRmlsdGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BcHBseVJhbmdlRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhcHBseVJhbmdlRmlsdGVyQXN5bmMnLFxuICAgIH07XG5cbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5taW4gIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXJPcHRpb25zLm1pbiAhPT0gbnVsbCkge1xuICAgICAgbGV0IG1pbjogc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgaWYgKGZpbHRlck9wdGlvbnMubWluIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBtaW4gPSBQYXJhbS5zZXJpYWxpemVEYXRlRm9yUGxhdGZvcm0oZmlsdGVyT3B0aW9ucy5taW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWluID0gZmlsdGVyT3B0aW9ucy5taW47XG4gICAgICB9XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclJhbmdlTWluXSA9IG1pbjtcbiAgICB9XG5cbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5tYXggIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXJPcHRpb25zLm1heCAhPT0gbnVsbCkge1xuICAgICAgbGV0IG1heDogc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgaWYgKGZpbHRlck9wdGlvbnMubWF4IGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBtYXggPSBQYXJhbS5zZXJpYWxpemVEYXRlRm9yUGxhdGZvcm0oZmlsdGVyT3B0aW9ucy5tYXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWF4ID0gZmlsdGVyT3B0aW9ucy5tYXg7XG4gICAgICB9XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclJhbmdlTWF4XSA9IG1heDtcbiAgICB9XG5cbiAgICAvLyBUaGUgbnVsbCBvcHRpb24gaXMgdXNlZCB3aXRoIG1pbittYXggZm9yICdpbmNsdWRlLXJhbmdlJyBvciAnaW5jbHVkZS1yYW5nZS1vci1udWxsJ1xuICAgIGlmIChmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24pIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyUmFuZ2VOdWxsT3B0aW9uXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5udWxsT3B0aW9ucy5jb252ZXJ0KGZpbHRlck9wdGlvbnMubnVsbE9wdGlvbik7XG4gICAgfVxuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZE5hbWVdID0gZmllbGROYW1lO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHRoaXMuYXBpRmlsdGVySGFuZGxlckNoZWNrRm9yQ29tbWFuZEVycm9yKHJlc3BvbnNlLnJlc3VsdCBhcyB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTtcbiAgICAgIHJldHVybiBmaWVsZE5hbWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+IHwgQ29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxzLFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkhpZXJhcmNoaWNhbEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcblxuICAgIGNvbnN0IGhpZXJhcmNoaWNhbExldmVscyA9ICh2YWx1ZXMgYXMgQ29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxzKS5sZXZlbHM7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShoaWVyYXJjaGljYWxMZXZlbHMpICYmIGhpZXJhcmNoaWNhbExldmVscy5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlckxldmVsc10gPSBoaWVyYXJjaGljYWxMZXZlbHM7XG4gICAgfSBlbHNlIGlmICgodmFsdWVzIGFzIEFycmF5PFN0cmluZz4pLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVmFsdWVzXSA9IHZhbHVlcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhlIHNlcnZlciBjb21tYW5kIGV4cGVjdHMgZW1wdHkgbGlzdCBmb3IgY2xlYXJpbmcgdGhlIGZpbHRlclxuICAgICAgLy8gaXQgYWxzbyBleHBlY3RzIGVpdGhlcnMgRmlsdGVyTGV2ZWxzIG9yIEZpbHRlclZhbHVlcyB0byBiZSBzZXRcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyTGV2ZWxzXSA9IFtdO1xuICAgIH1cblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVXBkYXRlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyVXBkYXRlVHlwZS5jb252ZXJ0KHVwZGF0ZVR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSXNFeGNsdWRlTW9kZV0gPSBmaWx0ZXJPcHRpb25zICYmICEhZmlsdGVyT3B0aW9ucy5pc0V4Y2x1ZGVNb2RlO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNsZWFyRmlsdGVyQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5DbGVhckZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnY2xlYXJGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9zbmUpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZE5hbWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zKSB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BcHBseVJlbGF0aXZlRGF0ZUZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlBlcmlvZFR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLnBlcmlvZFR5cGUuY29udmVydChvcHRpb25zLnBlcmlvZFR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRGF0ZVJhbmdlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZGF0ZVJhbmdlVHlwZS5jb252ZXJ0KG9wdGlvbnMucmFuZ2VUeXBlKTtcbiAgICBpZiAob3B0aW9ucy5yYW5nZVR5cGUgPT09IERhdGVSYW5nZVR5cGUuTGFzdE4gfHwgb3B0aW9ucy5yYW5nZVR5cGUgPT09IERhdGVSYW5nZVR5cGUuTmV4dE4pIHtcbiAgICAgIGlmIChvcHRpb25zLnJhbmdlTiA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMucmFuZ2VOID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgICAgRW1iZWRkaW5nRXJyb3JDb2Rlcy5NaXNzaW5nUmFuZ2VORm9yUmVsYXRpdmVEYXRlRmlsdGVycyxcbiAgICAgICAgICAnTWlzc2luZyByYW5nZU4gZmllbGQgZm9yIGEgcmVsYXRpdmUgZGF0ZSBmaWx0ZXIgb2YgTEFTVE4gb3IgTkVYVE4uJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUmFuZ2VOXSA9IG9wdGlvbnMucmFuZ2VOO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmFuY2hvckRhdGUgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmFuY2hvckRhdGUgIT09IG51bGwpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuQW5jaG9yRGF0ZV0gPSB0aGlzLmNvbnZlcnRBbmNob3JEYXRlKG9wdGlvbnMuYW5jaG9yRGF0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRGaWx0ZXJzO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRGaWx0ZXJzQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJzID0gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PEludGVybmFsQ29udHJhY3QuRmlsdGVyPjtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnREb21haW5GaWx0ZXJzKGZpbHRlcnMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldENhdGVnb3JpY2FsRG9tYWluQXN5bmMoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRDYXRlZ29yaWNhbERvbWFpbjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0Q2F0ZWdvcmljYWxEb21haW5Bc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZElkXSA9IGZpZWxkSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Eb21haW5UeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJEb21haW5UeXBlLmNvbnZlcnQoZG9tYWluVHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IHJlc3BvbnNlLnJlc3VsdCBhcyBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluO1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydENhdGVnb3JpY2FsRG9tYWluKGRvbWFpbiwgZG9tYWluVHlwZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmFuZ2VEb21haW5Bc3luYyh3b3Jrc2hlZXROYW1lOiBzdHJpbmcsIGZpZWxkSWQ6IHN0cmluZywgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSk6IFByb21pc2U8Q29udHJhY3QuUmFuZ2VEb21haW4+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldFJhbmdlRG9tYWluO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRSYW5nZURvbWFpbkFzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0ge1xuICAgICAgd29ya3NoZWV0OiB3b3Jrc2hlZXROYW1lLFxuICAgIH07XG5cbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkSWRdID0gZmllbGRJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkRvbWFpblR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmZpbHRlckRvbWFpblR5cGUuY29udmVydChkb21haW5UeXBlKTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuUmFuZ2VEb21haW4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZG9tYWluID0gcmVzcG9uc2UucmVzdWx0IGFzIEludGVybmFsQ29udHJhY3QuUmFuZ2VEb21haW47XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRSYW5nZURvbWFpbihkb21haW4sIGRvbWFpblR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldERhc2hib2FyZEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldERhc2hib2FyZEZpbHRlcnM7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldERhc2hib2FyZEZpbHRlcnNBc3luYycsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJzID0gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PEludGVybmFsQ29udHJhY3QuRmlsdGVyPjtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnREb21haW5GaWx0ZXJzKGZpbHRlcnMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RGFzaGJvYXJkRmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkRhc2hib2FyZENhdGVnb3JpY2FsRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhcHBseURhc2hib2FyZEZpbHRlckFzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclZhbHVlc10gPSB2YWx1ZXM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJVcGRhdGVUeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJVcGRhdGVUeXBlLmNvbnZlcnQodXBkYXRlVHlwZSk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Jc0V4Y2x1ZGVNb2RlXSA9IGZpbHRlck9wdGlvbnMgJiYgISFmaWx0ZXJPcHRpb25zLmlzRXhjbHVkZU1vZGU7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgc3RyaW5nO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMod29ya3NoZWV0TmFtZTogc3RyaW5nLCBmaWVsZElkOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgICBjb25zdCBzaGFyZWRGaWx0ZXJNb2RlbCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUdldEFwcGxpZWRXb3Jrc2hlZXRzKHdvcmtzaGVldE5hbWUsIGZpZWxkSWQsICdnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jJyk7XG4gICAgY29uc3Qgd29ya3NoZWV0TmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgc2hhcmVkRmlsdGVyTW9kZWwud29ya3NoZWV0cz8ubWFwKCh3b3Jrc2hlZXRJbmZvOiBJbnRlcm5hbENvbnRyYWN0LlNoYXJlZEZpbHRlcldvcmtzaGVldE1vZGVsKSA9PiB7XG4gICAgICBpZiAod29ya3NoZWV0SW5mby5pc1NlbGVjdGVkKSB7XG4gICAgICAgIHdvcmtzaGVldE5hbWVzLnB1c2god29ya3NoZWV0SW5mby53b3Jrc2hlZXROYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gd29ya3NoZWV0TmFtZXM7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0QXBwbGllZFdvcmtzaGVldHNBc3luYyhcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGFwcGx5VG9Xb3Jrc2hlZXRzOiBBcnJheTxzdHJpbmc+LFxuICApOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgICBjb25zdCBzaGFyZWRGaWx0ZXJNb2RlbCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUdldEFwcGxpZWRXb3Jrc2hlZXRzKHdvcmtzaGVldE5hbWUsIGZpZWxkSWQsICdnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jSW50ZXJuYWwnKTtcbiAgICBpZiAoIXNoYXJlZEZpbHRlck1vZGVsIHx8ICFzaGFyZWRGaWx0ZXJNb2RlbC53b3Jrc2hlZXRzKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1RoaXMgZmlsdGVyIGRvZXMgbm90IGFwcGx5IHRvIG11bHRpcGxlIHdvcmtzaGVldHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxvd2VkV29ya3NoZWV0czogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgYWN0aXZlV29ya3NoZWV0ID0gJyc7XG4gICAgc2hhcmVkRmlsdGVyTW9kZWwud29ya3NoZWV0cy5mb3JFYWNoKCh3b3Jrc2hlZXQpID0+IHtcbiAgICAgIC8vIEdldCBhY3RpdmUgd29ya3NoZWV0XG4gICAgICBpZiAod29ya3NoZWV0LmlzQWN0aXZlKSB7XG4gICAgICAgIGFjdGl2ZVdvcmtzaGVldCA9IHdvcmtzaGVldC53b3Jrc2hlZXROYW1lO1xuICAgICAgfVxuXG4gICAgICAvLyBQb3B1bGF0ZSBhbGxvd2VkIHdvcmtzaGVldHNcbiAgICAgIGlmICh3b3Jrc2hlZXQuaXNTZWxlY3RlZCB8fCB3b3Jrc2hlZXQuaXNFbmFibGVkKSB7XG4gICAgICAgIGFsbG93ZWRXb3Jrc2hlZXRzLnB1c2god29ya3NoZWV0LndvcmtzaGVldE5hbWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGFjdGl2ZVdvcmtzaGVldCA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnTm8gYWN0aXZlIHdvcmtzaGVldCcpO1xuICAgIH1cblxuICAgIGlmICghYXBwbHlUb1dvcmtzaGVldHMuaW5jbHVkZXMoYWN0aXZlV29ya3NoZWV0KSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAke2FjdGl2ZVdvcmtzaGVldH0gbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgYXBwbGllZCB3b3Jrc2hlZXRzYCk7XG4gICAgfVxuXG4gICAgYXBwbHlUb1dvcmtzaGVldHMuZm9yRWFjaCgoc2hlZXQpID0+IHtcbiAgICAgIC8vIGNoZWNrIGlmIGl0J3MgcHJlc2VudCB3aXRoaW4gY29tcGF0aWJsZSBzaGVldHNcbiAgICAgIGlmICghYWxsb3dlZFdvcmtzaGVldHMuaW5jbHVkZXMoc2hlZXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgVGhlIGZpZWxkICR7ZmllbGROYW1lfSBpc24ndCBhcHBsaWNhYmxlIHRvIHRoZSB3b3Jrc2hlZXQgJHtzaGVldH1gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQ2hhbmdlU2hhcmVkRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge307XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdID0gJ3NldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMnO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0ge1xuICAgICAgd29ya3NoZWV0OiB3b3Jrc2hlZXROYW1lLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZElkXSA9IGZpZWxkSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5TaGFyZWRGaWx0ZXJTaGVldHNdID0gYXBwbHlUb1dvcmtzaGVldHM7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nW10+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIGFwcGx5VG9Xb3Jrc2hlZXRzO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gSGVscGVyIE1ldGhvZHNcblxuICBwcml2YXRlIGV4ZWN1dGVHZXRBcHBsaWVkV29ya3NoZWV0cyhcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIHRlbGVtZXRyeUZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPEludGVybmFsQ29udHJhY3QuU2hhcmVkRmlsdGVyTW9kZWw+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldFNoYXJlZEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHt9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXSA9IHRlbGVtZXRyeUZ1bmN0aW9uTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGRJZF0gPSBmaWVsZElkO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEludGVybmFsQ29udHJhY3QuU2hhcmVkRmlsdGVyTW9kZWw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3Qgc2hhcmVkRmlsdGVyTW9kZWwgPSByZXNwb25zZS5yZXN1bHQgYXMgSW50ZXJuYWxDb250cmFjdC5TaGFyZWRGaWx0ZXJNb2RlbDtcbiAgICAgIHJldHVybiBzaGFyZWRGaWx0ZXJNb2RlbDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydERvbWFpbkZpbHRlcnMoZG9tYWluRmlsdGVyczogQXJyYXk8SW50ZXJuYWxDb250cmFjdC5GaWx0ZXI+KTogQXJyYXk8Q29udHJhY3QuRmlsdGVyPiB7XG4gICAgY29uc3QgZmlsdGVyczogQXJyYXk8Q29udHJhY3QuRmlsdGVyPiA9IFtdO1xuICAgIGRvbWFpbkZpbHRlcnMuZm9yRWFjaCgoZG9tYWluRmlsdGVyKSA9PiB7XG4gICAgICBzd2l0Y2ggKGRvbWFpbkZpbHRlci5maWx0ZXJUeXBlKSB7XG4gICAgICAgIGNhc2UgRmlsdGVyVHlwZS5DYXRlZ29yaWNhbDoge1xuICAgICAgICAgIGNvbnN0IGZpbHRlciA9IGRvbWFpbkZpbHRlciBhcyBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRDYXRlZ29yaWNhbEZpbHRlcihmaWx0ZXIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIENhdGVnb3JpY2FsIEZpbHRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgRmlsdGVyVHlwZS5IaWVyYXJjaGljYWw6IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBkb21haW5GaWx0ZXIgYXMgSW50ZXJuYWxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXI7XG4gICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgZmlsdGVycy5wdXNoKHRoaXMuY29udmVydEhpZXJhcmNoaWNhbEZpbHRlcihmaWx0ZXIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEhpZXJhcmNoaWNhbCBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEZpbHRlclR5cGUuUmFuZ2U6IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBkb21haW5GaWx0ZXIgYXMgSW50ZXJuYWxDb250cmFjdC5SYW5nZUZpbHRlcjtcbiAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2godGhpcy5jb252ZXJ0UmFuZ2VGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBSYW5nZSBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEZpbHRlclR5cGUuUmVsYXRpdmVEYXRlOiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRSZWxhdGl2ZURhdGVGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBSZWxhdGl2ZSBEYXRlIEZpbHRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmaWx0ZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Q2F0ZWdvcmljYWxGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyKTogQ29udHJhY3QuQ2F0ZWdvcmljYWxGaWx0ZXIge1xuICAgIGNvbnN0IGFwcGxpZWRWYWx1ZXM6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4gPSBkb21haW5GaWx0ZXIudmFsdWVzLm1hcCgoZHYpID0+IHtcbiAgICAgIHJldHVybiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZHYpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBDYXRlZ29yaWNhbEZpbHRlcihcbiAgICAgIGRvbWFpbkZpbHRlci52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGRDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkTmFtZSxcbiAgICAgIEZpbHRlclR5cGUuQ2F0ZWdvcmljYWwsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgYXBwbGllZFZhbHVlcyxcbiAgICAgIGRvbWFpbkZpbHRlci5pc0V4Y2x1ZGUsXG4gICAgICBkb21haW5GaWx0ZXIuaXNBbGxTZWxlY3RlZCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0SGllcmFyY2hpY2FsRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXIpOiBDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXIge1xuICAgIGNvbnN0IGFwcGxpZWRWYWx1ZXM6IEFycmF5PENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlckRhdGFWYWx1ZT4gPSBkb21haW5GaWx0ZXIudmFsdWVzLm1hcCgoaGllcmFyY2hpY2FsRGF0YVZhbHVlKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEhpZXJhcmNoaWNhbERhdGFWYWx1ZShcbiAgICAgICAgRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGhpZXJhcmNoaWNhbERhdGFWYWx1ZS52YWx1ZSksXG4gICAgICAgIGhpZXJhcmNoaWNhbERhdGFWYWx1ZS5oaWVyYXJjaGljYWxQYXRoLFxuICAgICAgICBoaWVyYXJjaGljYWxEYXRhVmFsdWUubGV2ZWwsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgbGV2ZWxEZXRhaWxzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbD4gPSBkb21haW5GaWx0ZXIubGV2ZWxJbmZvLm1hcCgoYUxldmVsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEhpZXJhcmNoaWNhbExldmVsRGV0YWlsKFxuICAgICAgICBhTGV2ZWwubmFtZSxcbiAgICAgICAgSW50ZXJuYWxFbnVtQ29udmVydGVyLmhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuY29udmVydChhTGV2ZWwubGV2ZWxTZWxlY3Rpb25TdGF0ZSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBIaWVyYXJjaGljYWxGaWx0ZXIoXG4gICAgICBkb21haW5GaWx0ZXIudmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkQ2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZE5hbWUsXG4gICAgICBGaWx0ZXJUeXBlLkhpZXJhcmNoaWNhbCxcbiAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICBkb21haW5GaWx0ZXIuZGltZW5zaW9uTmFtZSxcbiAgICAgIGRvbWFpbkZpbHRlci5oaWVyYXJjaHlDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmxldmVscyxcbiAgICAgIGxldmVsRGV0YWlscyxcbiAgICAgIGFwcGxpZWRWYWx1ZXMsXG4gICAgICBkb21haW5GaWx0ZXIuaXNBbGxTZWxlY3RlZCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UmFuZ2VGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRmlsdGVyKTogQ29udHJhY3QuUmFuZ2VGaWx0ZXIge1xuICAgIGNvbnN0IG1pblZhbHVlOiBEYXRhVmFsdWUgPSBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZG9tYWluRmlsdGVyLm1pbik7XG4gICAgY29uc3QgbWF4VmFsdWU6IERhdGFWYWx1ZSA9IERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW5GaWx0ZXIubWF4KTtcbiAgICByZXR1cm4gbmV3IFJhbmdlRmlsdGVyKFxuICAgICAgZG9tYWluRmlsdGVyLnZpc3VhbElkLndvcmtzaGVldCxcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZENhcHRpb24sXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGROYW1lLFxuICAgICAgRmlsdGVyVHlwZS5SYW5nZSxcbiAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICBtaW5WYWx1ZSxcbiAgICAgIG1heFZhbHVlLFxuICAgICAgZG9tYWluRmlsdGVyLmluY2x1ZGVOdWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRSZWxhdGl2ZURhdGVGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlcik6IENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlciB7XG4gICAgY29uc3QgYW5jaG9yRGF0ZVZhbHVlOiBEYXRhVmFsdWUgPSBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZG9tYWluRmlsdGVyLmFuY2hvckRhdGUpO1xuICAgIHJldHVybiBuZXcgUmVsYXRpdmVEYXRlRmlsdGVyKFxuICAgICAgZG9tYWluRmlsdGVyLnZpc3VhbElkLndvcmtzaGVldCxcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZENhcHRpb24sXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGROYW1lLFxuICAgICAgRXh0ZXJuYWxGaWx0ZXJUeXBlLlJlbGF0aXZlRGF0ZSxcbiAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICBhbmNob3JEYXRlVmFsdWUsXG4gICAgICBJbnRlcm5hbEVudW1Db252ZXJ0ZXIuZGF0ZVN0ZXBQZXJpb2QuY29udmVydChkb21haW5GaWx0ZXIucGVyaW9kVHlwZSksXG4gICAgICBJbnRlcm5hbEVudW1Db252ZXJ0ZXIuZGF0ZVJhbmdlVHlwZS5jb252ZXJ0KGRvbWFpbkZpbHRlci5yYW5nZVR5cGUpLFxuICAgICAgZG9tYWluRmlsdGVyLnJhbmdlTixcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Q2F0ZWdvcmljYWxEb21haW4oZG9tYWluOiBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluLCBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKTogQ29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW4ge1xuICAgIGNvbnN0IHZhbHVlczogQXJyYXk8RGF0YVZhbHVlPiA9IGRvbWFpbi52YWx1ZXMubWFwKChkb21haW5EdikgPT4ge1xuICAgICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW5Edik7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBDYXRlZ29yaWNhbERvbWFpbih2YWx1ZXMsIGRvbWFpblR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UmFuZ2VEb21haW4oZG9tYWluOiBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRG9tYWluLCBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKTogQ29udHJhY3QuUmFuZ2VEb21haW4ge1xuICAgIGNvbnN0IG1pbjogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbi5taW4pO1xuICAgIGNvbnN0IG1heDogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbi5tYXgpO1xuICAgIHJldHVybiBuZXcgUmFuZ2VEb21haW4obWluLCBtYXgsIGRvbWFpblR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0QW5jaG9yRGF0ZShhbmNob3JEYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICAvLyBDb252ZXJ0cyBhIERhdGUgb2JqZWN0IGludG8gYSBzdHJpbmcgZm9ybWF0IHRoYXQgdGhlIHNlcnZlciBleHBlY3RzIGZvciBkYXRlL3RpbWUgdmFsdWVzLlxuICAgIC8vIElmIGFuY2hvckRhdGUgZG9lc24ndCByZXByZXNlbnQgYSB2YWxpZCBEYXRlIG9iamVjdCwgYW55IG9mIHRoZXNlIHdvdWxkIGJlIE5hTi5cbiAgICBjb25zdCB5ZWFyID0gYW5jaG9yRGF0ZS5nZXRVVENGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1vbnRoID0gYW5jaG9yRGF0ZS5nZXRVVENNb250aCgpICsgMTtcbiAgICBjb25zdCBkYXkgPSBhbmNob3JEYXRlLmdldFVUQ0RhdGUoKTtcbiAgICBjb25zdCBoaCA9IGFuY2hvckRhdGUuZ2V0VVRDSG91cnMoKTtcbiAgICBjb25zdCBtbSA9IGFuY2hvckRhdGUuZ2V0VVRDTWludXRlcygpO1xuICAgIGNvbnN0IHNlYyA9IGFuY2hvckRhdGUuZ2V0VVRDU2Vjb25kcygpO1xuXG4gICAgaWYgKGlzTmFOKHllYXIpIHx8IGlzTmFOKG1vbnRoKSB8fCBpc05hTihkYXkpIHx8IGlzTmFOKGhoKSB8fCBpc05hTihtbSkgfHwgaXNOYU4oc2VjKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWREYXRlUGFyYW1ldGVyLCAnSW52YWxpZCBkYXRlIHBhcmFtZXRlcjogYW5jaG9yRGF0ZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fSAke2hofToke21tfToke3NlY31gO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGFwaUZpbHRlckhhbmRsZXJDaGVja0ZvckNvbW1hbmRFcnJvcihzZXJ2ZXJQbTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIGlmICghc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5QYXJhbWV0ZXJFcnJvcl0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNlcnZlclBtW0ludGVybmFsQ29udHJhY3QuUGFyYW1ldGVySWQuSW52YWxpZEZpZWxkQ2FwdGlvbl0pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkRmlsdGVyRmllbGROYW1lLCBzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRGaWVsZENhcHRpb25dKTtcbiAgICB9XG4gICAgaWYgKHNlcnZlclBtW0ludGVybmFsQ29udHJhY3QuUGFyYW1ldGVySWQuSW52YWxpZFZhbHVlc10pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkRmlsdGVyRmllbGRWYWx1ZSwgc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5JbnZhbGlkVmFsdWVzXSk7XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRBZ2dGaWVsZE5hbWVdKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZEFnZ3JlZ2F0aW9uRmllbGROYW1lLCBzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRBZ2dGaWVsZE5hbWVdKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLlNlcnZlckVycm9yLCAnU2VydmVyIEVycm9yJyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTaG93RGF0YVRhYmxlRm9ybWF0LFxuICBEYXRhVGFibGUgYXMgRGF0YVRhYmxlSW50ZXJuYWxDb250cmFjdCxcbiAgRGF0YVRhYmxlUmVhZGVyIGFzIERhdGFUYWJsZVJlYWRlckludGVybmFsQ29udHJhY3QsXG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBIaWdobGlnaHRlZE1hcmtzVGFibGUsXG4gIFBhcmFtZXRlcklkLFxuICBTZWxlY3RlZE1hcmtzVGFibGUsXG4gIFVuZGVybHlpbmdEYXRhVGFibGUsXG4gIFZlcmJJZCxcbiAgVmlzdWFsSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uLy4uL0FwaVNoYXJlZCc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IENvbHVtbiwgRGF0YVRhYmxlLCBNYXJrSW5mbyB9IGZyb20gJy4uLy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcbmltcG9ydCB7IERhdGFUYWJsZVJlYWRlciB9IGZyb20gJy4uLy4uL01vZGVscy9HZXREYXRhVGFibGVSZWFkZXJNb2RlbHMnO1xuaW1wb3J0IHsgRGF0YVZhbHVlRmFjdG9yeSB9IGZyb20gJy4uLy4uL1V0aWxzL0RhdGFWYWx1ZUZhY3RvcnknO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UsIEdldERhdGFUeXBlIH0gZnJvbSAnLi4vR2V0RGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEdldERhdGFTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEdldERhdGFTZXJ2aWNlIHtcbiAgLy8gVGhlIGV4dGVuc2lvbi9lbWJlZGRpbmcgaW5zdGFuY2UgdXNlcyB0aGUgc2FtZSBjYWNoZSBmb3IgYWxsIERhdGFUYWJsZVJlYWRlcnMuXG4gIHByaXZhdGUgdmlld0RhdGFUYWJsZUNhY2hlSWQ6IHN0cmluZyA9IHV1aWR2NCgpO1xuXG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkdldERhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWF4Um93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy52aWV3RGF0YVRhYmxlQ2FjaGVJZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGltaXRlZE1heFJvd3MocmVxdWVzdGVkUm93czogbnVtYmVyLCByb3dDb3VudExpbWl0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiByZXF1ZXN0ZWRSb3dzID4gMCAmJiByZXF1ZXN0ZWRSb3dzIDwgcm93Q291bnRMaW1pdCA/IHJlcXVlc3RlZFJvd3MgOiByb3dDb3VudExpbWl0O1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdEYXRhQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGdldFR5cGU6IEdldERhdGFUeXBlLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nOiBib29sZWFuLFxuICApOiBQcm9taXNlPERhdGFUYWJsZT4ge1xuICAgIC8vIENyZWF0ZSBhbGwgb2Ygb3VyIHBhcmFtZXRlcnNcbiAgICBjb25zdCBzdW1tYXJ5RGF0YSA9IGdldFR5cGUgPT09IEdldERhdGFUeXBlLlN1bW1hcnk7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gc3VtbWFyeURhdGEgPyAnZ2V0U3VtbWFyeURhdGFBc3luYycgOiAnZ2V0VW5kZXJseWluZ0RhdGFBc3luYyc7XG4gICAgY29uc3QgdmVyYiA9IHN1bW1hcnlEYXRhID8gVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YSA6IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YTtcbiAgICBjb25zdCByZXF1ZXN0TWF4Um93cyA9IHZlcmIgPT09IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YSA/IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cywgdGhpcy5nZXRNYXhSb3dMaW1pdCgpICsgMSkgOiBtYXhSb3dzO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06IGZ1bmN0aW9uTmFtZSxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXSA9IGlnbm9yZUFsaWFzZXM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dID0gaWdub3JlU2VsZWN0aW9uO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSW5jbHVkZUFsbENvbHVtbnNdID0gaW5jbHVkZUFsbENvbHVtbnM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF0gPSB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5NYXhSb3dzXSA9IHJlcXVlc3RNYXhSb3dzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF0gPSBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbik7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5BcHBseVdvcmtzaGVldEZvcm1hdHRpbmddID0gYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIHJlc3BvbnNlRGF0YS5pc1N1bW1hcnkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgICBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmc6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8RGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpZXdEYXRhVGFibGVDYWNoZUlkXTogdGhpcy5nZXRWaWV3RGF0YVRhYmxlQ2FjaGVJZCgpLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuUGFnZVJvd0NvdW50XTogcGFnZVJvd0NvdW50LFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZVNlbGVjdGlvbl06IGlnbm9yZVNlbGVjdGlvbixcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IGluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgICBbUGFyYW1ldGVySWQuQXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nXTogYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXREYXRhU3VtbWFyeURhdGFSZWFkZXIsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlUmVhZGVyPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBEYXRhVGFibGVSZWFkZXJJbnRlcm5hbENvbnRyYWN0O1xuXG4gICAgICByZXR1cm4gbmV3IERhdGFUYWJsZVJlYWRlcihyZXNwb25zZURhdGEuaWQsIHJlc3BvbnNlRGF0YS50b3RhbFJvd0NvdW50LCBwYWdlUm93Q291bnQsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj4ge1xuICAgIC8vIENyZWF0ZSBhbGwgdGhlIHBhcmFtZXRlcnMgZm9yIEdldERhdGFUeXBlIG9mIFN1bW1hcnkgd2l0aCAxIHJvdywgYW5kIG9ubHkgbmF0aXZlIHZhbHVlc1xuICAgIC8vIFRoZW4gcmV0dXJuIGp1c3QgdGhlIGNvbHVtbnNcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IHRydWUsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlU2VsZWN0aW9uXTogdHJ1ZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IHRydWUsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IDEsXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEFwaVNob3dEYXRhVGFibGVGb3JtYXQuTmF0aXZlVmFsdWVzT25seSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkNvbHVtbj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgdW5kZXJseWluZ0RhdGFUYWJsZSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgY29uc3QgZGF0YVRhYmxlID0gdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhO1xuICAgICAgY29uc3QgY29sdW1ucyA9IGRhdGFUYWJsZS5oZWFkZXJzLm1hcCgoaCkgPT4gbmV3IENvbHVtbihoLmZpZWxkQ2FwdGlvbiwgaC5maWVsZE5hbWUsIGguZGF0YVR5cGUsIGguaXNSZWZlcmVuY2VkLCBoLmluZGV4KSk7XG4gICAgICByZXR1cm4gY29sdW1ucztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0U2VsZWN0ZWRNYXJrcywgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIFNlbGVjdGVkTWFya3NUYWJsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YS5kYXRhLm1hcCgodGFibGUpID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZSh0YWJsZSwgdHJ1ZSkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0SGlnaGxpZ2h0ZWRNYXJrcywgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIEhpZ2hsaWdodGVkTWFya3NUYWJsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YS5kYXRhLm1hcCgodGFibGUpID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZSh0YWJsZSwgdHJ1ZSkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgIGRhdGFTb3VyY2VJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGNvbHVtbnNUb0luY2x1ZGU6IEFycmF5PHN0cmluZz4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPERhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXRhU291cmNlRGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhU291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cywgdGhpcy5nZXRNYXhSb3dMaW1pdCgpICsgMSksXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZV06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGUpLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldERhdGFTb3VyY2VEYXRhLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxEYXRhVGFibGU+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlXTogY29sdW1uc1RvSW5jbHVkZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhc291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhSb3dzXTogdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhtYXhSb3dzLCB0aGlzLmdldE1heFJvd0xpbWl0KCkgKyAxKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRMb2dpY2FsVGFibGVEYXRhLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxEYXRhVGFibGVSZWFkZXI+IHtcbiAgICBwYWdlUm93Q291bnQgPSB0aGlzLmdldExpbWl0ZWRNYXhSb3dzKHBhZ2VSb3dDb3VudCwgdGhpcy5nZXRNYXhSb3dMaW1pdCgpKTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlQ2FjaGVJZF06IHRoaXMuZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhc291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5QYWdlUm93Q291bnRdOiBwYWdlUm93Q291bnQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdOiB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCksXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5zaG93RGF0YVRhYmxlRm9ybWF0VHlwZS5jb252ZXJ0KGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlciwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGVSZWFkZXI+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFUYWJsZVJlYWRlckludGVybmFsQ29udHJhY3Q7XG5cbiAgICAgIHJldHVybiBuZXcgRGF0YVRhYmxlUmVhZGVyKHJlc3BvbnNlRGF0YS5pZCwgcmVzcG9uc2VEYXRhLnRvdGFsUm93Q291bnQsIHBhZ2VSb3dDb3VudCwgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nOiBib29sZWFuLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogaWdub3JlQWxpYXNlcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dOiBpZ25vcmVTZWxlY3Rpb24sXG4gICAgICBbUGFyYW1ldGVySWQuSW5jbHVkZUFsbENvbHVtbnNdOiBpbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhSb3dzXTogdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhtYXhSb3dzLCB0aGlzLmdldE1heFJvd0xpbWl0KCkgKyAxKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pLFxuICAgICAgW1BhcmFtZXRlcklkLkFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZ106IGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0VW5kZXJseWluZ1RhYmxlRGF0YSwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGU+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIFVuZGVybHlpbmdEYXRhVGFibGU7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVzdWx0c1RhYmxlKHJlc3BvbnNlRGF0YS5kYXRhLCBmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgICBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmc6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgcGFnZVJvd0NvdW50ID0gdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhwYWdlUm93Q291bnQsIHRoaXMuZ2V0TWF4Um93TGltaXQoKSk7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUNhY2hlSWRdOiB0aGlzLmdldFZpZXdEYXRhVGFibGVDYWNoZUlkKCksXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Mb2dpY2FsVGFibGVJZF06IGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZVNlbGVjdGlvbl06IGlnbm9yZVNlbGVjdGlvbixcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IGluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgICBbUGFyYW1ldGVySWQuUGFnZVJvd0NvdW50XTogcGFnZVJvd0NvdW50LFxuICAgICAgW1BhcmFtZXRlcklkLkFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZ106IGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlciwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGVSZWFkZXI+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFUYWJsZVJlYWRlckludGVybmFsQ29udHJhY3Q7XG5cbiAgICAgIHJldHVybiBuZXcgRGF0YVRhYmxlUmVhZGVyKHJlc3BvbnNlRGF0YS5pZCwgcmVzcG9uc2VEYXRhLnRvdGFsUm93Q291bnQsIHBhZ2VSb3dDb3VudCwgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdW1tYXJ5VGFibGVJZCA9ICcnO1xuXG4gIHB1YmxpYyBnZXRQYWdlQXN5bmModGFibGVJZDogc3RyaW5nLCBwYWdlTnVtYmVyOiBudW1iZXIsIHBhZ2VTaXplOiBudW1iZXIpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRQYWdlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpZXdEYXRhVGFibGVDYWNoZUlkXTogdGhpcy5nZXRWaWV3RGF0YVRhYmxlQ2FjaGVJZCgpLFxuICAgICAgW1BhcmFtZXRlcklkLlZpZXdEYXRhVGFibGVJZF06IHRhYmxlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVJvd0luZGV4XTogcGFnZU51bWJlciAqIHBhZ2VTaXplLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXREYXRhVGFibGVSZWFkZXJQYWdlLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgRGF0YVRhYmxlSW50ZXJuYWxDb250cmFjdDtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzUGFnZShyZXNwb25zZURhdGEsIHRhYmxlSWQgPT09IEdldERhdGFTZXJ2aWNlSW1wbC5zdW1tYXJ5VGFibGVJZCA/IHRydWUgOiBmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVsZWFzZUFzeW5jKHRhYmxlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZWxlYXNlJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlQ2FjaGVJZF06IHRoaXMuZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlSWRdOiB0YWJsZUlkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZWxlYXNlRGF0YVRhYmxlUmVhZGVyLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB2ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uczogQXJyYXk8c3RyaW5nPik6IEFycmF5PHN0cmluZz4ge1xuICAgIC8vIGNvbHVtbnMgbXVzdCBiZSBhIHZhbGlkIGFycmF5XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbHVtbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ2NvbHVtbnNUb0luY2x1ZGUgYW5kIGNvbHVtbnNUb0luY2x1ZGVCeUlkIG11c3QgYmUgdmFsaWQgYXJyYXlzJyk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFueSBkdXBsaWNhdGVzIGZyb20gdGhlIGlucHV0IGFycmF5XG4gICAgY29uc3QgY29sdW1uc0FzU2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoY29sdW1ucyk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oY29sdW1uc0FzU2V0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzUmVzdWx0c1RhYmxlKHJlc3BvbnNlRGF0YTogRGF0YVRhYmxlSW50ZXJuYWxDb250cmFjdCwgaXNTdW1tYXJ5OiBib29sZWFuKTogRGF0YVRhYmxlIHtcbiAgICBjb25zdCBoZWFkZXJzID0gcmVzcG9uc2VEYXRhLmhlYWRlcnMubWFwKChoKSA9PiBuZXcgQ29sdW1uKGguZmllbGRDYXB0aW9uLCBoLmZpZWxkTmFtZSwgaC5kYXRhVHlwZSwgaC5pc1JlZmVyZW5jZWQsIGguaW5kZXgpKTtcblxuICAgIC8vIFRPRE8gVGhpcyBzaG91bGQgYmUgY29udHJvbGxlZCBieSBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgYXBpIHdpbGwgcmVzcG9uZCBtYXJrcyBpbmZvIG9yIG5vdFxuICAgIGxldCBtYXJrcztcbiAgICBpZiAocmVzcG9uc2VEYXRhLm1hcmtzKSB7XG4gICAgICBtYXJrcyA9IHJlc3BvbnNlRGF0YS5tYXJrcy5tYXAoKGgpID0+IG5ldyBNYXJrSW5mbyhoLnR5cGUsIGguY29sb3IsIGgudHVwbGVJZCkpO1xuICAgIH1cblxuICAgIC8vIExpbWl0KzEgaXMgb3VyIHNlbnRpbmFsIHRoYXQgdW5kZXJseWluZyBkYXRhIGNvbnRhaW5zIG1vcmUgcm93cyB0aGFuIHVzZXIgaXMgYWxsb3dlZCB0byBmZXRjaC5cbiAgICAvLyBSZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBzbyB3ZSBhbHdheXMgcmV0dXJuIE1heFJvd0xpbWl0XG4gICAgY29uc3QgaXNUb3RhbFJvd0NvdW50TGltaXRlZCA9IGlzU3VtbWFyeSA9PT0gZmFsc2UgJiYgcmVzcG9uc2VEYXRhLmRhdGFUYWJsZS5sZW5ndGggPT09IHRoaXMuZ2V0TWF4Um93TGltaXQoKSArIDE7XG4gICAgaWYgKGlzVG90YWxSb3dDb3VudExpbWl0ZWQpIHtcbiAgICAgIHJlc3BvbnNlRGF0YS5kYXRhVGFibGUubGVuZ3RoIC09IDE7XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGUgPSByZXNwb25zZURhdGEuZGF0YVRhYmxlLm1hcCgocm93KSA9PiB7XG4gICAgICByZXR1cm4gcm93Lm1hcCgoY2VsbCwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVRhYmxlRGF0YVZhbHVlKGNlbGwsIGhlYWRlcnNbaW5kZXhdLmRhdGFUeXBlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKG1hcmtzKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGFUYWJsZSh0YWJsZSwgaGVhZGVycywgdGFibGUubGVuZ3RoLCBpc1RvdGFsUm93Q291bnRMaW1pdGVkLCBpc1N1bW1hcnksIG1hcmtzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRhVGFibGUodGFibGUsIGhlYWRlcnMsIHRhYmxlLmxlbmd0aCwgaXNUb3RhbFJvd0NvdW50TGltaXRlZCwgaXNTdW1tYXJ5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzUmVzdWx0c1BhZ2UocmVzcG9uc2VEYXRhOiBEYXRhVGFibGVJbnRlcm5hbENvbnRyYWN0LCBpc1N1bW1hcnk6IGJvb2xlYW4pOiBEYXRhVGFibGUge1xuICAgIGNvbnN0IGhlYWRlcnMgPSByZXNwb25zZURhdGEuaGVhZGVycy5tYXAoKGgpID0+IG5ldyBDb2x1bW4oaC5maWVsZENhcHRpb24sIGguZmllbGROYW1lLCBoLmRhdGFUeXBlLCBoLmlzUmVmZXJlbmNlZCwgaC5pbmRleCkpO1xuXG4gICAgbGV0IG1hcmtzO1xuICAgIGlmIChyZXNwb25zZURhdGEubWFya3MpIHtcbiAgICAgIG1hcmtzID0gcmVzcG9uc2VEYXRhLm1hcmtzLm1hcCgoaCkgPT4gbmV3IE1hcmtJbmZvKGgudHlwZSwgaC5jb2xvciwgaC50dXBsZUlkKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGUgPSByZXNwb25zZURhdGEuZGF0YVRhYmxlLm1hcCgocm93KSA9PiB7XG4gICAgICByZXR1cm4gcm93Lm1hcCgoY2VsbCwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVRhYmxlRGF0YVZhbHVlKGNlbGwsIGhlYWRlcnNbaW5kZXhdLmRhdGFUeXBlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKG1hcmtzKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGFUYWJsZSh0YWJsZSwgaGVhZGVycywgdGFibGUubGVuZ3RoLCBmYWxzZSwgaXNTdW1tYXJ5LCBtYXJrcyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0YVRhYmxlKHRhYmxlLCBoZWFkZXJzLCB0YWJsZS5sZW5ndGgsIGZhbHNlLCBpc1N1bW1hcnkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vTm90aWZpY2F0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uU2VydmljZUltcGwgZXh0ZW5kcyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBOb3RpZmljYXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIE1vZGVsLCBOb3RpZmljYXRpb24sIE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFVucmVnaXN0ZXJGbiB9IGZyb20gJy4uL05vdGlmaWNhdGlvblNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgUmVnaXN0cmF0aW9uIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ZpbHRlckZuOiAobm90aWZpY2F0aW9uTW9kZWw6IE1vZGVsKSA9PiBib29sZWFuLCBwcml2YXRlIF9jYWxsYmFja0ZuOiAobm90aWZpY2F0aW9uTW9kZWw6IE1vZGVsKSA9PiB2b2lkKSB7XG4gICAgLy8gTm90aGluZyBIZXJlXG4gIH1cblxuICBwdWJsaWMgb25Ob3RpZmljYXRpb24obm90aWZpY2F0aW9uTW9kZWw6IE1vZGVsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2ZpbHRlckZuKG5vdGlmaWNhdGlvbk1vZGVsKSkge1xuICAgICAgdGhpcy5fY2FsbGJhY2tGbihub3RpZmljYXRpb25Nb2RlbCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2Uge1xuICBwcml2YXRlIF9oYW5kbGVyczogeyBbbm90aWZpY2F0aW9uSWQ6IHN0cmluZ106IEFycmF5PFJlZ2lzdHJhdGlvbj4gfTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpIHtcbiAgICB0aGlzLl9oYW5kbGVycyA9IHt9O1xuICAgIHRoaXMuZGlzcGF0Y2hlci5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIodGhpcy5vbk5vdGlmaWNhdGlvbi5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckhhbmRsZXIoaWQ6IE5vdGlmaWNhdGlvbklkLCBmaWx0ZXJGbjogKG1vZGVsOiBNb2RlbCkgPT4gYm9vbGVhbiwgaGFuZGxlcjogKG1vZGVsOiBNb2RlbCkgPT4gdm9pZCk6IFVucmVnaXN0ZXJGbiB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLl9oYW5kbGVyc1tpZF0gfHwgbmV3IEFycmF5PFJlZ2lzdHJhdGlvbj4oKTtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSBuZXcgUmVnaXN0cmF0aW9uKGZpbHRlckZuLCBoYW5kbGVyKTtcbiAgICBoYW5kbGVycy5wdXNoKHJlZ2lzdHJhdGlvbik7XG4gICAgdGhpcy5faGFuZGxlcnNbaWRdID0gaGFuZGxlcnM7XG4gICAgcmV0dXJuICgpID0+IHRoaXMucmVtb3ZlUmVnaXN0cmF0aW9uKGlkLCByZWdpc3RyYXRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNIYW5kbGVyc0Zvck5vdGlmaWNhdGlvblR5cGUoaWQ6IE5vdGlmaWNhdGlvbklkKTogYm9vbGVhbiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgIHJldHVybiB0aGlzLl9oYW5kbGVycy5oYXNPd25Qcm9wZXJ0eShpZCk7XG4gIH1cblxuICBwcml2YXRlIG9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc0hhbmRsZXJzRm9yTm90aWZpY2F0aW9uVHlwZShub3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gR28gdGhyb3VnaCBhbmQgY2hlY2sgZm9yIGFsbCB0aGUgaGFuZGxlcnMgb2YgdGhpcyBwYXJ0aWN1bGFyIG5vdGlmaWNhdGlvblxuICAgIHRoaXMuX2hhbmRsZXJzW25vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25JZF0uZm9yRWFjaCgoaCkgPT4gaC5vbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb24uZGF0YSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVSZWdpc3RyYXRpb24oaWQ6IE5vdGlmaWNhdGlvbklkLCByZWdpc3RyYXRpb246IFJlZ2lzdHJhdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNIYW5kbGVyc0Zvck5vdGlmaWNhdGlvblR5cGUoaWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5faGFuZGxlcnNbaWRdID0gdGhpcy5faGFuZGxlcnNbaWRdLmZpbHRlcigocmVnKSA9PiByZWcgIT09IHJlZ2lzdHJhdGlvbik7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIE1vZGVsLCBQYXJhbWV0ZXJJZCwgUGFyYW1ldGVySW5mbywgU2hlZXRQYXRoLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvUGFyYW1ldGVySW1wbCc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi9QYXJhbWV0ZXJzU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgUGFyYW1ldGVyc1NlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgUGFyYW1ldGVyc1NlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5QYXJhbWV0ZXJzO1xuICB9XG5cbiAgcHVibGljIGdldFBhcmFtZXRlcnNGb3JTaGVldEFzeW5jKHNoZWV0UGF0aDogU2hlZXRQYXRoKTogUHJvbWlzZTxBcnJheTxQYXJhbWV0ZXJJbXBsPj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFBhcmFtZXRlcnNGb3JTaGVldEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaGVldFBhdGhdOiBzaGVldFBhdGgsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcnNBc3luYyhwYXJhbWV0ZXJzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGxQYXJhbWV0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxQYXJhbWV0ZXJJbXBsPj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFBhcmFtZXRlcnNGb3JTaGVldEFzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyc0FzeW5jKHBhcmFtZXRlcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXJhbWV0ZXJzQXN5bmMoaW5wdXRQYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByb21pc2U8QXJyYXk8UGFyYW1ldGVySW1wbD4+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRQYXJhbWV0ZXJzRm9yU2hlZXQsIGlucHV0UGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxQYXJhbWV0ZXJJbmZvPjtcbiAgICAgIHJldHVybiByZXN1bHQubWFwKChwYXJhbWV0ZXJJbmZvKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVySW1wbChwYXJhbWV0ZXJJbmZvLCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVBhcmFtZXRlclZhbHVlQXN5bmMoZmllbGROYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPFBhcmFtZXRlckluZm8+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdjaGFuZ2VQYXJhbWV0ZXJWYWx1ZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5QYXJhbWV0ZXJGaWVsZE5hbWVdOiBmaWVsZE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuUGFyYW1ldGVyVmFsdWVdOiBuZXdWYWx1ZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuQ2hhbmdlUGFyYW1ldGVyVmFsdWUsIHBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgUGFyYW1ldGVySW5mbztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZmluZFBhcmFtZXRlckJ5TmFtZUFzeW5jKG5hbWU6IHN0cmluZyk6IFByb21pc2U8UGFyYW1ldGVySW1wbCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLmZpbmRQYXJhbWV0ZXJBc3luYyhuYW1lLCB1bmRlZmluZWQpO1xuICB9XG5cbiAgcHVibGljIGZpbmRQYXJhbWV0ZXJCeUdsb2JhbEZpZWxkTmFtZUFzeW5jKGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTxQYXJhbWV0ZXJJbXBsIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuZmluZFBhcmFtZXRlckFzeW5jKHVuZGVmaW5lZCwgZmllbGROYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFBhcmFtZXRlckFzeW5jKG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZmllbGROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPFBhcmFtZXRlckltcGwgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZmluZFBhcmFtZXRlckFzeW5jJyxcbiAgICB9O1xuICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUGFyYW1ldGVyQ2FwdGlvbl0gPSBuYW1lO1xuICAgIH0gZWxzZSBpZiAoZmllbGROYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUGFyYW1ldGVyRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICduYW1lIG9yIGZpZWxkTmFtZSBtdXN0IGJlIHByb3ZpZGVkIHRvIGZpbmQgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuRmluZFBhcmFtZXRlciwgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlT2ZQYXJhbWV0ZXJJbmZvID0gKG9iamVjdDogTW9kZWwpOiBvYmplY3QgaXMgUGFyYW1ldGVySW5mbyA9PiB7XG4gICAgICAgIHJldHVybiAnZmllbGROYW1lJyBpbiBvYmplY3Q7XG4gICAgICB9O1xuXG4gICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIHRvIHNlZSBpZiB3ZSBnb3QgYSB2YWxpZCByZXNwb25zZSBiYWNrIGFnYWluXG4gICAgICBpZiAoaW5zdGFuY2VPZlBhcmFtZXRlckluZm8ocmVzcG9uc2UucmVzdWx0KSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQ7XG4gICAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVySW1wbChyZXN1bHQsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBQYXJhbWV0ZXJJZCxcbiAgUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUgYXMgU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRGltZW5zaW9uU2VsZWN0aW9uTW9kZWwsXG4gIEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsLFxuICBIb3ZlclR1cGxlSW50ZXJhY3Rpb25Nb2RlbCxcbiAgUmFuZ2VTZWxlY3Rpb25Nb2RlbCxcbiAgU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb25Nb2RlbCxcbiAgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyLFxuICBUdXBsZVNlbGVjdGlvbk1vZGVsLFxuICBWYWx1ZVNlbGVjdGlvbk1vZGVsLFxufSBmcm9tICcuLi8uLi9Nb2RlbHMvU2VsZWN0aW9uTW9kZWxzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uLy4uL1V0aWxzL1BhcmFtJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZWxlY3Rpb25TZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFNlbGVjdGlvblNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5TZWxlY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIGNsZWFyIGFsbCB0aGUgc2VsZWN0ZWQgbWFya3MgZm9yIHRoZSBnaXZlbiB3b3Jrc2hlZXQuXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKi9cbiAgcHVibGljIGNsZWFyU2VsZWN0ZWRNYXJrc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdjbGVhclNlbGVjdGVkTWFya3NBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNsZWFyU2VsZWN0ZWRNYXJrcywgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjsgLy8gRXhwZWN0aW5nIGFuIGVtcHR5IG1vZGVsIGFuZCBoZW5jZSB0aGUgdm9pZCByZXNwb25zZS5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gc2VsZWN0IG1hcmtzIGZvciB0aGUgZ2l2ZW4gd29ya3NoZWV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICogQHBhcmFtIHNlbGVjdGlvbkNyaXRlcmlhXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25VcGRhdGVUeXBlXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHNlbGVjdGlvbkNyaXRlcmlhczogQXJyYXk8Q29udHJhY3QuU2VsZWN0aW9uQ3JpdGVyaWE+LFxuICAgIHNlbGVjdGlvblVwZGF0ZVR5cGU6IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChzZWxlY3Rpb25Dcml0ZXJpYXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ1NlbGVjdGlvbiBjcml0ZXJpYSBtaXNzaW5nIGZvciBzZWxlY3RpbmcgbWFya3MgYnkgdmFsdWUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlOiBzdHJpbmcgPSB0aGlzLnZhbGlkYXRlU2VsZWN0aW9uVXBkYXRlVHlwZShzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gdGhpcy5wYXJzZVNlbGVjdGlvbk1hcmtzKHNlbGVjdGlvbkNyaXRlcmlhcyk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0aW9uVXBkYXRlVHlwZV06IHNlbGVjdGlvblR5cGUsXG4gICAgfTtcblxuICAgIGlmIChzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5oaWVyTW9kZWxBcnIgJiYgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuaGllck1vZGVsQXJyLmxlbmd0aCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5IaWVyVmFsU2VsZWN0aW9uTW9kZWxzXSA9IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmhpZXJNb2RlbEFycjtcbiAgICB9XG4gICAgaWYgKHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnF1YW50TW9kZWxBcnIgJiYgc2VsZWN0aW9uTW9kZWxDb250YWluZXIucXVhbnRNb2RlbEFyci5sZW5ndGgpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUXVhbnRSYW5nZVNlbGVjdGlvbk1vZGVsc10gPSBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5xdWFudE1vZGVsQXJyO1xuICAgIH1cbiAgICBpZiAoc2VsZWN0aW9uTW9kZWxDb250YWluZXIuZGltTW9kZWxBcnIgJiYgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuZGltTW9kZWxBcnIubGVuZ3RoKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkRpbVZhbFNlbGVjdGlvbk1vZGVsc10gPSBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5kaW1Nb2RlbEFycjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TZWxlY3RCeVZhbHVlLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgdGhpcy5hcGlGaWx0ZXJIYW5kbGVyQ2hlY2tGb3JDb21tYW5kRXJyb3IocmVzcG9uc2UucmVzdWx0IGFzIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBleGVjdXRlIGhvdmVyIGFjdGlvbnMgYW5kIHJlbmRlciB0b29sdGlwIGZvciBhIGdpdmVuIHR1cGxlIHJlcHJlc2VudGluZyBhIG1hcmsgaW4gdGhlIHZpc3VhbGl6YXRpb24uXG4gICAqIElmIHRoZSB0b29sdGlwIHBhcmFtZXRlciBpcyBpbmNsdWRlZCBpdCB3aWxsIHNob3cgdGhlIHRvb2x0aXAgb24gaG92ZXIuIElmIG5vdCwgbm8gdG9vbHRpcCBpcyBzaG93bi5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBob3ZlcmVkVHVwbGVcbiAgICogQHBhcmFtIHRvb2x0aXBcbiAgICogQHJldHVybnMgZW1wdHkgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGV4dGVuc2lvbiBob3N0IGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBpbmZvcm1lZCBvZiB0aGUgcmVxdWVzdCBhbmQgcmVqZWN0cyBvbiBlcnJvclxuICAgKi9cbiAgcHVibGljIGhvdmVyVHVwbGVBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgaG92ZXJlZFR1cGxlPzogbnVtYmVyLFxuICAgIHRvb2x0aXA/OiBDb250cmFjdC5Ub29sdGlwQ29udGV4dCB8IG51bGwsXG4gICAgYWxsb3dIb3ZlckFjdGlvbnM/OiBib29sZWFuLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgaW50ZXJhY3Rpb25Nb2RlbCA9IG5ldyBIb3ZlclR1cGxlSW50ZXJhY3Rpb25Nb2RlbChcbiAgICAgIHZpc3VhbElkLFxuICAgICAgdGhpcy5lbnN1cmVUdXBsZUlESXNOb25OZWdhdGl2ZShob3ZlcmVkVHVwbGUpLFxuICAgICAgdG9vbHRpcCxcbiAgICAgIGFsbG93SG92ZXJBY3Rpb25zLFxuICAgICk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnaG92ZXJUdXBsZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Ib3ZlclR1cGxlSW50ZXJhY3Rpb25dOiBpbnRlcmFjdGlvbk1vZGVsLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SYWlzZUhvdmVyVHVwbGVOb3RpZmljYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIG1vZGlmeSBzZWxlY3Rpb24sIGV4ZWN1dGUgc2VsZWN0IGFjdGlvbnMgYW5kIHJlbmRlciB0b29sdGlwIGZvciBhIGdpdmVuIGxpc3Qgb2YgdHVwbGVzIHJlcHJlc2VudGluZyBhIG1hcmsgb3IgbWFya3MgaW4gdGhlIHZpc3VhbGl6YXRpb24uXG4gICAqIElmIHRoZSB0b29sdGlwIHBhcmFtZXRlciBpcyBpbmNsdWRlZCBpdCB3aWxsIHNob3cgdGhlIHRvb2x0aXAgb24gc2VsZWN0LiBJZiBub3QsIG5vIHRvb2x0aXAgaXMgc2hvd24uXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcGFyYW0gc2VsZWN0ZWRUdXBsZXNcbiAgICogQHBhcmFtIHNlbGVjdE9wdGlvblxuICAgKiBAcGFyYW0gdG9vbHRpcFxuICAgKiBAcmV0dXJucyBlbXB0eSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZXh0ZW5zaW9uIGhvc3QgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGluZm9ybWVkIG9mIHRoZSByZXF1ZXN0IGFuZCByZWplY3RzIG9uIGVycm9yXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0VHVwbGVzQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHNlbGVjdGVkVHVwbGVzOiBBcnJheTxudW1iZXI+LFxuICAgIHNlbGVjdE9wdGlvbjogQ29udHJhY3QuU2VsZWN0T3B0aW9ucyxcbiAgICB0b29sdGlwPzogQ29udHJhY3QuVG9vbHRpcENvbnRleHQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpbnRlcmFjdGlvbk1vZGVsID0gbmV3IFNlbGVjdFR1cGxlc0ludGVyYWN0aW9uTW9kZWwodmlzdWFsSWQsIHNlbGVjdGVkVHVwbGVzLCBzZWxlY3RPcHRpb24sIHRvb2x0aXApO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NlbGVjdFR1cGxlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3RUdXBsZXNJbnRlcmFjdGlvbl06IGludGVyYWN0aW9uTW9kZWwsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJhaXNlU2VsZWN0VHVwbGVzTm90aWZpY2F0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcGlGaWx0ZXJIYW5kbGVyQ2hlY2tGb3JDb21tYW5kRXJyb3Ioc2VydmVyUG06IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICBpZiAoIXNlcnZlclBtW1BhcmFtZXRlcklkLlBhcmFtZXRlckVycm9yXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2VydmVyUG1bUGFyYW1ldGVySWQuSW52YWxpZEZpZWxkc10pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uRmllbGROYW1lLCBzZXJ2ZXJQbVtQYXJhbWV0ZXJJZC5JbnZhbGlkRmllbGRzXSk7XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJQbVtQYXJhbWV0ZXJJZC5JbnZhbGlkVmFsdWVzXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkludmFsaWRTZWxlY3Rpb25WYWx1ZSwgc2VydmVyUG1bUGFyYW1ldGVySWQuSW52YWxpZFZhbHVlc10pO1xuICAgIH1cbiAgICBpZiAoc2VydmVyUG1bUGFyYW1ldGVySWQuSW52YWxpZERhdGVzXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkludmFsaWRTZWxlY3Rpb25EYXRlLCBzZXJ2ZXJQbVtQYXJhbWV0ZXJJZC5JbnZhbGlkRGF0ZXNdKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHNlbGVjdCBtYXJrcyBmb3IgdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBNYXJrSW5mb1xuICAgKiBAcGFyYW0gc2VsZWN0aW9uVXBkYXRlVHlwZVxuICAgKi9cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlJZEFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBtYXJrczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+LFxuICAgIHNlbGVjdGlvblVwZGF0ZVR5cGU6IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChtYXJrcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnTWFya3MgaW5mbyBtaXNzaW5nIGZvciBzZWxlY3RpbmcgbWFya3MgYnkgSWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlOiBzdHJpbmcgPSB0aGlzLnZhbGlkYXRlU2VsZWN0aW9uVXBkYXRlVHlwZShzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gdGhpcy5wYXJzZVNlbGVjdGlvbklkcyhtYXJrcyk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2VsZWN0TWFya3NCeUlkQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0aW9uVXBkYXRlVHlwZV06IHNlbGVjdGlvblR5cGUsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0aW9uXTogc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2VsZWN0QnlWYWx1ZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIEV4cGVjdGluZyBhbiBlbXB0eSBtb2RlbCBhbmQgaGVuY2UgdGhlIHZvaWQgcmVzcG9uc2UuXG4gICAgICByZXR1cm47XG4gICAgICAvLyBUT0RPIEludmVzdGlnYXRlIHRoZSBlcnJvciByZXNwb25zZSB3aXRoIG11bHRpcGxlIG91dHB1dCBwYXJhbXMgYW5kIHRocm93IGVycm9yIGFjY29yZGluZ2x5LlxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBwcmVwYXJlIHRoZSBwcmVzIG1vZGVscyBmb3Igc2VsZWN0aW9uIGJ5IE1hcmtzSW5mb1xuICAgKiBAcGFyYW0gbWFya3NcbiAgICovXG4gIHByaXZhdGUgcGFyc2VTZWxlY3Rpb25JZHMobWFya3M6IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPik6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciB7XG4gICAgY29uc3QgaWRzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IG5ldyBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB0dXBsZUlkOiBudW1iZXIgfCB1bmRlZmluZWQgPSBtYXJrc1tpXS50dXBsZUlkO1xuICAgICAgaWYgKHR1cGxlSWQgIT09IHVuZGVmaW5lZCAmJiB0dXBsZUlkICE9PSBudWxsKSB7XG4gICAgICAgIC8vIElmIHR1cGxlIGlkIGlzIHByb3ZpZGVkIHVzZSB0aGF0IGluc3RlYWQgb2YgcGFpclxuICAgICAgICBpZHMucHVzaCh0dXBsZUlkLnRvU3RyaW5nKCkpOyAvLyBjb2xsZWN0IHRoZSB0dXBsZSBpZHNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAndHVwbGVJZCBwYXJzaW5nIGVycm9yJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpZHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAvLyB0dXBsZSBpZHMgYmFzZWQgc2VsZWN0aW9uXG4gICAgICBjb25zdCB0dXBsZVNlbGVjdGlvbk1vZGVsOiBUdXBsZVNlbGVjdGlvbk1vZGVsID0gbmV3IFR1cGxlU2VsZWN0aW9uTW9kZWwoKTtcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwuc2VsZWN0aW9uVHlwZSA9ICd0dXBsZXMnO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5vYmplY3RJZHMgPSBpZHM7XG4gICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5zZWxlY3Rpb24gPSB0dXBsZVNlbGVjdGlvbk1vZGVsO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0aW9uTW9kZWxDb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHByZXBhcmUgdGhlIHByZXMgbW9kZWxzIGZvciBzZWxlY3Rpb24gYnkgdmFsdWVzLlxuICAgKlxuICAgKiBTdXBwb3J0cyAzIHR5cGVzIGZvciBzZWxlY3Rpb246XG4gICAqIDEpIEhpZXJhcmNoaWNhbCB2YWx1ZSBiYXNlZCBzZWxlY3Rpb25cbiAgICogMikgUmFuZ2UgdmFsdWUgYmFzZWQgc2VsZWN0aW9uXG4gICAqIDMpIERpbWVuc2lvbiB2YWx1ZSBiYXNlZCBzZWxlY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlU2VsZWN0aW9uTWFya3Moc2VsZWN0aW9uQ3JpdGVyaWFzOiBBcnJheTxDb250cmFjdC5TZWxlY3Rpb25Dcml0ZXJpYT4pOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbkNyaXRlcmlhcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc3QgPSBzZWxlY3Rpb25Dcml0ZXJpYXNbaV07XG4gICAgICBpZiAoIShzdC5maWVsZE5hbWUgJiYgc3QudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBzdC52YWx1ZSAhPT0gbnVsbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdTZWxlY3Rpb24gQ3JpdGVyaWEgcGFyc2luZyBlcnJvcicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjYXRSZWdleCA9IG5ldyBSZWdFeHAoJyhbW0EtWmEtejAtOV0rXSkuKicsICdnJyk7XG4gICAgICBjb25zdCByYW5nZU9wdGlvbiA9IHN0LnZhbHVlIGFzIENvbnRyYWN0LlJhbmdlVmFsdWU7XG4gICAgICBpZiAoY2F0UmVnZXgudGVzdChzdC5maWVsZE5hbWUpKSB7XG4gICAgICAgIC8vIEhpZXJhcmNoaWNhbCB2YWx1ZSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3QgaGllck1vZGVsOiBIaWVyYXJjaGljYWxTZWxlY3Rpb25Nb2RlbCA9IHRoaXMuYWRkVG9QYXJhbXNMaXN0KHN0LmZpZWxkTmFtZSwgc3QudmFsdWUpIGFzIEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsO1xuICAgICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5oaWVyTW9kZWxBcnIucHVzaChoaWVyTW9kZWwpO1xuICAgICAgfSBlbHNlIGlmIChyYW5nZU9wdGlvbi5taW4gIT09IHVuZGVmaW5lZCAmJiByYW5nZU9wdGlvbi5tYXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBSYW5nZSB2YWx1ZSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3QgcXVhbnRNb2RlbDogUmFuZ2VTZWxlY3Rpb25Nb2RlbCA9IHRoaXMuYWRkVG9SYW5nZVBhcmFtc0xpc3Qoc3QuZmllbGROYW1lLCByYW5nZU9wdGlvbik7XG4gICAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnF1YW50TW9kZWxBcnIucHVzaChxdWFudE1vZGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpbWVuc2lvbiB2YWx1ZSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3QgZGltTW9kZWw6IERpbWVuc2lvblNlbGVjdGlvbk1vZGVsID0gdGhpcy5hZGRUb1BhcmFtc0xpc3Qoc3QuZmllbGROYW1lLCBzdC52YWx1ZSkgYXMgRGltZW5zaW9uU2VsZWN0aW9uTW9kZWw7XG4gICAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmRpbU1vZGVsQXJyLnB1c2goZGltTW9kZWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gdHJhbnNmb3JtIHRoZSBrZXkgdmFsdWUgcGFpciBpbnRvIHZhbHVlIGJhc2VkIHByZXMgbW9kZWwgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVTZWxlY3Rpb25Nb2RlbFxuICAgKiBAcGFyYW0gZmllbGROYW1lXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBhZGRUb1BhcmFtc0xpc3QoZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlOiBDb250cmFjdC5DYXRlZ29yaWNhbFZhbHVlIHwgQ29udHJhY3QuUmFuZ2VWYWx1ZSk6IFZhbHVlU2VsZWN0aW9uTW9kZWwge1xuICAgIGNvbnN0IHZhbHVlU2VsZWN0aW9uTW9kZWw6IFZhbHVlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVmFsdWVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgIGNvbnN0IG1hcmtWYWx1ZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBjb25zdCB2YWx1ZUFycjogQXJyYXk8c3RyaW5nPiA9IHZhbHVlO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZUFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBtYXJrVmFsdWVzLnB1c2goUGFyYW0uc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUodmFsdWVBcnJbaV0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbWFya1ZhbHVlcy5wdXNoKFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgdmFsdWVTZWxlY3Rpb25Nb2RlbC5xdWFsaWZpZWRGaWVsZENhcHRpb24gPSBmaWVsZE5hbWU7XG4gICAgdmFsdWVTZWxlY3Rpb25Nb2RlbC5zZWxlY3RWYWx1ZXMgPSBtYXJrVmFsdWVzO1xuICAgIHJldHVybiB2YWx1ZVNlbGVjdGlvbk1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB0cmFuc2Zvcm0gdGhlIGtleSB2YWx1ZSBwYWlyIGludG8gcmFuZ2UgYmFzZWQgc2VsZWN0aW9uIHByZXMgbW9kZWwuXG4gICAqXG4gICAqIFRPRE86IE5lZWQgdG8gaGFuZGxlIHRoZSBwYXJzaW5nIG9mIGRhdGUgdHlwZSB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZVNlbGVjdGlvbk1vZGVsXG4gICAqIEBwYXJhbSBmaWVsZE5hbWVcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGFkZFRvUmFuZ2VQYXJhbXNMaXN0KGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogQ29udHJhY3QuUmFuZ2VWYWx1ZSk6IFJhbmdlU2VsZWN0aW9uTW9kZWwge1xuICAgIGNvbnN0IHJhbmdlU2VsZWN0aW9uTW9kZWw6IFJhbmdlU2VsZWN0aW9uTW9kZWwgPSBuZXcgUmFuZ2VTZWxlY3Rpb25Nb2RlbCgpO1xuICAgIHJhbmdlU2VsZWN0aW9uTW9kZWwucXVhbGlmaWVkRmllbGRDYXB0aW9uID0gZmllbGROYW1lO1xuICAgIGlmICh2YWx1ZS5tYXggIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS5tYXggIT09IG51bGwpIHtcbiAgICAgIHJhbmdlU2VsZWN0aW9uTW9kZWwubWF4VmFsdWUgPSBQYXJhbS5zZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZSh2YWx1ZS5tYXgpO1xuICAgIH1cbiAgICBpZiAodmFsdWUubWluICE9PSB1bmRlZmluZWQgJiYgdmFsdWUubWluICE9PSBudWxsKSB7XG4gICAgICByYW5nZVNlbGVjdGlvbk1vZGVsLm1pblZhbHVlID0gUGFyYW0uc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUodmFsdWUubWluKTtcbiAgICB9XG4gICAgcmFuZ2VTZWxlY3Rpb25Nb2RlbC5pbmNsdWRlZCA9IHRoaXMudmFsaWRhdGVOdWxsT3B0aW9uVHlwZSh2YWx1ZS5udWxsT3B0aW9uKTtcbiAgICByZXR1cm4gcmFuZ2VTZWxlY3Rpb25Nb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gdmFsaWRhdGUgdGhlIHNlbGVjdGlvbiB1cGRhdGUgdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIHNlbGVjdGlvblVwZGF0ZVR5cGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTZWxlY3Rpb25VcGRhdGVUeXBlKHNlbGVjdGlvblVwZGF0ZVR5cGU6IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUpOiBzdHJpbmcge1xuICAgIGlmIChzZWxlY3Rpb25VcGRhdGVUeXBlID09PSBDb250cmFjdC5TZWxlY3Rpb25VcGRhdGVUeXBlLlJlcGxhY2UpIHtcbiAgICAgIHJldHVybiBTZWxlY3Rpb25VcGRhdGVUeXBlSW50ZXJuYWwuUmVwbGFjZTtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGlvblVwZGF0ZVR5cGUgPT09IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUuQWRkKSB7XG4gICAgICByZXR1cm4gU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLkFkZDtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGlvblVwZGF0ZVR5cGUgPT09IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUuUmVtb3ZlKSB7XG4gICAgICByZXR1cm4gU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLlJlbW92ZTtcbiAgICB9XG4gICAgcmV0dXJuIFNlbGVjdGlvblVwZGF0ZVR5cGVJbnRlcm5hbC5SZXBsYWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB2YWxpZGF0ZSB0aGUgaW5jbHVkZSB0eXBlIGZvciByYW5nZSBzZWxlY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBudWxsT3B0aW9uXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTnVsbE9wdGlvblR5cGUobnVsbE9wdGlvbjogQ29udHJhY3QuRmlsdGVyTnVsbE9wdGlvbiB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKG51bGxPcHRpb24pIHtcbiAgICAgIGlmIChudWxsT3B0aW9uID09PSBDb250cmFjdC5GaWx0ZXJOdWxsT3B0aW9uLk51bGxWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLkluY2x1ZGVOdWxsO1xuICAgICAgfSBlbHNlIGlmIChudWxsT3B0aW9uID09PSBDb250cmFjdC5GaWx0ZXJOdWxsT3B0aW9uLk5vbk51bGxWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLkluY2x1ZGVOb25OdWxsO1xuICAgICAgfSBlbHNlIGlmIChudWxsT3B0aW9uID09PSBDb250cmFjdC5GaWx0ZXJOdWxsT3B0aW9uLkFsbFZhbHVlcykge1xuICAgICAgICByZXR1cm4gUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMuSW5jbHVkZUFsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMuSW5jbHVkZUFsbDtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlVHVwbGVJRElzTm9uTmVnYXRpdmUodHVwbGVJZD86IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHR1cGxlSWQgJiYgdHVwbGVJZCA+IDApIHtcbiAgICAgIHJldHVybiB0dXBsZUlkO1xuICAgIH1cblxuICAgIC8vIDAgd2lsbCBub3QgcmVmZXIgdG8gYSB2YWxpZCB0dXBsZSAoc2luY2UgdHVwbGUgaWRzIGFyZSAxLWJhc2VkKSxcbiAgICAvLyBidXQgY2FuIGJlIHVzZWQgZm9yIGNsZWFyaW5nIHRoZSBjdXJyZW50IGhvdmVyIG9yIHNlbGVjdGlvblxuICAgIHJldHVybiAwO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIEludGVybmFsQXBpRGlzcGF0Y2hlciwgSW50ZXJuYWxUYWJsZWF1RXJyb3IsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBTaG91bGRUaHJvdyB9IGZyb20gJy4uLy4uL1V0aWxzL0VudW1Db252ZXJ0ZXInO1xuXG4vKipcbiAqIEVhY2ggU2VydmNlSW1wbCBzaG91bGQgZXh0ZW5kIHRoaXMgYmFzZSBjbGFzcyBmb3IgdGhlIHNha2Ugb2ZcbiAqIHByb3BlciBlcnJvciBoYW5kbGluZy4gIFRoaXMgYmFzZSBoYW5kbGVzIHRoZSBjb252ZXJzaW9uXG4gKiBmcm9tIGludGVybmFsIGVycm9ycyB0byBleHRlcm5hbCBlcnJvcnMgdGhhdCB3ZSB0aHJvdyB0byBkZXZlbG9wZXJzXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlSW1wbEJhc2Uge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyLCBwcm90ZWN0ZWQgX3JlZ2lzdHJ5SWQ6IG51bWJlcikge31cblxuICBwcm90ZWN0ZWQgZXhlY3V0ZSh2ZXJiOiBWZXJiSWQsIHBhcmFtczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaGVyLmV4ZWN1dGUodmVyYiwgcGFyYW1zKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIC8vIEFueSBpbnRlcm5hbCBlcnJvciB0aGF0IGNvbWVzIGZyb20gdGhlIGRpc3BhdGNoZXIgc2hvdWxkIGJlIGNvbnZlcnRlZFxuICAgICAgLy8gdG8gYW4gZXh0ZXJuYWwgZXJyb3IgdXNpbmcgdGhlIGVudW0gbWFwcGVyIGZvciBlcnJvciBjb2Rlcy5cbiAgICAgIGNvbnN0IGludGVybmFsRXJyb3IgPSBlcnJvciBhcyBJbnRlcm5hbFRhYmxlYXVFcnJvcjtcbiAgICAgIGNvbnN0IGV4dGVybmFsRXJyb3JDb2RlOiBFcnJvckNvZGVzID0gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmVycm9yQ29kZS5jb252ZXJ0KGludGVybmFsRXJyb3IuZXJyb3JDb2RlLCBTaG91bGRUaHJvdy5Obyk7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKGV4dGVybmFsRXJyb3JDb2RlLCBpbnRlcm5hbEVycm9yLm1lc3NhZ2UpO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTaGVldFNpemUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNpemVTZXJ2aWNlIH0gZnJvbSAnLi4vU2l6ZVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgU2l6ZVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgU2l6ZVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5TaXplO1xuICB9XG5cbiAgY2hhbmdlU2l6ZUFzeW5jKG5hbWU6IHN0cmluZywgbmV3U2l6ZTogU2hlZXRTaXplKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NoYW5nZVNpemVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU2hlZXROYW1lXTogbmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NaW5IZWlnaHRdOiBuZXdTaXplLm1pblNpemU/LmhlaWdodCB8fCAwLFxuICAgICAgW1BhcmFtZXRlcklkLk1pbldpZHRoXTogbmV3U2l6ZS5taW5TaXplPy53aWR0aCB8fCAwLFxuICAgICAgW1BhcmFtZXRlcklkLk1heEhlaWdodF06IG5ld1NpemUubWF4U2l6ZT8uaGVpZ2h0IHx8IDAsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4V2lkdGhdOiBuZXdTaXplLm1heFNpemU/LndpZHRoIHx8IDAsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNldFNoZWV0U2l6ZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigoX3Jlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJZCwgU3RvcnlQb2ludE1vZGVsLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFN0b3J5QWN0aXZhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TdG9yeUFjdGl2YXRpb25TZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIFN0b3J5QWN0aXZhdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgU3RvcnlBY3RpdmF0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlN0b3J5QWN0aXZhdGlvbjtcbiAgfVxuXG4gIGFjdGl2YXRlTmV4dFN0b3J5UG9pbnRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFjdGl2YXRlTmV4dFN0b3J5UG9pbnQ7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FjdGl2YXRlTmV4dFN0b3J5UG9pbnRBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIGFjdGl2YXRlUHJldmlvdXNTdG9yeVBvaW50QXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BY3RpdmF0ZVByZXZpb3VzU3RvcnlQb2ludDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnRBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIGFjdGl2YXRlU3RvcnlQb2ludEFzeW5jKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFjdGl2YXRlU3RvcnlQb2ludDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWN0aXZhdGVTdG9yeVBvaW50QXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5TdG9yeVBvaW50SW5kZXhdID0gaW5kZXg7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICByZXZlcnRTdG9yeVBvaW50QXN5bmMoaW5kZXg6IG51bWJlcik6IFByb21pc2U8U3RvcnlQb2ludE1vZGVsPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5SZXZlcnRTdG9yeVBvaW50O1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZXZlcnRTdG9yeVBvaW50QXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5TdG9yeVBvaW50SW5kZXhdID0gaW5kZXg7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48U3RvcnlQb2ludE1vZGVsPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgU3RvcnlQb2ludE1vZGVsO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQsIFZpc3VhbElkLCBWaXN1YWxTcGVjaWZpY2F0aW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBWaXN1YWxNb2RlbFNlcnZpY2UgfSBmcm9tICcuLi9WaXN1YWxNb2RlbFNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgVmlzdWFsTW9kZWxTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFZpc3VhbE1vZGVsU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlZpc3VhbE1vZGVsO1xuICB9XG5cbiAgcHVibGljIGdldFZpc3VhbFNwZWNpZmljYXRpb25Bc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPENvbnRyYWN0LlZpc3VhbFNwZWNpZmljYXRpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogdmlzdWFsSWQud29ya3NoZWV0LFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRWaXN1YWxTcGVjaWZpY2F0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0LlZpc3VhbFNwZWNpZmljYXRpb24+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIFZpc3VhbFNwZWNpZmljYXRpb247XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGVuY29kaW5nVHlwZTogQ29udHJhY3QuRW5jb2RpbmdUeXBlLFxuICAgIGNvbHVtbnM6IEFycmF5PENvbnRyYWN0LkNvbHVtbj4sXG4gICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWRkTWFya3NDYXJkRmllbGRzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiB2aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBbUGFyYW1ldGVySWQuTWFya3NDYXJkSW5kZXhdOiBtYXJrc0NhcmRJbmRleCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FbmNvZGluZ1R5cGVdOiBlbmNvZGluZ1R5cGUsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc106IGNvbHVtbnMsXG4gICAgICBbUGFyYW1ldGVySWQuU3RhcnRJbmRleF06IHN0YXJ0SW5kZXgsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5BZGRNYXJrc0NhcmRGaWVsZHMsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1vdmVNYXJrc0NhcmRGaWVsZEFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGZyb21JbmRleDogbnVtYmVyLFxuICAgIHRvSW5kZXg6IG51bWJlcixcbiAgICBmaWVsZENvdW50ID0gMSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogdmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgW1BhcmFtZXRlcklkLk1hcmtzQ2FyZEluZGV4XTogbWFya3NDYXJkSW5kZXgsXG4gICAgICBbUGFyYW1ldGVySWQuRnJvbUluZGV4XTogZnJvbUluZGV4LFxuICAgICAgW1BhcmFtZXRlcklkLlRvSW5kZXhdOiB0b0luZGV4LFxuICAgICAgW1BhcmFtZXRlcklkLkZpZWxkQ291bnRdOiBmaWVsZENvdW50LFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuTW92ZU1hcmtzQ2FyZEZpZWxkLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbWFya3NDYXJkSW5kZXg6IG51bWJlcixcbiAgICBlbmNvZGluZ1R5cGU6IENvbnRyYWN0LkVuY29kaW5nVHlwZSxcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICAgZGVsZXRlQ291bnQ6IG51bWJlcixcbiAgICBjb2x1bW5zOiBBcnJheTxDb250cmFjdC5Db2x1bW4+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc3BsaWNlTWFya3NDYXJkRmllbGRzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiB2aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBbUGFyYW1ldGVySWQuTWFya3NDYXJkSW5kZXhdOiBtYXJrc0NhcmRJbmRleCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FbmNvZGluZ1R5cGVdOiBlbmNvZGluZ1R5cGUsXG4gICAgICBbUGFyYW1ldGVySWQuU3RhcnRJbmRleF06IHN0YXJ0SW5kZXgsXG4gICAgICBbUGFyYW1ldGVySWQuRGVsZXRlQ291bnRdOiBkZWxldGVDb3VudCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zXTogY29sdW1ucyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNwbGljZU1hcmtzQ2FyZEZpZWxkcywgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBlZGl0QWxpYXNlc0RpYWxvZ0FzeW5jKGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2VkaXRBbGlhc2VzRGlhbG9nQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkZpZWxkSWRdOiBmaWVsZE5hbWUsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5FZGl0QWxpYXNlc0RpYWxvZywgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEN1c3RvbVZpZXdNb2RlbCwgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ3VzdG9tVmlld0ltcGwgfSBmcm9tICcuLi8uLi9JbXBsL0N1c3RvbVZpZXdJbXBsJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBWaXpTZXJ2aWNlIH0gZnJvbSAnLi4vVml6U2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBWaXpTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFZpelNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5WaXo7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NyZWF0ZVZpekltYWdlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpekFQSUlucHV0SnNvbl06IEpTT04uc3RyaW5naWZ5KGlucHV0U3BlYyksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlZpekFQSSwgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlU2hlZXRBc3luYyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWN0aXZhdGVTaGVldEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Td2l0Y2hUb1NoZWV0TmFtZV06IG5hbWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkFjdGl2YXRlU2hlZXQsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEN1c3RvbVZpZXdzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDdXN0b21WaWV3SW1wbD4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0Q3VzdG9tVmlld3NBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEN1c3RvbVZpZXdzLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PEN1c3RvbVZpZXdJbXBsPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3cyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxDdXN0b21WaWV3TW9kZWw+O1xuICAgICAgcmV0dXJuIGN1c3RvbVZpZXdzLm1hcCgoY3VzdG9tVmlldzogQ3VzdG9tVmlld01vZGVsKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgQ3VzdG9tVmlld0ltcGwoY3VzdG9tVmlldywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q3VzdG9tVmlld0FzeW5jKGN1c3RvbVZpZXdOYW1lPzogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGwgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2hvd0N1c3RvbVZpZXdBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld05hbWVdOiBjdXN0b21WaWV3TmFtZSB8fCAnJywgLy8gYSBmYWxzZXkgdmFsdWUgbWVhbnMgXCJzaG93IG9yaWdpbmFsIHZpZXdcIlxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TaG93Q3VzdG9tVmlldywgcGFyYW1ldGVycykudGhlbjxDdXN0b21WaWV3SW1wbCB8IHVuZGVmaW5lZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3ID0gcmVzcG9uc2UucmVzdWx0IGFzIEN1c3RvbVZpZXdNb2RlbDtcbiAgICAgIHJldHVybiBjdXN0b21WaWV3Py5sdWlkID8gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpIDogdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUN1c3RvbVZpZXdBc3luYyhjdXN0b21WaWV3TmFtZTogc3RyaW5nKTogUHJvbWlzZTxDdXN0b21WaWV3SW1wbD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZW1vdmVDdXN0b21WaWV3QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlld05hbWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlbW92ZUN1c3RvbVZpZXcsIHBhcmFtZXRlcnMpLnRoZW48Q3VzdG9tVmlld0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlldyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDdXN0b21WaWV3TW9kZWw7XG4gICAgICByZXR1cm4gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNhdmVDdXN0b21WaWV3QXN5bmMoY3VzdG9tVmlld05hbWU6IHN0cmluZyk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGw+IHtcbiAgICAvLyBDdXN0b21WaWV3SXNEZWZhdWx0IGlzIGEgcmVxdWlyZWQgcGFyYW1ldGVyLCBidXQgb3VyIEFQSSBoYXMgbm90IGJlZW4gdXBkYXRlZCB0byBhbGxvdyBpdCB0byBiZSBzcGVjaWZpZWQgeWV0LlxuICAgIC8vIFdlIHNob3VsZCBhZGQgYSAnZGVmYXVsdCcgcGFyYW1ldGVyIHRvIHRoZSBpbnRlcmZhY2UuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NhdmVDdXN0b21WaWV3QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlld05hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld0lzRGVmYXVsdF06IGZhbHNlLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TYXZlV29ya2Jvb2tBc0N1c3RvbVZpZXcsIHBhcmFtZXRlcnMpLnRoZW48Q3VzdG9tVmlld0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlldyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDdXN0b21WaWV3TW9kZWw7XG4gICAgICByZXR1cm4gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldEFjdGl2ZUN1c3RvbVZpZXdBc0RlZmF1bHRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2V0QWN0aXZlQ3VzdG9tVmlld0FzRGVmYXVsdEFzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2V0QWN0aXZlQ3VzdG9tVmlld0FzRGVmYXVsdCwgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUFzeW5jKGN1c3RvbVZpZXc6IEN1c3RvbVZpZXdJbXBsKTogUHJvbWlzZTxDdXN0b21WaWV3SW1wbD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzYXZlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdMdWlkXTogY3VzdG9tVmlldy5sdWlkLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlldy5uYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdJc0RlZmF1bHRdOiBjdXN0b21WaWV3LmlzRGVmYXVsdCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3SXNQdWJsaWNdOiBjdXN0b21WaWV3LnNoYXJlZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuVXBkYXRlQ3VzdG9tVmlldywgcGFyYW1ldGVycykudGhlbjxDdXN0b21WaWV3SW1wbD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3ID0gcmVzcG9uc2UucmVzdWx0IGFzIEN1c3RvbVZpZXdNb2RlbDtcbiAgICAgIHJldHVybiBuZXcgQ3VzdG9tVmlld0ltcGwoY3VzdG9tVmlldywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VycmVudFNyY0FzeW5jKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEN1cnJlbnRTcmNBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEN1cnJlbnRTcmMsIHBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIGFzIEV4dGVybmFsRW51bUNvbnZlcnRlciB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi8uLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuLi8uLi9VdGlscy9QYXJhbSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2UgfSBmcm9tICcuLi9ab25lU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBab25lU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBab25lU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlpvbmU7XG4gIH1cblxuICBwdWJsaWMgc2V0VmlzaWJpbGl0eUFzeW5jKFxuICAgIGRhc2hib2FyZDogc3RyaW5nLFxuICAgIGRhc2hib2FyZFpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+LFxuICAgIHpvbmVWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5ab25lVmlzaWJpbGl0eU1hcCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2V0VmlzaWJpbGl0eUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXNoYm9hcmRdOiBkYXNoYm9hcmQsXG4gICAgICBbUGFyYW1ldGVySWQuWm9uZUlkc1Zpc2liaWxpdHlNYXBdOiB7fSxcbiAgICB9O1xuXG4gICAgLy8gem9uZVZpc2liaWxpdHlNYXAgY2FuIGJlIGVpdGhlciBhbiBvYmplY3Qgb3IgYSBNYXAgLSBjb252ZXJ0IGl0IHRvIGEgTWFwXG4gICAgY29uc3QgcGFyYW1ldGVyQXNNYXAgPSBQYXJhbS5jb252ZXJ0UGFyYW1ldGVyVG9NYXAoem9uZVZpc2liaWxpdHlNYXAsICd6b25lVmlzaWJpbGl0eU1hcCcpO1xuXG4gICAgcGFyYW1ldGVyQXNNYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeVpvbmVJc1ZhbGlkKGRhc2hib2FyZFpvbmVNYXAsIE51bWJlci5wYXJzZUludChrZXksIDEwKSk7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlPih2YWx1ZSwgRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUsICdEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZScpO1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5ab25lSWRzVmlzaWJpbGl0eU1hcF1ba2V5XSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5zZXRWaXNpYmlsaXR5VHlwZS5jb252ZXJ0KHZhbHVlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNldFpvbmVWaXNpYmlsaXR5LCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1vdmVBbmRSZXNpemVBc3luYyhcbiAgICBkYXNoYm9hcmQ6IHN0cmluZyxcbiAgICBkYXNoYm9hcmRab25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPixcbiAgICBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheTogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXksXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRGFzaGJvYXJkXTogZGFzaGJvYXJkLFxuICAgICAgW1BhcmFtZXRlcklkLkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUxpc3RdOiBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSxcbiAgICB9O1xuXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXkuZm9yRWFjaCgoZGFzaGJvYXJkT2JqZWN0OiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUpID0+IHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlab25lSXNWYWxpZEFuZEZsb2F0aW5nKGRhc2hib2FyZFpvbmVNYXAsIGRhc2hib2FyZE9iamVjdC5kYXNoYm9hcmRPYmplY3RJRCk7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5V2lkdGhBbmRIZWlnaHRPZkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZShkYXNoYm9hcmRPYmplY3QpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuTW92ZUFuZFJlc2l6ZVpvbmVzLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIHRhYmxlIHN1bW1hcnkuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWJsZVN1bW1hcnkgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZVN1bW1hcnkge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfdGFibGVJbmZvOiBUYWJsZUluZm8pIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8uaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb25JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8uY29ubmVjdGlvbklkO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXN0b21TUUwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbmZvLmN1c3RvbVNRTDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRW1iZWRkaW5nRXJyb3JDb2RlcywgRXJyb3JDb2RlcywgU2hhcmVkRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogQ3VzdG9tIGVycm9yIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IEVycm9yIG9iamVjdC5cbiAqIFRoaXMgYWxsb3dzIHVzIHRvIHByb3ZpZGUgYSBmaWVsZCB3aXRoIGEgc3BlY2lmaWMgZXJyb3IgY29kZVxuICogc28gdGhhdCBkZXZlbG9wZXJzIGNhbiBtb3JlIGVhc2lseSBwcm9ncmFtbWF0aWNhbGx5IHJlc3BvbmRcbiAqIHRvIGVycm9yIHNjZW5hcmlvcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhYmxlYXVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Vycm9yQ29kZTogRXJyb3JDb2RlcyB8IEVtYmVkZGluZ0Vycm9yQ29kZXMgfCBTaGFyZWRFcnJvckNvZGVzLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgJHtfZXJyb3JDb2RlfTogJHttZXNzYWdlfWApO1xuXG4gICAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQtd2lraS9ibG9iL21hc3Rlci9CcmVha2luZy1DaGFuZ2VzLm1kI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29ya1xuICAgIC8vIEVycm9yIGluaGVyaXRhbmNlIGRvZXMgbm90IHdvcmsgcHJvcGVydGx5IHdoZW4gY29tcGlsaW5nIHRvIEVTNSwgdGhpcyBpcyBhIHdvcmthcm91bmQgdG8gZm9yY2VcbiAgICAvLyB0aGUgcHJvdG8gY2hhaW4gdG8gYmUgYnVpbHQgY29ycmVjdGx5LiAgU2VlIHRoZSBnaXRodWIgbGluayBhYm92ZSBmb3IgZGV0YWlscy5cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgVGFibGVhdUVycm9yLnByb3RvdHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVycm9yQ29kZSgpOiBFcnJvckNvZGVzIHwgRW1iZWRkaW5nRXJyb3JDb2RlcyB8IFNoYXJlZEVycm9yQ29kZXMge1xuICAgIHJldHVybiB0aGlzLl9lcnJvckNvZGU7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFWYWx1ZSB9IGZyb20gJy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcblxuLyoqXG4gKiBJbiB2ZXJzaW9uIDIgb2YgdGhlIGludGVyZmFjZSwgd2Ugc2hvdWxkIGNvbGxhcHNlIHZhbHVlIGludG8gbmF0aXZlVmFsdWUsIGFuZCBkbyBhbGwgdGhpcyB3b3JrIG92ZXJcbiAqIGluIHRoZSBwbGF0Zm9ybS5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFWYWx1ZUZhY3Rvcnkge1xuICBwdWJsaWMgc3RhdGljIE1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWU6IEludGVybmFsQ29udHJhY3QuRGF0YVZhbHVlLCBkYXRhVHlwZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZSk6IERhdGFWYWx1ZSB7XG4gICAgLy8gUGFyYW1ldGVyIHZhbHVlcyBhcmUgYWxsIHN0cmluZ3MsIGNvbnZlcnQgZnJvbSBzdHJpbmcgdG8gdmFsdWVcbiAgICByZXR1cm4gbmV3IERhdGFWYWx1ZShcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLnZhbHVlLFxuICAgICAgSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZUNvbnZlcnRlci5jb252ZXJ0U3RyaW5nVmFsdWVUb05hdGl2ZVZhbHVlKGludGVybmFsRGF0YVZhbHVlLnZhbHVlLCBkYXRhVHlwZSksXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS5mb3JtYXR0ZWRWYWx1ZSxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLmFsaWFzZWRWYWx1ZSxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLmhhc0FsaWFzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIE1ha2VGaWx0ZXJEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWU6IEludGVybmFsQ29udHJhY3QuRGF0YVZhbHVlKTogRGF0YVZhbHVlIHtcbiAgICAvLyBGaWx0ZXJzIGFscmVhZHkgaGF2ZSBuYXRpdmUgdHlwZSBpbiB2YWx1ZSwganVzdCB1c2UgdGhhdCBmb3IgbmF0aXZlVmFsdWUgYWxzb1xuICAgIHJldHVybiBuZXcgRGF0YVZhbHVlKGludGVybmFsRGF0YVZhbHVlLnZhbHVlLCBpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSwgaW50ZXJuYWxEYXRhVmFsdWUuZm9ybWF0dGVkVmFsdWUpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBNYWtlVGFibGVEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWU6IEludGVybmFsQ29udHJhY3QuRGF0YVZhbHVlLCBkYXRhVHlwZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZSk6IERhdGFWYWx1ZSB7XG4gICAgLy8gRGF0YVRhYmxlcyBjb250YWluIGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBkYXRlIGFzIHN0cmluZyB8ICclbnVsbCVcbiAgICAvLyBjb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlIGNvbnZlcnRzIGRhdGVzIGFzIHN0cmluZyB0byBkYXRlcywgYW5kIGFueSBzcGVjaWFsIHRvIG51bGxcbiAgICAvLyAoYm9vbGVhbiwgbnVtYmVycywgc3RyaW5ncyBhcmUgcGFzc2VkIHRocm91Z2gpXG4gICAgLy8gQmVjYXVzZSBvZiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiAtIHdlIGNhbiBoYXZlIHVuZGVmaW5lZCB2YWx1ZXMsIHdoaWNoIGFyZSBkaWZmZXJlbnQgdGhhbiBhbnkgc3BlY2lhbFxuICAgIHJldHVybiBuZXcgRGF0YVZhbHVlKFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZUNvbnZlcnRlci5jb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlKGludGVybmFsRGF0YVZhbHVlLnZhbHVlLCBkYXRhVHlwZSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS5mb3JtYXR0ZWRWYWx1ZSxcbiAgICApO1xuICB9XG59XG4iLCIvKipcbiAqIEEgUHJvbWlzZSB3cmFwcGVyIGNsYXNzIGFsbG93aW5nIGZvciByZXNvbHZpbmcvcmVqZWN0aW5nIHRoZSBQcm9taXNlIG91dHNpZGUgdGhlIGNvbnRleHQgb2YgaXRzIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBEZWZlcnJlZFxuICogQHRlbXBsYXRlIFRSZXNvbHZlIFRoZSB0eXBlIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZS5cbiAqIEB0ZW1wbGF0ZSBUUmVqZWN0IFRoZSB0eXBlIHVzZWQgdG8gcmVqZWN0IHRoZSBwcm9taXNlLiBEZWZhdWx0cyB0byBhbnkuXG4gKiBAbGluayBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzQ2Mzc0MzZcbiAqL1xuZXhwb3J0IGNsYXNzIERlZmVycmVkPFRSZXNvbHZlLCBUUmVqZWN0ID0gYW55PiB7XG4gIHByaXZhdGUgX3Byb21pc2U6IFByb21pc2U8VFJlc29sdmU+O1xuICBwcml2YXRlIF9yZXNvbHZlOiAocmVzcG9uc2U6IFRSZXNvbHZlIHwgUHJvbWlzZUxpa2U8VFJlc29sdmU+KSA9PiB2b2lkO1xuICBwcml2YXRlIF9yZWplY3Q6IChyZWFzb24/OiBUUmVqZWN0KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIERlZmVycmVkLlxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fcHJvbWlzZSA9IG5ldyBQcm9taXNlPFRSZXNvbHZlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLl9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIHRoaXMuX3JlamVjdCA9IHJlamVjdDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBQcm9taXNlLlxuICAgKlxuICAgKiBAcmVhZG9ubHlcbiAgICogQHR5cGUge1Byb21pc2U8VFJlc29sdmU+fVxuICAgKi9cbiAgZ2V0IHByb21pc2UoKTogUHJvbWlzZTxUUmVzb2x2ZT4ge1xuICAgIHJldHVybiB0aGlzLl9wcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSB3cmFwcGVkIFByb21pc2UuXG4gICAqXG4gICAqIEBwYXJhbSB7KFRSZXNvbHZlIHwgUHJvbWlzZUxpa2U8VFJlc29sdmU+KX0gcmVzcG9uc2UgVGhlIGFyZ3VtZW50IHRvIGJlIHJlc29sdmVkIGJ5IHRoZSBQcm9taXNlLlxuICAgKiBAcmV0dXJucyB7Kn0gIHt2b2lkfVxuICAgKi9cbiAgcmVzb2x2ZShyZXNwb25zZTogVFJlc29sdmUgfCBQcm9taXNlTGlrZTxUUmVzb2x2ZT4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3Jlc29sdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXNvbHZlKHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKlxuICAgKiBAcGFyYW0ge1RSZWplY3R9IFtyZWFzb25dIFRoZSByZWFzb24gd2h5IHRoZSBQcm9taXNlIHJlamVjdGVkLlxuICAgKiBAcmV0dXJucyB7Kn0gIHt2b2lkfVxuICAgKi9cbiAgcmVqZWN0KHJlYXNvbj86IFRSZWplY3QpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3JlamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JlamVjdChyZWFzb24pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBVbnJlZ2lzdGVyVGltZW91dEluTWlsbGlzZWNvbmRzID0gMzAwMDA7XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBjb252ZXJ0cyBmcm9tIGEgc291cmNlIGVudW0gdmFsdWUgdG8gZGVzdGluYXRpb24gZW51bVxuICogdmFsdWUgZ2l2ZW4gYSBtYXBwaW5nIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIHdoZW4gY29uc3RydWN0ZWQuXG4gKlxuICogTm90ZTogVGhpcyBleGFjdCBzYW1lIGNsYXNzIGlzIGRlZmluZWQgaW4gYXBpLWNvcmUuICBHaXZlbiBpdHMgc21hbGxcbiAqIG5hdHVyZSwgaXQgaXMgbm90IHdvcnRoIGhhdmluZyBpbiBhIHNlcGFyYXRlIHByb2plY3QgdG8gc2hhcmUgdGhpcyBiZXR3ZWVuXG4gKiBhcGktY29yZSBhbmQgYXBpLXNoYXJlZC4gIElmIG1vcmUgdXRpbGl0eSBmdW5jdGlvbmFsaXR5IGlzIGFkZGVkIHRoYXQgaXMgdXNlZCBieSBhcGktY29yZVxuICogYW5kIGFwaS1zaGFyZWQgYnV0IGhhcyBubyBvdGhlciBkZXBlbmRlY2llcywgYSB1dGlsdGl0eSBwcm9qZWN0IG1pZ2h0IGJlIG1lcml0ZWQsXG4gKiBhbmQgdGhpcyBjbGFzcyBjb3VsZCBiZSBtb3ZlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudW1Db252ZXJ0ZXI8VFNvdXJjZVR5cGUgZXh0ZW5kcyBzdHJpbmcsIFREZXN0aW5hdGlvblR5cGU+IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX21hcHBpbmdzOiB7IFtlbnVtVmFsOiBzdHJpbmddOiBURGVzdGluYXRpb25UeXBlIH0sIHByaXZhdGUgX2RlZmF1bHRWYWw/OiBURGVzdGluYXRpb25UeXBlKSB7fVxuXG4gIHB1YmxpYyBjb252ZXJ0KGVudW1WYWw6IFRTb3VyY2VUeXBlLCB0aHJvd0lmTWlzc2luZzogU2hvdWxkVGhyb3cgPSBTaG91bGRUaHJvdy5ZZXMpOiBURGVzdGluYXRpb25UeXBlIHtcbiAgICBpZiAodGhpcy5fbWFwcGluZ3MuaGFzT3duUHJvcGVydHkoZW51bVZhbCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXBwaW5nc1tlbnVtVmFsIGFzIHN0cmluZ107XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2RlZmF1bHRWYWwgIT09IHVuZGVmaW5lZCAmJiB0aHJvd0lmTWlzc2luZyAhPT0gU2hvdWxkVGhyb3cuWWVzKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbDtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYEVudW0gTWFwcGluZyBub3QgZm91bmQgZm9yOiAke2VudW1WYWx9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGVudW0gU2hvdWxkVGhyb3cge1xuICBZZXMgPSAneWVzJyxcbiAgTm8gPSAnbm8nLFxufVxuIiwiaW1wb3J0IHtcbiAgRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlLFxuICBFeHBvcnREYXRhT3B0aW9ucyxcbiAgRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIFByaW50T3JpZW50YXRpb24sXG4gIFByaW50UGFnZVNpemUsXG4gIFByaW50U2NhbGluZyxcbiAgUmFuZ2VGaWx0ZXJPcHRpb25zLFxuICBTaGFyZWRFcnJvckNvZGVzLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4uL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuL1BhcmFtJztcblxuaW50ZXJmYWNlIEVudW1MaWtlIHtcbiAgdG9TdHJpbmcoKTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjb25zdHJ1Y3QgY29tbW9uIGVycm9ycyB0aHJvdWdob3V0IHRoZSBleHRlcm5hbFxuICogcHJvamVjdHMgKGFwaS1zaGFyZWQsIGV4dGVuc2lvbnMtYXBpLCBldGMuKS4gIEl0IGhhcyBzb21lIGR1cGxpY2F0aW9uIHdpdGhcbiAqIHRoZSBFcnJvckhlbHBlcnMgY2xhc3MgaW4gYXBpLWNvcmUsIGJ1dCBpcyBzZXBhcmF0ZSBkdWUgdG8gdGhlIG5lZWQgdG8gdGhyb3dcbiAqIGFuIGV4dGVybmFsIFRhYmxlYXVFcnJvciB2cy4gYW4gSW50ZXJuYWxUYWJsZWF1RXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBFcnJvckhlbHBlcnMge1xuICAvKipcbiAgICogVGhyb3dzIHdpdGggY29kZSBJbnRlcm5hbEVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0gYXBpTmFtZSBuYW1lIG9mIGFwaSB0aGF0IHdhcyBjYWxsZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFwaU5vdEltcGxlbWVudGVkKGFwaU5hbWU6IHN0cmluZyk6IFRhYmxlYXVFcnJvciB7XG4gICAgcmV0dXJuIG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJHthcGlOYW1lfSBBUEkgbm90IHlldCBpbXBsZW1lbnRlZC5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gaW50ZXJuYWwgZXJyb3IgaWYgYXJndW1lbnQgaXMgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUludGVybmFsVmFsdWUoYXJndW1lbnRWYWx1ZTogYW55LCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmIChhcmd1bWVudFZhbHVlID09PSBudWxsIHx8IGFyZ3VtZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAke2FyZ3VtZW50VmFsdWV9IGlzIGludmFsaWQgdmFsdWUgZm9yOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgYXJndW1lbnQgaXMgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVBhcmFtZXRlcihhcmd1bWVudFZhbHVlOiBhbnksIGFyZ3VtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGFyZ3VtZW50VmFsdWUgPT09IG51bGwgfHwgYXJndW1lbnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7YXJndW1lbnRWYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgYXJndW1lbnQgaXMgbm90IHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAgICogRm9yIG9iamVjdHMsIGl0IGp1c3QgdGVzdHMgdGhhdCBpdCBpcyBhbiBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIGFyZ3VtZW50VmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBleHBlY3RlZFR5cGUgZXhwZWN0ZWQgcmVzdWx0IG9mIHR5cGVvZlxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVBhcmFtZXRlclR5cGUoYXJndW1lbnRWYWx1ZTogYW55LCBleHBlY3RlZFR5cGU6IHN0cmluZywgYXJndW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50VmFsdWUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2FyZ3VtZW50VmFsdWV9IGhhcyBpbnZhbGlkIHR5cGUgZm9yIHBhcmFtZXRlcjogJHthcmd1bWVudE5hbWV9LmApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiBhcmd1bWVudCBpcyBlbXB0eSBzdHJpbmcsIG51bGwgb3IgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0gYXJndW1lbnRWYWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGFyZ3VtZW50TmFtZSBuYW1lIG9mIGFyZ3VtZW50IHRvIHZlcmlmeVxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlTdHJpbmdQYXJhbWV0ZXIoYXJndW1lbnRWYWx1ZTogc3RyaW5nLCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmIChhcmd1bWVudFZhbHVlID09PSBudWxsIHx8IGFyZ3VtZW50VmFsdWUgPT09IHVuZGVmaW5lZCB8fCBhcmd1bWVudFZhbHVlID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2FyZ3VtZW50VmFsdWV9IGlzIGludmFsaWQgdmFsdWUgZm9yIHBhcmFtdGVyOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgcGFzc2VkIHZhbHVlIGlzIGEgdmFsaWQgdmFsdWUgZm9yIHRoYXQgZW51bS5cbiAgICpcbiAgICogU3RyaW5nIGVudW1zIGFyZSB7c3RyaW5nIDogc3RyaW5nfSBkaWN0aW9uYXJpZXMgd2hpY2ggYXJlIG5vdCByZXZlcnNlIG1hcHBhYmxlXG4gICAqIFRoaXMgaXMgYW4gdWdseSB3b3JrYXJvdW5kXG4gICAqXG4gICAqIEBwYXJhbSBlbnVtVmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBlbnVtVHlwZSBlbnVtIHRvIHZlcmlmeSBhZ2FpbnN0XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIGlzVmFsaWRFbnVtVmFsdWU8RW51bVR5cGUgZXh0ZW5kcyBFbnVtTGlrZT4oZW51bVZhbHVlOiBFbnVtVHlwZSwgZW51bVR5cGU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGxldCBpc1ZhbGlkID0gZmFsc2U7XG4gICAgT2JqZWN0LmtleXMoZW51bVR5cGUpLmZvckVhY2goKGVudW1LZXkpID0+IHtcbiAgICAgIGlmIChlbnVtVHlwZVtlbnVtS2V5XSA9PT0gZW51bVZhbHVlLnRvU3RyaW5nKCkpIHtcbiAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaXNWYWxpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBwYXNzZWQgdmFsdWUgaXMgYSB2YWxpZCB2YWx1ZSBmb3IgdGhhdCBlbnVtLlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiB0aGUgZW51bSB2YWx1ZSBpcyBub3QgdmFsaWQuXG4gICAqXG4gICAqIFN0cmluZyBlbnVtcyBhcmUge3N0cmluZyA6IHN0cmluZ30gZGljdGlvbmFyaWVzIHdoaWNoIGFyZSBub3QgcmV2ZXJzZSBtYXBwYWJsZVxuICAgKiBUaGlzIGlzIGFuIHVnbHkgd29ya2Fyb3VuZFxuICAgKlxuICAgKiBAcGFyYW0gZW51bVZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gZW51bVR5cGUgZW51bSB0byB2ZXJpZnkgYWdhaW5zdFxuICAgKiBAcGFyYW0gZW51bU5hbWUgZW51bSBuYW1lIGZvciBjbGVhciBlcnJvciBtZXNzYWdlXG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUVudW1WYWx1ZTxFbnVtVHlwZSBleHRlbmRzIEVudW1MaWtlPihlbnVtVmFsdWU6IEVudW1UeXBlLCBlbnVtVHlwZTogYW55LCBlbnVtTmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCFFcnJvckhlbHBlcnMuaXNWYWxpZEVudW1WYWx1ZShlbnVtVmFsdWUsIGVudW1UeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2VudW1WYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgZW51bTogJHtlbnVtTmFtZX0uYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHBhc3NlZCB2YWx1ZSBpcyBiZXR3ZWVuIFttaW4sIG1heCkgLi4uIG1pbiA8PSB2YWx1ZSA8IG1heFxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHZhbGlkLlxuICAgKlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBtaW4gICB2YWx1ZSBtdXN0IGJlID49IG1pblxuICAgKiBAcGFyYW0gbWF4ICAgdmFsdWUgbXVzdCBiZSA8IG1heFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlSYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcbiAgICBsZXQgaXNWYWxpZCA9IG1pbiA8PSB2YWx1ZSAmJiB2YWx1ZSA8IG1heDtcblxuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke3ZhbHVlfSBpcyBpbnZhbGlkIHZhbHVlIGZvciByYW5nZTogWyR7bWlufS4uJHttYXh9KWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgcGFyYW1zIG1pbiBhbmQgbWF4IGZvciBhcHBseWluZyByYW5nZSBmaWx0ZXIuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFBhcmFtZXRlciBpZiByYW5nZSBpcyBpbnZhbGlkLlxuICAgKlxuICAgKiBAcGFyYW0gbWluIHJhbmdlIG1pblxuICAgKiBAcGFyYW0gbWF4IHJhbmdlIG1heFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlSYW5nZVBhcmFtVHlwZShtaW46IFJhbmdlRmlsdGVyT3B0aW9uc1snbWluJ10sIG1heDogUmFuZ2VGaWx0ZXJPcHRpb25zWydtYXgnXSk6IHZvaWQge1xuICAgIGNvbnN0IGlzTWluRGVmaW5lZCA9IG1pbiAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGlzTWF4RGVmaW5lZCA9IG1heCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFpc01pbkRlZmluZWQgJiYgIWlzTWF4RGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIGF0IGxlYXN0IG9uZSBvZiBtaW4gb3IgbWF4IGlzIHJlcXVpcmVkLicpO1xuICAgIH1cblxuICAgIGlmIChpc01pbkRlZmluZWQgJiYgIVBhcmFtLmlzVHlwZU51bWJlcihtaW4pICYmICFQYXJhbS5pc1R5cGVEYXRlKG1pbikpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgJ1VuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgb25seSBEYXRlIGFuZCBudW1iZXIgYXJlIGFsbG93ZWQgZm9yIHBhcmFtZXRlciBtaW4uJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzTWF4RGVmaW5lZCAmJiAhUGFyYW0uaXNUeXBlTnVtYmVyKG1heCkgJiYgIVBhcmFtLmlzVHlwZURhdGUobWF4KSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAnVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBvbmx5IERhdGUgYW5kIG51bWJlciBhcmUgYWxsb3dlZCBmb3IgcGFyYW1ldGVyIG1heC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNNaW5EZWZpbmVkICYmIGlzTWF4RGVmaW5lZCAmJiB0eXBlb2YgbWluICE9PSB0eXBlb2YgbWF4KSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIHBhcmFtZXRlcnMgbWluIGFuZCBtYXggc2hvdWxkIGJlIG9mIHRoZSBzYW1lIHR5cGUuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHpvbmVJZCBpcyBwcmVzZW50IGluIHRoZSBjdXJyZW50IGRhc2hib2FyZC5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIGVpdGhlciBjb25kaXRpb24gaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBkYXNoYm9hcmRab25lTWFwIEEgbWFwIG9mIHpvbmVJZCdzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBwYXJhbSB6b25lSUQgWm9uZUlkIHRvIGJlIHZhbGlkYXRlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlab25lSXNWYWxpZChkYXNoYm9hcmRab25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPiwgem9uZUlEOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoZGFzaGJvYXJkWm9uZU1hcC5oYXMoem9uZUlEKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICBgVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBEYXNoYm9hcmQgT2JqZWN0IElkOiAke3pvbmVJRH0gaXMgbm90IHByZXNlbnQgaW4gZGFzaGJvYXJkLmAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHRoZSB6b25lIGlzIHByZXNlbnQgYW5kIGZsb2F0aW5nIGluIHRoZSBjdXJyZW50IGRhc2hib2FyZC5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIGVpdGhlciBjb25kaXRpb24gaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBkYXNoYm9hcmRab25lTWFwIEEgbWFwIG9mIHpvbmVJZCdzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBwYXJhbSB6b25lSUQgWm9uZUlkIHRvIGJlIHZhbGlkYXRlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlab25lSXNWYWxpZEFuZEZsb2F0aW5nKGRhc2hib2FyZFpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+LCB6b25lSUQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChkYXNoYm9hcmRab25lTWFwLmhhcyh6b25lSUQpICYmIGRhc2hib2FyZFpvbmVNYXAuZ2V0KHpvbmVJRCkhLmlzRmxvYXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgYFVuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgRGFzaGJvYXJkIE9iamVjdCBJZDogJHt6b25lSUR9IGlzIG5vdCBwcmVzZW50IG9yIGlzIGEgZml4ZWQgem9uZSBpbiB0aGUgZGFzaGJvYXJkLmAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHdpZHRoIGFuZCBoZWlnaHQgYXJlID4gMCBmb3IgZWFjaCBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgb2JqZWN0LlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgZWl0aGVyIGNvbmRpdGlvbiBpcyBmYWxzZS5cbiAgICpcbiAgICogQHBhcmFtIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgb2JqZWN0IGZvciB3aGljaCB3aWR0aCBhbmQgaGVpZ2h0IHdpbGwgYmUgdmFsaWRhdGVkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVdpZHRoQW5kSGVpZ2h0T2ZEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUoXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlOiBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUsXG4gICk6IHZvaWQge1xuICAgIGlmIChkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUud2lkdGggPCAwIHx8IGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZS5oZWlnaHQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgIGBVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUgZm9yIGRhc2hib2FyZCBvYmplY3QgSUQgJHtkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUuZGFzaGJvYXJkT2JqZWN0SUR9OmAgK1xuICAgICAgICAgIGAgbmVnYXRpdmUgd2lkdGhzIGFuZCBoZWlnaHRzIGFyZSBub3QgYWxsb3dlZC5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgaXMgdGhlIGdpdmVuIHNoZWV0IG5hbWUgaXMgaW4gdGhlIGxpc3Qgb2Ygc2hlZXRzIG5hbWVzIGFsbG93ZWQgZm9yIGV4cG9ydGluZy5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIHRoZSBjb25kaXRpb24gYWJvdmUgaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBleHBvcnRhYmxlU2hlZXROYW1lcyBBIGxpc3Qgb2Ygc2hlZXQgbmFtZXMgYWxsb3dlZCBmb3IgZXhwb3J0aW5nXG4gICAqIEBwYXJhbSBzaGVldE5hbWUgdGhlIG5hbWUgb2YgdGhlIHNoZWV0IHNlbGVjdGVkIGZvciBleHBvcnRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5U2hlZXROYW1lKGV4cG9ydGFibGVTaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LCBzaGVldE5hbWU6IHN0cmluZykge1xuICAgIGlmICghZXhwb3J0YWJsZVNoZWV0TmFtZXMuaW5jbHVkZXMoc2hlZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uU2hlZXQsXG4gICAgICAgICdzaGVldE5hbWUgcGFyYW1ldGVyIG11c3QgYmVsb25nIHRvIGEgd29ya3NoZWV0IHdpdGhpbiB0aGUgY3VycmVudCB2aWV3JyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBFeHBvcnREYXRhT3B0aW9ucyBvYmplY3RcbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IG9mIEV4cG9ydERhdGFPcHRpb25zIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBFeHBvcnREYXRhT3B0aW9ucyBvYmplY3QgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBDU1YgZmlsZSBmb3IgZXhwb3J0RGF0YUFzeW5jLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlFeHBvcnREYXRhT3B0aW9ucyhvcHRpb25zOiBFeHBvcnREYXRhT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICghUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQob3B0aW9ucy5pZ25vcmVBbGlhc2VzKSAmJiAhUGFyYW0uaXNUeXBlQm9vbChvcHRpb25zLmlnbm9yZUFsaWFzZXMpKSB8fFxuICAgICAgKCFQYXJhbS5pc051bGxPclVuZGVmaW5lZChvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkKSAmJiAhQXJyYXkuaXNBcnJheShvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkKSlcbiAgICApXG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ29wdGlvbnMgcGFyYW1hdGVyIG11c3QgYmUgb2YgdHlwZSBFeHBvcnREYXRhT3B0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGlmIHRoZSBzaGVldCBuYW1lcyBhcmUgaW5jbHVkZWQgaW4gYW55IG9mIHRoZSBleHBvcnQgc2NlbmFyaW9zLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgYW4gYXJyYXkuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFNlbGVjdGlvblNoZWV0IGlmIHRoZXJlIGFyZSBhcnJheSBlbnRyaWVzIHRoYXQgZG9udCBleGlzdCBvciBpZiB0aGVyZSBpcyBtaXhpbmcgYmV0d2VlbiBzaGVldHMgZnJvbSB0aGUgZGFzaGJvYXJkIGFuZCBzaGVldCBmcm9tIHRoZSB3b3JrYm9vay5cbiAgICpcbiAgICogQHBhcmFtIHNoZWV0TmFtZXMgTGlzdCBvZiBzaGVldCBuYW1lcyBzZWxlY3RlZCBmb3IgZXhwb3J0aW5nLlxuICAgKiBAcGFyYW0gZXhwb3J0U2NlbmFyaW9zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IHNoZWV0IG5hbWUsIGV4cG9ydGFibGUgc2hlZXRzIGZyb20gdGhlIGRhc2hib2FyZCwgYW5kIGV4cG9ydGFibGUgc2hlZXRzIGZyb20gdGhlIHdvcmtib29rLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlTaGVldE5hbWVzRm9yUERGQW5kUFBUKHNoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sIGV4cG9ydFNjZW5hcmlvczogRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCk6IHZvaWQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzaGVldE5hbWVzKSkgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdzaGVldE5hbWVzIHBhcmFtZXRlciBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgaWYgKHNoZWV0TmFtZXMubGVuZ3RoID09PSAwKSB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3NoZWV0TmFtZXMgc2hvdWxkIG5vdCBiZSBlbXB0eScpO1xuXG4gICAgY29uc3QgaXNJbmNsdWRlZEluRGFzaGJvYXJkID0gc2hlZXROYW1lcy5ldmVyeSgoc2hlZXROYW1lOiBzdHJpbmcpID0+XG4gICAgICBleHBvcnRTY2VuYXJpb3MuZXhwb3J0YWJsZVNoZWV0TmFtZXNGcm9tRGFzaGJvYXJkLmluY2x1ZGVzKHNoZWV0TmFtZSksXG4gICAgKTtcbiAgICBpZiAoaXNJbmNsdWRlZEluRGFzaGJvYXJkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlzSW5jbHVkZWRJbldvcmtib29rID0gc2hlZXROYW1lcy5ldmVyeSgoc2hlZXROYW1lOiBzdHJpbmcpID0+XG4gICAgICBleHBvcnRTY2VuYXJpb3MuZXhwb3J0YWJsZVNoZWV0TmFtZXNGcm9tV29ya2Jvb2suaW5jbHVkZXMoc2hlZXROYW1lKSxcbiAgICApO1xuICAgIGlmIChpc0luY2x1ZGVkSW5Xb3JrYm9vaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpc0N1cnJlbnRTaGVldCA9IHNoZWV0TmFtZXMubGVuZ3RoID09PSAxICYmIHNoZWV0TmFtZXNbMF0gPT09IGV4cG9ydFNjZW5hcmlvcy5jdXJyZW50U2hlZXROYW1lO1xuICAgIGlmIChpc0N1cnJlbnRTaGVldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEV4cG9ydCByZXF1aXJlbWVudDogYWxsIHNoZWV0IG5hbWVzIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3Qgb2YgZXhwb3J0YWJsZSBzaGVldHMgaW4gdGhlIGRhc2hib2FyZCBvclxuICAgIC8vIGFsbCBzaGVldCBuYW1lcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mIGV4cG9ydGFibGUgc2hlZXRzIGluIHRoZSB3b3JrYm9vaywgb3IgdGhlIHNoZWV0IG5hbWUgaXMgdGhlIGN1cnJlbnQgc2hlZXRcbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uU2hlZXQsXG4gICAgICAnc2hlZXROYW1lcyBwYXJhbWV0ZXIgbXVzdCBoYXZlIGFsbCBpdHMgZW50cmllcyBiZSBleHBvcnRhYmxlIHNoZWV0IG5hbWVzIGZyb20gdGhlIGRhc2hib2FyZCBvciBhbGwgaXRzIGVudHJpZXMgYmUgZXhwb3J0YWJsZSBzaGVldCBuYW1lcyBmcm9tIHRoZSB3b3JrYm9vaycsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBvYmplY3QncyBwcm9wZXJ0aWVzLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgb2YgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgZXh0ZXJuYWwgdXNlci1mYWNpbmcgRXhwb3J0UERGT3B0aW9ucyBvYmplY3QgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBQREYgZmlsZSBmb3IgZXhwb3J0UERGQXN5bmMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUV4cG9ydFBERk9wdGlvbnMob3B0aW9uczogRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudmVyaWZ5RW51bVZhbHVlPFByaW50T3JpZW50YXRpb24+KG9wdGlvbnMub3JpZW50YXRpb24sIFByaW50T3JpZW50YXRpb24sICdQcmludE9yaWVudGF0aW9uJyk7XG4gICAgICB0aGlzLnZlcmlmeUVudW1WYWx1ZTxQcmludFBhZ2VTaXplPihvcHRpb25zLnBhZ2VTaXplLCBQcmludFBhZ2VTaXplLCAnUHJpbnRQYWdlU2l6ZScpO1xuICAgICAgdGhpcy52ZXJpZnlFbnVtVmFsdWU8UHJpbnRTY2FsaW5nPihvcHRpb25zLnNjYWxpbmcsIFByaW50U2NhbGluZywgJ1ByaW50U2NhbGluZycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdvcHRpb25zIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgRXhwb3J0UERGT3B0aW9ucycpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgRXhwb3J0TGF5b3V0T3B0aW9ucyxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIEZpdFBhZ2VzLFxuICBQYWdlT3JpZW50YXRpb24sXG4gIFBhZ2VTY2FsaW5nT3B0aW9uLFxuICBQYWdlU2l6ZU9wdGlvbixcbiAgU2NhbGVNb2RlLFxuICBTY2FsaW5nU2VsZWN0aW9uLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRXhwb3J0RGF0YU9wdGlvbnMsXG4gIEV4cG9ydFBERk9wdGlvbnMgYXMgRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zLFxuICBQcmludE9yaWVudGF0aW9uLFxuICBQcmludFBhZ2VTaXplLFxuICBQcmludFNjYWxpbmcsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIEhlbHBlciBtZXRob2RzIGZvciBFeHBvcnQgQVBJcy5cbiAqXG4gKiBAY2xhc3MgRXhwb3J0SGVscGVyc1xuICovXG5leHBvcnQgY2xhc3MgRXhwb3J0SGVscGVycyB7XG4gIHB1YmxpYyBzdGF0aWMgRGVmYXVsdERhdGFPcHRpb25zOiBFeHBvcnREYXRhT3B0aW9ucyA9IHtcbiAgICBpZ25vcmVBbGlhc2VzOiBmYWxzZSxcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogW10sXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBEZWZhdWx0UERGT3B0aW9uczogRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zID0ge1xuICAgIHNjYWxpbmc6IFByaW50U2NhbGluZy5BdXRvbWF0aWMsXG4gICAgcGFnZVNpemU6IFByaW50UGFnZVNpemUuTGV0dGVyLFxuICAgIG9yaWVudGF0aW9uOiBQcmludE9yaWVudGF0aW9uLlBvcnRyYWl0LFxuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIERlZmF1bHRMYXlvdXRPcHRpb25zOiBFeHBvcnRMYXlvdXRPcHRpb25zID0ge1xuICAgIGltYWdlSGVpZ2h0OiAwLFxuICAgIGltYWdlV2lkdGg6IDAsXG4gICAgcGFnZUZpdEhvcml6b250YWw6IDEsXG4gICAgcGFnZUZpdFZlcnRpY2FsOiAxLFxuICAgIHBhZ2VPcmllbnRhdGlvbk9wdGlvbjogUGFnZU9yaWVudGF0aW9uLlBvcnRyYWl0LFxuICAgIHBhZ2VTY2FsZU1vZGU6IFNjYWxlTW9kZS5TY2FsZUF1dG8sXG4gICAgcGFnZVNjYWxlUGVyY2VudDogMTAwLFxuICAgIHBhZ2VTaXplT3B0aW9uOiBQYWdlU2l6ZU9wdGlvbi5MZXR0ZXIsXG4gIH07XG5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIHRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zJyBwcm9wZXJ0aWVzIGJhc2VkIG9uIHRoZSBnaXZlbiBQREYgZXhwb3J0IGNvbmZpZ3VyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgY29uc3RydWN0IHRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zIGlkZW50aWNhbGx5IHRvIGhvdyB0aGUgJ0V4cG9ydCBQREYnIGRpYWxvZyBjb25zdHJ1Y3RzIHRoZSBFeHBvcnRQZGZPcHRpb25zUHJlc01vZGVsLlxuICAgKiBTZWUgdGhlIGhhbmRsZUV4cG9ydENsaWNrIG1ldGhvZCBpbiBAYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1wZGYtb3B0aW9ucy1kaWFsb2cgZm9yIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGludGVybmFsRXhwb3J0UGRmT3B0aW9ucyBUaGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsIHVzZWQgdG8gY29uZmlndXJlIHRoZSBvdXRwdXQgUERGIGZpbGUuXG4gICAqIEBwYXJhbSBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMgVGhlIGV4dGVybmFsIEV4cG9ydFBERk9wdGlvbnMgdXNlci1mYWNpbmcgb2JqZWN0IHBhc3NlZCB0byBleHBvcnRQREZBc3luYy5cbiAgICogQHBhcmFtIHNoZWV0TmFtZXMgVGhlIGxpc3Qgb2Ygc2hlZXRzIHNlbGVjdGVkIGZvciBleHBvcnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVwZGF0ZUludGVybmFsRXhwb3J0UERGT3B0aW9ucyhcbiAgICBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBzaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LFxuICApOiB2b2lkIHtcbiAgICBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMuY3VycmVudFNoZWV0ID0gc2hlZXROYW1lc1swXTtcbiAgICB0aGlzLnVwZGF0ZUV4cG9ydExheW91dE9wdGlvbnMoaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zLCBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMpO1xuICAgIHRoaXMudXBkYXRlU2hlZXRPcHRpb25zKGludGVybmFsRXhwb3J0UGRmT3B0aW9ucywgc2hlZXROYW1lcyk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCBmb3IgdXBkYXRlSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zLlxuICAgKiBNb2RpZmllcyB0aGUgZXhwb3J0TGF5b3V0T3B0aW9ucyBwcm9wZXJ0eSBvZiB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBiYXNlZCBvbiB0aGUgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucy5cbiAgICogU2VlIHRoZSBnZXRFeHBvcnRMYXlvdXRPcHRpb25zIG1ldGhvZCBpbiBAYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1wZGYtb3B0aW9ucy1kaWFsb2cgZm9yIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGludGVybmFsRXhwb3J0UGRmT3B0aW9ucyBUaGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsIHVzZWQgdG8gY29uZmlndXJlIHRoZSBvdXRwdXQgUERGIGZpbGUuXG4gICAqIEBwYXJhbSBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMgVGhlIGV4dGVybmFsIEV4cG9ydFBERk9wdGlvbnMgdXNlci1mYWNpbmcgb2JqZWN0IHBhc3NlZCB0byBleHBvcnRQREZBc3luYy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdXBkYXRlRXhwb3J0TGF5b3V0T3B0aW9ucyhcbiAgICBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZXhwb3J0TGF5b3V0T3B0aW9ucyA9IGludGVybmFsRXhwb3J0UGRmT3B0aW9ucy5leHBvcnRMYXlvdXRPcHRpb25zO1xuXG4gICAgLy8gc2V0dGluZyB0aGUgaW1hZ2UgaGVpZ2h0IGFuZCB3aWR0aCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzXG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5pbWFnZUhlaWdodCA9IHRoaXMuRGVmYXVsdExheW91dE9wdGlvbnMuaW1hZ2VIZWlnaHQ7XG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5pbWFnZVdpZHRoID0gdGhpcy5EZWZhdWx0TGF5b3V0T3B0aW9ucy5pbWFnZVdpZHRoO1xuXG4gICAgLy8gIHNldHRpbmcgdGhlIG9yaWVudGF0aW9uIHZhbHVlIGZvciB0aGUgZXhwb3J0TGF5b3V0T3B0aW9uc1xuICAgIHN3aXRjaCAoZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zLm9yaWVudGF0aW9uKSB7XG4gICAgICBjYXNlIFByaW50T3JpZW50YXRpb24uTGFuZHNjYXBlOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VPcmllbnRhdGlvbk9wdGlvbiA9IFBhZ2VPcmllbnRhdGlvbi5MYW5kc2NhcGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludE9yaWVudGF0aW9uLlBvcnRyYWl0OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VPcmllbnRhdGlvbk9wdGlvbiA9IFBhZ2VPcmllbnRhdGlvbi5Qb3J0cmFpdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2ludmFsaWQgb3JpZW50YXRpb24gZm9yIEV4cG9ydFBERk9wdGlvbicpO1xuICAgIH1cblxuICAgIC8vIHNldHRpbmcgdGhlIHBhZ2Ugc2l6ZSB2YWx1ZSBmb3IgdGhlIGV4cG9ydExheW91dE9wdGlvbnNcbiAgICBzd2l0Y2ggKGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucy5wYWdlU2l6ZSkge1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkEzOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQTM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkE0OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQTQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkE1OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQTU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkI0OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQjQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkI1OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQjU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkV4ZWN1dGl2ZTpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkV4ZWN1dGl2ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuRm9saW86XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5Gb2xpbztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuTGVkZ2VyOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uTGVkZ2VyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5MZWdhbDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkxlZ2FsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5MZXR0ZXI6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5MZXR0ZXI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLk5vdGU6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5Ob3RlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5RdWFydG86XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5RdWFydG87XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLlN0YXRlbWVudDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLlN0YXRlbWVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuVGFibG9pZDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLlRhYmxvaWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLlVuc3BlY2lmaWVkOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uVW5zcGVjaWZpZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdpbnZhbGlkIHBhZ2VTaXplIGZvciBFeHBvcnRQREZPcHRpb24nKTtcbiAgICB9XG5cbiAgICAvLyBzZXR0aW5nIHRoZSBzY2FsaW5nIHZhbHVlcyBmb3IgdGhlIGV4cG9ydExheW91dE9wdGlvbnNcbiAgICBzd2l0Y2ggKGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucy5zY2FsaW5nKSB7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5BdE1vc3QxUGFnZUhpZ2g6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgRml0UGFnZXMuRml0T25lSGlnaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuQXRNb3N0MVBhZ2VXaWRlOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIEZpdFBhZ2VzLkZpdE9uZVdpZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLkF0TW9zdDJQYWdlc0hpZ2g6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgRml0UGFnZXMuRml0VHdvSGlnaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuQXRNb3N0MlBhZ2VzV2lkZTpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBGaXRQYWdlcy5GaXRUd29XaWRlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5BdXRvbWF0aWM6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3RBdXRvKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjMTAwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0MTAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjMjAwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0MjAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjMjU6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3QyNSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzQwMDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDQwMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzUwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0NTApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLlBlcmM2MDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDYwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjNzU6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3Q3NSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzgwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0ODApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLlBlcmM5MDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDkwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2ludmFsaWQgc2NhbGluZyBmb3IgRXhwb3J0UERGT3B0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgZm9yIHVwZGF0ZUludGVybmFsRXhwb3J0UERGT3B0aW9ucy5cbiAgICogTW9kaWZpZXMgdGhlIHNoZWV0T3B0aW9ucyBwcm9wZXJ0eSBvZiB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBiYXNlZCBvbiB0aGUgc2hlZXRzIHNlbGVjdGVkIGZvciBleHBvcnQuXG4gICAqIFNlZSB0aGUgaGFuZGxlRXhwb3J0Q2xpY2sgbWV0aG9kIGluIEBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBkZi1vcHRpb25zLWRpYWxvZyBmb3IgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zIFRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zIHByZXMgbW9kZWwgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBQREYgZmlsZS5cbiAgICogQHBhcmFtIHNoZWV0TmFtZXMgVGhlIGxpc3Qgb2Ygc2hlZXRzIHNlbGVjdGVkIGZvciBleHBvcnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVwZGF0ZVNoZWV0T3B0aW9ucyhpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucywgc2hlZXROYW1lczogQXJyYXk8c3RyaW5nPik6IHZvaWQge1xuICAgIGNvbnN0IHsgZXhwb3J0TGF5b3V0T3B0aW9ucywgc2hlZXRPcHRpb25zIH0gPSBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM7XG4gICAgLy8gdXBkYXRpbmcgdGhlIGV4cG9ydCBsYXlvdXRzIG9wdGlvbnMgZm9yIGVhY2ggc2hlZXQgYW5kIHNlbGVjdGluZyBzaGVldCBmb3IgZXhwb3J0IGlmIGluY2x1ZGVkIGluIGxpc3RcbiAgICBmb3IgKGNvbnN0IHNoZWV0T3B0aW9uIG9mIHNoZWV0T3B0aW9ucykge1xuICAgICAgc2hlZXRPcHRpb24uZXhwb3J0TGF5b3V0T3B0aW9ucyA9IGV4cG9ydExheW91dE9wdGlvbnM7XG4gICAgICBzaGVldE9wdGlvbi5pc1NlbGVjdGVkID0gc2hlZXROYW1lcy5pbmNsdWRlcyhzaGVldE9wdGlvbi5zaGVldCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgZm9yIHVwZGF0ZUV4cG9ydExheW91dE9wdG9ucy5cbiAgICogVGhpcyBtZXRob2QgaXMgYSBzcG9vZiBvZiB0aGUgZ2V0Rml0QW5kU2NhbGVWYWx1ZXMgbWV0aG9kIHVzZWQgaW4gQGJyb3dzZXItY2xpZW50cy9leHBvcnQtcGRmLW9wdGlvbnMgdG8gc2V0IHRoZSBleHBvcnRMYXlvdXRPcHRpb25zJyBzY2FsaW5nIHByb3BlcnRpZXMuXG4gICAqIEluIHRoZSBmdXR1cmUsIHRoaXMgZmlsZSBzaG91bGQgYmUgcmVmYWN0b3JlZCB0byBpbXBvcnQgdGhlIG1ldGhvZCBkaXJlY3RseSBmcm9tIEBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBkZi1vcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gc2NhbGluZ1NlbGVjdGlvbiBzdHJpbmcgdXNlZCBmb3Igc2V0dGluZyB0aGUgZXhwb3J0TGF5b3V0T3B0aW9ucyBiYXNlZCBvbiB0aGUgUHJpbnRTY2FsaW5nIHByb3BlcnR5IGZyb20gdGhlIEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucy5cbiAgICogQHBhcmFtIGV4cG9ydExheW91dE9wdGlvbnMgdGhlIEV4cG9ydExheW91dE9wdGlvbnMgdXNlZCBieSB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zOiBFeHBvcnRMYXlvdXRPcHRpb25zLCBzY2FsaW5nU2VsZWN0aW9uOiBTY2FsaW5nU2VsZWN0aW9uKTogdm9pZCB7XG4gICAgbGV0IHsgcGFnZUZpdEhvcml6b250YWwsIHBhZ2VGaXRWZXJ0aWNhbCwgcGFnZVNjYWxlTW9kZSwgcGFnZVNjYWxlUGVyY2VudCB9ID0gdGhpcy5EZWZhdWx0TGF5b3V0T3B0aW9ucztcblxuICAgIGNvbnN0IGZpdE1hdGNoID0gdGhpcy5maXRSZWdleC5leGVjKHNjYWxpbmdTZWxlY3Rpb24pO1xuICAgIGNvbnN0IHBlcmNlbnRNYXRjaCA9IHRoaXMucGN0UmVnZXguZXhlYyhzY2FsaW5nU2VsZWN0aW9uKTtcblxuICAgIGlmIChmaXRNYXRjaCkge1xuICAgICAgW3BhZ2VGaXRIb3Jpem9udGFsLCBwYWdlRml0VmVydGljYWxdID0gZml0TWF0Y2guc2xpY2UoMSkubWFwKCh2YWx1ZSkgPT4gTnVtYmVyKHZhbHVlKSk7XG4gICAgICBwYWdlU2NhbGVNb2RlID0gU2NhbGVNb2RlLlNjYWxlRml0UGFnZXM7XG4gICAgfSBlbHNlIGlmIChwZXJjZW50TWF0Y2gpIHtcbiAgICAgIFtwYWdlU2NhbGVQZXJjZW50XSA9IHBlcmNlbnRNYXRjaC5zbGljZSgxKS5tYXAoKHZhbHVlKSA9PiBOdW1iZXIodmFsdWUpKTtcbiAgICAgIHBhZ2VTY2FsZU1vZGUgPSBTY2FsZU1vZGUuU2NhbGVQZXJjZW50YWdlO1xuICAgIH1cblxuICAgIC8vIGdldEZpdEFuZFNjYWxlVmFsdWVzIHJldHVybnMgdGhlIHByb3BlcnRpZXMgYmVsb3csIGJ1dCBpbnN0ZWFkIHRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZW0uXG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlRml0SG9yaXpvbnRhbCA9IHBhZ2VGaXRIb3Jpem9udGFsO1xuICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZUZpdFZlcnRpY2FsID0gcGFnZUZpdFZlcnRpY2FsO1xuICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNjYWxlTW9kZSA9IHBhZ2VTY2FsZU1vZGU7XG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2NhbGVQZXJjZW50ID0gcGFnZVNjYWxlUGVyY2VudDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGZpdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnZml0KFswLTldKyl4KFswLTldKyknKTtcbiAgcHJpdmF0ZSBzdGF0aWMgcGN0UmVnZXggPSBuZXcgUmVnRXhwKCdwY3QoWzAtOV0rKScpO1xufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi9FcnJvckhlbHBlcnMnO1xuXG5leHBvcnQgY2xhc3MgUGFyYW0ge1xuICAvKipcbiAgICogc2VyaWFsaXplcyB0aGUgZGF0ZSBpbnRvIHRoZSBmb3JtYXQgdGhhdCB0aGUgc2VydmVyIGV4cGVjdHMuXG4gICAqIEBwYXJhbSBkYXRlIHRoZSBkYXRlIHRvIHNlcmlhbGl6ZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVEYXRlRm9yUGxhdGZvcm0oZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgeWVhcjogbnVtYmVyID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1vbnRoOiBudW1iZXIgPSBkYXRlLmdldFVUQ01vbnRoKCkgKyAxO1xuICAgIGNvbnN0IGRheTogbnVtYmVyID0gZGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgY29uc3QgaGg6IG51bWJlciA9IGRhdGUuZ2V0VVRDSG91cnMoKTtcbiAgICBjb25zdCBtbTogbnVtYmVyID0gZGF0ZS5nZXRVVENNaW51dGVzKCk7XG4gICAgY29uc3Qgc2VjOiBudW1iZXIgPSBkYXRlLmdldFVUQ1NlY29uZHMoKTtcbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9ICR7aGh9OiR7bW19OiR7c2VjfWA7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZUJvb2xlYW5Gb3JQbGF0Zm9ybShib29sOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYm9vbCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZU51bWJlckZvclBsYXRmb3JtKG51bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbnVtLnRvU3RyaW5nKDEwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgaW5wdXQgaXMgYSBudW1iZXJcbiAgICovXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVOdW1iZXIoaW5wdXQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInIHx8IGlucHV0IGluc3RhbmNlb2YgTnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBpbnB1dCBpcyBhIERhdGVcbiAgICovXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVEYXRlKGlucHV0OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaW5wdXQgaW5zdGFuY2VvZiBEYXRlO1xuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIGlzVHlwZVN0cmluZyhpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHwgaW5wdXQgaW5zdGFuY2VvZiBTdHJpbmc7XG4gIH1cblxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55ICovXG4gIHB1YmxpYyBzdGF0aWMgaXNUeXBlQm9vbChpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ2Jvb2xlYW4nIHx8IGlucHV0IGluc3RhbmNlb2YgQm9vbGVhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBpbnB1dCBpcyBudWxsIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIGlzTnVsbE9yVW5kZWZpbmVkKGlucHV0OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoUGFyYW0uaXNUeXBlTnVtYmVyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFBhcmFtLnNlcmlhbGl6ZU51bWJlckZvclBsYXRmb3JtKHZhbHVlIGFzIG51bWJlcik7XG4gICAgfSBlbHNlIGlmIChQYXJhbS5pc1R5cGVEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFBhcmFtLnNlcmlhbGl6ZURhdGVGb3JQbGF0Zm9ybSh2YWx1ZSBhcyBEYXRlKTtcbiAgICB9IGVsc2UgaWYgKFBhcmFtLmlzVHlwZUJvb2wodmFsdWUpKSB7XG4gICAgICByZXR1cm4gUGFyYW0uc2VyaWFsaXplQm9vbGVhbkZvclBsYXRmb3JtKHZhbHVlIGFzIGJvb2xlYW4pO1xuICAgIH0gZWxzZSBpZiAoUGFyYW0uaXNUeXBlU3RyaW5nKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFVuZXhwZWN0ZWQgaW52YWxpZCB2YWx1ZSBmb3I6ICR7dmFsdWV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHBhcmFtZXRlciBpcyBhbHJlYWR5IGEgTWFwLCBvciBjb252ZXJ0cyBhbiBvYmplY3QgdG8gYSBNYXAuXG4gICAqIElmIHRoZSBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0LCB3ZSBjb252ZXJ0IGl0IHRvIGEgTWFwIHVzaW5nIE9iamVjdC5lbnRyaWVzLlxuICAgKiBAdGhyb3dzIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdCBvciBNYXBcbiAgICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0UGFyYW1ldGVyVG9NYXAocGFyYW06IG9iamVjdCwgcGFyYW1OYW1lOiBzdHJpbmcpOiBNYXA8YW55LCBhbnk+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyVHlwZShwYXJhbSwgJ29iamVjdCcsIHBhcmFtTmFtZSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW0pKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYEV4cGVjdGluZyBvYmplY3Qgb3IgTWFwIGZvcjogJHtwYXJhbU5hbWV9LmApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbSBpbnN0YW5jZW9mIE1hcCA/IHBhcmFtIDogbmV3IE1hcChPYmplY3QuZW50cmllcyhwYXJhbSkpO1xuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIHRyeVBhcnNlTnVtYmVyKHZhbHVlOiBhbnkpOiB7IHBhcnNlZD86IG51bWJlcjsgc3VjY2VzczogYm9vbGVhbiB9IHtcbiAgICBpZiAoUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmIChQYXJhbS5pc1R5cGVOdW1iZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBwYXJzZWQ6IHZhbHVlIGFzIG51bWJlciwgc3VjY2VzczogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlU3RyaW5nID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICBpZiAodmFsdWVTdHJpbmcgPT09ICdOYU4nKSB7XG4gICAgICAvLyAnTmFOJyBwYXJzZXMgYXMgTmFOIHdoaWNoIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYSBmYWlsZWQgcGFyc2UuXG4gICAgICByZXR1cm4geyBwYXJzZWQ6IE5hTiwgc3VjY2VzczogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmxvYXQodmFsdWVTdHJpbmcpO1xuICAgIGlmIChpc05hTihwYXJzZWQpKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHBhcnNlZCwgc3VjY2VzczogdHJ1ZSB9O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2hlZXRJbmZvLCBTaGVldFR5cGUsIFNpemVDb25zdHJhaW50IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5cbmV4cG9ydCBjbGFzcyBTaGVldFV0aWxzIHtcbiAgLy8gVGhpcyBpcyBhIGRpcmVjdCBwb3J0IGZyb20gU2hlZXRTaXplLmNzIC0gU2hlZXRTaXplRmFjdG9yeVxuICBwdWJsaWMgc3RhdGljIGdldFNoZWV0U2l6ZUZyb21TaXplQ29uc3RyYWludHMoc2l6ZUNvbnN0cmFpbnQ6IFNpemVDb25zdHJhaW50KTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBjb25zdCB7IG1pbldpZHRoLCBtaW5IZWlnaHQsIG1heFdpZHRoLCBtYXhIZWlnaHQgfSA9IHNpemVDb25zdHJhaW50O1xuXG4gICAgaWYgKG1pbkhlaWdodCA9PT0gMCAmJiBtaW5XaWR0aCA9PT0gMCkge1xuICAgICAgaWYgKG1heEhlaWdodCA9PT0gMCAmJiBtYXhXaWR0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGJlaGF2aW9yOiBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWMsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJlaGF2aW9yOiBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdE1vc3QsXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG1heFdpZHRoLCBoZWlnaHQ6IG1heEhlaWdodCB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAobWF4SGVpZ2h0ID09PSAwICYmIG1heFdpZHRoID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuQXRMZWFzdCxcbiAgICAgICAgbWluU2l6ZTogeyB3aWR0aDogbWluV2lkdGgsIGhlaWdodDogbWluSGVpZ2h0IH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChtYXhIZWlnaHQgPT09IG1pbkhlaWdodCAmJiBtYXhXaWR0aCA9PT0gbWluV2lkdGggJiYgbWluV2lkdGggPiAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuRXhhY3RseSxcbiAgICAgICAgbWluU2l6ZTogeyB3aWR0aDogbWluV2lkdGgsIGhlaWdodDogbWluSGVpZ2h0IH0sXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG1pbldpZHRoLCBoZWlnaHQ6IG1pbkhlaWdodCB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyAnRml0IFdpZHRoJyBmb3IgYSBEU0QgbGF5b3V0XG4gICAgY29uc3QgaXNEc2RMYXlvdXQgPSBtaW5XaWR0aCA9PT0gMCAmJiBtYXhXaWR0aCA9PT0gMDtcblxuICAgIHJldHVybiB7XG4gICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2UsXG4gICAgICBtaW5TaXplOiB7IHdpZHRoOiBtaW5XaWR0aCwgaGVpZ2h0OiBtaW5IZWlnaHQgfSxcbiAgICAgIG1heFNpemU6IHsgd2lkdGg6IGlzRHNkTGF5b3V0ID8gMjE0NzQ4MzY0NyA6IG1heFdpZHRoLCBoZWlnaHQ6IG1heEhlaWdodCB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUF1dG9tYXRpY1NpemUoKTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBsZXQgYmVoYXZpb3IgPSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWM7XG4gICAgbGV0IG1pblNpemUgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcbiAgICBsZXQgbWF4U2l6ZSA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplLCBtYXhTaXplIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFB1Ymxpc2hlZFNoZWV0SW5mb0J5TmFtZShuYW1lOiBzdHJpbmcsIHNoZWV0SW5mb3M6IEFycmF5PFNoZWV0SW5mbz4pOiBTaGVldEluZm8gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNoZWV0SW5mbyA9IHNoZWV0SW5mb3MuZmluZCgoc2hlZXQpID0+IHNoZWV0Lm5hbWUgPT09IG5hbWUpO1xuICAgIHJldHVybiBzaGVldEluZm87XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFNoZWV0VHlwZUVudW0oaW50ZXJuYWxTaGVldFR5cGU6IFNoZWV0VHlwZSk6IENvbnRyYWN0LlNoZWV0VHlwZSB7XG4gICAgbGV0IHNoZWV0VHlwZTogQ29udHJhY3QuU2hlZXRUeXBlO1xuICAgIHN3aXRjaCAoaW50ZXJuYWxTaGVldFR5cGUpIHtcbiAgICAgIGNhc2UgU2hlZXRUeXBlLldvcmtzaGVldDoge1xuICAgICAgICBzaGVldFR5cGUgPSBDb250cmFjdC5TaGVldFR5cGUuV29ya3NoZWV0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgU2hlZXRUeXBlLkRhc2hib2FyZDoge1xuICAgICAgICBzaGVldFR5cGUgPSBDb250cmFjdC5TaGVldFR5cGUuRGFzaGJvYXJkO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgU2hlZXRUeXBlLlN0b3J5OiB7XG4gICAgICAgIHNoZWV0VHlwZSA9IENvbnRyYWN0LlNoZWV0VHlwZS5TdG9yeTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5TZXJ2ZXJFcnJvciwgJ0ludmFsaWQgU2hlZXRUeXBlJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaGVldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzVmFsaWRTaGVldFNpemUoc2l6ZU9iamVjdDogQ29udHJhY3QuU2l6ZSB8IENvbnRyYWN0LlNoZWV0U2l6ZSk6IHNpemVPYmplY3QgaXMgQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICByZXR1cm4gKDxDb250cmFjdC5TaGVldFNpemU+c2l6ZU9iamVjdCkuYmVoYXZpb3IgIT09IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBEZWZlcnJlZCwgVW5yZWdpc3RlclRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9IGZyb20gJy4vRGVmZXJyZWQnO1xuXG4vKipcbiAqIEEgRGVmZXJyZWQgd3JhcHBlciBjbGFzcyBhZGRpbmcgZnVuY3Rpb25hbGl0eSB0byByZWplY3QgdW5yZXNwb25zaXZlIHByb21pc2VzIGFmdGVyIHRpbWVvdXRcbiAqXG4gKiB0aGlzIGNsYXNzIGhhbmRsZXMgdHdvIHRoaW5nczpcblxuICogICAgMS4gQWRkcyB0aW1lb3V0IGxvZ2ljIGZvciBkZWZlcnJlZFxuICogICAgMi4gSXQgYmxvY2tzIG11bHRpcGxlIGNhbGxzIGZyb20gZXhlY3V0aW5nIGF0IHRoZSBzYW1lIHRpbWUuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFNob3J0TGl2ZWREZWZlcnJlZFxuICogQHRlbXBsYXRlIFRSZXNvbHZlIFRoZSB0eXBlIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZS5cbiAqIEB0ZW1wbGF0ZSBUUmVqZWN0IFRoZSB0eXBlIHVzZWQgdG8gcmVqZWN0IHRoZSBwcm9taXNlLiBEZWZhdWx0cyB0byBhbnkuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgU2hvcnRMaXZlZERlZmVycmVkPFRSZXNvbHZlLCBUUmVqZWN0ID0gYW55PiB7XG4gIHByaXZhdGUgX2RlZmVycmVkOiBEZWZlcnJlZDxUUmVzb2x2ZSwgVFJlamVjdD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3RpbWVvdXRJZDtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfdGltZW91dEluTWlsbGlzZWNvbmRzID0gVW5yZWdpc3RlclRpbWVvdXRJbk1pbGxpc2Vjb25kcykge31cblxuICBwdWJsaWMgZ2V0TmV3UHJvbWlzZU9yVGhyb3dJZkJ1c3koKTogUHJvbWlzZTxUUmVzb2x2ZT4ge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkFwaUV4ZWN1dGlvbkVycm9yLCAnVGhpcyBhcGkgY2Fubm90IGJlIGV4ZWN1dGVkIHRpbGwgcHJldmlvdXMgY2FsbCBpcyByZXNvbHZlZC4nKTtcbiAgICB9XG4gICAgdGhpcy5fZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTtcblxuICAgIHRoaXMuX3RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLlRpbWVvdXQsXG4gICAgICAgIGBBcGkgZmFpbGVkIHRvIGNvbXBsZXRlIGluICR7dGhpcy5fdGltZW91dEluTWlsbGlzZWNvbmRzIC8gMTAwMH0gc2Vjb25kc2AsXG4gICAgICApO1xuICAgICAgdGhpcy5yZWplY3QoZXJyb3IpO1xuICAgIH0sIHRoaXMuX3RpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG5cbiAgICByZXR1cm4gdGhpcy5fZGVmZXJyZWQucHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlKHJlc3BvbnNlOiBUUmVzb2x2ZSB8IFByb21pc2VMaWtlPFRSZXNvbHZlPik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZCk7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgIHRoaXMuX2RlZmVycmVkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWplY3QoZXJyb3I6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZCk7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xuICAgICAgdGhpcy5fZGVmZXJyZWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXJDb250cmFjdCB9IGZyb20gJy4vVmVyc2lvbk51bWJlckNvbnRyYWN0JztcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGV4dGVuc2lvbnMsIGVtYmVkZGluZ1xuICogYW5kIGV4dGVuc2lvbnMtYXBpLXR5cGVzIGxpYnJhcnlcbiAqL1xuZXhwb3J0IGNsYXNzIFZlcnNpb25OdW1iZXIgaW1wbGVtZW50cyBWZXJzaW9uTnVtYmVyQ29udHJhY3Qge1xuICBwdWJsaWMgbWFqb3I6IG51bWJlcjtcbiAgcHVibGljIG1pbm9yOiBudW1iZXI7XG4gIHB1YmxpYyBmaXg6IG51bWJlcjtcbiAgcHVibGljIGJ1aWxkOiBudW1iZXI7XG4gIHB1YmxpYyBpc0FscGhhOiBib29sZWFuO1xuXG4gIC8vIHByaXZhdGUgY29uc3RydWN0b3Igc28gZXZlcnlvbmUgdXNlcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gIC8vIGJ1aWxkIG51bWJlcnMgaGF2ZSB0aGlzIGZvcm06IE0ubS5mLXByZS5OXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih2ZXJzaW9uU3RyaW5nOiBzdHJpbmcsIGlzQWxwaGE6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBwYXJ0U3RyID0gdmVyc2lvblN0cmluZy5zcGxpdCgnLScpO1xuICAgIHRoaXMuYnVpbGQgPSB0aGlzLmdldEJ1aWxkTnVtYmVyKHBhcnRTdHJbMV0pO1xuICAgIHZlcnNpb25TdHJpbmcgPSBwYXJ0U3RyWzBdO1xuXG4gICAgY29uc3QgcGFydHMgPSB2ZXJzaW9uU3RyaW5nLnNwbGl0KCcuJykubWFwKChwKSA9PiBwYXJzZUludChwLCAxMCkpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgSW52YWxpZCB2ZXJzaW9uIG51bWJlcjogJHt2ZXJzaW9uU3RyaW5nfWApO1xuICAgIH1cblxuICAgIHRoaXMubWFqb3IgPSBwYXJ0c1swXTtcbiAgICB0aGlzLm1pbm9yID0gcGFydHNbMV07XG4gICAgdGhpcy5maXggPSBwYXJ0c1syXTtcbiAgICB0aGlzLmlzQWxwaGEgPSBpc0FscGhhO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCdWlsZE51bWJlcihwcmVSZWxlYXNlU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IG5vQnVpbGROdW1iZXIgPSAtMTtcbiAgICBpZiAoIXByZVJlbGVhc2VTdHJpbmcpIHtcbiAgICAgIHJldHVybiBub0J1aWxkTnVtYmVyO1xuICAgIH1cblxuICAgIC8vIFRoZSBwcmVSZWxlYXNlIHN0cmluZyBoYXMgdGhpcyBmb3JtOiBwcmUuTiwgYnV0IHdlIGRvbid0IGRlcGVuZCBvbiB0aGUgYWN0dWFsIHN0cmluZyBiZWluZyAncHJlJ1xuICAgIGNvbnN0IHBhcnRTdHIgPSBwcmVSZWxlYXNlU3RyaW5nLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIHBhcnRTdHJbMV0gPyBwYXJzZUludChwYXJ0U3RyWzFdLCAxMCkgOiBub0J1aWxkTnVtYmVyO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JtYXR0ZWRWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLm1ham9yfS4ke3RoaXMubWlub3J9LiR7dGhpcy5maXh9YDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZnVsbEZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMubWFqb3J9LiR7dGhpcy5taW5vcn0uJHt0aGlzLmZpeH0tcHJlLiR7dGhpcy5idWlsZH1gO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXhlY3V0ZVJlc3BvbnNlLFxuICBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcixcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLFxuICBOb3RpZmljYXRpb24sXG4gIE5vdGlmaWNhdGlvbkhhbmRsZXIsXG4gIFZlcmJJZCxcbiAgVmVyc2lvbkxlc3NUaGFuLFxuICBWZXJzaW9uTnVtYmVyLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBJbnRlcm5hbEFwaURpc3BhdGNoZXIgd2hpY2ggc3VwcG9ydHMgdXBncmFkaW5nIGFuZCBkb3duZ3JhZGluZyB0aGUgaW5wdXRcbiAqIGludGVybmFsIGNvbnRyYWN0IHRvIHRoZSB2ZXJzaW9uIHRoYXQgdGhpcyBtb2R1bGUgaXMgYnVpbHQgYWdhaW5zdFxuICpcbiAqIEBjbGFzcyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXJcbiAqIEBpbXBsZW1lbnRzIHtJbnRlcm5hbEFwaURpc3BhdGNoZXJ9XG4gKi9cbmV4cG9ydCBjbGFzcyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgaW1wbGVtZW50cyBJbnRlcm5hbEFwaURpc3BhdGNoZXIge1xuICBwcml2YXRlIF92ZXJzaW9uQ29udmVydGVyOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcjtcbiAgcHJpdmF0ZSBfbm90aWZpY2F0aW9uSGFuZGxlcnM6IEFycmF5PE5vdGlmaWNhdGlvbkhhbmRsZXI+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXJcbiAgICogV2UgaGF2ZSBtdWx0aXBsZSB2ZXJzaW9uIGNvbnZlcnRpbmcgZGlzcGF0Y2hlcnMgdGhhdCB3b3JrIHRvZ2V0aGVyLlxuICAgKiBJZiBuZWVkZWQsIHRoZSBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgd3JhcHMgZWl0aGVyIHRoZSBJbnRlcm5hbEFwaURpc3BhdGNoZXIgKGRlc2t0b3ApXG4gICAqIG9yIHRoZSBDcm9zc0ZyYW1lRGlzcGF0Y2hlciAoc2VydmVyKS5cbiAgICogVGhlIEludGVybmFsL0Nyb3NzRnJhbWUgZGlzcGF0Y2hlcnMgaGFuZGxlIGFuIHVwZGF0ZWQgcGxhdGZvcm0gd2l0aCBhbiBvbGRlciBleHRlcm5hbCBsaWJyYXJ5LlxuICAgKiAoVGhlIENyb3NzRnJhbWVEaXNwYXRjaGVyIHNlbmRzIG1lc3NhZ2VzIGFjcm9zcyB0aGUgZnJhbWUsIGFuZCBpdCBpcyBoYW5kbGVkIGJ5IHRoZSBQcmVzTGF5ZXJIYW5kbGVyLilcbiAgICogTWVhbndoaWxlLCB0aGUgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyIGhhbmRsZXMgYW4gdXBkYXRlZCBleHRlcm5hbCBsaWJyYXJ5IHdpdGggYW4gb2xkZXIgcGxhdGZvcm0uXG5cbiAgICogQHBhcmFtIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXIgVGhlIGRlbGVnYXRlIHRoYXQgZG9lcyB0aGUgYWN0dWFsIHdvcmsuXG4gICAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb25OdW1iZXIgVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHdoaWNoIHRoZSBwbGF0Zm9ybSBtb2R1bGUgaXMgdXNpbmcuXG4gICAqIFRoaXMgbnVtYmVyIHdpbGwgYmUgdXNlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBkb3duZ3JhZGUgaW5jb21pbmcgY29tbWFuZHMgYW5kIHVwZ3JhZGUgdGhlIHJlc3VsdHNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgcGxhdGZvcm1WZXJzaW9uTnVtYmVyOiBWZXJzaW9uTnVtYmVyKSB7XG4gICAgdGhpcy5fdmVyc2lvbkNvbnZlcnRlciA9IENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXIoSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiwgcGxhdGZvcm1WZXJzaW9uTnVtYmVyKTtcblxuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzID0gW107XG4gICAgX2FwaURlbGVnYXRlRGlzcGF0Y2hlci5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCA9PiB7XG4gICAgICBpZiAodGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZ3JhZGVkTm90aWZpY2F0aW9uID0gdGhpcy5fdmVyc2lvbkNvbnZlcnRlci51cGdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7XG4gICAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgIGhhbmRsZXIodXBncmFkZWROb3RpZmljYXRpb24pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIG5lZWRzVmVyc2lvbkNvbnZlcnRlcihwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIpOiBib29sZWFuIHtcbiAgICAvLyBJZiBvdXIgcGxhdGZvcm0gaXMgbGVzcyB0aGFuIGV4dGVybmFsIGxpYnJhcnkgdmVyc2lvbiwgdGhlbiB3ZSBuZWVkIGEgY29udmVydGVyXG4gICAgcmV0dXJuIFZlcnNpb25MZXNzVGhhbihwbGF0Zm9ybVZlcnNpb24sIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04pO1xuICB9XG5cbiAgcHVibGljIGV4ZWN1dGUodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRvd25ncmFkZVBhcmFtZXRlcnMgPSB0aGlzLl92ZXJzaW9uQ29udmVydGVyLmRvd25ncmFkZUV4ZWN1dGVDYWxsKHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgICAgcmV0dXJuIHRoaXMuX2FwaURlbGVnYXRlRGlzcGF0Y2hlci5leGVjdXRlKGRvd25ncmFkZVBhcmFtZXRlcnMudmVyYiwgZG93bmdyYWRlUGFyYW1ldGVycy5wYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCB1cGdyYWRlUmVzcG9uc2UgPSB0aGlzLl92ZXJzaW9uQ29udmVydGVyLnVwZ3JhZGVFeGVjdXRlUmV0dXJuKHJlc3BvbnNlLCB2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgcmV0dXJuIHVwZ3JhZGVSZXNwb25zZTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKGhhbmRsZXI6IE5vdGlmaWNhdGlvbkhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xuICB9XG5cbiAgcHVibGljIHVucmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKGhhbmRsZXI6IE5vdGlmaWNhdGlvbkhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycyA9IHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLmZpbHRlcigoaCkgPT4gaCAhPT0gaGFuZGxlcik7XG4gIH1cbn1cbiIsImV4cG9ydCB7IGRlZmF1bHQgYXMgdjEgfSBmcm9tICcuL3YxLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjMgfSBmcm9tICcuL3YzLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjQgfSBmcm9tICcuL3Y0LmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjUgfSBmcm9tICcuL3Y1LmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTklMIH0gZnJvbSAnLi9uaWwuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdmFsaWRhdGUgfSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc3RyaW5naWZ5IH0gZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJzZSB9IGZyb20gJy4vcGFyc2UuanMnOyIsIi8qXG4gKiBCcm93c2VyLWNvbXBhdGlibGUgSmF2YVNjcmlwdCBNRDVcbiAqXG4gKiBNb2RpZmljYXRpb24gb2YgSmF2YVNjcmlwdCBNRDVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL0phdmFTY3JpcHQtTUQ1XG4gKlxuICogQ29weXJpZ2h0IDIwMTEsIFNlYmFzdGlhbiBUc2NoYW5cbiAqIGh0dHBzOi8vYmx1ZWltcC5uZXRcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxuICpcbiAqIEJhc2VkIG9uXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlXG4gKiBEaWdlc3QgQWxnb3JpdGhtLCBhcyBkZWZpbmVkIGluIFJGQyAxMzIxLlxuICogVmVyc2lvbiAyLjIgQ29weXJpZ2h0IChDKSBQYXVsIEpvaG5zdG9uIDE5OTkgLSAyMDA5XG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2VcbiAqIFNlZSBodHRwOi8vcGFqaG9tZS5vcmcudWsvY3J5cHQvbWQ1IGZvciBtb3JlIGluZm8uXG4gKi9cbmZ1bmN0aW9uIG1kNShieXRlcykge1xuICBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgIHZhciBtc2cgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoYnl0ZXMpKTsgLy8gVVRGOCBlc2NhcGVcblxuICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobXNnLmxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7ICsraSkge1xuICAgICAgYnl0ZXNbaV0gPSBtc2cuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWQ1VG9IZXhFbmNvZGVkQXJyYXkod29yZHNUb01kNShieXRlc1RvV29yZHMoYnl0ZXMpLCBieXRlcy5sZW5ndGggKiA4KSk7XG59XG4vKlxuICogQ29udmVydCBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzIHRvIGFuIGFycmF5IG9mIGJ5dGVzXG4gKi9cblxuXG5mdW5jdGlvbiBtZDVUb0hleEVuY29kZWRBcnJheShpbnB1dCkge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIHZhciBsZW5ndGgzMiA9IGlucHV0Lmxlbmd0aCAqIDMyO1xuICB2YXIgaGV4VGFiID0gJzAxMjM0NTY3ODlhYmNkZWYnO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoMzI7IGkgKz0gOCkge1xuICAgIHZhciB4ID0gaW5wdXRbaSA+PiA1XSA+Pj4gaSAlIDMyICYgMHhmZjtcbiAgICB2YXIgaGV4ID0gcGFyc2VJbnQoaGV4VGFiLmNoYXJBdCh4ID4+PiA0ICYgMHgwZikgKyBoZXhUYWIuY2hhckF0KHggJiAweDBmKSwgMTYpO1xuICAgIG91dHB1dC5wdXNoKGhleCk7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGUgb3V0cHV0IGxlbmd0aCB3aXRoIHBhZGRpbmcgYW5kIGJpdCBsZW5ndGhcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aDgpIHtcbiAgcmV0dXJuIChpbnB1dExlbmd0aDggKyA2NCA+Pj4gOSA8PCA0KSArIDE0ICsgMTtcbn1cbi8qXG4gKiBDYWxjdWxhdGUgdGhlIE1ENSBvZiBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzLCBhbmQgYSBiaXQgbGVuZ3RoLlxuICovXG5cblxuZnVuY3Rpb24gd29yZHNUb01kNSh4LCBsZW4pIHtcbiAgLyogYXBwZW5kIHBhZGRpbmcgKi9cbiAgeFtsZW4gPj4gNV0gfD0gMHg4MCA8PCBsZW4gJSAzMjtcbiAgeFtnZXRPdXRwdXRMZW5ndGgobGVuKSAtIDFdID0gbGVuO1xuICB2YXIgYSA9IDE3MzI1ODQxOTM7XG4gIHZhciBiID0gLTI3MTczMzg3OTtcbiAgdmFyIGMgPSAtMTczMjU4NDE5NDtcbiAgdmFyIGQgPSAyNzE3MzM4Nzg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSArPSAxNikge1xuICAgIHZhciBvbGRhID0gYTtcbiAgICB2YXIgb2xkYiA9IGI7XG4gICAgdmFyIG9sZGMgPSBjO1xuICAgIHZhciBvbGRkID0gZDtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpXSwgNywgLTY4MDg3NjkzNik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDFdLCAxMiwgLTM4OTU2NDU4Nik7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNywgNjA2MTA1ODE5KTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgM10sIDIyLCAtMTA0NDUyNTMzMCk7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA3LCAtMTc2NDE4ODk3KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgNV0sIDEyLCAxMjAwMDgwNDI2KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgNl0sIDE3LCAtMTQ3MzIzMTM0MSk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDddLCAyMiwgLTQ1NzA1OTgzKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgOF0sIDcsIDE3NzAwMzU0MTYpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyA5XSwgMTIsIC0xOTU4NDE0NDE3KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNywgLTQyMDYzKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgMTFdLCAyMiwgLTE5OTA0MDQxNjIpO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDcsIDE4MDQ2MDM2ODIpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyAxM10sIDEyLCAtNDAzNDExMDEpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAxNF0sIDE3LCAtMTUwMjAwMjI5MCk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDE1XSwgMjIsIDEyMzY1MzUzMjkpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNSwgLTE2NTc5NjUxMCk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDZdLCA5LCAtMTA2OTUwMTYzMik7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDExXSwgMTQsIDY0MzcxNzcxMyk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaV0sIDIwLCAtMzczODk3MzAyKTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgNV0sIDUsIC03MDE1NTg2OTEpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAxMF0sIDksIDM4MDE2MDgzKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgMTVdLCAxNCwgLTY2MDQ3ODMzNSk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDRdLCAyMCwgLTQwNTUzNzg0OCk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDldLCA1LCA1Njg0NDY0MzgpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAxNF0sIDksIC0xMDE5ODAzNjkwKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgM10sIDE0LCAtMTg3MzYzOTYxKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgOF0sIDIwLCAxMTYzNTMxNTAxKTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgMTNdLCA1LCAtMTQ0NDY4MTQ2Nyk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDJdLCA5LCAtNTE0MDM3ODQpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTQsIDE3MzUzMjg0NzMpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyAxMl0sIDIwLCAtMTkyNjYwNzczNCk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDVdLCA0LCAtMzc4NTU4KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgOF0sIDExLCAtMjAyMjU3NDQ2Myk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDExXSwgMTYsIDE4MzkwMzA1NjIpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAxNF0sIDIzLCAtMzUzMDk1NTYpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNCwgLTE1MzA5OTIwNjApO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyA0XSwgMTEsIDEyNzI4OTMzNTMpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTYsIC0xNTU0OTc2MzIpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAxMF0sIDIzLCAtMTA5NDczMDY0MCk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDEzXSwgNCwgNjgxMjc5MTc0KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpXSwgMTEsIC0zNTg1MzcyMjIpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTYsIC03MjI1MjE5NzkpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyA2XSwgMjMsIDc2MDI5MTg5KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgOV0sIDQsIC02NDAzNjQ0ODcpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyAxMl0sIDExLCAtNDIxODE1ODM1KTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgMTVdLCAxNiwgNTMwNzQyNTIwKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMl0sIDIzLCAtOTk1MzM4NjUxKTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpXSwgNiwgLTE5ODYzMDg0NCk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDddLCAxMCwgMTEyNjg5MTQxNSk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTUsIC0xNDE2MzU0OTA1KTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgNV0sIDIxLCAtNTc0MzQwNTUpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDYsIDE3MDA0ODU1NzEpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAzXSwgMTAsIC0xODk0OTg2NjA2KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNSwgLTEwNTE1MjMpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyAxXSwgMjEsIC0yMDU0OTIyNzk5KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgOF0sIDYsIDE4NzMzMTMzNTkpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAxNV0sIDEwLCAtMzA2MTE3NDQpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTUsIC0xNTYwMTk4MzgwKTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgMTNdLCAyMSwgMTMwOTE1MTY0OSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA2LCAtMTQ1NTIzMDcwKTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgMTFdLCAxMCwgLTExMjAyMTAzNzkpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAyXSwgMTUsIDcxODc4NzI1OSk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDldLCAyMSwgLTM0MzQ4NTU1MSk7XG4gICAgYSA9IHNhZmVBZGQoYSwgb2xkYSk7XG4gICAgYiA9IHNhZmVBZGQoYiwgb2xkYik7XG4gICAgYyA9IHNhZmVBZGQoYywgb2xkYyk7XG4gICAgZCA9IHNhZmVBZGQoZCwgb2xkZCk7XG4gIH1cblxuICByZXR1cm4gW2EsIGIsIGMsIGRdO1xufVxuLypcbiAqIENvbnZlcnQgYW4gYXJyYXkgYnl0ZXMgdG8gYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3Jkc1xuICogQ2hhcmFjdGVycyA+MjU1IGhhdmUgdGhlaXIgaGlnaC1ieXRlIHNpbGVudGx5IGlnbm9yZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBieXRlc1RvV29yZHMoaW5wdXQpIHtcbiAgaWYgKGlucHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHZhciBsZW5ndGg4ID0gaW5wdXQubGVuZ3RoICogODtcbiAgdmFyIG91dHB1dCA9IG5ldyBVaW50MzJBcnJheShnZXRPdXRwdXRMZW5ndGgobGVuZ3RoOCkpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoODsgaSArPSA4KSB7XG4gICAgb3V0cHV0W2kgPj4gNV0gfD0gKGlucHV0W2kgLyA4XSAmIDB4ZmYpIDw8IGkgJSAzMjtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG4vKlxuICogQWRkIGludGVnZXJzLCB3cmFwcGluZyBhdCAyXjMyLiBUaGlzIHVzZXMgMTYtYml0IG9wZXJhdGlvbnMgaW50ZXJuYWxseVxuICogdG8gd29yayBhcm91bmQgYnVncyBpbiBzb21lIEpTIGludGVycHJldGVycy5cbiAqL1xuXG5cbmZ1bmN0aW9uIHNhZmVBZGQoeCwgeSkge1xuICB2YXIgbHN3ID0gKHggJiAweGZmZmYpICsgKHkgJiAweGZmZmYpO1xuICB2YXIgbXN3ID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGxzdyA+PiAxNik7XG4gIHJldHVybiBtc3cgPDwgMTYgfCBsc3cgJiAweGZmZmY7XG59XG4vKlxuICogQml0d2lzZSByb3RhdGUgYSAzMi1iaXQgbnVtYmVyIHRvIHRoZSBsZWZ0LlxuICovXG5cblxuZnVuY3Rpb24gYml0Um90YXRlTGVmdChudW0sIGNudCkge1xuICByZXR1cm4gbnVtIDw8IGNudCB8IG51bSA+Pj4gMzIgLSBjbnQ7XG59XG4vKlxuICogVGhlc2UgZnVuY3Rpb25zIGltcGxlbWVudCB0aGUgZm91ciBiYXNpYyBvcGVyYXRpb25zIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIG1kNWNtbihxLCBhLCBiLCB4LCBzLCB0KSB7XG4gIHJldHVybiBzYWZlQWRkKGJpdFJvdGF0ZUxlZnQoc2FmZUFkZChzYWZlQWRkKGEsIHEpLCBzYWZlQWRkKHgsIHQpKSwgcyksIGIpO1xufVxuXG5mdW5jdGlvbiBtZDVmZihhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiAmIGMgfCB+YiAmIGQsIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5mdW5jdGlvbiBtZDVnZyhhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiAmIGQgfCBjICYgfmQsIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5mdW5jdGlvbiBtZDVoaChhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiBeIGMgXiBkLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZnVuY3Rpb24gbWQ1aWkoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGMgXiAoYiB8IH5kKSwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1kNTsiLCJleHBvcnQgZGVmYXVsdCAnMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwJzsiLCJpbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmZ1bmN0aW9uIHBhcnNlKHV1aWQpIHtcbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBVVUlEJyk7XG4gIH1cblxuICB2YXIgdjtcbiAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDE2KTsgLy8gUGFyc2UgIyMjIyMjIyMtLi4uLi0uLi4uLS4uLi4tLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDAsIDgpLCAxNikpID4+PiAyNDtcbiAgYXJyWzFdID0gdiA+Pj4gMTYgJiAweGZmO1xuICBhcnJbMl0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzNdID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLSMjIyMtLi4uLi0uLi4uLS4uLi4uLi4uLi4uLlxuXG4gIGFycls0XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSg5LCAxMyksIDE2KSkgPj4+IDg7XG4gIGFycls1XSA9IHYgJiAweGZmOyAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLSMjIyMtLi4uLi0uLi4uLi4uLi4uLi5cblxuICBhcnJbNl0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMTQsIDE4KSwgMTYpKSA+Pj4gODtcbiAgYXJyWzddID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tLi4uLi0jIyMjLS4uLi4uLi4uLi4uLlxuXG4gIGFycls4XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxOSwgMjMpLCAxNikpID4+PiA4O1xuICBhcnJbOV0gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0uLi4uLS4uLi4tIyMjIyMjIyMjIyMjXG4gIC8vIChVc2UgXCIvXCIgdG8gYXZvaWQgMzItYml0IHRydW5jYXRpb24gd2hlbiBiaXQtc2hpZnRpbmcgaGlnaC1vcmRlciBieXRlcylcblxuICBhcnJbMTBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDI0LCAzNiksIDE2KSkgLyAweDEwMDAwMDAwMDAwICYgMHhmZjtcbiAgYXJyWzExXSA9IHYgLyAweDEwMDAwMDAwMCAmIDB4ZmY7XG4gIGFyclsxMl0gPSB2ID4+PiAyNCAmIDB4ZmY7XG4gIGFyclsxM10gPSB2ID4+PiAxNiAmIDB4ZmY7XG4gIGFyclsxNF0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzE1XSA9IHYgJiAweGZmO1xuICByZXR1cm4gYXJyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBwYXJzZTsiLCJleHBvcnQgZGVmYXVsdCAvXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7IiwiLy8gVW5pcXVlIElEIGNyZWF0aW9uIHJlcXVpcmVzIGEgaGlnaCBxdWFsaXR5IHJhbmRvbSAjIGdlbmVyYXRvci4gSW4gdGhlIGJyb3dzZXIgd2UgdGhlcmVmb3JlXG4vLyByZXF1aXJlIHRoZSBjcnlwdG8gQVBJIGFuZCBkbyBub3Qgc3VwcG9ydCBidWlsdC1pbiBmYWxsYmFjayB0byBsb3dlciBxdWFsaXR5IHJhbmRvbSBudW1iZXJcbi8vIGdlbmVyYXRvcnMgKGxpa2UgTWF0aC5yYW5kb20oKSkuXG52YXIgZ2V0UmFuZG9tVmFsdWVzO1xudmFyIHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm5nKCkge1xuICAvLyBsYXp5IGxvYWQgc28gdGhhdCBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIHBvbHlmaWxsIGhhdmUgYSBjaGFuY2UgdG8gZG8gc29cbiAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBnZXRSYW5kb21WYWx1ZXMgbmVlZHMgdG8gYmUgaW52b2tlZCBpbiBhIGNvbnRleHQgd2hlcmUgXCJ0aGlzXCIgaXMgYSBDcnlwdG8gaW1wbGVtZW50YXRpb24uIEFsc28sXG4gICAgLy8gZmluZCB0aGUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgY3J5cHRvIChtc0NyeXB0bykgb24gSUUxMS5cbiAgICBnZXRSYW5kb21WYWx1ZXMgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pIHx8IHR5cGVvZiBtc0NyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byk7XG5cbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsIi8vIEFkYXB0ZWQgZnJvbSBDaHJpcyBWZW5lc3MnIFNIQTEgY29kZSBhdFxuLy8gaHR0cDovL3d3dy5tb3ZhYmxlLXR5cGUuY28udWsvc2NyaXB0cy9zaGExLmh0bWxcbmZ1bmN0aW9uIGYocywgeCwgeSwgeikge1xuICBzd2l0Y2ggKHMpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4geCAmIHkgXiB+eCAmIHo7XG5cbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4geCBeIHkgXiB6O1xuXG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHggJiB5IF4geCAmIHogXiB5ICYgejtcblxuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiB4IF4geSBeIHo7XG4gIH1cbn1cblxuZnVuY3Rpb24gUk9UTCh4LCBuKSB7XG4gIHJldHVybiB4IDw8IG4gfCB4ID4+PiAzMiAtIG47XG59XG5cbmZ1bmN0aW9uIHNoYTEoYnl0ZXMpIHtcbiAgdmFyIEsgPSBbMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNl07XG4gIHZhciBIID0gWzB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjBdO1xuXG4gIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG1zZyA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChieXRlcykpOyAvLyBVVEY4IGVzY2FwZVxuXG4gICAgYnl0ZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgKytpKSB7XG4gICAgICBieXRlcy5wdXNoKG1zZy5jaGFyQ29kZUF0KGkpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoYnl0ZXMpKSB7XG4gICAgLy8gQ29udmVydCBBcnJheS1saWtlIHRvIEFycmF5XG4gICAgYnl0ZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChieXRlcyk7XG4gIH1cblxuICBieXRlcy5wdXNoKDB4ODApO1xuICB2YXIgbCA9IGJ5dGVzLmxlbmd0aCAvIDQgKyAyO1xuICB2YXIgTiA9IE1hdGguY2VpbChsIC8gMTYpO1xuICB2YXIgTSA9IG5ldyBBcnJheShOKTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgTjsgKytfaSkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDMyQXJyYXkoMTYpO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICBhcnJbal0gPSBieXRlc1tfaSAqIDY0ICsgaiAqIDRdIDw8IDI0IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgMV0gPDwgMTYgfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAyXSA8PCA4IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgM107XG4gICAgfVxuXG4gICAgTVtfaV0gPSBhcnI7XG4gIH1cblxuICBNW04gLSAxXVsxNF0gPSAoYnl0ZXMubGVuZ3RoIC0gMSkgKiA4IC8gTWF0aC5wb3coMiwgMzIpO1xuICBNW04gLSAxXVsxNF0gPSBNYXRoLmZsb29yKE1bTiAtIDFdWzE0XSk7XG4gIE1bTiAtIDFdWzE1XSA9IChieXRlcy5sZW5ndGggLSAxKSAqIDggJiAweGZmZmZmZmZmO1xuXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IE47ICsrX2kyKSB7XG4gICAgdmFyIFcgPSBuZXcgVWludDMyQXJyYXkoODApO1xuXG4gICAgZm9yICh2YXIgdCA9IDA7IHQgPCAxNjsgKyt0KSB7XG4gICAgICBXW3RdID0gTVtfaTJdW3RdO1xuICAgIH1cblxuICAgIGZvciAodmFyIF90ID0gMTY7IF90IDwgODA7ICsrX3QpIHtcbiAgICAgIFdbX3RdID0gUk9UTChXW190IC0gM10gXiBXW190IC0gOF0gXiBXW190IC0gMTRdIF4gV1tfdCAtIDE2XSwgMSk7XG4gICAgfVxuXG4gICAgdmFyIGEgPSBIWzBdO1xuICAgIHZhciBiID0gSFsxXTtcbiAgICB2YXIgYyA9IEhbMl07XG4gICAgdmFyIGQgPSBIWzNdO1xuICAgIHZhciBlID0gSFs0XTtcblxuICAgIGZvciAodmFyIF90MiA9IDA7IF90MiA8IDgwOyArK190Mikge1xuICAgICAgdmFyIHMgPSBNYXRoLmZsb29yKF90MiAvIDIwKTtcbiAgICAgIHZhciBUID0gUk9UTChhLCA1KSArIGYocywgYiwgYywgZCkgKyBlICsgS1tzXSArIFdbX3QyXSA+Pj4gMDtcbiAgICAgIGUgPSBkO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gUk9UTChiLCAzMCkgPj4+IDA7XG4gICAgICBiID0gYTtcbiAgICAgIGEgPSBUO1xuICAgIH1cblxuICAgIEhbMF0gPSBIWzBdICsgYSA+Pj4gMDtcbiAgICBIWzFdID0gSFsxXSArIGIgPj4+IDA7XG4gICAgSFsyXSA9IEhbMl0gKyBjID4+PiAwO1xuICAgIEhbM10gPSBIWzNdICsgZCA+Pj4gMDtcbiAgICBIWzRdID0gSFs0XSArIGUgPj4+IDA7XG4gIH1cblxuICByZXR1cm4gW0hbMF0gPj4gMjQgJiAweGZmLCBIWzBdID4+IDE2ICYgMHhmZiwgSFswXSA+PiA4ICYgMHhmZiwgSFswXSAmIDB4ZmYsIEhbMV0gPj4gMjQgJiAweGZmLCBIWzFdID4+IDE2ICYgMHhmZiwgSFsxXSA+PiA4ICYgMHhmZiwgSFsxXSAmIDB4ZmYsIEhbMl0gPj4gMjQgJiAweGZmLCBIWzJdID4+IDE2ICYgMHhmZiwgSFsyXSA+PiA4ICYgMHhmZiwgSFsyXSAmIDB4ZmYsIEhbM10gPj4gMjQgJiAweGZmLCBIWzNdID4+IDE2ICYgMHhmZiwgSFszXSA+PiA4ICYgMHhmZiwgSFszXSAmIDB4ZmYsIEhbNF0gPj4gMjQgJiAweGZmLCBIWzRdID4+IDE2ICYgMHhmZiwgSFs0XSA+PiA4ICYgMHhmZiwgSFs0XSAmIDB4ZmZdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzaGExOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbi8qKlxuICogQ29udmVydCBhcnJheSBvZiAxNiBieXRlIHZhbHVlcyB0byBVVUlEIHN0cmluZyBmb3JtYXQgb2YgdGhlIGZvcm06XG4gKiBYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFhcbiAqL1xuXG52YXIgYnl0ZVRvSGV4ID0gW107XG5cbmZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgYnl0ZVRvSGV4LnB1c2goKGkgKyAweDEwMCkudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeShhcnIpIHtcbiAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgLy8gTm90ZTogQmUgY2FyZWZ1bCBlZGl0aW5nIHRoaXMgY29kZSEgIEl0J3MgYmVlbiB0dW5lZCBmb3IgcGVyZm9ybWFuY2VcbiAgLy8gYW5kIHdvcmtzIGluIHdheXMgeW91IG1heSBub3QgZXhwZWN0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkL3B1bGwvNDM0XG4gIHZhciB1dWlkID0gKGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgM11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDVdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA3XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDhdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxM11dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNV1dKS50b0xvd2VyQ2FzZSgpOyAvLyBDb25zaXN0ZW5jeSBjaGVjayBmb3IgdmFsaWQgVVVJRC4gIElmIHRoaXMgdGhyb3dzLCBpdCdzIGxpa2VseSBkdWUgdG8gb25lXG4gIC8vIG9mIHRoZSBmb2xsb3dpbmc6XG4gIC8vIC0gT25lIG9yIG1vcmUgaW5wdXQgYXJyYXkgdmFsdWVzIGRvbid0IG1hcCB0byBhIGhleCBvY3RldCAobGVhZGluZyB0b1xuICAvLyBcInVuZGVmaW5lZFwiIGluIHRoZSB1dWlkKVxuICAvLyAtIEludmFsaWQgaW5wdXQgdmFsdWVzIGZvciB0aGUgUkZDIGB2ZXJzaW9uYCBvciBgdmFyaWFudGAgZmllbGRzXG5cbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkJyk7XG4gIH1cblxuICByZXR1cm4gdXVpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RyaW5naWZ5OyIsImltcG9ydCBybmcgZnJvbSAnLi9ybmcuanMnO1xuaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7IC8vICoqYHYxKClgIC0gR2VuZXJhdGUgdGltZS1iYXNlZCBVVUlEKipcbi8vXG4vLyBJbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vTGlvc0svVVVJRC5qc1xuLy8gYW5kIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS91dWlkLmh0bWxcblxudmFyIF9ub2RlSWQ7XG5cbnZhciBfY2xvY2tzZXE7IC8vIFByZXZpb3VzIHV1aWQgY3JlYXRpb24gdGltZVxuXG5cbnZhciBfbGFzdE1TZWNzID0gMDtcbnZhciBfbGFzdE5TZWNzID0gMDsgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCBmb3IgQVBJIGRldGFpbHNcblxuZnVuY3Rpb24gdjEob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgdmFyIGkgPSBidWYgJiYgb2Zmc2V0IHx8IDA7XG4gIHZhciBiID0gYnVmIHx8IG5ldyBBcnJheSgxNik7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgbm9kZSA9IG9wdGlvbnMubm9kZSB8fCBfbm9kZUlkO1xuICB2YXIgY2xvY2tzZXEgPSBvcHRpb25zLmNsb2Nrc2VxICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmNsb2Nrc2VxIDogX2Nsb2Nrc2VxOyAvLyBub2RlIGFuZCBjbG9ja3NlcSBuZWVkIHRvIGJlIGluaXRpYWxpemVkIHRvIHJhbmRvbSB2YWx1ZXMgaWYgdGhleSdyZSBub3RcbiAgLy8gc3BlY2lmaWVkLiAgV2UgZG8gdGhpcyBsYXppbHkgdG8gbWluaW1pemUgaXNzdWVzIHJlbGF0ZWQgdG8gaW5zdWZmaWNpZW50XG4gIC8vIHN5c3RlbSBlbnRyb3B5LiAgU2VlICMxODlcblxuICBpZiAobm9kZSA9PSBudWxsIHx8IGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICB2YXIgc2VlZEJ5dGVzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IHJuZykoKTtcblxuICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgIC8vIFBlciA0LjUsIGNyZWF0ZSBhbmQgNDgtYml0IG5vZGUgaWQsICg0NyByYW5kb20gYml0cyArIG11bHRpY2FzdCBiaXQgPSAxKVxuICAgICAgbm9kZSA9IF9ub2RlSWQgPSBbc2VlZEJ5dGVzWzBdIHwgMHgwMSwgc2VlZEJ5dGVzWzFdLCBzZWVkQnl0ZXNbMl0sIHNlZWRCeXRlc1szXSwgc2VlZEJ5dGVzWzRdLCBzZWVkQnl0ZXNbNV1dO1xuICAgIH1cblxuICAgIGlmIChjbG9ja3NlcSA9PSBudWxsKSB7XG4gICAgICAvLyBQZXIgNC4yLjIsIHJhbmRvbWl6ZSAoMTQgYml0KSBjbG9ja3NlcVxuICAgICAgY2xvY2tzZXEgPSBfY2xvY2tzZXEgPSAoc2VlZEJ5dGVzWzZdIDw8IDggfCBzZWVkQnl0ZXNbN10pICYgMHgzZmZmO1xuICAgIH1cbiAgfSAvLyBVVUlEIHRpbWVzdGFtcHMgYXJlIDEwMCBuYW5vLXNlY29uZCB1bml0cyBzaW5jZSB0aGUgR3JlZ29yaWFuIGVwb2NoLFxuICAvLyAoMTU4Mi0xMC0xNSAwMDowMCkuICBKU051bWJlcnMgYXJlbid0IHByZWNpc2UgZW5vdWdoIGZvciB0aGlzLCBzb1xuICAvLyB0aW1lIGlzIGhhbmRsZWQgaW50ZXJuYWxseSBhcyAnbXNlY3MnIChpbnRlZ2VyIG1pbGxpc2Vjb25kcykgYW5kICduc2VjcydcbiAgLy8gKDEwMC1uYW5vc2Vjb25kcyBvZmZzZXQgZnJvbSBtc2Vjcykgc2luY2UgdW5peCBlcG9jaCwgMTk3MC0wMS0wMSAwMDowMC5cblxuXG4gIHZhciBtc2VjcyA9IG9wdGlvbnMubXNlY3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubXNlY3MgOiBEYXRlLm5vdygpOyAvLyBQZXIgNC4yLjEuMiwgdXNlIGNvdW50IG9mIHV1aWQncyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBjdXJyZW50IGNsb2NrXG4gIC8vIGN5Y2xlIHRvIHNpbXVsYXRlIGhpZ2hlciByZXNvbHV0aW9uIGNsb2NrXG5cbiAgdmFyIG5zZWNzID0gb3B0aW9ucy5uc2VjcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5uc2VjcyA6IF9sYXN0TlNlY3MgKyAxOyAvLyBUaW1lIHNpbmNlIGxhc3QgdXVpZCBjcmVhdGlvbiAoaW4gbXNlY3MpXG5cbiAgdmFyIGR0ID0gbXNlY3MgLSBfbGFzdE1TZWNzICsgKG5zZWNzIC0gX2xhc3ROU2VjcykgLyAxMDAwMDsgLy8gUGVyIDQuMi4xLjIsIEJ1bXAgY2xvY2tzZXEgb24gY2xvY2sgcmVncmVzc2lvblxuXG4gIGlmIChkdCA8IDAgJiYgb3B0aW9ucy5jbG9ja3NlcSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2xvY2tzZXEgPSBjbG9ja3NlcSArIDEgJiAweDNmZmY7XG4gIH0gLy8gUmVzZXQgbnNlY3MgaWYgY2xvY2sgcmVncmVzc2VzIChuZXcgY2xvY2tzZXEpIG9yIHdlJ3ZlIG1vdmVkIG9udG8gYSBuZXdcbiAgLy8gdGltZSBpbnRlcnZhbFxuXG5cbiAgaWYgKChkdCA8IDAgfHwgbXNlY3MgPiBfbGFzdE1TZWNzKSAmJiBvcHRpb25zLm5zZWNzID09PSB1bmRlZmluZWQpIHtcbiAgICBuc2VjcyA9IDA7XG4gIH0gLy8gUGVyIDQuMi4xLjIgVGhyb3cgZXJyb3IgaWYgdG9vIG1hbnkgdXVpZHMgYXJlIHJlcXVlc3RlZFxuXG5cbiAgaWYgKG5zZWNzID49IDEwMDAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXVpZC52MSgpOiBDYW4ndCBjcmVhdGUgbW9yZSB0aGFuIDEwTSB1dWlkcy9zZWNcIik7XG4gIH1cblxuICBfbGFzdE1TZWNzID0gbXNlY3M7XG4gIF9sYXN0TlNlY3MgPSBuc2VjcztcbiAgX2Nsb2Nrc2VxID0gY2xvY2tzZXE7IC8vIFBlciA0LjEuNCAtIENvbnZlcnQgZnJvbSB1bml4IGVwb2NoIHRvIEdyZWdvcmlhbiBlcG9jaFxuXG4gIG1zZWNzICs9IDEyMjE5MjkyODAwMDAwOyAvLyBgdGltZV9sb3dgXG5cbiAgdmFyIHRsID0gKChtc2VjcyAmIDB4ZmZmZmZmZikgKiAxMDAwMCArIG5zZWNzKSAlIDB4MTAwMDAwMDAwO1xuICBiW2krK10gPSB0bCA+Pj4gMjQgJiAweGZmO1xuICBiW2krK10gPSB0bCA+Pj4gMTYgJiAweGZmO1xuICBiW2krK10gPSB0bCA+Pj4gOCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsICYgMHhmZjsgLy8gYHRpbWVfbWlkYFxuXG4gIHZhciB0bWggPSBtc2VjcyAvIDB4MTAwMDAwMDAwICogMTAwMDAgJiAweGZmZmZmZmY7XG4gIGJbaSsrXSA9IHRtaCA+Pj4gOCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRtaCAmIDB4ZmY7IC8vIGB0aW1lX2hpZ2hfYW5kX3ZlcnNpb25gXG5cbiAgYltpKytdID0gdG1oID4+PiAyNCAmIDB4ZiB8IDB4MTA7IC8vIGluY2x1ZGUgdmVyc2lvblxuXG4gIGJbaSsrXSA9IHRtaCA+Pj4gMTYgJiAweGZmOyAvLyBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGAgKFBlciA0LjIuMiAtIGluY2x1ZGUgdmFyaWFudClcblxuICBiW2krK10gPSBjbG9ja3NlcSA+Pj4gOCB8IDB4ODA7IC8vIGBjbG9ja19zZXFfbG93YFxuXG4gIGJbaSsrXSA9IGNsb2Nrc2VxICYgMHhmZjsgLy8gYG5vZGVgXG5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCA2OyArK24pIHtcbiAgICBiW2kgKyBuXSA9IG5vZGVbbl07XG4gIH1cblxuICByZXR1cm4gYnVmIHx8IHN0cmluZ2lmeShiKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdjE7IiwiaW1wb3J0IHYzNSBmcm9tICcuL3YzNS5qcyc7XG5pbXBvcnQgbWQ1IGZyb20gJy4vbWQ1LmpzJztcbnZhciB2MyA9IHYzNSgndjMnLCAweDMwLCBtZDUpO1xuZXhwb3J0IGRlZmF1bHQgdjM7IiwiaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5pbXBvcnQgcGFyc2UgZnJvbSAnLi9wYXJzZS5qcyc7XG5cbmZ1bmN0aW9uIHN0cmluZ1RvQnl0ZXMoc3RyKSB7XG4gIHN0ciA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTsgLy8gVVRGOCBlc2NhcGVcblxuICB2YXIgYnl0ZXMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGJ5dGVzLnB1c2goc3RyLmNoYXJDb2RlQXQoaSkpO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG5leHBvcnQgdmFyIEROUyA9ICc2YmE3YjgxMC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xuZXhwb3J0IHZhciBVUkwgPSAnNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChuYW1lLCB2ZXJzaW9uLCBoYXNoZnVuYykge1xuICBmdW5jdGlvbiBnZW5lcmF0ZVVVSUQodmFsdWUsIG5hbWVzcGFjZSwgYnVmLCBvZmZzZXQpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgdmFsdWUgPSBzdHJpbmdUb0J5dGVzKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5hbWVzcGFjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5hbWVzcGFjZSA9IHBhcnNlKG5hbWVzcGFjZSk7XG4gICAgfVxuXG4gICAgaWYgKG5hbWVzcGFjZS5sZW5ndGggIT09IDE2KSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ05hbWVzcGFjZSBtdXN0IGJlIGFycmF5LWxpa2UgKDE2IGl0ZXJhYmxlIGludGVnZXIgdmFsdWVzLCAwLTI1NSknKTtcbiAgICB9IC8vIENvbXB1dGUgaGFzaCBvZiBuYW1lc3BhY2UgYW5kIHZhbHVlLCBQZXIgNC4zXG4gICAgLy8gRnV0dXJlOiBVc2Ugc3ByZWFkIHN5bnRheCB3aGVuIHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLCBlLmcuIGBieXRlcyA9XG4gICAgLy8gaGFzaGZ1bmMoWy4uLm5hbWVzcGFjZSwgLi4uIHZhbHVlXSlgXG5cblxuICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KDE2ICsgdmFsdWUubGVuZ3RoKTtcbiAgICBieXRlcy5zZXQobmFtZXNwYWNlKTtcbiAgICBieXRlcy5zZXQodmFsdWUsIG5hbWVzcGFjZS5sZW5ndGgpO1xuICAgIGJ5dGVzID0gaGFzaGZ1bmMoYnl0ZXMpO1xuICAgIGJ5dGVzWzZdID0gYnl0ZXNbNl0gJiAweDBmIHwgdmVyc2lvbjtcbiAgICBieXRlc1s4XSA9IGJ5dGVzWzhdICYgMHgzZiB8IDB4ODA7XG5cbiAgICBpZiAoYnVmKSB7XG4gICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IGJ5dGVzW2ldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYnVmO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJpbmdpZnkoYnl0ZXMpO1xuICB9IC8vIEZ1bmN0aW9uI25hbWUgaXMgbm90IHNldHRhYmxlIG9uIHNvbWUgcGxhdGZvcm1zICgjMjcwKVxuXG5cbiAgdHJ5IHtcbiAgICBnZW5lcmF0ZVVVSUQubmFtZSA9IG5hbWU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eVxuICB9IGNhdGNoIChlcnIpIHt9IC8vIEZvciBDb21tb25KUyBkZWZhdWx0IGV4cG9ydCBzdXBwb3J0XG5cblxuICBnZW5lcmF0ZVVVSUQuRE5TID0gRE5TO1xuICBnZW5lcmF0ZVVVSUQuVVJMID0gVVJMO1xuICByZXR1cm4gZ2VuZXJhdGVVVUlEO1xufSIsImltcG9ydCBybmcgZnJvbSAnLi9ybmcuanMnO1xuaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5cbmZ1bmN0aW9uIHY0KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBybmcpKCk7IC8vIFBlciA0LjQsIHNldCBiaXRzIGZvciB2ZXJzaW9uIGFuZCBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGBcblxuICBybmRzWzZdID0gcm5kc1s2XSAmIDB4MGYgfCAweDQwO1xuICBybmRzWzhdID0gcm5kc1s4XSAmIDB4M2YgfCAweDgwOyAvLyBDb3B5IGJ5dGVzIHRvIGJ1ZmZlciwgaWYgcHJvdmlkZWRcblxuICBpZiAoYnVmKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHJuZHNbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIHJldHVybiBzdHJpbmdpZnkocm5kcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHY0OyIsImltcG9ydCB2MzUgZnJvbSAnLi92MzUuanMnO1xuaW1wb3J0IHNoYTEgZnJvbSAnLi9zaGExLmpzJztcbnZhciB2NSA9IHYzNSgndjUnLCAweDUwLCBzaGExKTtcbmV4cG9ydCBkZWZhdWx0IHY1OyIsImltcG9ydCBSRUdFWCBmcm9tICcuL3JlZ2V4LmpzJztcblxuZnVuY3Rpb24gdmFsaWRhdGUodXVpZCkge1xuICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnICYmIFJFR0VYLnRlc3QodXVpZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRlOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZnVuY3Rpb24gdmVyc2lvbih1dWlkKSB7XG4gIGlmICghdmFsaWRhdGUodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0ludmFsaWQgVVVJRCcpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlSW50KHV1aWQuc3Vic3RyKDE0LCAxKSwgMTYpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2ZXJzaW9uOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiLyoqXG4gKiBUaGlzIGlzIHlvdXIgbWFpbi4gVGhpcyBpcyB3aGVyZSB5b3UgcmUtZXhwb3J0IGV2ZXJ5dGhpbmcgeW91IHdhbnQgdG8gYmUgcHVibGljbHkgYXZhaWxhYmxlLlxuICpcbiAqIFRoZSBidWlsZCBlbmZvcmNlcyB0aGF0IHRoZSBmaWxlIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnbG9iYWwgdmFyaWFibGUgdGhhdCBpcyBleHBvcnRlZC5cbiAqL1xuXG5pbXBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbi8vIER1ZSB0byB0aGUgd2F5IHdlIGNvbmZpZ3VyZWQgd2VicGFjaywgd2Ugc2hvdWxkIGJlIGV4cG9ydGluZyB0aGluZ3Mgd2hpY2ggd2lsbCBiZSB1bmRlclxuLy8gYSBnbG9iYWwgdmFyaWFibGUgY2FsbGVkIFwidGFibGVhdVwiLiBFeHBvcnQgZXZlcnl0aGluZyB3ZSB3YW50IHRvIGJlIHZpc2libGUgdW5kZXIgdGFibGVhdVxuLy8gZnJvbSB0aGlzIGZpbGUuXG5pbXBvcnQgeyBFeHRlbnNpb25zSW1wbCB9IGZyb20gJy4vRXh0ZW5zaW9uc0FwaS9JbXBsL0V4dGVuc2lvbnNJbXBsJztcbmltcG9ydCB7IEV4dGVuc2lvbnMgfSBmcm9tICcuL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9FeHRlbnNpb25zJztcblxuZGVjbGFyZSBsZXQgVkVSU0lPTl9JU19BTFBIQTogYm9vbGVhbjtcbmNvbnN0IGlzQWxwaGE6IGJvb2xlYW4gPSB0eXBlb2YgVkVSU0lPTl9JU19BTFBIQSAhPT0gJ3VuZGVmaW5lZCcgPyBWRVJTSU9OX0lTX0FMUEhBIDogZmFsc2U7XG5cbmRlY2xhcmUgbGV0IEFQSV9WRVJTSU9OX05VTUJFUjogc3RyaW5nO1xuQXBpVmVyc2lvbi5TZXRWZXJzaW9uTnVtYmVyKHR5cGVvZiBBUElfVkVSU0lPTl9OVU1CRVIgIT09ICd1bmRlZmluZWQnID8gQVBJX1ZFUlNJT05fTlVNQkVSIDogJzAuMC4wJywgaXNBbHBoYSk7XG5cbmNvbnN0IGV4dGVuc2lvbkltcGwgPSBuZXcgRXh0ZW5zaW9uc0ltcGwoKTtcbmV4cG9ydCBjb25zdCBleHRlbnNpb25zID0gbmV3IEV4dGVuc2lvbnMoZXh0ZW5zaW9uSW1wbCk7XG5cbi8vIEV4cG9ydCBFbnVtc1xuLy8gVGhlc2Ugc2hvdyB1cCB1bmRlciB0aGUgdGFibGVhdSBvYmplY3QuIEkuZS4gdGFibGVhdS5FeHRlbnNpb25Db250ZXh0LlNlcnZlclxuZXhwb3J0IHtcbiAgQW5hbHl0aWNzT2JqZWN0VHlwZSxcbiAgQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSxcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLFxuICBEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZSxcbiAgRGF0YVR5cGUsXG4gIERhdGVSYW5nZVR5cGUsXG4gIERpYWxvZ1N0eWxlLFxuICBFbmNvZGluZ1R5cGUsXG4gIEVycm9yQ29kZXMsXG4gIEV4dGVuc2lvbkNvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlLFxuICBGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJEb21haW5UeXBlLFxuICBGaWx0ZXJOdWxsT3B0aW9uLFxuICBGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlLFxuICBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgTWFya1R5cGUsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgUGVyaW9kVHlwZSxcbiAgUXVpY2tUYWJsZUNhbGNUeXBlLFxuICBSZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zLFxuICBSZXBsYXlTcGVlZFR5cGUsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gIFNlbGVjdE9wdGlvbnMsXG4gIFNoZWV0VHlwZSxcbiAgU29ydERpcmVjdGlvbixcbiAgVGFibGVhdUV2ZW50VHlwZSxcbiAgVHJlbmRMaW5lTW9kZWxUeXBlLFxuICBWaXpJbWFnZUVuY29kaW5nVHlwZSxcbiAgVml6SW1hZ2VQYWxldHRlVHlwZSxcbiAgVml6SW1hZ2VTaXplU2V0dGluZ0FsaWdubWVudFR5cGUsXG4gIFZpekltYWdlU2l6ZVNldHRpbmdUeXBlLFxuICBWaXpJbWFnZVNvcnREaXJlY3Rpb25UeXBlLFxuICBab25lVmlzaWJpbGl0eVR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/lib/beta/tableau.extensions.1.15.0.beta.min.js b/lib/beta/tableau.extensions.1.15.0.beta.min.js new file mode 100644 index 00000000..698b2a75 --- /dev/null +++ b/lib/beta/tableau.extensions.1.15.0.beta.min.js @@ -0,0 +1,2 @@ +(()=>{var e={1808:e=>{!function(){var t=new RegExp("^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$","i");function r(e){for(var t="",r=0;r{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7112);class n extends i.TableauEvent{constructor(e){super(a.TableauEventType.DashboardLayoutChanged),this._dashboardLayoutChangeDetails=e}get dashboardLayoutChangeDetails(){return this._dashboardLayoutChangeDetails}}t.DashboardLayoutChangedEvent=n},1672:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(5136),n=r(4144);class s extends n.TableauWorksheetEvent{constructor(e,t,r){super(a.TableauEventType.FilterChanged,e),this._fieldName=t,this._fieldId=r}get fieldName(){return this._fieldName}get fieldId(){return this._fieldId}getFilterAsync(){return this._worksheet.getFiltersAsync().then((e=>{const t=this.fieldId?e.find((e=>e.fieldId===this.fieldId),this):e.find((e=>e.fieldName===this.fieldName),this);if(!t)throw new i.TableauError(a.ErrorCodes.MissingFilter,`cannot find filter: ${this._fieldName}`);return t}))}}t.FilterChangedEvent=s},5572:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(4144);class n extends i.TableauWorksheetEvent{constructor(e){super(a.TableauEventType.MarkSelectionChanged,e)}getMarksAsync(){return this.worksheet.getSelectedMarksAsync()}}t.MarksSelectedEvent=n},864:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(5136),n=r(4592),s=r(3848),o=r(3248);class l extends o.TableauSheetEvent{constructor(e,t){super(a.TableauEventType.ParameterChanged,t),this._globalFieldName=e}getParameterAsync(){return i.ApiServiceRegistry.get(s.ExtensionsRegistryId).getService("parameters-service").findParameterByGlobalFieldNameAsync(this._globalFieldName).then((e=>{if(void 0===e)throw new i.TableauError(a.ErrorCodes.MissingParameter,`Cannot find parameter: ${this._globalFieldName}`);return new n.Parameter(e,this.sheet)}))}}t.ParameterChangedEvent=l},3464:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(4144);class n extends i.TableauWorksheetEvent{constructor(e){super(a.TableauEventType.SummaryDataChanged,e)}}t.SummaryDataChangedEvent=n},7112:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableauEvent=class{constructor(e){this._type=e}get type(){return this._type}}},3248:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7112);class i extends a.TableauEvent{constructor(e,t){super(e),this._sheet=t}get sheet(){return this._sheet}}t.TableauSheetEvent=i},4144:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3248);class i extends a.TableauSheetEvent{constructor(e,t){super(e,t),this._worksheet=t}get worksheet(){return this._worksheet}}t.TableauWorksheetEvent=i},4164:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7112);class n extends i.TableauEvent{constructor(e){super(a.TableauEventType.WorkbookFormattingChanged),this._formatting=e}get formatting(){return this._formatting}}t.WorkbookFormattingChangedEvent=n},4712:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(4144);class n extends i.TableauWorksheetEvent{constructor(e,t){super(a.TableauEventType.WorksheetFormattingChanged,e),this._formatting=t}get formatting(){return this._formatting}}t.WorksheetFormattingChangedEvent=n},92:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.BentonSansFontFamilyName="Benton Sans",t.BentonSansLowDPIFontFamilyName="Benton Sans Low-DPI",t.BentonSansBookFontFaceName="Benton Sans Book",t.BentonSansBookItalicFontFaceName="Benton Sans Book Italic",t.BentonSansSemiDemiFontFaceName="Benton Sans SemiDemi",t.BentonSansSemiDemiItalicFontFaceName="Benton Sans SemiDemi Italic",t.BentonSansLightFontFaceName="Benton Sans Light",t.BentonSansMediumFontFaceName="Benton Sans Medium",t.SupportedBentonSansFontFaces=[t.BentonSansBookFontFaceName,t.BentonSansBookItalicFontFaceName,t.BentonSansSemiDemiFontFaceName,t.BentonSansSemiDemiItalicFontFaceName,t.BentonSansLightFontFaceName,t.BentonSansMediumFontFaceName]},8396:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ConnectedServer=class{constructor(e,t,r,a){this._userId=e,this._siteId=t,this._siteNamespace=r,this._workbookId=a}get userId(){return this._userId}get siteId(){return this._siteId}get siteNamespace(){return this._siteNamespace}get workbookId(){return this._workbookId}}},5920:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136),i=r(3848);class n extends a.WorkbookImpl{getAllDataSourcesAsync(){return a.ApiServiceRegistry.get(i.ExtensionsRegistryId).getService("data-source-service").getAllDataSourcesAsync().then((e=>{const t=e,r=[];return Object.values(t.dataSources).forEach((e=>{r.push(this.createDataSourceFromInfo(e))})),r}))}createDataSourceFromInfo(e){const t=new a.DataSourceImpl(e,i.ExtensionsRegistryId),r=new a.DataSource(t);return t.initializeWithPublicInterfaces(r),r}}t.ExtensionWorkbookImpl=n},976:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136),s=r(4252),o=r(9224),l=r(5548),d=r(893),c=r(520),u=r(3032),h=r(1964),p=r(8012),m=r(7e3),g=r(6616),y=r(3848),I=r(92),v=r(5920),S=r(7269),T=r(5436),b=r(2200),f=r(1024);t.ExtensionsImpl=class{initializeAsync(e,t){return this._initializationPromise||(this._initializationPromise=new Promise(((r,a)=>{var s;const o={isAlpha:n.ApiVersion.Instance.isAlpha};if(S.LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise(o))null===(s=S.LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise(o))||void 0===s||s.then((r=>this.onDispatcherReceived(r,e,t))).then((e=>{r(e)})).catch((e=>{a(e)}));else{const s=this.onDispatcherReceived.bind(this);n.doCrossFrameBootstrap(window,i.INTERNAL_CONTRACT_VERSION,o).then((r=>s(r,e,t))).then((e=>{r(e)})).catch((e=>{a(e)}))}}))),this._initializationPromise}createVizImageAsync(e){return n.ApiServiceRegistry.get(y.ExtensionsRegistryId).getService("viz-service").createVizImageAsync(e)}setClickThroughAsync(e){return n.ApiServiceRegistry.get(y.ExtensionsRegistryId).getService("UIService").setClickThroughAsync(e,this.extensionZoneId)}isDashboardExtensionLocator(e){if(!e.dashboardPath)throw new n.TableauError(a.ErrorCodes.InternalError,"Unexpected error during initialization.");return!0}onDispatcherReceived(e,t,r){let a=e(i.INTERNAL_CONTRACT_VERSION);g.registerInitializationExtensionsServices(a);const s=n.ApiServiceRegistry.get(y.ExtensionsRegistryId).getService("InitializationService"),l=r?Object.keys(r):[];return s.initializeDashboardExtensionsAsync(t,l).then((e=>{const t=e.extensionEnvironment.platformVersion?e.extensionEnvironment.platformVersion:{major:1,minor:9,fix:0};return n.VersionedExternalApiDispatcher.needsVersionConverter(t)&&(a=new n.VersionedExternalApiDispatcher(a,t)),n.registerAllSharedServices(a,y.ExtensionsRegistryId),g.registerAllExtensionsServices(a),e.extensionDashboardInfo&&this.isDashboardExtensionLocator(e.extensionInstance.locator)&&(this.dashboardContent=this.initializeDashboardContent(e.extensionDashboardInfo,e.extensionInstance.locator.dashboardPath),this.extensionZoneId=e.extensionDashboardInfo.extensionZoneId),e.extensionWorksheetInfo&&(this.worksheetContent=this.initializeWorksheetContent(e.extensionWorksheetInfo)),this.environment=new c.Environment(e.extensionEnvironment),this.settings=this.initializeSettings(e.extensionSettingsInfo),this.ui=new h.UI(new f.UIImpl),this.workbook=new o.Workbook(new v.ExtensionWorkbookImpl),e.extensionEnvironment.workbookFormatting&&(this.initializeTableauFonts(a,e.extensionEnvironment.workbookFormatting),this.applyAllFormatting(e.extensionEnvironment.workbookFormatting)),this.initializeContextMenuCallbacks(r),this.initializeWorkbookFormattingChangedEventCallback(a),e.extensionDialogPayload}))}applyAllFormatting(e){if(this._styleElement||(this._styleElement=document.createElement("style"),this._styleElement.id="Tableau-Extension-Formatting",document.head.appendChild(this._styleElement)),!this._styleElement.sheet||!e)return;const t=this._styleElement.sheet;for(;t.cssRules.length>0;)t.deleteRule(t.cssRules.length-1);e.formattingSheets.map((e=>{this.applyFormattingSheetToStyleSheet(e,t)}))}applyFormattingSheetToStyleSheet(e,t){let r="";const a=e.cssProperties;a.fontFamily&&(r+="font-family: "+a.fontFamily.toString()+"; "),a.fontSize&&(r+="font-size: "+a.fontSize.toString()+"; "),a.fontWeight&&(r+="font-weight: "+a.fontWeight.toString()+"; "),a.fontStyle&&(r+="font-style: "+a.fontStyle.toString()+"; "),a.textDecoration&&(r+="text-decoration: "+a.textDecoration.toString()+"; "),a.color&&(r+="color: "+a.color+"; ");const i="."+e.classNameKey+" { "+r+" }";t.insertRule(i,t.cssRules.length)}initializeWorkbookFormattingChangedEventCallback(e){n.ApiServiceRegistry.get(y.ExtensionsRegistryId).getService("notification-service").registerHandler(i.NotificationId.WorkbookFormattingChanged,(()=>!0),(t=>{t&&(this.initializeTableauFonts(e,t),this.applyAllFormatting(t))}))}initializeTableauFonts(e,t){const r=[...I.SupportedBentonSansFontFaces,...b.SupportedTableauFontFaces];if(t.formattingSheets.forEach((e=>{e.cssProperties.fontFamily&&r.push(e.cssProperties.fontFamily)})),r.length>0){const t={[i.ParameterId.FontNameListItems]:r};e.execute(i.VerbId.GetFonts,t).then((e=>{this.loadFonts(e.result)})).catch()}}loadFonts(e){e.forEach((e=>{b.SupportedTableauFontFaces.includes(e.fontName)?this.loadTableauFonts(e):I.SupportedBentonSansFontFaces.includes(e.fontName)?this.loadBentonSansFonts(e):document.fonts.add(new FontFace(e.fontName,e.fontBinaryInfo))}))}initializeDashboardContent(e,t){const r=new n.SheetInfoImpl(e.name,a.SheetType.Dashboard,{width:e.size.w,height:e.size.h},void 0,!0),i=new n.DashboardImpl(r,e.zones,t,y.ExtensionsRegistryId,null,e.activeDashboardObjectId),o=new s.Dashboard(i);return new d.DashboardContent(o)}initializeWorksheetContent(e){const t=new n.SheetInfoImpl(e.visualId.worksheet,a.SheetType.Worksheet,{width:e.size.w,height:e.size.h},void 0,!0),r=new n.WorksheetImpl(t,y.ExtensionsRegistryId,e.visualId,null,null,e.backgroundColor,p.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(e.formatting)),i=new l.Worksheet(r);return new m.WorksheetContent(i)}initializeSettings(e){const t=new T.SettingsImpl(e);return new u.Settings(t)}initializeContextMenuCallbacks(e){n.ApiServiceRegistry.get(y.ExtensionsRegistryId).getService("notification-service").registerHandler(i.NotificationId.ContextMenuClick,(()=>!0),(t=>{if(e){if(!e[t.id])throw new n.TableauError(a.ErrorCodes.InternalError,`Received unexpected context menu Id from event: ${t.id}`);e[t.id]()}}))}loadTableauFonts(e){switch(e.fontName){case b.TableauBookFontFaceName:document.fonts.add(new FontFace(b.TableauBookFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case b.TableauLightFontFaceName:document.fonts.add(new FontFace(b.TableauLightFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case b.TableauRegularFontFaceName:document.fonts.add(new FontFace(b.TableauRegularFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case b.TableauSemiBoldFontFaceName:document.fonts.add(new FontFace(b.TableauSemiboldFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(b.TableauRegularFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case b.TableauBoldFontFaceName:document.fonts.add(new FontFace(b.TableauBoldFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(b.TableauBoldFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(b.TableauMediumFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(b.TableauSemiboldFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case b.TableauMediumFontFaceName:document.fonts.add(new FontFace(b.TableauMediumFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(b.TableauLightFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(b.TableauBookFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;default:throw new n.TableauError(a.ErrorCodes.InternalError,`'attempted to load unsupported font: ${e.fontName}.'`)}}loadBentonSansFonts(e){switch(e.fontName){case I.BentonSansBookFontFaceName:document.fonts.add(new FontFace(I.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(I.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"100",style:"normal"}));break;case I.BentonSansLightFontFaceName:document.fonts.add(new FontFace(I.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"100",style:"normal"}));break;case I.BentonSansMediumFontFaceName:document.fonts.add(new FontFace(I.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(I.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case I.BentonSansSemiDemiFontFaceName:document.fonts.add(new FontFace(I.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case I.BentonSansBookItalicFontFaceName:document.fonts.add(new FontFace(I.BentonSansFontFamilyName,e.fontBinaryInfo,{style:"italic"}));break;case I.BentonSansSemiDemiItalicFontFaceName:document.fonts.add(new FontFace(I.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{style:"italic"}));break;default:throw new n.TableauError(a.ErrorCodes.InternalError,`'attempted to load unsupported font: ${e.fontName}.'`)}}}},7269:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448);!function(e){function t(e){var t;return e&&void 0!==e.isAlpha||window.__warningIssued?(null===(t=e)||void 0===t?void 0:t.isAlpha)&&window.__platformIsOfficialRelease&&window.__tableauDesktopDispatcher.then((e=>{e(a.INTERNAL_CONTRACT_VERSION).execute(a.VerbId.BlockExtension,{}).catch()})).catch():(console.warn("This is a beta version of the Extensions API. Please upgrade to an official release."),window.__warningIssued=!0),window.__tableauDesktopDispatcher}e.getDesktopDispatcherPromise=t,e.hasDesktopApiDispatcherPromise=function(e){return!!t(e)}}(t.LegacyInternalApiDispatcherHolder||(t.LegacyInternalApiDispatcherHolder={}))},5436:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136),s=r(7112),o=r(3848);class l extends s.TableauEvent{constructor(e){super(a.TableauEventType.SettingsChanged),this._newSettings=e}get newSettings(){return this._newSettings}}class d{constructor(e){this._saveInProgress=!1,this.initializeSettings(e)}erase(e){n.ErrorHelpers.verifyParameter(e,"key"),this._currentSettings[e]&&(this.verifySettingsAreUnlocked(),delete this._currentSettings[e],this._isModified=!0)}get(e){return n.ErrorHelpers.verifyParameter(e,"key"),this._currentSettings[e]}getAll(){return Object.assign({},this._currentSettings)}get isModified(){return this._isModified}saveAsync(){return this.verifySettingsAreUnlocked(),this._isModified?(this._saveInProgress=!0,n.ApiServiceRegistry.get(o.ExtensionsRegistryId).getService("SettingsService").saveSettingsAsync(this._currentSettings).then((e=>(this._saveInProgress=!1,this._isModified=!1,void 0===this._currentSettings?this._currentSettings=e:Object.assign(this._currentSettings,e),e)),(e=>(this._saveInProgress=!1,Promise.reject(e))))):Promise.resolve(this._currentSettings)}set(e,t){n.ErrorHelpers.verifyStringParameter(e,"key"),n.ErrorHelpers.verifyParameter(t,"value"),this.verifySettingsAreUnlocked(),this._currentSettings[e]=t,this._isModified=!0}initializeEvents(){const e=new Array;let t;try{t=n.ApiServiceRegistry.get(o.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new n.SingleEventManagerImpl(a.TableauEventType.SettingsChanged);return t.registerHandler(i.NotificationId.SettingsChanged,(()=>!0),(e=>{this._currentSettings=e.newSettings,r.triggerEvent((()=>new l(e.newSettings)))})),e.push(r),e}initializeSettings(e){n.ErrorHelpers.verifyParameter(e,"settingsInfo"),n.ErrorHelpers.verifyParameter(e.settingsValues,"settingsInfo.SettingsValues"),this._currentSettings=e.settingsValues,this._isModified=!1}verifySettingsAreUnlocked(){if(this._saveInProgress)throw new n.TableauError(a.ErrorCodes.SettingSaveInProgress,d.ASYNC_SAVE_IN_PROGRESS)}}t.SettingsImpl=d,d.ASYNC_SAVE_IN_PROGRESS="Async Save is in progress, updating settings is not allowed."},2200:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableauBookFontFamilyName="Tableau Book",t.TableauLightFontFamilyName="Tableau Light",t.TableauRegularFontFamilyName="Tableau Regular",t.TableauMediumFontFamilyName="Tableau Medium",t.TableauSemiboldFontFamilyName="Tableau Semibold",t.TableauBoldFontFamilyName="Tableau Bold",t.TableauBookFontFaceName="Tableau Book",t.TableauBoldFontFaceName="Tableau Bold",t.TableauLightFontFaceName="Tableau Light",t.TableauMediumFontFaceName="Tableau Medium",t.TableauRegularFontFaceName="Tableau Regular",t.TableauSemiBoldFontFaceName="Tableau Semi Bold",t.SupportedTableauFontFaces=[t.TableauBookFontFaceName,t.TableauBoldFontFaceName,t.TableauLightFontFaceName,t.TableauMediumFontFaceName,t.TableauRegularFontFaceName,t.TableauSemiBoldFontFaceName]},1024:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7419),n=r(3448),s=r(5136),o=r(7112),l=r(3848);class d extends o.TableauEvent{constructor(e){super(a.TableauEventType.DialogMessageReceived),this.message=e}}t.DialogMessageEvent=d,t.UIImpl=class{constructor(){}displayDialogAsync(e,t,r){const o=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService"),d=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service");return new Promise(((l,c)=>{o.displayDialogAsync(e,t||"",r).then((()=>{const e=d.registerHandler(n.NotificationId.ExtensionDialogUpdate,(()=>!0),(t=>{if(t.isCloseEvent){if(void 0===t.closePayload)throw new s.TableauError(a.ErrorCodes.InternalError,"closePayload is undefined");l(t.closePayload)}else c(new s.TableauError(i.ErrorCodes.DialogClosedByUser,"Extension dialog closed by user."));e()}))})).catch((e=>{c(e)}))}))}sendDialogMessageAsync(e,t){s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService").sendDialogMessageAsync(e,t)}closeDialog(e){s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService").closeDialog(e)}initializeEvents(){const e=new Array;let t;try{t=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new s.SingleEventManagerImpl(a.TableauEventType.DialogMessageReceived);return t.registerHandler(n.NotificationId.ExtensionDialogMessage,(()=>!0),(e=>{r.triggerEvent((()=>new d(e.message)))})),e.push(r),e}}},4252:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136),s=r(6416),o=r(4164),l=r(3848),d=r(3192),c=r(8512),u=r(5548);class h extends c.Sheet{constructor(e){super(e),this._dashboardImpl=e,e.initializeWithPublicInterfaces(),this.initializeEvents().forEach((e=>this.addNewEventType(e)))}get worksheets(){return this._dashboardImpl.worksheetsImpl.map((e=>new u.Worksheet(e)))}get objects(){return this._dashboardImpl.objects.map((e=>new d.DashboardObject(e)))}get activeDashboardObjectId(){return this._dashboardImpl.activeDashboardObjectId}get activeDashboardName(){return this._dashboardImpl.activeDashboardName}setZoneVisibilityAsync(e){return this._dashboardImpl.setDashboardObjectVisibilityAsync(e)}setDashboardObjectVisibilityAsync(e){return this._dashboardImpl.setDashboardObjectVisibilityAsync(e)}getDashboardObjectById(e){const t=this._dashboardImpl.getDashboardObjectById(e);return t&&new d.DashboardObject(t)}initializeEvents(){const e=new Array;let t;try{t=n.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new n.SingleEventManagerImpl(a.TableauEventType.DashboardLayoutChanged);t.registerHandler(i.NotificationId.DashboardLayoutChanged,(()=>!0),(e=>{const t=this._dashboardImpl.updateZones(e.zones,e.activeZoneId,e.activeDashboardName);r.triggerEvent((()=>new s.DashboardLayoutChangedEvent(t)))})),e.push(r);const d=new n.SingleEventManagerImpl(a.TableauEventType.WorkbookFormattingChanged);return t.registerHandler(i.NotificationId.WorkbookFormattingChanged,(()=>!0),(e=>{d.triggerEvent((()=>new o.WorkbookFormattingChangedEvent(e)))})),e.push(d),e}moveAndResizeDashboardObjectsAsync(e){return this._dashboardImpl.moveAndResizeDashboardObjectsAsync(e)}replayAnimationAsync(e){return this._dashboardImpl.replayAnimationAsync(e)}getFiltersAsync(){return this._dashboardImpl.getFiltersAsync()}applyFilterAsync(e,t,r,a){return this._dashboardImpl.applyFilterAsync(e,t,r,a)}}t.Dashboard=h},3192:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(4252),i=r(5548);t.DashboardObject=class{constructor(e){this._dashboardObjectImpl=e}get dashboard(){return new a.Dashboard(this._dashboardObjectImpl.dashboardImpl)}get type(){return this._dashboardObjectImpl.type}get position(){return this._dashboardObjectImpl.position}get size(){return this._dashboardObjectImpl.size}get worksheet(){if(this._dashboardObjectImpl.worksheetImpl)return new i.Worksheet(this._dashboardObjectImpl.worksheetImpl)}get name(){return this._dashboardObjectImpl.name}get isFloating(){return this._dashboardObjectImpl.isFloating}get isVisible(){return this._dashboardObjectImpl.isVisible}get id(){return this._dashboardObjectImpl.id}get fieldId(){return this._dashboardObjectImpl.fieldId}}},4592:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136),s=r(864),o=r(3848);class l extends n.EventListenerManager{constructor(e,t){super(),this.parameterImpl=e,this.initializeEvents(t).forEach((e=>this.addNewEventType(e)))}get name(){return this.parameterImpl.name}get currentValue(){return this.parameterImpl.currentValue}get dataType(){return this.parameterImpl.dataType}get allowableValues(){return this.parameterImpl.allowableValues}get id(){return this.parameterImpl.id}changeValueAsync(e){return this.parameterImpl.changeValueAsync(e)}initializeEvents(e){n.ErrorHelpers.verifyInternalValue(e,"sheet");const t=new Array;let r;try{r=n.ApiServiceRegistry.get(o.ExtensionsRegistryId).getService("notification-service")}catch(e){return t}const l=new n.SingleEventManagerImpl(a.TableauEventType.ParameterChanged);return r.registerHandler(i.NotificationId.ParameterChanged,(e=>e===this.parameterImpl.id),(t=>{l.triggerEvent((()=>new s.ParameterChangedEvent(t,e)))})),t.push(l),t}}t.Parameter=l},8512:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(5136),n=r(4592);class s extends i.EventListenerManager{constructor(e){super(),this._sheetImpl=e}get name(){return this._sheetImpl.name}get sheetType(){return this._sheetImpl.sheetType}get size(){if(this.isValidSize(this._sheetImpl.size))return this._sheetImpl.size;throw new i.TableauError(a.EmbeddingErrorCodes.ImplementationError,"Size not implemented")}isValidSize(e){const t=e;return void 0!==t.width&&void 0!==t.height}findParameterAsync(e){return this._sheetImpl.findParameterAsync(e).then((e=>new Promise(e?t=>t(new n.Parameter(e,this)):e=>e(void 0))))}getParametersAsync(){return this._sheetImpl.getParametersAsync().then((e=>e.map((e=>new n.Parameter(e,this)))))}}t.Sheet=s},9224:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Workbook=class{constructor(e){this._workbookImpl=e}getAllDataSourcesAsync(){return this._workbookImpl.getAllDataSourcesAsync()}}},5548:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7419),n=r(3448),s=r(5136),o=r(1672),l=r(5572),d=r(3464),c=r(4712),u=r(3848),h=r(4252),p=r(8512);class m extends p.Sheet{constructor(e){super(e),this._worksheetImpl=e,this.initializeEvents().forEach((e=>this.addNewEventType(e)))}get parentDashboard(){if(null==this._worksheetImpl.parentDashboard)throw new s.TableauError(a.SharedErrorCodes.ImplementationError,"Parent dashboard not implemented");return new h.Dashboard(this._worksheetImpl.parentDashboard)}get backgroundColor(){if(null==this._worksheetImpl.backgroundColor)throw new s.TableauError(a.SharedErrorCodes.ImplementationError,"Worksheet background color is not available");return this._worksheetImpl.backgroundColor}get formatting(){if(null==this._worksheetImpl.formatting)throw new s.TableauError(a.SharedErrorCodes.ImplementationError,"Worksheet formatting information is not available");return this._worksheetImpl.formatting}initializeEvents(){const e=new Array;let t;try{t=s.ApiServiceRegistry.get(u.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new s.SingleEventManagerImpl(i.TableauEventType.MarkSelectionChanged);t.registerHandler(n.NotificationId.SelectedMarksChanged,(e=>{const t=e;return this.visualIdsAreEqual(t,this._worksheetImpl.visualId)}),(()=>r.triggerEvent((()=>new l.MarksSelectedEvent(this)))));const a=new s.SingleEventManagerImpl(i.TableauEventType.FilterChanged);t.registerHandler(n.NotificationId.FilterChanged,(e=>{const t=e;return this._worksheetImpl.visualId.worksheet===t.visualId.worksheet}),(e=>{a.triggerEvent((()=>new o.FilterChangedEvent(this,e.fieldName,e.fieldId)))}));const h=new s.SingleEventManagerImpl(i.TableauEventType.SummaryDataChanged);t.registerHandler(n.NotificationId.SummaryDataChanged,(e=>{const t=e;return this._worksheetImpl.visualId.worksheet===t.visualId.worksheet}),(e=>{h.triggerEvent((()=>new d.SummaryDataChangedEvent(this)))}));const p=new s.SingleEventManagerImpl(i.TableauEventType.WorksheetFormattingChanged);return t.registerHandler(n.NotificationId.WorksheetFormattingChanged,(e=>{const t=e;return this._worksheetImpl.visualId.worksheet===t.visualId.worksheet}),(e=>{p.triggerEvent((()=>new c.WorksheetFormattingChangedEvent(this,e)))})),e.push(r),e.push(a),e.push(h),e.push(p),e}applyFilterAsync(e,t,r,a){return this._worksheetImpl.applyFilterAsync(e,t,r,a)}applyRangeFilterAsync(e,t){return this._worksheetImpl.applyRangeFilterAsync(e,t)}applyHierarchicalFilterAsync(e,t,r,a){return this._worksheetImpl.applyHierarchicalFilterAsync(e,t,r,a)}applyRelativeDateFilterAsync(e,t){return this._worksheetImpl.applyRelativeDateFilterAsync(e,t)}clearFilterAsync(e){return this._worksheetImpl.clearFilterAsync(e)}getDataSourcesAsync(){return this._worksheetImpl.getDataSourcesAsync()}getFiltersAsync(){return this._worksheetImpl.getFiltersAsync()}getSelectedMarksAsync(){return this._worksheetImpl.getSelectedMarksAsync()}getHighlightedMarksAsync(){return this._worksheetImpl.getHighlightedMarksAsync()}getSummaryDataAsync(e){return this._worksheetImpl.getSummaryDataAsync(e)}getSummaryDataReaderAsync(e,t){return this._worksheetImpl.getSummaryDataReaderAsync(e,t)}getSummaryColumnsInfoAsync(){return this._worksheetImpl.getSummaryColumnsInfoAsync()}getUnderlyingDataAsync(e){return console.warn("Worksheet.getUnderlyingDataAsync is deprecated. Please use Worksheet.getUnderlyingTablesAsync and Worksheet.getUnderlyingTableDataAsync"),this._worksheetImpl.getUnderlyingDataAsync(e)}getUnderlyingTablesAsync(){return this._worksheetImpl.getUnderlyingTablesAsync()}getUnderlyingTableDataAsync(e,t){return this._worksheetImpl.getUnderlyingTableDataAsync(e,t)}getUnderlyingTableDataReaderAsync(e,t,r){return this._worksheetImpl.getUnderlyingTableDataReaderAsync(e,t,r)}getVisualSpecificationAsync(){return this._worksheetImpl.getVisualSpecificationAsync()}addMarksCardFieldsAsync(e,t,r,a){return this._worksheetImpl.addMarksCardFieldsAsync(e,t,r,a)}moveMarksCardFieldAsync(e,t,r,a=1){return this._worksheetImpl.moveMarksCardFieldAsync(e,t,r,a)}spliceMarksCardFieldsAsync(e,t,r,a,i){return this._worksheetImpl.spliceMarksCardFieldsAsync(e,t,r,a,i)}clearSelectedMarksAsync(){return this._worksheetImpl.clearSelectedMarksAsync()}selectMarksByIDAsync(e,t){return this._worksheetImpl.selectMarksByIdAsync(e,t)}selectMarksByValueAsync(e,t){return this._worksheetImpl.selectMarksByValueAsync(e,t)}selectMarksByIdAsync(e,t){return this._worksheetImpl.selectMarksByIdAsync(e,t)}annotateMarkAsync(e,t){return this._worksheetImpl.annotateMarkAsync(e,t)}getAnnotationsAsync(){return this._worksheetImpl.getAnnotationsAsync()}removeAnnotationAsync(e){return this._worksheetImpl.removeAnnotationAsync(e)}hoverTupleAsync(e,t,r=!0){return this._worksheetImpl.hoverTupleAsync(e,t,r)}selectTuplesAsync(e,t,r){return this._worksheetImpl.selectTuplesAsync(e,t,r)}getTooltipTextAsync(e){return this._worksheetImpl.getTooltipTextAsync(e)}leaveMarkNavigationAsync(){return this._worksheetImpl.leaveMarkNavigationAsync()}editAliasesDialogAsync(e){return this._worksheetImpl.editAliasesDialogAsync(e)}visualIdsAreEqual(e,t){return e&&t&&e.worksheet===t.worksheet&&e.dashboard===t.dashboard&&e.storyboard===t.storyboard&&e.storyPointID===t.storyPointID}}t.Worksheet=m},893:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DashboardContent=class{constructor(e){this._dashboard=e}get dashboard(){return this._dashboard}}},520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136),i=r(8396),n=r(8012);t.Environment=class{constructor(e){this._apiVersion=a.ApiVersion.Instance&&a.ApiVersion.Instance.formattedValue,this._context=a.InternalToExternalEnumMappings.extensionContext.convert(e.extensionContext),this._formatting=n.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(e.workbookFormatting),this._language=e.extensionLanguage,this._country=e.extensionCountry,this._locale=e.extensionLocale,this._mode=a.InternalToExternalEnumMappings.extensionMode.convert(e.extensionMode),this._operatingSystem=e.operatingSystem,this._tableauVersion=e.tableauVersion,this._uniqueUserId=e.uniqueUserId,e.userId&&(this.connectedServer=new i.ConnectedServer(e.userId,e.siteId,e.siteNamespace,e.workbookId),this.featureFlags=e.featureFlags)}get apiVersion(){return this._apiVersion}get context(){return this._context}get workbookFormatting(){return this._formatting}get language(){return this._language}get country(){return this._country}get locale(){return this._locale}get mode(){return this._mode}get operatingSystem(){return this._operatingSystem}get tableauVersion(){return this._tableauVersion}get uniqueUserId(){return this._uniqueUserId}}},5408:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Extensions=class{constructor(e){this.extensionImpl=e,this.extensionImpl=e}get dashboardContent(){return this.extensionImpl.dashboardContent}get worksheetContent(){return this.extensionImpl.worksheetContent}get environment(){return this.extensionImpl.environment}get settings(){return this.extensionImpl.settings}get ui(){return this.extensionImpl.ui}get workbook(){return this.extensionImpl.workbook}get dashboardObjectId(){return this.extensionImpl.extensionZoneId}initializeAsync(e){return this.extensionImpl.initializeAsync(!1,e).then()}initializeDialogAsync(){return this.extensionImpl.initializeAsync(!0)}createVizImageAsync(e){return this.extensionImpl.createVizImageAsync(e)}setClickThroughAsync(e){return this.extensionImpl.setClickThroughAsync(e)}}},3032:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136);class i extends a.EventListenerManager{constructor(e){super(),this._settingsImpl=e,this._settingsImpl.initializeEvents().forEach((e=>this.addNewEventType(e)))}erase(e){this._settingsImpl.erase(e)}get(e){return this._settingsImpl.get(e)}getAll(){return this._settingsImpl.getAll()}get isModified(){return this._settingsImpl.isModified}saveAsync(){return this._settingsImpl.saveAsync()}set(e,t){this._settingsImpl.set(e,t)}}t.Settings=i},1964:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136);class i extends a.EventListenerManager{constructor(e){super(),this._impl=e,this._impl.initializeEvents().forEach((e=>this.addNewEventType(e)))}displayDialogAsync(e,t,r){return this._impl.displayDialogAsync(e,t,r)}sendDialogMessageAsync(e,t){return this._impl.sendDialogMessageAsync(e,t)}closeDialog(e){this._impl.closeDialog(e)}}t.UI=i},8012:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136);t.WorkbookFormattingEnvUtil=class{static convertToWorkbookFormatting(e){if(e)return{formattingSheets:e.formattingSheets.map((e=>{return{classNameKey:a.InternalToExternalEnumMappings.classNameKey.convert(e.classNameKey),cssProperties:(t=e.classNameKey,r=e.cssProperties,"tableau-row-dividers"===t||"tableau-column-dividers"===t?{borderColor:r.borderColor,borderStyle:r.borderStyle,borderWidth:r.borderWidth}:{fontFamily:r.fontFamily,fontSize:r.fontSize,fontWeight:r.fontWeight,fontStyle:r.fontStyle,textDecoration:r.textDecoration,color:r.color})};var t,r}))}}}},7e3:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorksheetContent=class{constructor(e){this._worksheet=e}get worksheet(){return this._worksheet}}},6336:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(5136);class n extends i.ServiceImplBase{get serviceName(){return"InitializationService"}initializeDashboardExtensionsAsync(e,t){const r={[a.ParameterId.FunctionName]:"initializeDashboardExtensionsAsync",[a.ParameterId.ExtensionContextMenuIds]:t,[a.ParameterId.IsExtensionDialog]:e};return this.execute(a.VerbId.InitializeExtension,r).then((e=>e.result))}}t.InitializationServiceImpl=n},5432:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136);class s extends n.ServiceImplBase{get serviceName(){return"SettingsService"}saveSettingsAsync(e){const t={[i.ParameterId.FunctionName]:"saveSettingsAsync",[i.ParameterId.SettingsValues]:e};return this.execute(i.VerbId.SaveExtensionSettings,t).then((e=>{const t=e.result;if(!t||!t.settingsValues)throw new n.TableauError(a.ErrorCodes.InternalError,"Unexpected error savings settings.");return t.settingsValues}))}}t.SettingsServiceImpl=s},752:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136),s=a.DialogStyle.Window;class o extends n.ServiceImplBase{get serviceName(){return"UIService"}displayDialogAsync(e,t,r){const o={[i.ParameterId.FunctionName]:"displayDialogAsync",[i.ParameterId.ExtensionDialogUrl]:e,[i.ParameterId.ExtensionDialogPayload]:t},l=r&&r.height?r.height:400,d=r&&r.width?r.width:600,c=r&&r.dialogStyle?r.dialogStyle:s;if(l<=0||d<=0)throw new n.TableauError(a.ErrorCodes.InvalidParameter,"Size parameters for displayDialogAsync must be positive");return o[i.ParameterId.ExtensionDialogH]=l,o[i.ParameterId.ExtensionDialogW]=d,n.ErrorHelpers.verifyEnumValue(c,a.DialogStyle,"DialogStyle"),o[i.ParameterId.ExtensionDialogStyle]=n.ExternalToInternalEnumMappings.dialogStyles.convert(c),this.execute(i.VerbId.DisplayDialog,o).then((e=>{switch(e.result){case i.ExtensionDialogResult.DialogAlreadyOpen:throw new n.TableauError(a.ErrorCodes.DialogAlreadyOpen,"There already exists an open dialog for this extension.");case i.ExtensionDialogResult.InvalidDomain:throw new n.TableauError(a.ErrorCodes.InvalidDomainDialog,"The url of an extension dialog must match the domain of the parent extension.");default:return}}))}closeDialog(e){const t={[i.ParameterId.FunctionName]:"closeDialog"};return e&&(t[i.ParameterId.ExtensionDialogPayload]=e),this.execute(i.VerbId.CloseDialog,t).then((()=>{}))}sendDialogMessageAsync(e,t){const r={[i.ParameterId.FunctionName]:"sendDialogMessage",[i.ParameterId.ExtensionDialogMessage]:e};return t&&(r[i.ParameterId.ExtensionDialogUrl]=t),this.execute(i.VerbId.SendDialogMessage,r).then((()=>{}))}setClickThroughAsync(e,t){if(n.ErrorHelpers.verifyParameterType(e,"boolean","clickThroughEnabled"),void 0===t||t<=0)throw new n.TableauError(a.ErrorCodes.InternalError,"Extension Id is invalid.");const r={[i.ParameterId.ExtensionZoneId]:t,[i.ParameterId.ClickThroughEnabled]:e};return this.execute(i.VerbId.SetClickThrough,r).then((()=>{}))}}t.UIServiceImpl=o},6616:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136),i=r(6336),n=r(5432),s=r(752),o=r(3848);t.registerAllExtensionsServices=function(e){a.ApiServiceRegistry.get(o.ExtensionsRegistryId).registerService(new n.SettingsServiceImpl(e,o.ExtensionsRegistryId)),a.ApiServiceRegistry.get(o.ExtensionsRegistryId).registerService(new s.UIServiceImpl(e,o.ExtensionsRegistryId))},t.registerInitializationExtensionsServices=function(e){a.ApiServiceRegistry.get(o.ExtensionsRegistryId).registerService(new i.InitializationServiceImpl(e,o.ExtensionsRegistryId))}},3848:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExtensionsRegistryId=0},268:(e,t,r)=>{"use strict";function a(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),a(r(4171));var i=r(3536);t.ApiMenuType=i.ApiMenuType,t.CrosstabFileFormat=i.CrosstabFileFormat,t.DeviceType=i.DeviceType,t.EmbeddingErrorCodes=i.EmbeddingErrorCodes,t.EmbeddingTableauEventType=i.TableauEventType,t.FileFormats=i.FileFormats,t.PrintOrientation=i.PrintOrientation,t.PrintPageSize=i.PrintPageSize,t.PrintScaling=i.PrintScaling,t.PulseErrorMessageVisibility=i.PulseErrorMessageVisibility,t.PulseLayout=i.PulseLayout,t.PulseTimeDimension=i.PulseTimeDimension,t.SheetSizeBehavior=i.SheetSizeBehavior,t.TableauDialogType=i.TableauDialogType,t.Toolbar=i.Toolbar,a(r(828)),a(r(3432)),a(r(1480)),a(r(5488))},5840:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=r(4744);t.ErrorCodes=a.ErrorCodes,t.ExtensionContext=a.ExtensionContext,t.ExtensionMode=a.ExtensionMode,t.TableauEventType=a.TableauEventType,t.VizImageEncodingType=a.VizImageEncodingType,t.VizImagePaletteType=a.VizImagePaletteType,t.VizImageSizeSettingAlignmentType=a.VizImageSizeSettingAlignmentType,t.VizImageSizeSettingType=a.VizImageSizeSettingType,t.VizImageSortDirectionType=a.VizImageSortDirectionType,function(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}(r(5488))},7419:(e,t,r)=>{"use strict";function a(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),a(r(268)),a(r(5840))},4171:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.AskDataAttributes||(t.AskDataAttributes={})).Origin="origin",r.ShowEmbed="show-embed",r.ShowPin="show-pin",r.ShowSave="show-save",r.ShowShare="show-share"},3536:(e,t)=>{"use strict";var r,a,i,n,s,o,l,d,c,u,h,p,m,g,y,I;Object.defineProperty(t,"__esModule",{value:!0}),(I=t.CrosstabFileFormat||(t.CrosstabFileFormat={})).CSV="csv",I.Excel="xlsx",(y=t.DeviceType||(t.DeviceType={})).Default="default",y.Desktop="desktop",y.Tablet="tablet",y.Phone="phone",(g=t.EmbeddingErrorCodes||(t.EmbeddingErrorCodes={})).AuthFailed="auth-failed",g.BrowserNotCapable="browser-not-capable",g.DownloadWorkbookNotAllowed="download-workbook-not-allowed",g.FilterCannotBePerformed="filter-cannot-be-performed",g.IndexOutOfRange="index-out-of-range",g.InternalError="internal-error",g.InvalidCustomViewName="invalid-custom-view-name",g.InvalidDateParameter="invalid-date-parameter",g.invalidFilterFieldNameOrValue="invalid-filter-field-name",g.InvalidParameter="invalid-parameter",g.InvalidTimeDimension="invalid-time-dimension",g.InvalidSize="invalid-size",g.InvalidSheetType="invalid-sheet-type",g.InvalidSizeBehavior="invalid-size-behavior",g.InvalidSizeBehaviorOnWorksheet="invalid-size-behavior-on-worksheet",g.InvalidUrl="invalid-url",g.MissingMaxSize="missing-max-size",g.MissingMinSize="missing-min-size",g.MissingMinMaxSize="missing-min-max-size",g.MissingParameter="missing-parameter",g.MissingRangeNForRelativeDateFilters="missing-range-n-for-relative-date-filters",g.NoUrlForHiddenWorksheet="no-url-for-hidden-worksheet",g.NoUrlOrParentElementNotFound="no-url-or-parent-element-not-found",g.NotActiveSheet="not-active-sheet",g.NullOrEmptyParameter="null-or-empty-parameter",g.SheetNotInWorkbook="sheet-not-in-workbook",g.StaleDataReference="stale-data-reference",g.UnknownAuthError="unknown-auth-error",g.UnsupportedEventName="unsupported-event-name",g.VizAlreadyInManager="viz-already-in-manager",g.ImplementationError="wrong-implementation",g.NotImplemented="not-implemented",g.EventInitializationError="event-initialization-error",g.IncompatibleVersionError="incompatible-version-error",g.UnknownDialogType="unknown-dialog-type",g.FilterMissingOrNotImplemented="filter-missing-not-implemented",g.StoryPointIdMismatch="storypoint-id-mismatch",(m=t.FileFormats||(t.FileFormats={})).PDF="pdf",m.PNG="png",(p=t.PrintOrientation||(t.PrintOrientation={})).Portrait="portrait",p.Landscape="landscape",(h=t.PrintPageSize||(t.PrintPageSize={})).Letter="letter",h.Legal="legal",h.Note="note",h.Folio="folio",h.Tabloid="tabloid",h.Ledger="ledger",h.Statement="statement",h.Executive="executive",h.A3="A3",h.A4="A4",h.A5="A5",h.B4="B4",h.B5="B5",h.Quarto="quarto",h.Unspecified="unspecified",(u=t.PrintScaling||(t.PrintScaling={})).Automatic="automatic",u.Perc25="25%",u.Perc50="50%",u.Perc60="60%",u.Perc75="75%",u.Perc80="80%",u.Perc90="90%",u.Perc100="100%",u.Perc200="200%",u.Perc400="400%",u.AtMost1PageHigh="at-most-1-page-high",u.AtMost2PagesHigh="at-most-2-pages-high",u.AtMost1PageWide="at-most-1-page-wide",u.AtMost2PagesWide="at-most-2-pages-wide",(c=t.RevertVizSelection||(t.RevertVizSelection={})).All="all",c.Axes="axes",c.Filters="filters",c.Sorts="sorts",c.Shelves="shelves",(d=t.ToolbarButtons||(t.ToolbarButtons={})).Alerts="alerts",d.AskData="askData",d.CustomViews="customViews",d.DataDetails="dataDetails",d.Share="share",d.Subscribe="subscribe",(l=t.Toolbar||(t.Toolbar={})).Top="top",l.Bottom="bottom",l.Hidden="hidden",(o=t.SheetSizeBehavior||(t.SheetSizeBehavior={})).Automatic="automatic",o.Exactly="exactly",o.Range="range",o.AtLeast="atleast",o.AtMost="atmost",(s=t.PulseLayout||(t.PulseLayout={})).Default="default",s.Card="card",s.Ban="ban",(n=t.PulseTimeDimension||(t.PulseTimeDimension={})).Today="Today",n.Yesterday="Yesterday",n.WeekToDate="WeekToDate",n.LastWeek="LastWeek",n.MonthToDate="MonthToDate",n.LastMonth="LastMonth",n.QuarterToDate="QuarterToDate",n.LastQuarter="LastQuarter",n.YearToDate="YearToDate",n.LastYear="LastYear",(i=t.PulseErrorMessageVisibility||(t.PulseErrorMessageVisibility={})).Visible="visible",i.Hidden="hidden",i.Suppressed="suppressed",(a=t.TableauEventType||(t.TableauEventType={})).CustomViewLoaded="customviewloaded",a.CustomViewRemoved="customviewremoved",a.CustomViewSaved="customviewsaved",a.CustomViewSetDefault="customviewsetdefault",a.EditButtonClicked="editbuttonclicked",a.EditInDesktopButtonClicked="editindesktopbuttonclicked",a.FilterChanged="filterchanged",a.FirstVizSizeKnown="firstvizsizeknown",a.FirstInteractive="firstinteractive",a.CustomMarkContextMenuEvent="custommarkcontextmenu",a.MarkSelectionChanged="markselectionchanged",a.ParameterChanged="parameterchanged",a.ToolbarStateChanged="toolbarstatechanged",a.WorkbookReadyToClose="workbookreadytoclose",a.WorkbookPublished="workbookpublished",a.WorkbookPublishedAs="workbookpublishedas",a.UrlAction="urlaction",a.TabSwitched="tabswitched",a.StoryPointSwitched="storypointswitched",a.VizLoadError="vizloaderror",a.IframeSrcUpdated="iframesrcupdated",a.SummaryDataChanged="summarydatachanged",a.ReadyToReceiveAuthToken="readytoreceiveauthtoken",a.FirstPulseMetricSizeKnown="firstpulsemetricsizeknown",a.PulseError="pulseerror",a.PulseFiltersChanged="pulsefilterschanged",a.PulseInsightDiscovered="pulseinsightdiscovered",a.PulseMetricSizeChanged="pulsemetricsizechanged",a.PulseTimeDimensionChanged="pulsetimedimensionchanged",a.PulseUrlChanged="pulseurlchanged",(t.ApiMenuType||(t.ApiMenuType={})).Ubertip="ubertip",(r=t.TableauDialogType||(t.TableauDialogType={})).ExportPDF="export-pdf",r.ExportPowerPoint="export-powerpoint",r.ExportData="export-data",r.ExportCrossTab="export-cross-tab",r.ExportWorkbook="export-workbook",r.Share="share"},828:(e,t)=>{"use strict";var r,a,i;Object.defineProperty(t,"__esModule",{value:!0}),(i=t.PulseAttributes||(t.PulseAttributes={})).DisableExploreFilter="disable-explore-filter",i.Layout="layout",i.OnFirstInteractive="onFirstInteractive",i.OnFirstPulseMetricSizeKnown="onFirstPulseMetricSizeKnown",i.OnPulseUrlError="onPulseError",i.OnPulseFiltersChanged="onPulseFiltersChanged",i.OnPulseInsightDiscovered="onPulseInsightDiscovered",i.OnPulseMetricSizeChanged="onPulseMetricSizeChanged",i.OnPulseTimeDimensionChanged="onPulseTimeDimensionChanged",i.OnPulseUrlChanged="onPulseUrlChanged",i.TimeDimension="time-dimension",i.TokenOptional="token-optional",(a=t.PulseChildElements||(t.PulseChildElements={})).IframeStyle="iframe-style",a.ThemeParameter="theme-parameter",a.PulseFilter="pulse-filter",(r=t.PulseChildElementAttributes||(t.PulseChildElementAttributes={})).Name="name",r.Field="field",r.Value="value",r.Type="type"},3432:(e,t)=>{"use strict";var r,a,i,n,s;Object.defineProperty(t,"__esModule",{value:!0}),(s=t.VizSharedAttributes||(t.VizSharedAttributes={})).TouchOptimize="touch-optimize",s.HideEditInDesktopButton="hide-edit-in-desktop-button",s.SuppressDefaultEditBehavior="suppress-default-edit-behavior",s.DisableVersionCheck="disable-version-check",s.OnEditInDesktopButtonClicked="onEditInDesktopButtonClicked",s.OnFirstVizSizeKnown="onFirstVizSizeKnown",s.OnFirstInteractive="onFirstInteractive",(n=t.VizAttributes||(t.VizAttributes={})).DisableUrlActionsPopups="disable-url-actions",n.HideTabs="hide-tabs",n.Toolbar="toolbar",n.InstanceIdToClone="instance-id-to-clone",n.Device="device",n.HideEditButton="hide-edit-button",n.OnEditButtonClicked="onEditButtonClicked",n.OnFilterChanged="onFilterChanged",n.OnCustomMarkContextMenuEvent="onCustomMarkContextMenuEvent",n.OnMarkSelectionChanged="onMarkSelectionChanged",n.OnParameterChanged="onParameterChanged",n.OnToolbarStateChanged="onToolbarStateChanged",n.OnUrlAction="onUrlAction",n.OnTabSwitched="onTabSwitched",n.OnCustomViewLoaded="onCustomViewLoaded",n.OnCustomViewRemoved="onCustomViewRemoved",n.OnCustomViewSaved="onCustomViewSaved",n.OnCustomViewSetDefault="onCustomViewSetDefault",n.OnStoryPointSwitched="onStoryPointSwitched",n.OnSummaryDataChanged="onSummaryDataChanged",n.OnReadyToReceiveAuthToken="onReadyToReceiveAuthToken",(i=t.VizAuthoringAttributes||(t.VizAuthoringAttributes={})).OnWorkbookPublished="onWorkbookPublished",i.OnWorkbookPublishedAs="onWorkbookPublishedAs",i.OnWorkbookReadyToClose="onWorkbookReadyToClose",i.HideCloseButton="hide-close-button",(a=t.VizChildElements||(t.VizChildElements={})).VizFilter="viz-filter",a.VizParameter="viz-parameter",a.CustomParameter="custom-parameter",a.IframeStyle="iframe-style",(r=t.VizChildElementAttributes||(t.VizChildElementAttributes={})).Field="field",r.Value="value",r.Name="name"},1480:(e,t)=>{"use strict";var r,a,i,n;Object.defineProperty(t,"__esModule",{value:!0}),(n=t.WebComponentAttributes||(t.WebComponentAttributes={})).Src="src",n.Width="width",n.Height="height",n.Token="token",n.Debug="debug",n.IframeAuth="iframe-auth",n.OnVizLoadError="onvizloaderror",n.ForceTokenSync="force-token-sync",(i=t.EmbeddedIframeAttributes||(t.EmbeddedIframeAttributes={})).Loading="iframe-attr-loading",i.Style="iframe-attr-style",i.Class="iframe-attr-class",(a=t.WebComponentChildElements||(t.WebComponentChildElements={})).CustomParameter="custom-parameter",a.IframeStyle="iframe-style",(r=t.WebComponentChildElementAttributes||(t.WebComponentChildElementAttributes={})).Field="field",r.Value="value",r.Name="name"},4744:e=>{"use strict";var t;!function(e){let t,r,a,i,n,s,o,l,d;!function(e){e.APINotInitialized="api-not-initialized",e.VisibilityError="visibility-error",e.DialogAlreadyOpen="dialog-already-open",e.DialogClosedByUser="dialog-closed-by-user",e.InternalError="internal-error",e.InvalidDomainDialog="invalid-dialog-domain",e.InvalidParameter="invalid-parameter",e.MissingFilter="missing-filter",e.MissingParameter="missing-parameter",e.ServerError="server-error",e.SettingSaveInProgress="setting-save-in-progress",e.UnsupportedEventName="unsupported-event-name",e.UnsupportedMethodForDataSourceType="unsupported-method-for-data-source-type"}(t=e.ErrorCodes||(e.ErrorCodes={})),function(e){e.Desktop="desktop",e.Server="server",e.Cloud="cloud",e.PublicWeb="public-web",e.PublicDesktop="public-desktop"}(r=e.ExtensionContext||(e.ExtensionContext={})),function(e){e.Authoring="authoring",e.Viewing="viewing"}(a=e.ExtensionMode||(e.ExtensionMode={})),function(e){e.DialogMessageReceived="dialog-message-received",e.FilterChanged="filter-changed",e.MarkSelectionChanged="mark-selection-changed",e.SummaryDataChanged="summary-data-changed",e.ParameterChanged="parameter-changed",e.SettingsChanged="settings-changed",e.DashboardLayoutChanged="dashboard-layout-changed",e.WorkbookFormattingChanged="workbook-formatting-changed",e.WorksheetFormattingChanged="worksheet-formatting-changed"}(i=e.TableauEventType||(e.TableauEventType={})),function(e){e.Discrete="discrete",e.Continuous="continuous"}(n=e.VizImageEncodingType||(e.VizImageEncodingType={})),function(e){e.Ascending="ascending",e.Descending="descending"}(s=e.VizImageSortDirectionType||(e.VizImageSortDirectionType={})),function(e){e.CustomDiverging="custom-diverging",e.CustomSequential="custom-sequential"}(o=e.VizImagePaletteType||(e.VizImagePaletteType={})),function(e){e.Fixed="fixed",e.Manual="manual"}(l=e.VizImageSizeSettingType||(e.VizImageSizeSettingType={})),function(e){e.Right="right",e.Left="left",e.Center="center"}(d=e.VizImageSizeSettingAlignmentType||(e.VizImageSizeSettingAlignmentType={}))}(t||(t={})),e.exports=t},4912:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.SharedErrorCodes||(t.SharedErrorCodes={})).CrosstabCreationError="crosstab-creation-error",r.DataCreationError="data-creation-error",r.InvalidAggregationFieldName="invalid-aggregation-field-name",r.InvalidFilterFieldName="invalid-filter-name",r.InvalidFilterFieldValue="invalid-filter-fieldValue",r.InvalidSelectionDate="invalid-selection-date",r.InvalidSelectionFieldName="invalid-selection-fieldName",r.InvalidSelectionValue="invalid-selection-value",r.InvalidSelectionSheet="invalid-selection-sheet",r.InternalError="internal-error",r.InvalidParameter="invalid-parameter",r.PDFCreationError="pdf-creation-error",r.PowerPointCreationError="powerpoint-creation-error",r.NotActiveSheet="not-active-sheet",r.ImplementationError="wrong-implementation",r.ApiExecutionError="api-execution-error",r.ServerError="server-error",r.Timeout="timeout"},808:e=>{"use strict";var t;!function(e){let t,r,a,i,n,s,o,l,d,c,u,h,p,m,g,y,I,v,S,T,b,f,E,A,P,_,w,D,C;!function(e){e.Cluster="cluster",e.Forecast="forecast",e.TrendLine="trend-line"}(t=e.AnalyticsObjectType||(e.AnalyticsObjectType={})),function(e){e.Mark="mark",e.Point="point",e.Area="area"}(r=e.AnnotationType||(e.AnnotationType={})),function(e){e.Discrete="discrete",e.Continuous="continuous",e.Unknown="unknown"}(a=e.ColumnType||(e.ColumnType={})),function(e){e.WorksheetTitle="tableau-worksheet-title",e.Worksheet="tableau-worksheet",e.Tooltip="tableau-tooltip",e.StoryTitle="tableau-story-title",e.DashboardTitle="tableau-dashboard-title",e.Pane="tableau-pane",e.RowDividers="tableau-row-dividers",e.ColumnDividers="tableau-column-dividers"}(i=e.ClassNameKey||(e.ClassNameKey={})),function(e){e.Blank="blank",e.Worksheet="worksheet",e.QuickFilter="quick-filter",e.ParameterControl="parameter-control",e.PageFilter="page-filter",e.Legend="legend",e.Title="title",e.Text="text",e.Image="image",e.WebPage="web-page",e.Extension="extension"}(n=e.DashboardObjectType||(e.DashboardObjectType={})),function(e){e.Show="show",e.Hide="hide"}(s=e.DashboardObjectVisibilityType||(e.DashboardObjectVisibilityType={})),function(e){e.String="string",e.Int="int",e.Float="float",e.Bool="bool",e.Date="date",e.DateTime="date-time",e.Spatial="spatial",e.Unknown="unknown"}(o=e.DataType||(e.DataType={})),function(e){e.Added="added",e.Removed="removed",e.IsFloatingChanged="is-floating-changed",e.IsVisibleChanged="is-visible-changed",e.PositionChanged="position-changed",e.SizeChanged="size-changed",e.NameChanged="name-changed",e.Selected="selected",e.Deselected="deselected",e.DashboardChanged="dashboard-changed"}(l=e.DashboardLayoutChange||(e.DashboardLayoutChange={})),function(e){e.Last="last",e.LastN="last-n",e.Next="next",e.NextN="next-n",e.Current="current",e.ToDate="to-date"}(d=e.DateRangeType||(e.DateRangeType={})),function(e){e.Window="window",e.Modal="modal",e.Modeless="modeless"}(c=e.DialogStyle||(e.DialogStyle={})),function(e){e.Column="column",e.Row="row",e.Page="page",e.Filter="filter",e.MarksType="marks-type",e.MeasureValues="measure-values",e.Color="color",e.Size="size",e.Label="label",e.Detail="detail",e.Tooltip="tooltip",e.Shape="shape",e.Path="path",e.Angle="angle",e.Geometry="geometry",e.Custom="custom"}(u=e.EncodingType||(e.EncodingType={})),function(e){e.Sum="sum",e.Avg="avg",e.Min="min",e.Max="max",e.Stdev="stdev",e.Stdevp="stdevp",e.Var="var",e.Varp="varp",e.Collect="collect",e.Count="count",e.Countd="countd",e.Median="median",e.Attr="attr",e.None="none",e.Year="year",e.Qtr="qtr",e.Month="month",e.Day="day",e.Hour="hour",e.Minute="minute",e.Second="second",e.Week="week",e.Weekday="weekday",e.MonthYear="month-year",e.Mdy="mdy",e.End="end",e.TruncYear="trunc-year",e.TruncQtr="trunc-qtr",e.TruncMonth="trunc-month",e.TruncWeek="trunc-week",e.TruncDay="trunc-day",e.TruncHour="trunc-hour",e.TruncMinute="trunc-minute",e.TruncSecond="trunc-second",e.Quart1="quart1",e.Quart3="quart3",e.Skewness="skewness",e.Kurtosis="kurtosis",e.InOut="in-out",e.User="user"}(h=e.FieldAggregationType||(e.FieldAggregationType={})),function(e){e.Dimension="dimension",e.Measure="measure",e.Unknown="unknown"}(p=e.FieldRoleType||(e.FieldRoleType={})),function(e){e.Categorical="categorical",e.Range="range",e.Hierarchical="hierarchical",e.RelativeDate="relative-date"}(m=e.FilterType||(e.FilterType={})),function(e){e.Add="add",e.All="all",e.Replace="replace",e.Remove="remove"}(g=e.FilterUpdateType||(e.FilterUpdateType={})),function(e){e.Relevant="relevant",e.Database="database"}(y=e.FilterDomainType||(e.FilterDomainType={})),function(e){e.NullValues="null-values",e.NonNullValues="non-null-values",e.AllValues="all-values"}(I=e.FilterNullOption||(e.FilterNullOption={})),function(e){e.AllValues="all-values",e.OnlyNativeValues="only-native-values",e.OnlyFormattedValues="only-formatted-values"}(v=e.IncludeDataValuesOption||(e.IncludeDataValuesOption={})),function(e){e.Bar="bar",e.Line="line",e.Area="area",e.Square="square",e.Circle="circle",e.Shape="shape",e.Text="text",e.Map="map",e.Pie="pie",e.GanttBar="gantt-bar",e.Polygon="polygon",e.Heatmap="heatmap",e.VizExtension="viz-extension"}(S=e.MarkType||(e.MarkType={})),function(e){e.All="all",e.List="list",e.Range="range"}(T=e.ParameterValueType||(e.ParameterValueType={})),function(e){e.Years="years",e.Quarters="quarters",e.Months="months",e.Weeks="weeks",e.Days="days",e.Hours="hours",e.Minutes="minutes",e.Seconds="seconds"}(b=e.PeriodType||(e.PeriodType={})),function(e){e.RunningTotal="running-total",e.Difference="difference",e.PercentDifference="percent-difference",e.PercentOfTotal="percent-of-total",e.Rank="rank",e.Percentile="percentile",e.MovingAverage="moving-average",e.YTDTotal="ytd-total",e.CompoundGrowthRate="compound-growth-rate",e.YearOverYearGrowth="year-over-year-growth",e.YTDGrowth="ytd-growth",e.Undefined="undefined"}(f=e.QuickTableCalcType||(e.QuickTableCalcType={})),function(e){e.Replace="select-replace",e.Add="select-add",e.Remove="select-remove"}(E=e.SelectionUpdateType||(e.SelectionUpdateType={})),function(e){e.Simple="select-options-simple",e.Toggle="select-options-toggle"}(A=e.SelectOptions||(e.SelectOptions={})),function(e){e.Dashboard="dashboard",e.Story="story",e.Worksheet="worksheet"}(P=e.SheetType||(e.SheetType={})),function(e){e.Increasing="increasing",e.Decreasing="decreasing"}(_=e.SortDirection||(e.SortDirection={})),function(e){e.Linear="linear",e.Logarithmic="logarithmic",e.Exponential="exponential",e.Polynomial="polynomial"}(w=e.TrendLineModelType||(e.TrendLineModelType={})),function(e){e.Slow="slow",e.Normal="normal",e.Fast="fast"}(D=e.ReplaySpeedType||(e.ReplaySpeedType={})),function(e){e.AllSelected="all-selected",e.NoneSelected="none-selected",e.SomeSelected="some-selected",e.UnknownSelected="unknown-selected"}(C=e.HierarchicalLevelSelectionState||(e.HierarchicalLevelSelectionState={})),e.ZoneVisibilityType=Object.assign({},s)}(t||(t={})),e.exports=t},5488:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}(r(4912));var a=r(808);t.AnalyticsObjectType=a.AnalyticsObjectType,t.AnnotationType=a.AnnotationType,t.ClassNameKey=a.ClassNameKey,t.ColumnType=a.ColumnType,t.DashboardLayoutChange=a.DashboardLayoutChange,t.DashboardObjectType=a.DashboardObjectType,t.DashboardObjectVisibilityType=a.DashboardObjectVisibilityType,t.DataType=a.DataType,t.DateRangeType=a.DateRangeType,t.DialogStyle=a.DialogStyle,t.EncodingType=a.EncodingType,t.FieldAggregationType=a.FieldAggregationType,t.FieldRoleType=a.FieldRoleType,t.FilterDomainType=a.FilterDomainType,t.FilterNullOption=a.FilterNullOption,t.FilterType=a.FilterType,t.FilterUpdateType=a.FilterUpdateType,t.HierarchicalLevelSelectionState=a.HierarchicalLevelSelectionState,t.IncludeDataValuesOption=a.IncludeDataValuesOption,t.MarkType=a.MarkType,t.ParameterValueType=a.ParameterValueType,t.PeriodType=a.PeriodType,t.QuickTableCalcType=a.QuickTableCalcType,t.ReplaySpeedType=a.ReplaySpeedType,t.SelectOptions=a.SelectOptions,t.SelectionUpdateType=a.SelectionUpdateType,t.SheetType=a.SheetType,t.SortDirection=a.SortDirection,t.TrendLineModelType=a.TrendLineModelType,t.ZoneVisibilityType=a.ZoneVisibilityType},3448:(e,t,r)=>{"use strict";function a(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});const i=r(5892);t.INTERNAL_CONTRACT_VERSION=i,a(r(6716)),a(r(1080)),a(r(5824)),a(r(4547)),a(r(2400)),a(r(2496)),a(r(2472)),a(r(552)),a(r(3256)),a(r(7204)),a(r(4528)),a(r(3388)),a(r(3760)),t.MESSAGING_VERSION={major:1,minor:0,fix:0}},6716:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(1080);class i{static isSpecial(e){return e.length>2&&"%"===e[0]&&"%"===e[e.length-1]}static parseBoolean(e){const t=e.toLowerCase();return"true"!==t&&"false"!==t?this.specialValueIndicator:"true"===t}static parseNumber(e){const t=Number(e);return isNaN(t)?this.specialValueIndicator:t}static parseDate(e){const t=new Date(e);return Number.isNaN(t.getTime())?null:t}static parseDateTime(e){const t=e.replace(" ","T").concat("Z"),r=new Date(t);return Number.isNaN(r.getTime())?null:r}static convertValueAsStringToValue(e,t){if(null!=e){if(this.isSpecial(e))return e;switch(t){case a.DataType.Bool:return this.parseBoolean(e);case a.DataType.Int:case a.DataType.Float:return this.parseNumber(e);case a.DataType.Date:return null===this.parseDate(e)?this.specialValueIndicator:e;case a.DataType.DateTime:return null===this.parseDateTime(e)?this.specialValueIndicator:e;case a.DataType.Spatial:case a.DataType.String:default:return e}}}static convertValueToNativeValue(e,t){if(null==e)return null;switch(t){case a.DataType.Bool:case a.DataType.Int:case a.DataType.Float:return"string"==typeof e?null:e;case a.DataType.Date:return this.parseDate(e);case a.DataType.DateTime:return this.parseDateTime(e);case a.DataType.String:return this.isSpecial(e)?null:e;case a.DataType.Spatial:default:return e}}static convertStringValueToNativeValue(e,t){return this.convertValueToNativeValue(this.convertValueAsStringToValue(e,t),t)}}t.DataTypeConverter=i,i.specialValueIndicator="%null%"},1080:(e,t)=>{"use strict";var r,a,i,n,s,o,l,d,c,u,h,p,m,g,y,I,v,S,T,b,f,E,A,P,_,w,D,C,F,x,M,k,N,R;Object.defineProperty(t,"__esModule",{value:!0}),(R=t.ExtensionContext||(t.ExtensionContext={})).Desktop="desktop",R.Server="server",R.Unknown="unknown",R.Cloud="cloud",R.PublicWeb="public-web",R.PublicDesktop="public-desktop",(N=t.ExtensionMode||(t.ExtensionMode={})).Authoring="authoring",N.Viewing="viewing",N.Unknown="unknown",(k=t.AnnotateEnum||(t.AnnotateEnum={})).Mark="mark",k.Point="point",k.Area="area",(M=t.ColumnType||(t.ColumnType={})).Discrete="discrete",M.Continuous="continuous",M.Unknown="unknown",(x=t.DashboardObjectType||(t.DashboardObjectType={})).Blank="blank",x.Worksheet="worksheet",x.QuickFilter="quick-filter",x.ParameterControl="parameter-control",x.PageFilter="page-filter",x.Legend="legend",x.Title="title",x.Text="text",x.Image="image",x.WebPage="web-page",x.Extension="extension",(F=t.DataType||(t.DataType={})).String="string",F.Int="int",F.Float="float",F.Bool="bool",F.Date="date",F.DateTime="date-time",F.Spatial="spatial",F.Unknown="unknown",(C=t.DialogStyle||(t.DialogStyle={})).Window="window",C.Modal="modal",C.Modeless="modeless",(D=t.EncodedDataType||(t.EncodedDataType={})).Number="number",D.String="string",D.Date="date",D.Boolean="boolean",(w=t.ErrorCodes||(t.ErrorCodes={})).INITIALIZATION_ERROR="initialization-error",w.INTERNAL_ERROR="internal-error",w.MISSING_ENUM_MAPPING="missing-enum-mapping",w.MISSING_PARAMETER="missing-parameter",w.PERMISSION_DENIED="permission-denied",w.PRES_MODEL_PARSING_ERROR="pres-model-parsing-error",w.VERSION_NOT_CONFIGURED="version-not-configured",w.VISIBILITY_ERROR="visibility-error",w.UNKNOWN_VERB_ID="unknown-verb-id",(_=t.FieldAggregationType||(t.FieldAggregationType={})).Sum="sum",_.Avg="avg",_.Min="min",_.Max="max",_.Stdev="stdev",_.Stdevp="stdevp",_.Var="var",_.Varp="varp",_.Collect="collect",_.Count="count",_.Countd="countd",_.Median="median",_.Attr="attr",_.None="none",_.Year="year",_.Qtr="qtr",_.Month="month",_.Day="day",_.Hour="hour",_.Minute="minute",_.Second="second",_.Week="week",_.Weekday="weekday",_.MonthYear="month-year",_.Mdy="mdy",_.End="end",_.TruncYear="trunc-year",_.TruncQtr="trunc-qtr",_.TruncMonth="trunc-month",_.TruncWeek="trunc-week",_.TruncDay="trunc-day",_.TruncHour="trunc-hour",_.TruncMinute="trunc-minute",_.TruncSecond="trunc-second",_.Quart1="quart1",_.Quart3="quart3",_.Skewness="skewness",_.Kurtosis="kurtosis",_.InOut="in-out",_.User="user",(P=t.FieldRoleType||(t.FieldRoleType={})).Dimension="dimension",P.Measure="measure",P.Unknown="unknown",(A=t.FilterUpdateType||(t.FilterUpdateType={})).Add="add",A.All="all",A.Replace="replace",A.Remove="remove",(E=t.SheetType||(t.SheetType={})).Dashboard="dashboard",E.Story="story",E.Worksheet="worksheet",(f=t.DomainRestrictionType||(t.DomainRestrictionType={})).All="all",f.List="list",f.Range="range",(b=t.DateStepPeriod||(t.DateStepPeriod={})).Years="years",b.Quarters="quarters",b.Months="months",b.Weeks="weeks",b.Days="days",b.Hours="hours",b.Minutes="minutes",b.Seconds="seconds",(T=t.FilterNullOption||(t.FilterNullOption={})).NullValues="nullvalues",T.NonNullValues="nonnullvalues",T.AllValues="allvalues",(S=t.FilterDomainType||(t.FilterDomainType={})).Relevant="relevant",S.Database="database",(v=t.SelectionUpdateType||(t.SelectionUpdateType={})).Replace="select-replace",v.Add="select-add",v.Remove="select-remove",(I=t.SelectOptions||(t.SelectOptions={})).Simple="select-options-simple",I.Toggle="select-options-toggle",I.Menu="select-options-menu",I.Range="select-options-range",I.Search="select-options-search",(y=t.QuantitativeIncludedValues||(t.QuantitativeIncludedValues={})).IncludeNull="include-null",y.IncludeNonNull="include-non-null",y.IncludeAll="include-all",(g=t.HierarchicalLevelSelectionState||(t.HierarchicalLevelSelectionState={})).AllSelected="all-selected",g.NoneSelected="none-selected",g.SomeSelected="some-selected",g.UnknownSelected="unknown-selected",(m=t.MarkType||(t.MarkType={})).Bar="bar",m.Line="line",m.Area="area",m.Square="square",m.Circle="circle",m.Shape="shape",m.Text="text",m.Map="map",m.Pie="pie",m.GanttBar="gantt-bar",m.Polygon="polygon",m.Heatmap="heatmap",m.VizExtension="viz-extension",(p=t.FilterType||(t.FilterType={})).Categorical="categorical",p.Range="range",p.RelativeDate="relativeDate",p.Hierarchical="hierarchical",(h=t.DateRangeType||(t.DateRangeType={})).Last="last",h.LastN="lastN",h.Next="next",h.NextN="nextN",h.Current="current",h.ToDate="toDate",(u=t.ExtensionDialogResult||(t.ExtensionDialogResult={})).DialogAlreadyOpen="dialog-already-open",u.InvalidDomain="invalid-domain",u.Success="success",(c=t.ApiShowDataTableFormat||(t.ApiShowDataTableFormat={})).NativeValuesOnly="native-values-only",c.FormattedValuesOnly="formatted-values-only",c.NativeAndFormattedValues="native-and-formatted-values",(d=t.PageSizeOption||(t.PageSizeOption={})).Letter="letter",d.Legal="legal",d.Note="note",d.Folio="folio",d.Tabloid="tabloid",d.Ledger="ledger",d.Statement="statement",d.Executive="executive",d.A3="a3",d.A4="a4",d.A5="a5",d.B4="b4",d.B5="b5",d.Quarto="quarto",d.Unspecified="unspecified",(l=t.PageOrientation||(t.PageOrientation={})).Printer="printer",l.Portrait="portrait",l.Landscape="landscape",(o=t.ScaleMode||(t.ScaleMode={})).ScaleAuto="auto",o.ScalePercentage="percent",o.ScaleFitPages="fit-pages",(s=t.PageScalingOption||(t.PageScalingOption={})).ScalePctAuto="auto",s.ScalePct400="pct400",s.ScalePct200="pct200",s.ScalePct100="pct100",s.ScalePct90="pct90",s.ScalePct80="pct80",s.ScalePct75="pct75",s.ScalePct60="pct60",s.ScalePct50="pct50",s.ScalePct25="pct25",(n=t.FitPages||(t.FitPages={})).FitOneHigh="fit0x1",n.FitTwoHigh="fit0x2",n.FitOneWide="fit1x0",n.FitTwoWide="fit2x0",(i=t.EncodingType||(t.EncodingType={})).Color="color",i.Size="size",i.Label="label",i.Detail="detail",i.Tooltip="tooltip",i.Shape="shape",i.Path="path",i.Angle="angle",i.Geometry="geometry",i.Custom="custom",(a=t.PulseTimeDimension||(t.PulseTimeDimension={})).Today="Today",a.Yesterday="Yesterday",a.WeekToDate="WeekToDate",a.LastWeek="LastWeek",a.MonthToDate="MonthToDate",a.LastMonth="LastMonth",a.QuarterToDate="QuarterToDate",a.LastQuarter="LastQuarter",a.YearToDate="YearToDate",a.LastYear="LastYear",(r=t.PulseErrorMessageVisibility||(t.PulseErrorMessageVisibility={})).Visible="visible",r.Hidden="hidden",r.Suppressed="suppressed"},5824:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.NotificationId||(t.NotificationId={})).CustomMarkContextMenuClicked="custom-mark-context-menu-clicked",r.ContextMenuClick="context-menu-click",r.CustomViewRemoved="custom-view-removed",r.CustomViewSaved="custom-view-saved",r.CustomViewSetDefault="custom-view-set-default",r.CustomViewsLoaded="custom-views-loaded",r.DashboardLayoutChanged="dashboard-layout-changed",r.EditButtonClicked="edit-button-clicked",r.EditInDesktopButtonClicked="edit-in-desktop-button-clicked",r.ExtensionDialogUpdate="extension-dialog-update",r.ExtensionDialogMessage="extension-dialog-message",r.FilterChanged="filter-changed",r.FirstVizSizeKnown="first-viz-size-known",r.FirstPulseMetricSizeKnown="first-pulse-metric-size-known",r.ParameterChanged="parameter-changed",r.PulseError="pulse-error",r.PulseFiltersChanged="pulse-filters-changed",r.PulseMetricSizeChanged="pulse-metric-size-changed",r.PulseInsightDiscovered="pulse-insight-discovered",r.PulseInteractive="pulse-interactive",r.PulseTimeDimensionChanged="pulse-time-dimension-changed",r.PulseUrlChanged="pulse-url-changed",r.SelectedMarksChanged="selected-marks-changed",r.SettingsChanged="settings-changed",r.SummaryDataChanged="summary-data-changed",r.TestConversionNotification="test-conversion-notification",r.ToolbarStateChanged="toolbar-state-changed",r.VizInteractive="viz-interactive",r.AskDataInteractive="ask-data-interactive",r.WorkbookReadyToClose="workbook-ready-to-close",r.WorkbookFormattingChanged="workbook-formatting-changed",r.WorkbookPublished="workbook-published",r.WorkbookPublishedAs="workbook-published-as",r.WorksheetFormattingChanged="worksheet-formatting-changed",r.UrlAction="url-action",r.TabSwitched="tab-switched",r.StoryPointSwitched="story-point-switched",r.ReadyToReceiveAuthToken="ready-to-receive-auth-token"},4547:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.ParameterId||(t.ParameterId={})).ActiveTablesInfo="active-tables-info",r.AnchorDate="anchor-date",r.AnnotateEnum="annotate-enum",r.AnnotationList="annotation-list",r.ApplyWorksheetFormatting="apply-worksheet-formatting",r.CategoricalDomain="categorical-domain",r.ClickThroughEnabled="click-through-enabled",r.Columns="columns",r.ColumnsToInclude="columns-to-include",r.ColumnsToIncludeById="columns-to-include-by-id",r.ConnectionDescriptionSummaries="connection-description-summaries",r.CurrentSheetType="current-sheet-type",r.CustomView="custom-view",r.CustomViewIsDefault="custom-view-is-default",r.CustomViewIsPublic="custom-view-is-public",r.CustomViewLuid="custom-view-luid",r.CustomViewName="custom-view-name",r.CustomViews="custom-views",r.Dashboard="dashboard",r.DashboardFilters="dashboard-filters",r.DashboardName="dashboard",r.DashboardObjectPositionAndSizeUpdate="dashboard-object-position-and-size-update",r.DashboardObjectPositionAndSizeUpdateList="dashboard-object-position-and-size-update-list",r.DataRowIndex="data-row-index",r.DataSchema="data-schema",r.DataSource="data-source",r.DataSourceDataTable="data-source-data-table",r.DataSourceId="data-source-id",r.DataSourceName="data-source-name",r.DataTable="data-table",r.DataTableReader="data-table-reader",r.DateRangeType="date-range-type",r.DeleteCount="delete-count",r.DeltaTimeMs="delta-time-ms",r.DimValSelectionModels="dimensionValueSelectionModels",r.DomainType="domain-type",r.EmbeddingAbstractQuery="embedding-abstract-query",r.EmbeddingBootstrapInfo="embedding-bootstrap-info",r.EncodingType="encoding-type",r.ExportCrosstabSheetMap="export-crosstab-sheet-map",r.ExportFile="export-file",r.ExportOriginUrl="export-origin-url",r.ExportPdfOptions="export-pdf-options",r.ExtensionBootstrapInfo="extension-bootstrap-info",r.ExtensionContextMenuIds="extension-context-menu-ids",r.ExtensionDialogH="extension-dialog-height",r.ExtensionDialogMessage="extension-dialog-message",r.ExtensionDialogPayload="extension-dialog-payload",r.ExtensionDialogResult="extension-dialog-result",r.ExtensionDialogStyle="extension-dialog-style",r.ExtensionDialogUrl="extension-dialog-url",r.ExtensionDialogW="extension-dialog-width",r.ExtensionLocator="extension-locator",r.ExtensionSettingsInfo="extension-settings-info",r.ExtensionZoneId="extension-zone-id",r.ExternalMenuDescription="external-menu-description",r.ExternalMenuHeader="external-menu-header",r.ExternalMenuItemDisplayName="external-menu-item-display-name",r.ExternalMenuItemId="external-menu-item-id",r.Field="field",r.FieldCount="field-count",r.FieldId="field-id",r.FieldName="field-name",r.FilterLevels="filter-levels",r.FilterRangeMax="filter-range-max",r.FilterRangeMin="filter-range-min",r.FilterRangeNullOption="filter-range-null-option",r.FilterUpdateType="filter-update-type",r.FilterValues="filter-values",r.FontNameListItems="font-name-list-items",r.FormattedText="formatted-text",r.FunctionName="function-name",r.FromIndex="from-index",r.HierValSelectionModels="hierarchicalValueSelectionModels",r.HighlightedData="highlighted-data",r.HoverTupleInteraction="hover-tuple-interaction",r.IgnoreAliases="ignore-aliases",r.IgnoreSelection="ignore-selection",r.IncludeAllColumns="include-all-columns",r.InvalidAggFieldName="invalid-agg-field-name",r.InvalidDates="invalid-dates",r.InvalidFieldCaption="invalid-field-caption",r.InvalidFields="invalid-fields",r.InvalidValues="invalid-values",r.IsAnalyticsAssistantAvailable="is-analytics-assistant-available",r.IsExcludeMode="is-exclude",r.IsExtensionDialog="is-extension-dialog",r.IsFromCalcDialog="is-from-calc-dialog",r.JoinDescription="join-description",r.LogicalTableId="logical-table-id",r.LogicalTableInfoList="logical-table-info-list",r.MarksCardIndex="marks-card-index",r.MaxHeight="max-height",r.MaxRows="max-rows",r.MaxWidth="max-width",r.MinHeight="min-height",r.MinWidth="min-width",r.PageRowCount="page-row-count",r.ParameterCaption="paremeter-caption",r.ParameterError="parameter-error",r.ParameterFieldName="parameter-field-name",r.ParameterInfo="parameter-info",r.ParameterInfos="parameter-infos",r.ParameterValue="parameter-value",r.PeriodType="period-type",r.PulseFieldName="fieldName",r.PulseFieldNames="fieldNames",r.PulseFilterDomainType="domainType",r.PulseFilterDomainSearchTerm="searchTerm",r.PulsePageSize="pageSize",r.PulseNextPageToken="nextPageToken",r.PulseFilters="filters",r.PulseTimeDimension="timeDimension",r.QuantitativeDomain="quantitative-dmain",r.QuantRangeSelectionModels="quantativeRangeSelectionModels",r.RangeN="range-n",r.ReplaySpeed="replay-speed",r.SelectedData="selected-data",r.SelectedSheetNames="selected-sheet-names",r.Selection="selection",r.SelectionList="selection-list",r.SelectionUpdateType="selectionUpdateType",r.SelectTuplesInteraction="select-tuples-interaction",r.SendNotifications="send-notifications",r.SettingsValues="settings-values",r.SharedFilterSheets="shared-filter-sheets",r.SharedFiltersInfo="shared-filters-info",r.SheetIdentifier="sheet-identifier",r.SheetName="sheet-name",r.SheetPath="sheet-path",r.ShouldRefreshDS="should-refresh-ds",r.ShowDataTableFormat="show-data-table-format",r.StartIndex="start-index",r.State="state",r.StoryPointIndex="story-point-index",r.StoryPointInfo="story-point-info",r.SwitchToSheetName="switch-to-sheet-name",r.TargetPoint="target-point",r.TestConversionParameter="test-conversion-parameter",r.Text="formatted-text",r.ToIndex="to-index",r.TooltipContext="tooltip-context",r.TooltipTextRequest="tooltip-text-request",r.TooltipText="tooltip-text",r.UnderlyingDataTable="underlying-data-table",r.UnderlyingSummaryDataTable="underlying-summary-data-table",r.Url="url",r.UseTabDelimiters="use-tab-delimiters",r.ViewDataTableCacheId="view-data-table-cache-id",r.ViewDataTableId="view-data-table-id",r.VisualId="visual-id",r.VisualSpecification="visual-specification",r.VizAPIInputJson="vizapi-input-json",r.VizAPIStateWithDataModel="vizapi-state-with-data-model",r.VizAPIStateWarningMsg="vizapi-state-warning-msg",r.VizAPISVG="vizapi-svg",r.WorksheetName="worksheet-name",r.WorksheetFilters="worksheet-filters",r.ZoneIdsVisibilityMap="zone-ids-visibility-map"},2400:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.VerbId||(t.VerbId={})).ActivateNextStoryPoint="activate-next-story-point",r.ActivatePreviousStoryPoint="activate-previous-story-point",r.ActivateSheet="activateSheet",r.ActivateStoryPoint="activate-story-point",r.AddMarksCardFields="add-marks-card-fields",r.AppendExternalMenuItem="append-external-menu-item",r.ApplyCategoricalFilter="categorical-filter",r.ApplyPulseFilters="apply-pulse-filters",r.ApplyPulseTimeDimension="apply-pulse-time-dimension",r.ApplyRangeFilter="range-filter",r.ApplyRelativeDateFilter="apply-relative-date-Filter",r.Authenticate="authenticate",r.BlockExtension="block-extension",r.ChangeParameterValue="change-parameter-value",r.ChangeSharedFilter="change-shared-filter",r.ClearAllPulseFilters="clear-all-pulse-filters",r.ClearFilter="clear-filter",r.ClearPulseFilters="clear-pulse-filters",r.ClearSelectedMarks="clear-selected-marks",r.CloseDialog="close-dialog",r.CreateAnnotation="create-annotation",r.DashboardCategoricalFilter="dashboard-categorical-filter",r.DisplayDialog="display-dialog",r.DownloadWorkbook="download-workbook",r.EditAliasesDialog="edit-aliases-dialog",r.ExecuteExternalMenuItem="execute-external-menu-item",r.ExportCrosstab="export-crosstab",r.ExportCrosstabCsvDownload="export-crosstab-csv-download",r.ExportCrosstabExcelDownload="export-crosstab-excel-download",r.ExportData="export-data",r.ExportDataDownload="export-data-download",r.ExportImage="export-image",r.ExportPdf="export-pdf",r.ExportPdfDownload="export-pdf-download",r.ExportPowerpoint="export-powerpoint",r.ExportPowerpointDownload="export-powerpoint-download",r.FindParameter="find-parameter",r.GetActiveTables="get-active-tables",r.GetAllDataSources="get-all-data-sources",r.GetAnnotations="get-annotations",r.GetCategoricalDomain="get-categorical-domain",r.GetConnectionDescriptionSummaries="get-connection-description-summaries",r.GetCurrentSrc="get-current-src",r.GetCustomViews="get-custom-views",r.GetDashboardFilters="get-dashboard-filters",r.GetDataSource="get-datasource",r.GetDataSourceData="get-datasource-data",r.GetDataSources="get-data-sources",r.GetDataSummaryData="get-summary-data",r.GetDataSummaryDataReader="get-summary-data-reader",r.GetDataTableReaderPage="get-data-table-reader-page",r.GetEmbeddingAbstractQueryWithDataModel="get-embedding-abstract-query-with-data-model",r.GetEmbeddingClientInfo="get-embedding-client-info",r.GetVizStateWithDataModel="get-viz-state-with-data-model",r.GetExportCrosstabSheetMap="get-export-crosstab-sheet-map",r.GetExportPdfOptions="get-export-pdf-options",r.GetField="get-field",r.GetFieldAndDataSource="get-field-and-datasource",r.GetVisualSpecification="get-visual-specification",r.GetFilters="get-filters",r.GetFonts="get-fonts",r.GetHighlightedMarks="get-highlighted-marks",r.GetJoinDescription="get-join-description",r.GetLogicalTableData="get-logical-table-data",r.GetLogicalTableDataReader="get-logical-table-data-reader",r.GetLogicalTables="get-logical-tables",r.GetParametersForSheet="get-parameters-for-sheet",r.GetPulseCategoricalDomain="get-pulse-categorical-domain",r.GetPulseFilters="get-pulse-filters",r.GetPulseTimeDimension="get-pulse-time-dimension",r.GetRangeDomain="get-range-domain",r.GetSelectedMarks="get-selected-marks",r.GetSharedFilter="get-shared-filter",r.GetTooltipText="get-tooltip-text",r.GetUnderlyingData="get-underlying-data",r.GetUnderlyingTableData="get-underlying-table-data",r.GetUnderlyingTableDataReader="get-underlying-table-data-reader",r.GetUnderlyingTables="get-underlying-tables",r.HierarchicalFilter="hierachical-filter",r.InitializeExtension="initialize-extension",r.IsAnalyticsAssistantAvailable="is-analytics-assistant-available",r.LaunchAnalyticsAssistant="launch-analytics-assistant",r.MoveAndResizeZones="move-and-resize-zones",r.MoveMarksCardField="move-marks-card-field",r.RaiseLeaveMarkNavNotification="raise-leave-mark-nav-notification",r.RaiseHoverTupleNotification="raise-hover-tuple-notification",r.RaiseSelectTuplesNotification="raise-select-tuples-notification",r.Redo="redo",r.RefreshDataSource="refresh-data-source",r.ReleaseDataTableReader="release-data-table-reader",r.RemoveAnnotation="remove-annotation",r.RemoveCustomView="remove-custom-view",r.RemoveExternalMenuItem="remove-external-menu-item",r.RenameExternalMenu="rename-external-menu",r.ReplayAnimation="replay-animation",r.RevertStoryPoint="revert-story-point",r.RevertWorkbook="revert-workbook",r.SaveExtensionSettings="save-extension-settings",r.SaveWorkbookAsCustomView="save-workbook-as-custom-view",r.SelectByValue="select-by-value",r.SetActiveCustomViewAsDefault="set-active-custom-view-as-default",r.SetAutoUpdate="set-auto-update",r.SetClickThrough="set-click-through",r.SendDialogMessage="send-dialog-message",r.SetVizStateWithDataModel="set-viz-state-with-data-model",r.SetSheetSize="set-sheet-size",r.SetZoneVisibility="set-zone-visibility",r.Share="share",r.ShowCustomView="show-custom-view",r.SpliceMarksCardFields="splice-marks-card-fields",r.TestConversionVerb="test-conversion-verb",r.Undo="undo",r.UpdateCustomView="update-custom-view",r.VizAPI="viz-api"},2496:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.AskDataOptionNames||(t.AskDataOptionNames={})).token="token",r.origin="origin",r.showEmbed="showEmbed",r.showPin="showPin",r.showSave="showSave",r.showShare="showShare",r.debug=":jsdebug",r.ApiID=":apiID",r.ApiExternalVersion=":apiExternalVersion",r.ApiInternalVersion=":apiInternalVersion",r.AskDataWebComponent=":askDataWebComponent"},2472:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.PulseOptionNames||(t.PulseOptionNames={})).embed="embed",r.token="token",r.disableExploreFilter="disableExploreFilter",r.layout="embed_layout",r.theme="embed_theme",r.ApiExternalVersion=":apiExternalVersion",r.ApiInternalVersion=":apiInternalVersion",r.PulseWebComponent=":pulseWebComponent"},552:(e,t)=>{"use strict";var r,a,i;Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.ONE="1",e.ALERTS=":alerts",e.ALIAS="alias",e.ALLOW_DEFERRED_BOOTSTRAP=":allowDeferredBootstrap",e.ALLOW_AUTOGEN_WORKSHEET_PHONE_LAYOUTS="allowAutogenWorksheetPhoneLayouts",e.API_ID=":apiID",e.APP=":app",e.ATTACHMENT="attachment",e.IS_IPAD_APP="app",e.ANIMATE_TRANSITION=":animate_transition",e.ASCENDING="ascending",e.AUTHENTICATION="authentication",e.ATTRIBUTES="attributes",e.AUTHORING_SHEET=":authSheet",e.AXIS="axis",e.BOOTSTRAP_WHEN_NOTIFIED=":bootstrapWhenNotified",e.BROWSER_BACK_BUTTON_UNDO=":browserBackButtonUndo",e.BROWSER_RENDERING_ON="isBrowserRendering",e.BROWSER_RENDERING_THRESHOLD="browserRenderingThreshold",e.CHARSET="charset",e.CLIENT_DIMENSION="clientDimension",e.CLIENT_IP="client_ip",e.CLIENT_NUM="clientNum",e.COLON_EMBEDDED=":embedded",e.COLON_MOBILE=":mobile",e.COLON_DEEP_LINKING_DISABLED=":deepLinkingDisabled",e.COLON_WATERMARK=":watermark",e.COMMENTS=":comments",e.COMMENTING_ENABLED=":commentingEnabled",e.COMMENTING_MENTIONS_ENABLED=":commentingMentions",e.CONNECTION="connection",e.CREATED_BY_FEATURE="createdByFeature",e.CRYPTED_PASSWORD="crypted",e.CSSDEBUG=":cssdebug",e.CSV="csv",e.CUSTOM_VIEWS=":customViews",e.CV=":cv",e.CV_ID="cvId",e.DASHBOARD_PORT_SIZE="dashboardPortSize",e.DATA_DETAILS=":dataDetails",e.DATASOURCE="datasource",e.DEBUG=":debug",e.DELAY=":delay",e.DEPTH="depth",e.DEVICE_TYPE=":device",e.DEVICE_PIXEL_RATIO="devicePixelRatio",e.DEVICE_PREVIEW_MODE=":devicepreviewmode",e.DIMENSIONS=":dimensions",e.DISABLE_SHARED_SESSIONS=":disable_shared_sessions",e.DISABLE_URL_ACTIONS_POPUPS=":disableUrlActionsPopups",e.DIRECTION="direction",e.DISPLAY_OVERLAY=":display_overlay",e.DISPLAY_SHARE=":display_share",e.DISPLAY_SPINNER=":display_spinner",e.DISPLAY_STATIC_IMAGE=":display_static_image",e.DISPLAY_TABS="display_tabs",e.DISPLAY_VIEW_COUNT=":display_count",e.IGNORE_STICKY_SESSION=":ignore_sticky_session",e.INCREMENT_VIEW_COUNT=":increment_view_count",e.DOCMODE="docmode",e.DOMAIN="domain",e.DO_WORK="do_work",e.DX="dx",e.DY="dy",e.EDIT_DATA_ALERT=":editDataAlert",e.EMBED=":embed",e.EMBEDDED="embedded",e.ENCRYPTED="encrypted",e.API_EXTERNAL_VERSION=":apiExternalVersion",e.API_INTERNAL_VERSION=":apiInternalVersion",e.EXCLUDE="exclude",e.EXPORT_FORMAT=":export_format",e.FIELDNAME="fieldname",e.FIELD_NAME="field_name",e.FIELD_SEP="field_sep",e.FILE="file",e.FILTER_TILE_SIZE="filterTileSize",e.FN="fn",e.FOCUS="focus",e.FORCE_CACHE="force_cache",e.FORMAT="format",e.FORMAT_DATA_VALUE_LOCALLY="formatDataValueLocally",e.FROM_WG=":from_wg",e.GRAPHQL_DATABASE_ID=":graphQLDatabaseId",e.GRAPHQL_TABLE_ID=":graphQLTableId",e.GUID=":guid",e.H="h",e.HIDDEN="hidden",e.HIDE_CLOSE_BUTTON=":hideCloseButton",e.HIDE_EDIT_BUTTON=":hideEditButton",e.HIDE_EDIT_IN_DESKTOP_BUTTON=":hideEditInDesktopButton",e.HIGH_DPI=":highdpi",e.IMAGE_SIZE_LIMIT="imageSizeLimit",e.TRANSPARENT_LINE_MARKS_LIMIT="transparentLineMarkLimit",e.CLIENT_RENDER_PIXEL_LIMIT="clientRenderPixelLimit",e.IN="in",e.INSTANCE_ID=":iid",e.IS_GUEST_REDIRECT_FROM_VIZPORTAL=":isGuestRedirectFromVizportal",e.IS_MARK_ANIMATION_ENABLED="isMarkAnimationEnabled",e.IS_VIZPORTAL=":isVizPortal",e.INPUT_="input_string",e.JSDEBUG=":jsdebug",e.JSON="json",e.JSON_ONLY=":jsonOnly",e.KEEPFILE="keepfile",e.KEY="key",e.LANGUAGE="language",e.LANGUAGE_REQUESTED=":language",e.LINKTARGET=":linktarget",e.LOAD_ORDER_ID=":loadOrderID",e.LOAD_NEWEST_REVISION=":loadNewestRevision",e.LOCAL_PATHS=":localPaths",e.LOCALE="locale",e.LOCATION_ID="locationid",e.LOCATION_TYPE="locationtype",e.WORKBOOK_LOCALE="workbookLocale",e.MAXROWS="maxrows",e.MAX_AGE="maxAge",e.MAX_ROWS="maxRows",e.METHOD="method",e.MOBILE="mobile",e.MODIFIER="modifier",e.NAME="name",e.NAV_TYPE="navType",e.NAV_SRC="navSrc",e.NOATTACHMENT="no-attachment",e.NO_OVERWRITE="no_overwrite",e.OPEN_AUTHORING_IN_TOP_WINDOW=":openAuthoringInTopWindow",e.OPENID_HD=":openid_hd",e.OPENID_LOGIN_HINT=":openid_login_hint",e.OAUTHREQUEST="oauthrequest",e.OAUTH_CREDENTIAL_IDS="oauth_credential_ids",e.OFFLINE_MODE=":offlinemode",e.ORIGIN=":origin",e.OVERLAY=":overlay",e.P="p",e.PATH="path",e.PANE_RESOLVER_X="paneResolverX",e.PANE_RESOLVER_Y="paneResolverY",e.PARAM="param",e.PARENT_ID="parent_id",e.PASSWORD="password",e.PATTERN="pattern",e.PIXEL_RATIO=":pixelratio",e.PREFIX=":prefix",e.PREVIEW=":preview",e.PRIMARY_CONTENT_URL="primary_content_url",e.PROJECT="project",e.PROTOCOL="protocol",e.PSEUDO=":pseudo",e.QUERY="query",e.R="r",e.RANGE_TYPE="range_type",e.RECORD_SEP="record_sep",e.RECORD_CLIENT_PERFORMANCE=":record_client_performance",e.RECORD_PERFORMANCE=":record_performance",e.RECOVER_OLD_SESSION_ID=":recover_old_session_id",e.RECOVER_SESSION_STATE_TICKETS=":recover_session_state_tickets",e.REFRESH=":refresh",e.REFRESHUNMODIFIED=":refreshunmodified",e.REGION="region",e.RELOAD_ON_CUSTOM_VIEW_SAVE=":reloadOnCustomViewSave",e.RENDER=":render",e.RENDER_MAPS_CLIENT_SIDE="renderMapsClientSide",e.RETRY=":retry",e.REUSE="reuse",e.REUSE_FOREVER="reuse_forever",e.REVERT=":revert",e.SAVE_DB_PASSWORDS="save_db_passwords",e.SELECT_X="select_x",e.SELECT_Y="select_y",e.SESSION_FEATURE_PREFIX=":ff_",e.SESSION_FLAGS=":session_feature_flags",e.SHARE_BUTTON="share_button",e.SHEET_ID="sheet_id",e.SHARED="shared",e.SHOWALL="showall",e.SHOW_APP_BANNER=":showAppBanner",e.SHOW_ASK_DATA=":showAskData",e.SHOW_PARAMS="showParams",e.SHOW_SHARE_OPTIONS=":showShareOptions",e.SIZE=":size",e.SOURCE="source",e.STATE="state",e.STICKY_SESSION_KEY="stickySessionKey",e.SUBSCRIPTIONS=":subscriptions",e.SUMMARY="summary",e.SUPPRESS_DEFAULT_EDIT_BEHAVIOR=":suppressDefaultEditBehavior",e.SYNC_SESSION=":sync_session",e.SYNC_SESSION_STATE="sync_session_state",e.TABS=":tabs",e.TARGET="target",e.TARGET_SITE="target_site",e.TOOLBAR=":toolbar",e.TOOLTIP=":tooltip",e.TS="ts",e.UNDERLYING_TABLE_ID="underlying_table_id",e.UNDERLYING_TABLE_CAPTION="underlying_table_caption",e.UPDATE_TYPE="update_type",e.USE_GUEST=":useGuest",e.USE_INLINE_IMAGES="use_inline_images",e.USERAGENT="useragent",e.USERNAME="username",e.VALUE="value",e.VERBOSE_MODE="verboseMode",e.VIEW_ID="views_id",e.VIZ_SNAPSHOT_ID="viz_snapshot_id",e.VW=":vw",e.W="w",e.WORKSHEET_PORT_SIZE="worksheetPortSize",e.WATERMARK="watermark",e.WATERMARK_MARGIN=":watermark_margin",e.WB=":wb",e.WHICH="which",e.X="x",e.Y="y",e.ZID="zid",e.ZONE_ID="zone_id",e.KEYCHAIN_VERSION="keychain_version",e.DATASOURCE_ID="datasource_id",e.DATASOURCE_NAME="datasource_name",e.LENS_ID="lens_id",e.WIDTH="width",e.HEIGHT="height",e.LAYOUT_VIEWS="views",e.LAYOUT_MENUS="menus",e.LAYOUT_GEOMETRY="geometry",e.LAYOUT_PAGES="pages",e.LAYOUT_CACHEURL="cacheurl",e.LAYOUT_SHEET="sheet",e.LAYOUT_DEPTH="depth"}(r||(r={})),function(e){e.SHOW_VIZ_HOME=":showVizHome"}(a||(a={})),(i=t.VizOptionNames||(t.VizOptionNames={})).Size=":size",i.Embed=":embed",i.ApiInternalVersion=":apiInternalVersion",i.ApiExternalVersion=":apiExternalVersion",i.ShowVizHome=":showVizHome",i.Jsdebug=":jsdebug",i.BootstrapWhenNotified=":bootstrapWhenNotified",i.NavType="navType",i.NavSrc="navSrc",i.debug=":jsdebug",i.ApiID=":apiID",i.disableUrlActionsPopups=":disableUrlActionsPopups",i.hideTabs=":tabs",i.toolbar=":toolbar",i.device=":device",i.instanceIdToClone=":iid",i.touchOptimize="mobile",i.hideEditButton=":hideEditButton",i.hideEditInDesktopButton=":hideEditInDesktopButton",i.suppressDefaultEditBehavior=":suppressDefaultEditBehavior",i.hideCloseButton=":hideCloseButton"},3256:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(1808),i=r(3448),n=r(1680),s=r(4020),o=r(7204);t.CrossFrameMessenger=class{constructor(e,t,r){this.thisWindow=e,this.otherWindow=t,this.otherWindowOrigin=r}startListening(){if(!this.unregisterFunction){const e=this.onMessageReceived.bind(this);this.thisWindow.addEventListener("message",e,!0),this.unregisterFunction=()=>this.thisWindow.removeEventListener("message",e,!0)}}stopListening(){this.unregisterFunction&&(this.unregisterFunction(),this.unregisterFunction=void 0)}setInitializeMessageHandler(e){this.initializeMessageHandler=e}setCommandResponseMessageHandler(e){this.commandResponseMessageHandler=e}setCommandMessageHandler(e){this.commandMessageHandler=e}setNotificationMessageHandler(e){this.notificationMessageHandler=e}setHandshakeMessageHandler(e){this.handshakeMessageHandler=e}prepareInitializationMessage(e,t,r){const i={msgGuid:a.raw(),msgType:o.MessageType.Initialize,crossFrameVersion:t,apiVersion:e,options:r};return this.prepareMessage(i)}prepareCommandMessage(e,t){const r={msgGuid:a.raw(),msgType:o.MessageType.Command,verbId:e,parameters:t};return this.prepareMessage(r)}prepareCommandResponseMessage(e,t,r){const i={msgGuid:a.raw(),msgType:o.MessageType.CommandResponse,commandGuid:e,data:t,error:r};return r&&(i.error=JSON.parse(JSON.stringify(r))),this.prepareMessage(i)}prepareNotificationMessage(e,t){const r={msgGuid:a.raw(),msgType:o.MessageType.Notification,notificationId:e,data:t};return this.prepareMessage(r)}prepareAckMessage(){const e={msgGuid:a.raw(),msgType:o.MessageType.Ack,platformVersion:i.INTERNAL_CONTRACT_VERSION};return this.prepareMessage(e)}prepareMessage(e){if(!this.otherWindow||!this.otherWindowOrigin)throw"Other window not initialized, cannot dispatch messages";return new n.CrossFramePreparedMessage(e,this.otherWindow,this.otherWindowOrigin)}onMessageReceived(e){if(this.otherWindow&&e.source!==this.otherWindow)return;if(!e.data)return;const t=e.data;if(s.isMessage(t))switch(t.msgType){case o.MessageType.Initialize:if(!s.isInitMessage(t)||!this.initializeMessageHandler)return;this.initializeMessageHandler(t,e.source);break;case o.MessageType.CommandResponse:if(!s.isCommandResponseMessage(t)||!this.commandResponseMessageHandler)return;this.commandResponseMessageHandler(t,e.source);break;case o.MessageType.Command:if(!s.isCommandMessage(t)||!this.commandMessageHandler)return;this.commandMessageHandler(t,e.source);break;case o.MessageType.Notification:if(!s.isNotificationMessage(t)||!this.notificationMessageHandler)return;this.notificationMessageHandler(t,e.source);break;case o.MessageType.Handshake:if(!s.isHandshakeMessage(t)||!this.handshakeMessageHandler)return;this.handshakeMessageHandler(t,e.source)}}setOtherWindow(e){this.otherWindow=e}setOtherWindowOrigin(e){this.otherWindowOrigin=e}}},1680:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CrossFramePreparedMessage=class{constructor(e,t,r){this._message=e,this._target=t,this._origin=r}get messageGuid(){return this._message.msgGuid}send(){return this._target.postMessage(this._message,this._origin),this}}},4020:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(1808),i=r(5824),n=r(7204),s=new Set([i.NotificationId.EditButtonClicked,i.NotificationId.EditInDesktopButtonClicked,i.NotificationId.WorkbookPublished,i.NotificationId.WorkbookReadyToClose,i.NotificationId.ReadyToReceiveAuthToken]);function o(e){if(!e)return!1;const t=e;return!!(t&&t.msgGuid&&t.msgType)&&(!!a.isGuid(t.msgGuid)&&("string"==typeof t.msgType&&!([n.MessageType.Command,n.MessageType.CommandResponse,n.MessageType.Initialize,n.MessageType.Notification,n.MessageType.Handshake].indexOf(t.msgType)<0)))}function l(e){if(!e)return!1;const t=e;return"object"==typeof t&&"number"==typeof t.fix&&"number"==typeof t.minor&&"number"==typeof t.major}t.isMessage=o,t.isVersion=l,t.isInitMessage=function(e){if(!o(e))return!1;const t=e;return!!(t.msgType===n.MessageType.Initialize&&t.apiVersion&&l(t.apiVersion)&&t.crossFrameVersion&&l(t.crossFrameVersion))},t.isCommandResponseMessage=function(e){if(!o(e))return!1;const t=e;return!(t.msgType!==n.MessageType.CommandResponse||!a.isGuid(t.commandGuid)||!t.data&&!t.error)},t.isCommandMessage=function(e){if(!o(e))return!1;const t=e;return!(t.msgType!==n.MessageType.Command||!t.parameters||"object"!=typeof t.parameters||!t.verbId||"string"!=typeof t.verbId)},t.isNotificationMessage=function(e){if(!o(e))return!1;const t=e;return!(t.msgType!==n.MessageType.Notification||!t.data&&!s.has(t.notificationId)||!t.notificationId||"string"!=typeof t.notificationId)},t.isHandshakeMessage=function(e){return!!o(e)&&e.msgType===n.MessageType.Handshake}},7204:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.MessageType||(t.MessageType={})).Initialize="initialize",r.Notification="notification",r.Command="command",r.CommandResponse="command-response",r.Handshake="v-handshake",r.Ack="v-ack"},1600:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.IdentityVersionConverter=class{upgradeExecuteCall(e,t){return{verb:e,parameters:t}}downgradeExecuteReturn(e){return e}downgradeNotification(e){return e}}},2320:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StackingVersionConverter=class{constructor(e,t,r,a,i){if(this._externalMajorVersion=e,this._platformMajorVersion=t,this._upgradeExecuteTranslations=r,this._downgradeExecuteTranslations=a,this._downgradeNotificationTranslations=i,this._externalMajorVersion>this._platformMajorVersion)throw new Error(`Cannot convert between external version ${this._externalMajorVersion} and ${this._platformMajorVersion}`)}static fromData(e,t,r,a,i){return new this(e.major,t.major,r,a,i)}upgradeExecuteCall(e,t){let r={verb:e,parameters:t};for(const e of this._upgradeExecuteTranslations)r=e(r.verb,r.parameters);return r}downgradeExecuteReturn(e){let t=e;for(const e of this._downgradeExecuteTranslations)t=e(t);return t}downgradeNotification(e){let t=e;for(const e of this._downgradeNotificationTranslations)t=e(t);return t}}},3760:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(1600),i=r(2320),n=r(720);function s(e,t){return e.major===t.major&&e.minor===t.minor}function o(e,t,r,n,o){const d=e.major,c=e.minor,u=t.major;if(d>u)throw new Error(`External version must be less than or equal to platform version.\n externalMajorVersion=${d} platformMajorVersion=${u}`);if(s(e,t))return new a.IdentityVersionConverter;const h=l(d,u,c,r),p=l(d,u,c,n),m=l(d,u,c,o);return p.reverse(),m.reverse(),i.StackingVersionConverter.fromData(e,t,h,p,m)}function l(e,t,r,a){const i=[];for(let n=e;n<=t;n++)if(n in a){const t=n===e?r:0,s=d(Object.keys(a[n]));for(let e=t;e<=s;e++)e in a[n]&&i.push(...a[n][e])}return i}function d(e){return e.map((e=>Number(e))).reduce(((e,t)=>e>t?e:t))}t.VersionLessThan=function(e,t){return!(e.major>t.major)&&(e.major{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(5824);t.DowngradeWorksheetNames=function(e){const t=e.result;return void 0!==t.extensionDashboardInfo&&t.extensionDashboardInfo.zones.forEach((e=>{e.sheetInfo&&(e.name=e.sheetInfo.name)})),e},t.DowngradeFlipboardZoneID=function(e){if(e.notificationId===i.NotificationId.SelectedMarksChanged){const t=e.data;void 0===t.flipboardZoneID&&(t.flipboardZoneID=0)}return e};const n=["tableau-row-dividers","tableau-column-dividers","tableau-pane"];t.DowngradeWorksheetFomatting175=e=>function(e,t){var r,a;const i=e.result;return(null===(a=null===(r=i)||void 0===r?void 0:r.extensionWorksheetInfo)||void 0===a?void 0:a.formatting)&&(i.extensionWorksheetInfo.formatting.formattingSheets=i.extensionWorksheetInfo.formatting.formattingSheets.filter((e=>!t.includes(e.classNameKey)))),e}(e,n),t.DowngradeWorksheetFomattingNotification175=e=>function(e,t){if(e.notificationId===i.NotificationId.WorksheetFormattingChanged){const r=e.data;e.data=r.formattingSheets.filter((e=>!t.includes(e.classNameKey)))}return e}(e,n),t.DowngradeExtensionEnvironmentContext=function(e){const t=e.result;if(void 0!==t.extensionEnvironment){const e=t.extensionEnvironment.extensionContext;e===a.ExtensionContext.PublicWeb||e===a.ExtensionContext.Cloud?t.extensionEnvironment.extensionContext=a.ExtensionContext.Server:e===a.ExtensionContext.PublicDesktop&&(t.extensionEnvironment.extensionContext=a.ExtensionContext.Desktop)}return e}},4528:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExternalIdentityVersionConverter=class{downgradeExecuteCall(e,t){return{verb:e,parameters:t}}upgradeExecuteReturn(e,t,r){return e}upgradeNotification(e){return e}}},5768:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExternalStackingVersionConverter=class{constructor(e,t,r,a,i){if(this._externalVersion=e,this._platformVersion=t,this._downgradeExecuteCallTranslations=r,this._upgradeExecuteReturnTranslations=a,this._upgradeNotificationTranslations=i,this._externalVersion.major>this._platformVersion.major)throw new Error(`Cannot convert between external version ${this._externalVersion.major}\n and ${this._platformVersion.major}`)}downgradeExecuteCall(e,t){let r={verb:e,parameters:t};for(const e of this._downgradeExecuteCallTranslations)r=e(r.verb,r.parameters);return r}upgradeExecuteReturn(e,t,r){let a=e;for(const e of this._upgradeExecuteReturnTranslations)a=e(a,t,r);return a}upgradeNotification(e){let t=e;for(const e of this._upgradeNotificationTranslations)t=e(t);return t}}},3388:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3760),i=r(4528),n=r(5768);function s(e,t,r,s,l){const d=e.major,c=t.major,u=t.minor;if(d>c)throw new Error(`External version must be less than or equal to platform version.\n externalMajorVersion=${d} platformMajorVersion=${c}`);if(d{"use strict";function a(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});var i=r(2808);t.ApiVersion=i.ApiVersion,a(r(5184));var n=r(8540);t.CrossFrameDispatcher=n.CrossFrameDispatcher;var s=r(8340);t.DataSource=s.DataSource;var o=r(1044);t.ExternalToInternalEnumMappings=o.ExternalToInternalEnumMappings;var l=r(6557);t.InternalToExternalEnumMappings=l.InternalToExternalEnumMappings;var d=r(2680);t.EventListenerManager=d.EventListenerManager;var c=r(1072);t.Field=c.Field;var u=r(2520);t.CustomViewImpl=u.CustomViewImpl;var h=r(1940);t.DashboardImpl=h.DashboardImpl;var p=r(6488);t.DashboardObjectImpl=p.DashboardObjectImpl;var m=r(2180);t.DataSourceImpl=m.DataSourceImpl;var g=r(8552);t.ParameterImpl=g.ParameterImpl;var y=r(8332);t.SheetImpl=y.SheetImpl;var I=r(8736);t.SheetInfoImpl=I.SheetInfoImpl;var v=r(5144);t.SingleEventManagerImpl=v.SingleEventManagerImpl;var S=r(6804);t.StoryImpl=S.StoryImpl;var T=r(2608);t.StoryPointImpl=T.StoryPointImpl;var b=r(6068);t.StoryPointInfoImpl=b.StoryPointInfoImpl;var f=r(3044);t.WorkbookImpl=f.WorkbookImpl;var E=r(6500);t.WorksheetImpl=E.WorksheetImpl;var A=r(6368);t.Point=A.Point,a(r(8672)),a(r(3008));var P=r(1832);t.ClientInfoServiceImpl=P.ClientInfoServiceImpl;var _=r(1288);t.NotificationServiceImpl=_.NotificationServiceImpl;var w=r(8808);t.NotificationServiceImplBase=w.NotificationServiceImplBase,t.Registration=w.Registration;var D=r(1776);t.ServiceImplBase=D.ServiceImplBase;var C=r(4109);t.SizeServiceImpl=C.SizeServiceImpl;var F=r(2248);t.StoryActivationServiceImpl=F.StoryActivationServiceImpl;var x=r(6664);t.TableauError=x.TableauError;var M=r(1724);t.Deferred=M.Deferred;var k=r(7480);t.ErrorHelpers=k.ErrorHelpers;var N=r(5044);t.ExportHelpers=N.ExportHelpers;var R=r(2780);t.SheetUtils=R.SheetUtils;var V=r(1576);t.VersionNumber=V.VersionNumber;var O=r(8648);t.VersionedExternalApiDispatcher=O.VersionedExternalApiDispatcher},2808:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(1576);class i{static get Instance(){return i._instance}static SetVersionNumber(e,t){i._instance=new a.VersionNumber(e,t)}}t.ApiVersion=i},716:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ConnectionSummary=class{constructor(e){this._connectionInfo=e}get name(){return this._connectionInfo.name}get id(){return this._connectionInfo.id}get serverURI(){return this._connectionInfo.serverURI}get type(){return this._connectionInfo.type}}},5184:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(8540);t.doCrossFrameBootstrap=function(e,t,r){return new Promise(((n,s)=>{let o;o=function(e){try{return e.self!==e.parent}catch(e){return!0}}(e)?e.parent:e.opener,o||s("This extension is not running inside an iframe, desktop, or popup window. Initialization failed.");const l=new a.CrossFrameMessenger(e,o,"*"),d=l.prepareInitializationMessage(t,a.MESSAGING_VERSION,r);l.setCommandResponseMessageHandler((function(e){e.commandGuid===d.messageGuid&&n((()=>new i.CrossFrameDispatcher(l)))})),l.startListening(),d.send()}))}},8540:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419);t.CrossFrameDispatcher=class{constructor(e){if(this._messenger=e,this._pendingPromises={},this._notificationHandlers=[],!this._messenger)throw"Missing messenger object";this._messenger.setCommandResponseMessageHandler(this.onCommandResponse.bind(this)),this._messenger.setNotificationMessageHandler(this.onNotification.bind(this))}execute(e,t){const r=this._messenger.prepareCommandMessage(e,t),a=new Promise(((e,t)=>{this._pendingPromises[r.messageGuid]={resolve:e,reject:t}}));return r.send(),a}registerNotificationHandler(e){this._notificationHandlers.push(e)}unregisterNotificationHandler(e){this._notificationHandlers=this._notificationHandlers.filter((t=>t!==e))}onCommandResponse(e){if(Object.keys(this._pendingPromises).indexOf(e.commandGuid)<0)return;const t=this._pendingPromises[e.commandGuid];e.error&&t.reject(e.error),e.data&&t.resolve({result:e.data}),delete this._pendingPromises[e.commandGuid]}onNotification(e){for(const t of this._notificationHandlers)try{t({notificationId:e.notificationId,data:e.data})}catch(e){if(e.errorCode===a.EmbeddingErrorCodes.IncompatibleVersionError)throw e}}}},8340:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataSource=class{constructor(e){this._dataSourceImpl=e}get name(){return this._dataSourceImpl.name}get id(){return this._dataSourceImpl.id}get fields(){return this._dataSourceImpl.fields}get extractUpdateTime(){return this._dataSourceImpl.extractUpdateTime}get isExtract(){return this._dataSourceImpl.isExtract}get isPublished(){return this._dataSourceImpl.isPublished}publishedUrl(){return this._dataSourceImpl.publishedUrl()}refreshAsync(){return this._dataSourceImpl.refreshAsync()}getActiveTablesAsync(){return console.warn("DataSource.getActiveTablesAsync is deprecated. Please use DataSource.getLogicalTablesAsync."),this._dataSourceImpl.getActiveTablesAsync()}getConnectionSummariesAsync(){return this._dataSourceImpl.getConnectionSummariesAsync()}getUnderlyingDataAsync(e){return console.warn("DataSource.getUnderlyingDataAsync is deprecated. Please use DataSource.getLogicalTablesAsync and DataSource.getLogicalTableDataAsync."),this._dataSourceImpl.getUnderlyingDataAsync(e)}getLogicalTablesAsync(){return this._dataSourceImpl.getLogicalTablesAsync()}getLogicalTableDataAsync(e,t){return this._dataSourceImpl.getLogicalTableDataAsync(e,t)}getLogicalTableDataReaderAsync(e,t,r){return this._dataSourceImpl.getLogicalTableDataReaderAsync(e,t,r)}}},1044:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5520);class s{}t.ExternalToInternalEnumMappings=s,s.filterDomainType=new n.EnumConverter({[a.FilterDomainType.Relevant]:i.FilterDomainType.Relevant,[a.FilterDomainType.Database]:i.FilterDomainType.Database}),s.nullOptions=new n.EnumConverter({[a.FilterNullOption.AllValues]:i.FilterNullOption.AllValues,[a.FilterNullOption.NonNullValues]:i.FilterNullOption.NonNullValues,[a.FilterNullOption.NullValues]:i.FilterNullOption.NullValues}),s.filterUpdateType=new n.EnumConverter({[a.FilterUpdateType.Add]:i.FilterUpdateType.Add,[a.FilterUpdateType.All]:i.FilterUpdateType.All,[a.FilterUpdateType.Remove]:i.FilterUpdateType.Remove,[a.FilterUpdateType.Replace]:i.FilterUpdateType.Replace}),s.setVisibilityType=new n.EnumConverter({[a.ZoneVisibilityType.Show]:!0,[a.ZoneVisibilityType.Hide]:!1}),s.setReplaySpeedType=new n.EnumConverter({[a.ReplaySpeedType.Slow]:2,[a.ReplaySpeedType.Normal]:1,[a.ReplaySpeedType.Fast]:.5}),s.sheetType=new n.EnumConverter({[a.SheetType.Dashboard]:i.SheetType.Dashboard,[a.SheetType.Worksheet]:i.SheetType.Worksheet,[a.SheetType.Story]:i.SheetType.Story}),s.showDataTableFormatType=new n.EnumConverter({[a.IncludeDataValuesOption.AllValues]:i.ApiShowDataTableFormat.NativeAndFormattedValues,[a.IncludeDataValuesOption.OnlyNativeValues]:i.ApiShowDataTableFormat.NativeValuesOnly,[a.IncludeDataValuesOption.OnlyFormattedValues]:i.ApiShowDataTableFormat.FormattedValuesOnly}),s.periodType=new n.EnumConverter({[a.PeriodType.Years]:i.DateStepPeriod.Years,[a.PeriodType.Quarters]:i.DateStepPeriod.Quarters,[a.PeriodType.Months]:i.DateStepPeriod.Months,[a.PeriodType.Weeks]:i.DateStepPeriod.Weeks,[a.PeriodType.Days]:i.DateStepPeriod.Days,[a.PeriodType.Hours]:i.DateStepPeriod.Hours,[a.PeriodType.Minutes]:i.DateStepPeriod.Minutes,[a.PeriodType.Seconds]:i.DateStepPeriod.Seconds}),s.dateRangeType=new n.EnumConverter({[a.DateRangeType.Last]:i.DateRangeType.Last,[a.DateRangeType.LastN]:i.DateRangeType.LastN,[a.DateRangeType.Next]:i.DateRangeType.Next,[a.DateRangeType.NextN]:i.DateRangeType.NextN,[a.DateRangeType.Current]:i.DateRangeType.Current,[a.DateRangeType.ToDate]:i.DateRangeType.ToDate}),s.dialogStyles=new n.EnumConverter({[a.DialogStyle.Window]:i.DialogStyle.Window,[a.DialogStyle.Modal]:i.DialogStyle.Modal,[a.DialogStyle.Modeless]:i.DialogStyle.Modeless})},6557:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5520);class s{}t.InternalToExternalEnumMappings=s,s.extensionContext=new n.EnumConverter({[i.ExtensionContext.Desktop]:a.ExtensionContext.Desktop,[i.ExtensionContext.Server]:a.ExtensionContext.Server,[i.ExtensionContext.PublicWeb]:a.ExtensionContext.PublicWeb,[i.ExtensionContext.PublicDesktop]:a.ExtensionContext.PublicDesktop,[i.ExtensionContext.Cloud]:a.ExtensionContext.Cloud}),s.extensionMode=new n.EnumConverter({[i.ExtensionMode.Authoring]:a.ExtensionMode.Authoring,[i.ExtensionMode.Viewing]:a.ExtensionMode.Viewing}),s.columnType=new n.EnumConverter({[i.ColumnType.Continuous]:a.ColumnType.Continuous,[i.ColumnType.Discrete]:a.ColumnType.Discrete,[i.ColumnType.Unknown]:a.ColumnType.Unknown}),s.fieldAggregationType=new n.EnumConverter({[i.FieldAggregationType.Attr]:a.FieldAggregationType.Attr,[i.FieldAggregationType.Avg]:a.FieldAggregationType.Avg,[i.FieldAggregationType.Collect]:a.FieldAggregationType.Collect,[i.FieldAggregationType.Count]:a.FieldAggregationType.Count,[i.FieldAggregationType.Countd]:a.FieldAggregationType.Countd,[i.FieldAggregationType.Day]:a.FieldAggregationType.Day,[i.FieldAggregationType.End]:a.FieldAggregationType.End,[i.FieldAggregationType.Hour]:a.FieldAggregationType.Hour,[i.FieldAggregationType.InOut]:a.FieldAggregationType.InOut,[i.FieldAggregationType.Kurtosis]:a.FieldAggregationType.Kurtosis,[i.FieldAggregationType.Max]:a.FieldAggregationType.Max,[i.FieldAggregationType.Mdy]:a.FieldAggregationType.Mdy,[i.FieldAggregationType.Median]:a.FieldAggregationType.Median,[i.FieldAggregationType.Min]:a.FieldAggregationType.Min,[i.FieldAggregationType.Minute]:a.FieldAggregationType.Minute,[i.FieldAggregationType.MonthYear]:a.FieldAggregationType.MonthYear,[i.FieldAggregationType.None]:a.FieldAggregationType.None,[i.FieldAggregationType.Qtr]:a.FieldAggregationType.Qtr,[i.FieldAggregationType.Quart1]:a.FieldAggregationType.Quart1,[i.FieldAggregationType.Quart3]:a.FieldAggregationType.Quart3,[i.FieldAggregationType.Second]:a.FieldAggregationType.Second,[i.FieldAggregationType.Skewness]:a.FieldAggregationType.Skewness,[i.FieldAggregationType.Stdev]:a.FieldAggregationType.Stdev,[i.FieldAggregationType.Stdevp]:a.FieldAggregationType.Stdevp,[i.FieldAggregationType.Sum]:a.FieldAggregationType.Sum,[i.FieldAggregationType.TruncDay]:a.FieldAggregationType.TruncDay,[i.FieldAggregationType.TruncHour]:a.FieldAggregationType.TruncHour,[i.FieldAggregationType.TruncMinute]:a.FieldAggregationType.TruncMinute,[i.FieldAggregationType.TruncMonth]:a.FieldAggregationType.TruncMonth,[i.FieldAggregationType.TruncQtr]:a.FieldAggregationType.TruncQtr,[i.FieldAggregationType.TruncSecond]:a.FieldAggregationType.TruncSecond,[i.FieldAggregationType.TruncWeek]:a.FieldAggregationType.TruncWeek,[i.FieldAggregationType.TruncYear]:a.FieldAggregationType.TruncYear,[i.FieldAggregationType.User]:a.FieldAggregationType.User,[i.FieldAggregationType.Var]:a.FieldAggregationType.Var,[i.FieldAggregationType.Varp]:a.FieldAggregationType.Varp,[i.FieldAggregationType.Week]:a.FieldAggregationType.Week,[i.FieldAggregationType.Weekday]:a.FieldAggregationType.Weekday,[i.FieldAggregationType.Year]:a.FieldAggregationType.Year}),s.fieldRoleType=new n.EnumConverter({[i.FieldRoleType.Dimension]:a.FieldRoleType.Dimension,[i.FieldRoleType.Measure]:a.FieldRoleType.Measure,[i.FieldRoleType.Unknown]:a.FieldRoleType.Unknown}),s.sheetType=new n.EnumConverter({[i.SheetType.Dashboard]:a.SheetType.Dashboard,[i.SheetType.Story]:a.SheetType.Story,[i.SheetType.Worksheet]:a.SheetType.Worksheet}),s.dashboardObjectType=new n.EnumConverter({[i.DashboardObjectType.Extension]:a.DashboardObjectType.Extension,[i.DashboardObjectType.Blank]:a.DashboardObjectType.Blank,[i.DashboardObjectType.Image]:a.DashboardObjectType.Image,[i.DashboardObjectType.Legend]:a.DashboardObjectType.Legend,[i.DashboardObjectType.PageFilter]:a.DashboardObjectType.PageFilter,[i.DashboardObjectType.ParameterControl]:a.DashboardObjectType.ParameterControl,[i.DashboardObjectType.QuickFilter]:a.DashboardObjectType.QuickFilter,[i.DashboardObjectType.Text]:a.DashboardObjectType.Text,[i.DashboardObjectType.Title]:a.DashboardObjectType.Title,[i.DashboardObjectType.WebPage]:a.DashboardObjectType.WebPage,[i.DashboardObjectType.Worksheet]:a.DashboardObjectType.Worksheet}),s.dataType=new n.EnumConverter({[i.DataType.Bool]:a.DataType.Bool,[i.DataType.Date]:a.DataType.Date,[i.DataType.DateTime]:a.DataType.DateTime,[i.DataType.Float]:a.DataType.Float,[i.DataType.Int]:a.DataType.Int,[i.DataType.Spatial]:a.DataType.Spatial,[i.DataType.String]:a.DataType.String}),s.filterUpdateType=new n.EnumConverter({[i.FilterUpdateType.Add]:a.FilterUpdateType.Add,[i.FilterUpdateType.All]:a.FilterUpdateType.All,[i.FilterUpdateType.Remove]:a.FilterUpdateType.Remove,[i.FilterUpdateType.Replace]:a.FilterUpdateType.Replace}),s.allowableValues=new n.EnumConverter({[i.DomainRestrictionType.All]:a.ParameterValueType.All,[i.DomainRestrictionType.List]:a.ParameterValueType.List,[i.DomainRestrictionType.Range]:a.ParameterValueType.Range}),s.dateStepPeriod=new n.EnumConverter({[i.DateStepPeriod.Years]:a.PeriodType.Years,[i.DateStepPeriod.Quarters]:a.PeriodType.Quarters,[i.DateStepPeriod.Months]:a.PeriodType.Months,[i.DateStepPeriod.Weeks]:a.PeriodType.Weeks,[i.DateStepPeriod.Days]:a.PeriodType.Days,[i.DateStepPeriod.Hours]:a.PeriodType.Hours,[i.DateStepPeriod.Minutes]:a.PeriodType.Minutes,[i.DateStepPeriod.Seconds]:a.PeriodType.Seconds}),s.dateRangeType=new n.EnumConverter({[i.DateRangeType.Current]:a.DateRangeType.Current,[i.DateRangeType.Last]:a.DateRangeType.Last,[i.DateRangeType.LastN]:a.DateRangeType.LastN,[i.DateRangeType.Next]:a.DateRangeType.Next,[i.DateRangeType.NextN]:a.DateRangeType.NextN,[i.DateRangeType.ToDate]:a.DateRangeType.ToDate}),s.errorCode=new n.EnumConverter({[i.ErrorCodes.INITIALIZATION_ERROR]:a.ErrorCodes.InternalError,[i.ErrorCodes.INTERNAL_ERROR]:a.ErrorCodes.InternalError,[i.ErrorCodes.MISSING_ENUM_MAPPING]:a.ErrorCodes.InternalError,[i.ErrorCodes.MISSING_PARAMETER]:a.ErrorCodes.InternalError,[i.ErrorCodes.PERMISSION_DENIED]:a.ErrorCodes.InternalError,[i.ErrorCodes.PRES_MODEL_PARSING_ERROR]:a.ErrorCodes.InternalError,[i.ErrorCodes.UNKNOWN_VERB_ID]:a.ErrorCodes.InternalError,[i.ErrorCodes.VERSION_NOT_CONFIGURED]:a.ErrorCodes.APINotInitialized,[i.ErrorCodes.VISIBILITY_ERROR]:a.ErrorCodes.VisibilityError},a.ErrorCodes.InternalError),s.filterType=new n.EnumConverter({[i.FilterType.Categorical]:a.FilterType.Categorical,[i.FilterType.Range]:a.FilterType.Range,[i.FilterType.RelativeDate]:a.FilterType.RelativeDate,[i.FilterType.Hierarchical]:a.FilterType.Hierarchical}),s.classNameKey=new n.EnumConverter({"tableau-dashboard-title":a.ClassNameKey.DashboardTitle,"tableau-story-title":a.ClassNameKey.StoryTitle,"tableau-tooltip":a.ClassNameKey.Tooltip,"tableau-worksheet":a.ClassNameKey.Worksheet,"tableau-worksheet-title":a.ClassNameKey.WorksheetTitle,"tableau-pane":a.ClassNameKey.Pane,"tableau-row-dividers":a.ClassNameKey.RowDividers,"tableau-column-dividers":a.ClassNameKey.ColumnDividers,"dashboard-title":a.ClassNameKey.DashboardTitle,"story-title":a.ClassNameKey.StoryTitle,tooltip:a.ClassNameKey.Tooltip,worksheet:a.ClassNameKey.Worksheet,"worksheet-title":a.ClassNameKey.WorksheetTitle,pane:a.ClassNameKey.Pane,"row-dividers":a.ClassNameKey.RowDividers,"column-dividers":a.ClassNameKey.ColumnDividers}),s.hierarchicalLevelSelectionState=new n.EnumConverter({[i.HierarchicalLevelSelectionState.AllSelected]:a.HierarchicalLevelSelectionState.AllSelected,[i.HierarchicalLevelSelectionState.NoneSelected]:a.HierarchicalLevelSelectionState.NoneSelected,[i.HierarchicalLevelSelectionState.SomeSelected]:a.HierarchicalLevelSelectionState.SomeSelected,[i.HierarchicalLevelSelectionState.UnknownSelected]:a.HierarchicalLevelSelectionState.UnknownSelected}),s.annotationType=new n.EnumConverter({[i.AnnotateEnum.Area]:a.AnnotationType.Area,[i.AnnotateEnum.Mark]:a.AnnotationType.Mark,[i.AnnotateEnum.Point]:a.AnnotationType.Point}),s.markType=new n.EnumConverter({[i.MarkType.Area]:a.MarkType.Area,[i.MarkType.Bar]:a.MarkType.Bar,[i.MarkType.Circle]:a.MarkType.Circle,[i.MarkType.GanttBar]:a.MarkType.GanttBar,[i.MarkType.Heatmap]:a.MarkType.Heatmap,[i.MarkType.Line]:a.MarkType.Line,[i.MarkType.Map]:a.MarkType.Map,[i.MarkType.Pie]:a.MarkType.Pie,[i.MarkType.Polygon]:a.MarkType.Polygon,[i.MarkType.Shape]:a.MarkType.Shape,[i.MarkType.Square]:a.MarkType.Square,[i.MarkType.Text]:a.MarkType.Text,[i.MarkType.VizExtension]:a.MarkType.VizExtension})},2680:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664);t.EventListenerManager=class{constructor(){this._eventListenerManagers={}}addEventListener(e,t){if(!this._eventListenerManagers.hasOwnProperty(e))throw new i.TableauError(a.ErrorCodes.UnsupportedEventName,`Cannot add event, unsupported event type: ${e}`);return this._eventListenerManagers[e].addEventListener(t)}removeEventListener(e,t){if(!this._eventListenerManagers.hasOwnProperty(e))throw new i.TableauError(a.ErrorCodes.UnsupportedEventName,`Cannot remove event, unsupported event type: ${e}`);return this._eventListenerManagers[e].removeEventListener(t)}addNewEventType(e){this._eventListenerManagers[e.eventType]=e}}},1072:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Field=class{constructor(e){this._fieldImpl=e}get name(){return this._fieldImpl.name}get id(){return this._fieldImpl.id}get description(){return this._fieldImpl.description}get dataType(){return this._fieldImpl.dataType}get aggregation(){return this._fieldImpl.aggregation}get dataSource(){return this._fieldImpl.dataSource}get role(){return this._fieldImpl.role}get columnType(){return this._fieldImpl.columnType}get isCalculatedField(){return this._fieldImpl.isCalculatedField}get isCombinedField(){return this._fieldImpl.isCombinedField}get isGenerated(){return this._fieldImpl.isGenerated}get isGeospatial(){return this._fieldImpl.isGeospatial}get isHidden(){return this._fieldImpl.isHidden}get isPresentOnPublishedDatasource(){return this._fieldImpl.isPresentOnPublishedDatasource}}},2520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136);t.CustomViewImpl=class{constructor(e,t){this._registryId=t,this._luid=e.luid,this._name=e.name,this._shared=e.shared,this._isDefault=e.isDefault,this._ownerName=e.owner.userFriendlyName,this._url=e.url}get luid(){return this._luid}get name(){return this._name}set name(e){this._name=e}get shared(){return this._shared}set shared(e){this._shared=e}get isDefault(){return this._isDefault}set isDefault(e){this._isDefault=e}get ownerName(){return this._ownerName}get url(){return this._url}saveAsync(){return a.ApiServiceRegistry.get(this._registryId).getService("viz-service").saveAsync(this)}}},1940:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7419),n=r(3448),s=r(6557),o=r(6368),l=r(3008),d=r(6664),c=r(7480),u=r(6488),h=r(8332),p=r(8736),m=r(6500);class g extends h.SheetImpl{constructor(e,t,r,a,i,n=0){super(e,a),this._zones=t,this._sheetPath=r,this._parentStoryPointImpl=i,this._activeDashboardObjectId=n}get worksheetsImpl(){return this._worksheetsImpl}get objects(){return this._objects}get parentStoryPoint(){return this._parentStoryPointImpl}get activeDashboardObjectId(){return this._activeDashboardObjectId}get activeDashboardName(){return this._sheetPath.sheetName}initializeWithPublicInterfaces(){this._worksheetsImpl=new Array,this._objects=new Array,this.zoneMap=new Map;for(const e of this._zones){let t;const r={width:e.width,height:e.height},a=!1;if(e.zoneType===n.DashboardObjectType.Worksheet||e.zoneType===n.DashboardObjectType.QuickFilter){let s="",o="",l=!1;e.sheetInfo?(s=e.sheetInfo.name,o=e.sheetInfo.url||"",l=""===o):s=e.name;const d=new p.SheetInfoImpl(s,i.SheetType.Worksheet,r,this._worksheetsImpl.length,a,l,o),c={worksheet:s,dashboard:this._sheetInfoImpl.name,storyboard:this._sheetPath.storyboard,flipboardZoneID:this._sheetPath.flipboardZoneID,storyPointID:this._sheetPath.storyPointID};t=new m.WorksheetImpl(d,this._registryId,c,this,this._parentStoryPointImpl),e.zoneType===n.DashboardObjectType.Worksheet&&this._worksheetsImpl.push(t)}const l=new o.Point(e.x,e.y),d=new u.DashboardObjectImpl(this,s.InternalToExternalEnumMappings.dashboardObjectType.convert(e.zoneType),l,r,t,e.name,void 0!==e.isFloating&&e.isFloating,void 0===e.isVisible||e.isVisible,e.zoneId,e.fieldId);this._objects.push(d),this.zoneMap.set(e.zoneId,d)}}setDashboardObjectVisibilityAsync(e){return l.ApiServiceRegistry.get(this._registryId).getService("zone-service").setVisibilityAsync(this.name,this.zoneMap,e)}getDashboardObjectById(e){return this.zoneMap.get(e)}updateZones(e,t=0,r=""){const a=this._objects,n=this.zoneMap,s=this._activeDashboardObjectId,o=this._sheetPath.sheetName;this._zones=e,this._activeDashboardObjectId=t,r&&(this._sheetPath.sheetName=r,this._sheetInfoImpl.name=r),this.initializeWithPublicInterfaces();const l=this._objects,d=this.zoneMap,c=new Map;return a.forEach((e=>{const t=e.id;if(!d.has(t))return void this.addChange(t,c,i.DashboardLayoutChange.Removed);const r=d.get(t);e.isFloating!==r.isFloating&&this.addChange(t,c,i.DashboardLayoutChange.IsFloatingChanged),e.isVisible!==r.isVisible&&this.addChange(t,c,i.DashboardLayoutChange.IsVisibleChanged),e.name!==r.name&&this.addChange(t,c,i.DashboardLayoutChange.NameChanged),e.position.x===r.position.x&&e.position.y===r.position.y||this.addChange(t,c,i.DashboardLayoutChange.PositionChanged),e.size.width===r.size.width&&e.size.height===r.size.height||this.addChange(t,c,i.DashboardLayoutChange.SizeChanged)})),l.forEach((e=>{n.has(e.id)||this.addChange(e.id,c,i.DashboardLayoutChange.Added)})),s!==t&&(0!==t&&this.addChange(t,c,i.DashboardLayoutChange.Selected),0!==s&&this.addChange(s,c,i.DashboardLayoutChange.Deselected)),r&&o!==r&&this.addChange(0,c,i.DashboardLayoutChange.DashboardChanged),c}addChange(e,t,r){t.has(e)||t.set(e,[]),t.get(e).push(r)}moveAndResizeDashboardObjectsAsync(e){return l.ApiServiceRegistry.get(this._registryId).getService("zone-service").moveAndResizeAsync(this.name,this.zoneMap,e)}replayAnimationAsync(e){return l.ApiServiceRegistry.get(this._registryId).getService("animation-service").replayAsync(e)}getFiltersAsync(){return this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").getDashboardFiltersAsync()}applyFilterAsync(e,t,r,n){if(c.ErrorHelpers.verifyEnumValue(r,a.FilterUpdateType,"FilterUpdateType"),c.ErrorHelpers.verifyStringParameter(e,"fieldName"),!Array.isArray(t))throw new d.TableauError(i.ErrorCodes.InvalidParameter,"values parameter for applyDashboardFilterAsync must be an array");return this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyDashboardFilterAsync(e,t,r,n)}getWorksheetNamesFromZones(){const e=[];for(const t of this._zones){if(t.zoneType!==n.DashboardObjectType.Worksheet)continue;const r=t.sheetInfo?t.sheetInfo.name:t.name;e.push(r)}return e}verifyActiveSheetOrEmbeddedInActiveStoryPoint(){const e=this.active,t=null!=this.parentStoryPoint&&this.parentStoryPoint.active;if(!e&&!t)throw new d.TableauError(i.SharedErrorCodes.NotActiveSheet,"Operation not allowed on non-active sheet")}}t.DashboardImpl=g},6488:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DashboardObjectImpl=class{constructor(e,t,r,a,i,n,s,o,l,d){this._dashboardImpl=e,this._type=t,this._position=r,this._size=a,this._worksheetImpl=i,this._name=n,this._isFloating=s,this._isVisible=o,this._id=l,this._fieldId=d}get dashboardImpl(){return this._dashboardImpl}get type(){return this._type}get position(){return this._position}get size(){return this._size}get worksheetImpl(){return this._worksheetImpl}get name(){return this._name}get isFloating(){return this._isFloating}get isVisible(){return this._isVisible}get id(){return this._id}get fieldId(){return this._fieldId}}},2180:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(716),n=r(1072),s=r(624),o=r(3008),l=r(7603),d=r(7480),c=r(5288);t.DataSourceImpl=class{constructor(e,t){this._dataSourceInfo=e,this._registryId=t,this._fields=e.fields.map((e=>{const t=new c.FieldImpl(e,this);return new n.Field(t)}))}get name(){return this._dataSourceInfo.name}get id(){return this._dataSourceInfo.id}get extractUpdateTime(){return this._dataSourceInfo.extractUpdateTime}get fields(){return this._fields}get isExtract(){return this._dataSourceInfo.isExtract}get isPublished(){return this._dataSourceInfo.isPublished}publishedUrl(){return this._dataSourceInfo.publishedUrl}getMaxPageRowLimit(){return 1e4}refreshAsync(){return o.ApiServiceRegistry.get(this._registryId).getService("data-source-service").refreshAsync(this._dataSourceInfo.id)}getConnectionSummariesAsync(){return o.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getConnectionSummariesAsync(this._dataSourceInfo.id).then((e=>e.map((e=>new i.ConnectionSummary(e)))))}getActiveTablesAsync(){return o.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getActiveTablesAsync(this._dataSourceInfo.id).then((e=>e.map((e=>new l.TableSummary(e)))))}getUnderlyingDataAsync(e){return e=e||{},o.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getDataSourceDataAsync(this.id,!!e.ignoreAliases,e.maxRows||0,e.columnsToInclude||[],e.columnsToIncludeById||[],e.includeDataValuesOption||a.IncludeDataValuesOption.AllValues)}getLogicalTableDataAsync(e,t){return t=t||{},o.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getLogicalTableDataAsync(this.id,e,!!t.ignoreAliases,t.maxRows||0,t.columnsToInclude||[],t.columnsToIncludeById||[],t.includeDataValuesOption||a.IncludeDataValuesOption.AllValues)}getLogicalTableDataReaderAsync(e,t,r){return r=r||{},o.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getLogicalTableDataReaderAsync(this.id,e,t||this.getMaxPageRowLimit(),!!r.ignoreAliases,r.columnsToIncludeById||[],r.includeDataValuesOption||a.IncludeDataValuesOption.AllValues)}initializeWithPublicInterfaces(e){d.ErrorHelpers.verifyInternalValue(e,"dataSource"),this._fields=this._dataSourceInfo.fields.map((t=>{const r=new c.FieldImpl(t,e);return new n.Field(r)}))}getLogicalTablesAsync(){return o.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getLogicalTablesAsync(this.id).then((e=>e.map((e=>new s.LogicalTable(e)))))}}},5288:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(6557);t.FieldImpl=class{constructor(e,t){this._fieldInfo=e,this._parentDataSource=t}get name(){return this._fieldInfo.name}get id(){return this._fieldInfo.id}get description(){return this._fieldInfo.description}get dataType(){var e;return null!=(e=this._fieldInfo.dataType)?e:a.DataType.Unknown}get aggregation(){return n.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation)}get dataSource(){if(!this._parentDataSource)throw new Error("Data source information is not available for this field. Please use getFieldAsync method to get field's data source information");return this._parentDataSource}get role(){return n.InternalToExternalEnumMappings.fieldRoleType.convert(this._fieldInfo.role)}get columnType(){let e=this._fieldInfo.columnType||i.ColumnType.Unknown;return n.InternalToExternalEnumMappings.columnType.convert(e)}get isCalculatedField(){return this._fieldInfo.isCalculatedField}get isCombinedField(){return this._fieldInfo.isCombinedField}get isGenerated(){return this._fieldInfo.isGenerated}get isGeospatial(){return this._fieldInfo.isGeospatial}get isHidden(){return this._fieldInfo.isHidden}get isPresentOnPublishedDatasource(){return this._fieldInfo.isPresentOnPublishedDatasource}}},8552:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6557),n=r(3008),s=r(8052),o=r(7480),l=r(1172);t.ParameterImpl=class{constructor(e,t){this._registryId=t,this.setParameterInfo(e)}get name(){return this._parameterInfo.name}get currentValue(){return s.DataValueFactory.MakeParameterDataValue(this._parameterInfo.currentValue,this._parameterInfo.dataType)}get dataType(){return i.InternalToExternalEnumMappings.dataType.convert(this._parameterInfo.dataType)}get id(){return this._globalFieldName}get allowableValues(){return this._allowableValues}changeValueAsync(e){o.ErrorHelpers.verifyParameter(e,"newValue");const t=l.Param.serializeParameterValue(e);return n.ApiServiceRegistry.get(this._registryId).getService("parameters-service").changeParameterValueAsync(this._globalFieldName,t).then((e=>(this.setParameterInfo(e),this.currentValue)))}setParameterInfo(e){this._parameterInfo=e,this._globalFieldName=e.fieldName;const t=i.InternalToExternalEnumMappings.allowableValues.convert(e.allowableValuesType);let r,n,o,l,d;t===a.ParameterValueType.List?r=(e.allowableValues||[]).map((t=>s.DataValueFactory.MakeParameterDataValue(t,e.dataType))):t===a.ParameterValueType.Range&&(n=e.minValue&&s.DataValueFactory.MakeParameterDataValue(e.minValue,e.dataType),o=e.maxValue&&s.DataValueFactory.MakeParameterDataValue(e.maxValue,e.dataType),l=e.stepSize,d=e.dateStepPeriod&&i.InternalToExternalEnumMappings.dateStepPeriod.convert(e.dateStepPeriod)),this._allowableValues={type:t,allowableValues:r,minValue:n,maxValue:o,stepSize:l,dateStepPeriod:d}}}},8332:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3008),n=r(6664),s=r(7480),o=r(1172),l=r(2780);class d{constructor(e,t){this._sheetInfoImpl=e,this._registryId=t}get name(){return this._sheetInfoImpl.name}get sheetType(){return this._sheetInfoImpl.sheetType}get sheetPath(){return this._sheetInfoImpl.sheetPath}get size(){return this._sheetInfoImpl.sheetSize}get hidden(){if(void 0!==this._sheetInfoImpl.isHidden)return this._sheetInfoImpl.isHidden;throw new n.TableauError(a.EmbeddingErrorCodes.ImplementationError,"isHidden not implemented")}get active(){if(void 0!==this._sheetInfoImpl.isActive)return this._sheetInfoImpl.isActive;throw new n.TableauError(a.EmbeddingErrorCodes.ImplementationError,"active not implemented")}set active(e){void 0!==this._sheetInfoImpl.isActive&&(this._sheetInfoImpl.active=e)}get index(){if(void 0!==this._sheetInfoImpl.index)return this._sheetInfoImpl.index;throw new n.TableauError(a.EmbeddingErrorCodes.ImplementationError,"index not implemented")}get url(){if(void 0!==this._sheetInfoImpl.url)return this._sheetInfoImpl.url;throw new n.TableauError(a.EmbeddingErrorCodes.ImplementationError,"url not implemented")}getSheetSize(){if(!l.SheetUtils.isValidSheetSize(this.size))throw new n.TableauError(a.EmbeddingErrorCodes.InternalError,"size is not of type SheetSize");return this.size}findParameterAsync(e){return s.ErrorHelpers.verifyParameter(e,"parameterName"),i.ApiServiceRegistry.get(this._registryId).getService("parameters-service").findParameterByNameAsync(e)}getParametersAsync(){return i.ApiServiceRegistry.get(this._registryId).getService("parameters-service").getParametersForSheetAsync(this.sheetPath)}changeSizeAsync(e){const t=new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Invalid sheet size parameter");if(!e||!e.behavior)throw t;const r=this.normalizeSheetSize(e),s=r.behavior===a.SheetSizeBehavior.Automatic;if(!s&&!r.minSize&&!r.maxSize)throw t;if(!s&&this.sheetType===a.SheetType.Worksheet)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSizeBehaviorOnWorksheet,"Only SheetSizeBehavior.Automatic is allowed on Worksheets");if(s&&this.getSheetSize().behavior===r.behavior)return Promise.resolve(e);const o=this.processNewSize(r);return i.ApiServiceRegistry.get(this._registryId).getService("size-service").changeSizeAsync(this.name,o).then((()=>i.ApiServiceRegistry.get(this._registryId).getService("client-info-service").getClientInfoAsync().then((e=>{const t=e.publishedSheets.find((e=>e.name===this.name));if(!t)throw new n.TableauError(a.SharedErrorCodes.InternalError,`Can't find sheet with name ${this.name}`);const r=l.SheetUtils.getSheetSizeFromSizeConstraints(t.sizeConstraint);return this._sheetInfoImpl.sheetSize=r,r}))))}normalizeSheetSize(e){const{behavior:t}=e;return s.ErrorHelpers.verifyEnumValue(t,a.SheetSizeBehavior,"SheetSizeBehavior"),{behavior:t,minSize:d.parseDimensions(e.minSize),maxSize:d.parseDimensions(e.maxSize)}}processNewSize(e){var t,r,i,s;const{behavior:l,minSize:d,maxSize:c}=e,u=!o.Param.isNullOrUndefined(null===(t=d)||void 0===t?void 0:t.width),h=!o.Param.isNullOrUndefined(null===(r=d)||void 0===r?void 0:r.height),p=!o.Param.isNullOrUndefined(null===(i=c)||void 0===i?void 0:i.width),m=!o.Param.isNullOrUndefined(null===(s=c)||void 0===s?void 0:s.height),g=u&&h,y=p&&m;switch(l){case a.SheetSizeBehavior.Automatic:return{behavior:l};case a.SheetSizeBehavior.AtMost:{if(!c||!y)throw new n.TableauError(a.EmbeddingErrorCodes.MissingMaxSize,"Missing maxSize for SheetSizeBehavior.AtMost");const e={width:c.width,height:c.height};if(e.width<0||e.height<0)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:l,maxSize:e}}case a.SheetSizeBehavior.AtLeast:{if(!d||!g)throw new n.TableauError(a.EmbeddingErrorCodes.MissingMinSize,"Missing minSize for SheetSizeBehavior.AtLeast");const e={width:d.width,height:d.height};if(e.width<0||e.height<0)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:l,minSize:e}}case a.SheetSizeBehavior.Range:{if(!(d&&c&&g&&y))throw new n.TableauError(a.EmbeddingErrorCodes.MissingMinMaxSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");const e={width:d.width,height:d.height},t={width:c.width,height:c.height};if(e.width<0||e.height<0||t.width<0||t.height<0||e.width>t.width||e.height>t.height)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");return{behavior:l,minSize:e,maxSize:t}}case a.SheetSizeBehavior.Exactly:if(d&&c){if(g&&y){const e={width:d.width,height:d.height},t={width:c.width,height:c.height};if(e.width!==t.width||e.height!==t.height)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Conflicting size values for SheetSizeBehavior.Exactly");return{behavior:l,minSize:e,maxSize:t}}if(g){const e={width:d.width,height:d.height};return{behavior:l,minSize:e,maxSize:e}}if(y){const e={width:c.width,height:c.height};return{behavior:l,minSize:e,maxSize:e}}}throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Invalid sheet size parameter");default:throw new n.TableauError(a.SharedErrorCodes.InternalError,`Unsupported sheet size behavior: ${l}`)}}}t.SheetImpl=d,d.parseDimensions=e=>{const t={width:void 0,height:void 0};if(!e)return t;const{success:r,parsed:a}=o.Param.tryParseNumber(e.width),{success:i,parsed:n}=o.Param.tryParseNumber(e.height);return r&&i?{width:a,height:n}:r?{width:a}:i?{height:n}:t}},8736:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419);t.SheetInfoImpl=class{constructor(e,t,r,a,i,n,s){this._name=e,this._sheetType=t,this._sheetSize=r,this._index=a,this._isActive=i,this._isHidden=n,this._url=s}get name(){return this._name}set name(e){this._name=e}get sheetSize(){return this._sheetSize}set sheetSize(e){this._sheetSize=e}get sheetType(){return this._sheetType}get sheetPath(){return{sheetName:this.name,isDashboard:this.sheetType===a.SheetType.Dashboard}}get index(){return this._index}get isActive(){return this._isActive}set active(e){this._isActive=e}get isHidden(){return this._isHidden}get url(){return this._url}}},5144:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SingleEventManagerImpl=class{constructor(e){this._eventType=e,this._handlers=[]}get eventType(){return this._eventType}addEventListener(e){return this._handlers.push(e),()=>this.removeEventListener(e)}removeEventListener(e){const t=this._handlers.length;return this._handlers=this._handlers.filter((t=>t!==e)),t>this._handlers.length}triggerEvent(e){for(const t of this._handlers)try{t(e())}catch(e){continue}}}},6804:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3008),n=r(6664),s=r(7480),o=r(3036),l=r(8332),d=r(2608),c=r(6068);class u extends l.SheetImpl{constructor(e,t,r,a){super(e,a),this._sheetInfoImpl=e,this._publishedSheetInfos=r,this._registryId=a,this._storyPointInfoImpls=[],this._deferred=new o.ShortLivedDeferred,this.initializeStory(t)}initializeStory(e){e.storyPoints.forEach((t=>{const r=t.index===e.activeStoryPointIndex,a=new c.StoryPointInfoImpl(t.caption,t.index,t.storyPointId,r,t.updated,this);this._storyPointInfoImpls.push(a),r&&(this._activeStoryPointImpl=new d.StoryPointImpl(a,this._publishedSheetInfos,this._registryId,t.containedSheetInfo))}))}updateStoryInfo(e,t){if(!this._storyPointInfoImpls)return;let r=this._storyPointInfoImpls[e];if(r.storyPointId!==t.storyPointId)throw new n.TableauError(a.EmbeddingErrorCodes.StoryPointIdMismatch,`We should not be updating a story point when the IDs don't match. Existing storyPointID=${r.storyPointId}, newStoryPointID=${t.storyPointId}`);r.caption=t.caption,r.updated=t.updated,this._activeStoryPointImpl.storyPointId===t.storyPointId&&(this._activeStoryPointImpl.updated=r.updated)}updateStory(e){this._storyPointInfoImpls&&(this._storyPointInfoImpls.forEach((t=>{t.storyPointId===e.storyPointId?(t.caption=e.caption,t.index=e.index,t.active=!0,t.updated=e.updated,this._activeStoryPointImpl=new d.StoryPointImpl(t,this._publishedSheetInfos,this._registryId,e.containedSheetInfo)):t.active=!1})),this.activeStoryPoint&&this._deferred.resolve(this.activeStoryPoint))}get activeStoryPoint(){return this._activeStoryPointImpl}get storyPointsInfo(){return this._storyPointInfoImpls}get isActive(){return this._sheetInfoImpl.active}get isHidden(){return!!this._sheetInfoImpl.isHidden}activateNextStoryPointAsync(){if(this._activeStoryPointImpl.index===this._storyPointInfoImpls.length-1)return Promise.resolve(this._activeStoryPointImpl);let e=this._deferred.getNewPromiseOrThrowIfBusy();return i.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").activateNextStoryPointAsync(),e}activatePreviousStoryPointAsync(){if(0===this._activeStoryPointImpl.index)return Promise.resolve(this._activeStoryPointImpl);let e=this._deferred.getNewPromiseOrThrowIfBusy();return i.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").activatePreviousStoryPointAsync(),e}activateStoryPointAsync(e){if(s.ErrorHelpers.verifyParameter(e,"index"),s.ErrorHelpers.verifyParameterType(e,"number","index"),e<0||e>=this._storyPointInfoImpls.length)throw new n.TableauError(a.EmbeddingErrorCodes.IndexOutOfRange,"The index passed to this command is out of range.");if(e===this._activeStoryPointImpl.index)return Promise.resolve(this._activeStoryPointImpl);let t=this._deferred.getNewPromiseOrThrowIfBusy();return i.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").activateStoryPointAsync(e),t}revertStoryPointAsync(e){if(s.ErrorHelpers.verifyParameter(e,"index"),s.ErrorHelpers.verifyParameterType(e,"number","index"),e<0||e>=this._storyPointInfoImpls.length)throw new n.TableauError(a.EmbeddingErrorCodes.IndexOutOfRange,"The index passed to this command is out of range.");return i.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").revertStoryPointAsync(e).then((e=>(this.updateStoryInfo(e.index,e),new c.StoryPointInfoImpl(e.caption,e.index,e.storyPointId,!1,e.updated,this))))}clearPendingPromises(){this._deferred&&this._deferred.reject("All pending promises cleared")}}t.StoryImpl=u},2608:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664),n=r(2780),s=r(1940),o=r(8736),l=r(6500);t.StoryPointImpl=class{constructor(e,t,r,a){this._storyPointInfoImpl=e,a&&(this._containedSheetImpl=this.createContainedSheet(a,t,r))}get index(){return this._storyPointInfoImpl.index}get caption(){return this._storyPointInfoImpl.caption}get active(){return this._storyPointInfoImpl.active}get updated(){return this._storyPointInfoImpl.updated}set updated(e){this._storyPointInfoImpl.updated=e}get parentStory(){return this._storyPointInfoImpl.parentStory}get containedSheet(){return this._containedSheetImpl}get storyPointId(){return this._storyPointInfoImpl.storyPointId}createContainedSheet(e,t,r){const d=n.SheetUtils.getPublishedSheetInfoByName(e.name,t),c=n.SheetUtils.createAutomaticSize(),u=void 0===d,h=d?d.url:"",p=new o.SheetInfoImpl(e.name,n.SheetUtils.getSheetTypeEnum(e.sheetType),c,-1,!1,u,h);let m;switch(p.sheetType){case a.SheetType.Worksheet:{const e={worksheet:p.name};m=new l.WorksheetImpl(p,r,e,null,this);break}case a.SheetType.Dashboard:{const t={sheetName:p.name,isDashboard:!0};m=new s.DashboardImpl(p,e.dashboardZones,t,r,this);break}default:throw new i.TableauError(a.SharedErrorCodes.ServerError,"Invalid SheetType")}return m}}},6068:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StoryPointInfoImpl=class{constructor(e,t,r,a,i,n){this._caption=e,this._index=t,this._storyPointId=r,this._active=a,this._updated=i,this._parentStoryImpl=n}get caption(){return this._caption}set caption(e){this._caption=e}get index(){return this._index}set index(e){this._index=e}get storyPointId(){return this._storyPointId}get active(){return this._active}set active(e){this._active=e}get updated(){return this._updated}set updated(e){this._updated=e}get parentStory(){return this._parentStoryImpl}}},3044:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorkbookImpl=class{}},6500:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7419),n=r(8340),s=r(624),o=r(3483),l=r(3008),d=r(6664),c=r(7480),u=r(2180),h=r(8332);class p extends h.SheetImpl{constructor(e,t,r,a,i,n=null,s=null){super(e,t),this._visualId=r,this._parentDashboardImpl=a,this._parentStoryPointImpl=i,this._backgroundColor=n,this._formatting=s}get parentDashboard(){return this._parentDashboardImpl}get parentStoryPoint(){return this._parentStoryPointImpl}get visualId(){return this._visualId}getMaxPageRowLimit(){return 1e4}get backgroundColor(){return this._backgroundColor}get formatting(){return this._formatting}applyFilterAsync(e,t,r,i){return c.ErrorHelpers.verifyEnumValue(r,a.FilterUpdateType,"Contract.FilterUpdateType"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyFilterAsync(this.visualId,e,t,r,i)}applyRangeFilterAsync(e,t){return c.ErrorHelpers.verifyParameter(e,"fieldName"),c.ErrorHelpers.verifyParameter(t,"filterOptions"),t.nullOption?c.ErrorHelpers.verifyEnumValue(t.nullOption,i.FilterNullOption,"FilterNullOption"):c.ErrorHelpers.verifyRangeParamType(t.min,t.max),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyRangeFilterAsync(this.visualId,e,t)}applyHierarchicalFilterAsync(e,t,r,n){if(c.ErrorHelpers.verifyParameter(e,"fieldName"),c.ErrorHelpers.verifyParameter(t,"values"),c.ErrorHelpers.verifyEnumValue(r,a.FilterUpdateType,"Contract.FilterUpdateType"),!Array.isArray(t)&&!t.levels)throw new d.TableauError(i.ErrorCodes.InvalidParameter,"values parameter for applyHierarchicalFilterAsync must be an array or contain a levels key");return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyHierarchicalFilterAsync(this.visualId,e,t,r,n)}clearFilterAsync(e){return c.ErrorHelpers.verifyParameter(e,"fieldName"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").clearFilterAsync(this.visualId,e)}applyRelativeDateFilterAsync(e,t){return c.ErrorHelpers.verifyStringParameter(e,"fieldName"),c.ErrorHelpers.verifyParameter(t,"options"),c.ErrorHelpers.verifyEnumValue(t.periodType,i.PeriodType,"PeriodType"),c.ErrorHelpers.verifyEnumValue(t.rangeType,i.DateRangeType,"DateRangeType"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyRelativeDateFilterAsync(this.visualId,e,t)}getDataSourcesAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getDataSourcesAsync(this.visualId).then((e=>{const t=e,r=t.worksheetDataSchemaMap[this.name],a=[],i=r.primaryDataSource;a.push(this.createDataSourceFromInfo(t.dataSources[i]));for(const e of r.referencedDataSourceList)e!==i&&a.push(this.createDataSourceFromInfo(t.dataSources[e]));return a}))}getFiltersAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").getFiltersAsync(this.visualId)}getSelectedMarksAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getSelectedMarksAsync(this.visualId)}getHighlightedMarksAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getHighlightedMarksAsync(this.visualId)}getSummaryDataAsync(e){var t;return this.verifyActiveSheet(),e=e||{},l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getUnderlyingDataAsync(this.visualId,o.GetDataType.Summary,!!e.ignoreAliases,!!e.ignoreSelection,!0,e.columnsToIncludeById||[],e.maxRows||0,e.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!=(t=e.applyWorksheetFormatting)&&t)}getSummaryDataReaderAsync(e,t){var r;return this.verifyActiveSheet(),t=t||{},l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getSummaryDataReaderAsync(this.visualId,e||this.getMaxPageRowLimit(),!!t.ignoreAliases,!!t.ignoreSelection,!0,t.columnsToIncludeById||[],t.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!=(r=t.applyWorksheetFormatting)&&r)}getVisualSpecificationAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("visual-model-service").getVisualSpecificationAsync(this.visualId)}addMarksCardFieldsAsync(e,t,r,a){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("visual-model-service").addMarksCardFieldsAsync(this.visualId,e,t,r,a)}moveMarksCardFieldAsync(e,t,r,a){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("visual-model-service").moveMarksCardFieldAsync(this.visualId,e,t,r,a)}spliceMarksCardFieldsAsync(e,t,r,a,i){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("visual-model-service").spliceMarksCardFieldsAsync(this.visualId,e,t,r,a,i)}getSummaryColumnsInfoAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getSummaryColumnsInfoAsync(this.visualId)}getUnderlyingDataAsync(e){var t;return this.verifyActiveSheet(),e=e||{},l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getUnderlyingDataAsync(this.visualId,o.GetDataType.Underlying,!!e.ignoreAliases,!!e.ignoreSelection,!!e.includeAllColumns,e.columnsToIncludeById||[],e.maxRows||0,e.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!=(t=e.applyWorksheetFormatting)&&t)}getUnderlyingTablesAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getUnderlyingTablesAsync(this.visualId).then((e=>e.map((e=>new s.LogicalTable(e)))))}getUnderlyingTableDataAsync(e,t){var r;return this.verifyActiveSheet(),t=t||{},l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getUnderlyingTableDataAsync(this.visualId,e,!!t.ignoreAliases,!!t.ignoreSelection,!!t.includeAllColumns,t.columnsToIncludeById||[],t.maxRows||0,t.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!=(r=t.applyWorksheetFormatting)&&r)}getUnderlyingTableDataReaderAsync(e,t,r){var a;return this.verifyActiveSheet(),r=r||{},l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getUnderlyingTableDataReaderAsync(this.visualId,e,t||this.getMaxPageRowLimit(),!!r.ignoreAliases,!!r.ignoreSelection,!!r.includeAllColumns,r.columnsToIncludeById||[],r.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!=(a=r.applyWorksheetFormatting)&&a)}clearSelectedMarksAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("selection-service").clearSelectedMarksAsync(this.visualId)}selectMarksByValueAsync(e,t){return c.ErrorHelpers.verifyParameter(e,"fieldName"),c.ErrorHelpers.verifyEnumValue(t,i.SelectionUpdateType,"SelectionUpdateType"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("selection-service").selectMarksByValueAsync(this.visualId,e,t)}selectMarksByIdAsync(e,t){return c.ErrorHelpers.verifyParameter(e,"fieldName"),c.ErrorHelpers.verifyEnumValue(t,i.SelectionUpdateType,"SelectionUpdateType"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("selection-service").selectMarksByIdAsync(this.visualId,e,t)}annotateMarkAsync(e,t){return c.ErrorHelpers.verifyParameter(e,"mark"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("annotation-service").annotateMarkAsync(this.visualId,e,t)}getAnnotationsAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("annotation-service").getAnnotationsAsync(this.visualId)}removeAnnotationAsync(e){return c.ErrorHelpers.verifyParameter(e,"annotation"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("annotation-service").removeAnnotationAsync(this.visualId,e)}appendContextMenuAsync(e,t){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service").appendContextMenuAsync(this.visualId.worksheet,e,t)}removeContextMenuAsync(e,t){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service").removeContextMenuAsync(this.visualId.worksheet,e,t)}executeContextMenuAsync(e,t){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service").executeContextMenuAsync(this.visualId.worksheet,e,t)}renameContextMenuAsync(e,t,r){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service").renameContextMenuAsync(this.visualId.worksheet,e,t,r)}hoverTupleAsync(e,t,r){return this.isInsideDashboardExtension()?Promise.reject(new d.TableauError(a.SharedErrorCodes.ImplementationError,"hoverTupleAsync is not supported in dashboard extensions")):l.ApiServiceRegistry.get(this._registryId).getService("selection-service").hoverTupleAsync(this.visualId,e,t,r)}selectTuplesAsync(e,t,r){return this.isInsideDashboardExtension()?Promise.reject(new d.TableauError(a.SharedErrorCodes.ImplementationError,"selectTuplesAsync is not supported in dashboard extensions")):l.ApiServiceRegistry.get(this._registryId).getService("selection-service").selectTuplesAsync(this.visualId,e,t,r)}getTooltipTextAsync(e){return this.isInsideDashboardExtension()?Promise.reject(new d.TableauError(a.SharedErrorCodes.ImplementationError,"getTooltipTextAsync is not supported in dashboard extensions")):l.ApiServiceRegistry.get(this._registryId).getService("accessibility").getTooltipTextAsync(this.visualId,e)}leaveMarkNavigationAsync(){return this.isInsideDashboardExtension()?Promise.reject(new d.TableauError(a.SharedErrorCodes.ImplementationError,"leaveMarkNavigationAsync is not supported in dashboard extensions")):l.ApiServiceRegistry.get(this._registryId).getService("accessibility").leaveMarkNavigationAsync(this.visualId)}editAliasesDialogAsync(e){return l.ApiServiceRegistry.get(this._registryId).getService("visual-model-service").editAliasesDialogAsync(e)}createDataSourceFromInfo(e){const t=new u.DataSourceImpl(e,this._registryId),r=new n.DataSource(t);return t.initializeWithPublicInterfaces(r),r}verifyActiveSheet(){const e=this.active,t=this.isInsideActiveDashboard(),r=this.isInsideActiveStoryPoint();if(!e&&!t&&!r)throw new d.TableauError(i.SharedErrorCodes.NotActiveSheet,"Operation not allowed on non-active sheet")}isInsideActiveStoryPoint(){return this._parentStoryPointImpl&&this._parentStoryPointImpl.active}isInsideActiveDashboard(){return this._parentDashboardImpl&&this._parentDashboardImpl.active}isInsideDashboardExtension(){return null!==this._parentDashboardImpl}}t.WorksheetImpl=p},624:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LogicalTable=class{constructor(e){this._logicalTable=e}get id(){return this._logicalTable.id}get caption(){return this._logicalTable.caption}}},5064:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TooltipTextRequestModel=class{constructor(e,t){this.visualIdPresModel=e,this.tupleId=t}}},6296:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3008),n=r(7480);class s{constructor(e,t,r,a,i){this._worksheetName=e,this._fieldName=t,this._filterType=r,this._fieldId=a,this._registryId=i}get worksheetName(){return this._worksheetName}get fieldName(){return this._fieldName}get fieldId(){return this._fieldId}get filterType(){return this._filterType}getFieldAsync(){return i.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getFieldAsync(this._fieldId)}getAppliedWorksheetsAsync(){return i.ApiServiceRegistry.get(this._registryId).getService("filter-service").getAppliedWorksheetsAsync(this._worksheetName,this._fieldId)}setAppliedWorksheetsAsync(e){n.ErrorHelpers.verifyParameter(e,"applyToWorksheets");const t=new Set(e);return i.ApiServiceRegistry.get(this._registryId).getService("filter-service").setAppliedWorksheetsAsync(this._worksheetName,this._fieldName,this._fieldId,Array.from(t))}}t.Filter=s,t.CategoricalFilter=class extends s{constructor(e,t,r,a,i,n,s,o){super(e,t,a,r,i),this._appliedValues=n,this._isExcludeMode=s,this._isAllSelected=o}get isAllSelected(){return this._isAllSelected}get appliedValues(){return this._appliedValues}get isExcludeMode(){return this._isExcludeMode}getDomainAsync(e){return e||(e=a.FilterDomainType.Relevant),n.ErrorHelpers.verifyEnumValue(e,a.FilterDomainType,"FilterDomainType"),i.ApiServiceRegistry.get(this._registryId).getService("filter-service").getCategoricalDomainAsync(this._worksheetName,this._fieldId,e)}},t.HierarchicalDataValue=class{constructor(e,t,r){this._value=e,this._hierarchicalPath=t,this._level=r}get value(){return this._value}get hierarchicalPath(){return this._hierarchicalPath}get level(){return this._level}},t.HierarchicalLevelDetail=class{constructor(e,t){this._name=e,this._levelSelectionState=t}get name(){return this._name}get levelSelectionState(){return this._levelSelectionState}},t.HierarchicalFilter=class extends s{constructor(e,t,r,a,i,n,s,o,l,d,c){super(e,t,a,r,i),this._dimensionName=n,this._hierarchyCaption=s,this._numberOfLevels=o,this._levelDetails=l,this._appliedValues=d,this._isAllSelected=c}getDomainAsync(e){throw new Error("Method not implemented.")}get dimensionName(){return this._dimensionName}get hierarchyCaption(){return this._hierarchyCaption}get numberOfLevels(){return this._numberOfLevels}get levelDetails(){return this._levelDetails}get isAllSelected(){return this._isAllSelected}get appliedValues(){return this._appliedValues}},t.RangeFilter=class extends s{constructor(e,t,r,a,i,n,s,o){super(e,t,a,r,i),this._min=n,this._max=s,this._includeNullValues=o}get minValue(){return this._min}get maxValue(){return this._max}get includeNullValues(){return this._includeNullValues}getDomainAsync(e){const t=i.ApiServiceRegistry.get(this._registryId).getService("filter-service");return e||(e=a.FilterDomainType.Relevant),n.ErrorHelpers.verifyEnumValue(e,a.FilterDomainType,"FilterDomainType"),t.getRangeDomainAsync(this._worksheetName,this._fieldId,e)}},t.RelativeDateFilter=class extends s{constructor(e,t,r,a,i,n,s,o,l){super(e,t,a,r,i),this._anchorDate=n,this._periodType=s,this._rangeType=o,this._rangeN=l}get anchorDate(){return this._anchorDate}get periodType(){return this._periodType}get rangeType(){return this._rangeType}get rangeN(){return this._rangeN}},t.CategoricalDomain=class{constructor(e,t){this._values=e,this._domainType=t}get values(){return this._values}get type(){return this._domainType}},t.RangeDomain=class{constructor(e,t,r){this._min=e,this._max=t,this._domainType=r}get type(){return this._domainType}get min(){return this._min}get max(){return this._max}}},5068:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataTable=class{constructor(e,t,r,a,i,n){this._data=e,this._columns=t,this._totalRowCount=r,this._isTotalRowCountLimited=a,this._isSummaryData=i,this._marksInfo=n,this._name=i?"Summary Data Table":"Underlying Data Table"}get name(){return this._name}get data(){return this._data}get columns(){return this._columns}get marksInfo(){return this._marksInfo}get totalRowCount(){return this._totalRowCount}get isTotalRowCountLimited(){return this._isTotalRowCountLimited}get isSummaryData(){return this._isSummaryData}},t.MarkInfo=class{constructor(e,t,r){this._type=e,this._color=t,this._tupleId=r}get type(){return this._type}get color(){return this._color}get tupleId(){return this._tupleId}},t.Column=class{constructor(e,t,r,a,i){this._fieldName=e,this._fieldId=t,this._dataType=r,this._isReferenced=a,this._index=i}get fieldName(){return this._fieldName}get fieldId(){return this._fieldId}get dataType(){return this._dataType}get isReferenced(){return this._isReferenced}get index(){return this._index}},t.DataValue=class{constructor(e,t,r,a,i){this._value=e,this._nativeValue=t,this._formattedValue=r,this._aliasValue=a,this._hasAlias=i}get value(){return this._value}get nativeValue(){return this._nativeValue}get formattedValue(){return this._formattedValue}get aliasValue(){return this._aliasValue}get hasAlias(){return this._hasAlias}}},7968:function(e,t,r){"use strict";var a=this&&this.__awaiter||function(e,t,r,a){return new(r||(r=Promise))((function(i,n){function s(e){try{l(a.next(e))}catch(e){n(e)}}function o(e){try{l(a.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,o)}l((a=a.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=r(3008),n=r(7480);t.DataTableReader=class{constructor(e,t,r,a){this._id=e,this._totalRowCount=t,this._pageRowCount=r,this._registryId=a,this._pageCount=Math.ceil(t/r)}get totalRowCount(){return this._totalRowCount}get pageCount(){return this._pageCount}getPageAsync(e){return n.ErrorHelpers.verifyRange(e,0,this._pageCount),i.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getPageAsync(this._id,e,this._pageRowCount)}getAllPagesAsync(e){return a(this,void 0,void 0,(function*(){const t=yield this.getPageAsync(0);e=e||this.totalRowCount;const r=Math.min(e,this.totalRowCount),a=Math.ceil(r/this._pageRowCount),i=Math.min(a,400),n=i{"use strict";Object.defineProperty(t,"__esModule",{value:!0});class r{}t.SelectionModel=r;class a extends r{constructor(){super(...arguments),this.selectValues=[]}}t.ValueSelectionModel=a,t.HierarchicalSelectionModel=class extends a{},t.RangeSelectionModel=class extends r{},t.DimensionSelectionModel=class extends a{},t.TupleSelectionModel=class{constructor(){this.objectIds=[]}},t.SelectionModelsContainer=class{constructor(){this.hierModelArr=[],this.dimModelArr=[],this.quantModelArr=[]}},t.SelectTuplesInteractionModel=class{constructor(e,t=[],r,a){this.visualIdPresModel=e,this.tupleIds=t,this.selectOptions=r,this.tooltipContext=a}},t.HoverTupleInteractionModel=class{constructor(e,t,r,a){this.visualIdPresModel=e,this.tupleId=t,this.tooltipContext=r,this.allowHoverActions=a}}},6368:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Point=class{constructor(e,t){this._x=e,this._y=t}get x(){return this._x}get y(){return this._y}}},3483:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.GetDataType||(t.GetDataType={})).Summary="summary",r.Underlying="underlying"},8672:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3008),i=r(3964),n=r(8028),s=r(1384),o=r(9196),l=r(4924),d=r(3851),c=r(8864),u=r(7712),h=r(1288),p=r(7260),m=r(8784),g=r(4109),y=r(6096),I=r(744),v=r(8856);t.registerAllSharedServices=function(e,t){a.ApiServiceRegistry.get(t).registerService(new n.AnimationServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new o.DataSourceServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new l.ExportServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new u.GetDataServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new c.FilterServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new h.NotificationServiceImpl(e)),a.ApiServiceRegistry.get(t).registerService(new p.ParametersServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new m.SelectionServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new s.AnnotationServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new v.ZoneServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new g.SizeServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new y.VisualModelServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new I.VizServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new d.ExternalContextMenuServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new i.AccessibilityServiceImpl(e,t))}},3008:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664);"undefined"!=typeof window&&(window.__tableauApiServiceRegistry=window.__tableauApiServiceRegistry||{});class n{constructor(){this._services={}}registerService(e){this._services[e.serviceName]=e}getService(e){if(!this._services.hasOwnProperty(e))throw new i.TableauError(a.ErrorCodes.InternalError,`Service not registered: ${e}`);return this._services[e]}}class s{static get(e){if(window.__tableauApiServiceRegistry&&window.__tableauApiServiceRegistry[e]||s.setInstance(e,new n),!window.__tableauApiServiceRegistry[e])throw new i.TableauError(a.ErrorCodes.InternalError,"Service registry failed");return window.__tableauApiServiceRegistry[e]}static setInstance(e,t){window.__tableauApiServiceRegistry||(window.__tableauApiServiceRegistry={}),window.__tableauApiServiceRegistry[e]=t}static clearRegistry(){window.__tableauApiServiceRegistry={}}constructor(){}}t.ApiServiceRegistry=s},3964:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(5064),n=r(1776);class s extends n.ServiceImplBase{get serviceName(){return"accessibility"}getTooltipTextAsync(e,t){let r=new i.TooltipTextRequestModel(e,t);const n={[a.ParameterId.FunctionName]:"getTooltipTextAsync",[a.ParameterId.TooltipTextRequest]:r};return this.execute(a.VerbId.GetTooltipText,n).then((e=>e.result))}leaveMarkNavigationAsync(e){const t={[a.ParameterId.FunctionName]:"leaveMarkNavigationAsync",[a.ParameterId.VisualId]:e};return this.execute(a.VerbId.RaiseLeaveMarkNavNotification,t).then((e=>{}))}}t.AccessibilityServiceImpl=s},8028:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(1044),s=r(7480),o=r(1776);class l extends o.ServiceImplBase{get serviceName(){return"animation-service"}replayAsync(e){const t={[i.ParameterId.ReplaySpeed]:1};return s.ErrorHelpers.verifyEnumValue(e,a.ReplaySpeedType,"ReplaySpeedType"),t[i.ParameterId.ReplaySpeed]=n.ExternalToInternalEnumMappings.setReplaySpeedType.convert(e),this.execute(i.VerbId.ReplayAnimation,t).then((e=>{}))}}t.AnimationServiceImpl=l},1384:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(6557),s=r(7104),o=r(6664),l=r(1776);class d extends l.ServiceImplBase{get serviceName(){return"annotation-service"}annotateMarkAsync(e,t,r){const a=this.parseMarkSelectionIds([t]),n=`${r}`,s={[i.ParameterId.FunctionName]:"annotateMarkAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.AnnotateEnum]:i.AnnotateEnum.Mark,[i.ParameterId.TargetPoint]:{x:0,y:0},[i.ParameterId.SelectionList]:[a.selection],[i.ParameterId.FormattedText]:n};return this.execute(i.VerbId.CreateAnnotation,s).then((e=>{}))}getAnnotationsAsync(e){const t={[i.ParameterId.FunctionName]:"getAnnotationsAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.GetAnnotations,t).then((e=>{const t=e.result;return this.annotationFilterMap(t)}))}removeAnnotationAsync(e,t){const r=this.parseAnnotationSelectionIds([t]),a={[i.ParameterId.FunctionName]:"removeAnnotationAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.SelectionList]:[r.selection]};return this.execute(i.VerbId.RemoveAnnotation,a).then((e=>{}))}parseMarkSelectionIds(e){const t=[],r=new s.SelectionModelsContainer;if(e.forEach((e=>{const r=e.tupleId;if(!(null!=r&&r>0))throw new o.TableauError(a.ErrorCodes.InternalError,"invalid tupleId");t.push(r.toString())})),0!==t.length){const e=new s.TupleSelectionModel;e.selectionType="tuples",e.objectIds=t,r.selection=e}return r}parseAnnotationSelectionIds(e){const t=[],r=new s.SelectionModelsContainer;if(e.forEach((e=>{const r=e.annotationId;if(!(null!=r&&r>=0))throw new o.TableauError(a.ErrorCodes.InternalError,"invalid annotationId");t.push(r.toString())})),0!==t.length){const e=new s.TupleSelectionModel;e.selectionType="annotations",e.objectIds=t,r.selection=e}return r}mapAnnotation(e){return{annotationHTML:e.annotationText,annotationId:e.annotationId,annotationText:e.annotationPlainText,annotationType:n.InternalToExternalEnumMappings.annotationType.convert(e.annotateEnum),tupleId:e.tupleId}}annotationFilterMap(e){return e.map((e=>this.mapAnnotation(e)))}}t.AnnotationServiceImpl=d},1832:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(1776);class n extends i.ServiceImplBase{get serviceName(){return"client-info-service"}getClientInfoAsync(){const e=a.VerbId.GetEmbeddingClientInfo,t={[a.ParameterId.FunctionName]:"getClientInfoAsync"};return this.execute(e,t).then((e=>e.result))}}t.ClientInfoServiceImpl=n},9196:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(8340),s=r(1072),o=r(2180),l=r(5288),d=r(6664),c=r(1776);class u extends c.ServiceImplBase{constructor(e,t){super(e,t)}get serviceName(){return"data-source-service"}refreshAsync(e){const t={[i.ParameterId.FunctionName]:"refreshAsync",[i.ParameterId.DeltaTimeMs]:0,[i.ParameterId.ShouldRefreshDS]:!0};return e&&(t[i.ParameterId.DataSourceId]=e),this.execute(i.VerbId.RefreshDataSource,t).then((e=>{}))}getActiveTablesAsync(e){const t={[i.ParameterId.FunctionName]:"getActiveTablesAsync",[i.ParameterId.DataSourceId]:e};return this.execute(i.VerbId.GetActiveTables,t).then((t=>{const r=t.result;if(0===r.tables.length)throw new d.TableauError(a.ErrorCodes.UnsupportedMethodForDataSourceType,`getActiveTables is not supported for: ${e}`);return r.tables}))}getDataSourcesAsync(e){const t={[i.ParameterId.FunctionName]:"getDataSourcesAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.GetDataSources,t).then((e=>e.result))}getAllDataSourcesAsync(){const e={[i.ParameterId.FunctionName]:"getAllDataSourcesAsync"};return this.execute(i.VerbId.GetAllDataSources,e).then((e=>e.result))}getConnectionSummariesAsync(e){const t={[i.ParameterId.FunctionName]:"getConnectionSummariesAsync",[i.ParameterId.DataSourceId]:e};return this.execute(i.VerbId.GetConnectionDescriptionSummaries,t).then((e=>e.result))}getFieldAsync(e){const t=i.VerbId.GetFieldAndDataSource,r={[i.ParameterId.FunctionName]:"getFieldAsync",[i.ParameterId.FieldId]:e};return this.execute(t,r).then((e=>{const t=e.result[i.ParameterId.DataSource],r=e.result[i.ParameterId.Field];return this.convertField(r,this.convertDataSource(t))}))}getLogicalTablesAsync(e){const t={[i.ParameterId.FunctionName]:"getLogicalTablesAsync",[i.ParameterId.DataSourceId]:e};return this.execute(i.VerbId.GetLogicalTables,t).then((e=>e.result))}getUnderlyingTablesAsync(e){const t={[i.ParameterId.FunctionName]:"getUnderlyingTablesAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.GetUnderlyingTables,t).then((e=>e.result))}convertField(e,t){return new s.Field(new l.FieldImpl(e,t))}convertDataSource(e){return new n.DataSource(new o.DataSourceImpl(e,this._registryId))}}t.DataSourceServiceImpl=u},4924:function(e,t,r){"use strict";var a=this&&this.__awaiter||function(e,t,r,a){return new(r||(r=Promise))((function(i,n){function s(e){try{l(a.next(e))}catch(e){n(e)}}function o(e){try{l(a.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,o)}l((a=a.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=r(3448),n=r(7419),s=r(1044),o=r(5044),l=r(7480),d=r(6664),c=r(1776);class u extends c.ServiceImplBase{get serviceName(){return"export-service"}getExportCrosstabSheetMapAsync(e){const t=i.VerbId.GetExportCrosstabSheetMap,r={[i.ParameterId.FunctionName]:"getExportCrosstabSheetMapAsync",[i.ParameterId.CurrentSheetType]:s.ExternalToInternalEnumMappings.sheetType.convert(e)};return this.execute(t,r).then((e=>e.result))}exportCrosstabAsync(e,t,r,s){return a(this,void 0,void 0,(function*(){l.ErrorHelpers.verifySheetName(r,e),l.ErrorHelpers.verifyEnumValue(t,n.CrosstabFileFormat,"CrosstabFileFormat");const a=yield this.getExportCrosstabSheetMapAsync(s);if(!a[e])throw new d.TableauError(n.SharedErrorCodes.InternalError,"missing sheet doc id from sheetMap");const o={[i.ParameterId.FunctionName]:"exportCrosstabAsync",[i.ParameterId.SheetIdentifier]:a[e],[i.ParameterId.SendNotifications]:!0};let c;switch(t){case n.CrosstabFileFormat.CSV:c=i.VerbId.ExportCrosstabCsvDownload,o[i.ParameterId.UseTabDelimiters]=!0;break;case n.CrosstabFileFormat.Excel:c=i.VerbId.ExportCrosstabExcelDownload;break;default:throw new d.TableauError(n.SharedErrorCodes.InternalError,"unsupported Crosstab file format.")}return this.execute(c,o).then((e=>e.result)).catch((()=>{throw new d.TableauError(n.SharedErrorCodes.CrosstabCreationError,"An unexpected error occurred while generating the document.")}))}))}exportDataAsync(e,t){var r;l.ErrorHelpers.verifyExportDataOptions(t);const a=new Set(t.columnsToIncludeById),s=Array.from(a),o=i.VerbId.ExportDataDownload,c={[i.ParameterId.FunctionName]:"exportDataAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.IgnoreAliases]:(r=t.ignoreAliases,null!=r&&r),[i.ParameterId.ColumnsToIncludeById]:s};return this.execute(o,c).then((()=>{})).catch((()=>{throw new d.TableauError(n.SharedErrorCodes.DataCreationError,"An unexpected error occurred while generating the document.")}))}exportPowerPointAsync(e,t){l.ErrorHelpers.verifySheetNamesForPDFAndPPT(e,t);const r=i.VerbId.ExportPowerpointDownload,a={[i.ParameterId.FunctionName]:"exportPowerPointAsync",[i.ParameterId.ExportOriginUrl]:"",[i.ParameterId.SelectedSheetNames]:e};return this.execute(r,a).then((e=>e.result)).catch((()=>{throw new d.TableauError(n.SharedErrorCodes.PowerPointCreationError,"An error occured while attempting to generate the PowerPoint file.")}))}exportPDFAsync(e,t,r){return a(this,void 0,void 0,(function*(){l.ErrorHelpers.verifyExportPDFOptions(t),l.ErrorHelpers.verifySheetNamesForPDFAndPPT(e,r);const a=yield this.getExportPDFOptionsAsync();o.ExportHelpers.updateInternalExportPDFOptions(a,t,e);const s=i.VerbId.ExportPdfDownload,c={[i.ParameterId.FunctionName]:"exportPDFAsync",[i.ParameterId.ExportPdfOptions]:a};return this.execute(s,c).then((e=>e.result)).catch((()=>{throw new d.TableauError(n.SharedErrorCodes.PDFCreationError,"Unable to create PDF because something went wrong. Try again.")}))}))}getExportPDFOptionsAsync(){const e=i.VerbId.GetExportPdfOptions,t={[i.ParameterId.FunctionName]:"getExportPdfOptionsAsync"};return this.execute(e,t).then((e=>e.result))}}t.ExportServiceImpl=u},3851:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(1776);class n extends i.ServiceImplBase{get serviceName(){return"external-context-menu-service"}appendContextMenuAsync(e,t,r){const i=a.VerbId.AppendExternalMenuItem,n={[a.ParameterId.FunctionName]:"appendContextMenuAsync",[a.ParameterId.WorksheetName]:e,[a.ParameterId.ExternalMenuItemDisplayName]:r.displayName};return this.execute(i,n).then((e=>e.result))}removeContextMenuAsync(e,t,r){const i=a.VerbId.RemoveExternalMenuItem,n={[a.ParameterId.FunctionName]:"removeContextMenuAsync",[a.ParameterId.WorksheetName]:e,[a.ParameterId.ExternalMenuItemId]:r};return this.execute(i,n).then((e=>{}))}executeContextMenuAsync(e,t,r){const i=a.VerbId.ExecuteExternalMenuItem,n={[a.ParameterId.FunctionName]:"executeContextMenuAsync",[a.ParameterId.WorksheetName]:e,[a.ParameterId.ExternalMenuItemId]:r};return this.execute(i,n).then((e=>{}))}renameContextMenuAsync(e,t,r,i){const n=a.VerbId.RenameExternalMenu,s={[a.ParameterId.FunctionName]:"renameContextMenuAsync",[a.ParameterId.WorksheetName]:e,[a.ParameterId.ExternalMenuHeader]:r,[a.ParameterId.ExternalMenuDescription]:i};return this.execute(n,s).then((e=>{}))}}t.ExternalContextMenuServiceImpl=n},8864:function(e,t,r){"use strict";var a=this&&this.__awaiter||function(e,t,r,a){return new(r||(r=Promise))((function(i,n){function s(e){try{l(a.next(e))}catch(e){n(e)}}function o(e){try{l(a.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,o)}l((a=a.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=r(7419),n=r(3448),s=r(3448),o=r(5136),l=r(1044),d=r(6557),c=r(6296),u=r(8052),h=r(1172),p=r(1776);class m extends p.ServiceImplBase{get serviceName(){return"filter-service"}applyFilterAsync(e,t,r,a,n){const d=s.VerbId.ApplyCategoricalFilter,c={[s.ParameterId.FunctionName]:"applyFilterAsync"};if(c[s.ParameterId.VisualId]=e,c[s.ParameterId.FieldName]=t,!Array.isArray(r))throw new o.TableauError(i.ErrorCodes.InvalidParameter,"values parameter for applyFilterAsync must be an array");return c[s.ParameterId.FilterValues]=r,c[s.ParameterId.FilterUpdateType]=l.ExternalToInternalEnumMappings.filterUpdateType.convert(a),c[s.ParameterId.IsExcludeMode]=void 0!==n&&void 0!==n.isExcludeMode&&n.isExcludeMode,this.execute(d,c).then((e=>t))}applyRangeFilterAsync(e,t,r){const a=s.VerbId.ApplyRangeFilter,i={[s.ParameterId.FunctionName]:"applyRangeFilterAsync"};if(void 0!==r.min&&null!==r.min){let e;e=r.min instanceof Date?h.Param.serializeDateForPlatform(r.min):r.min,i[s.ParameterId.FilterRangeMin]=e}if(void 0!==r.max&&null!==r.max){let e;e=r.max instanceof Date?h.Param.serializeDateForPlatform(r.max):r.max,i[s.ParameterId.FilterRangeMax]=e}return r.nullOption&&(i[s.ParameterId.FilterRangeNullOption]=l.ExternalToInternalEnumMappings.nullOptions.convert(r.nullOption)),i[s.ParameterId.FieldName]=t,i[s.ParameterId.VisualId]=e,this.execute(a,i).then((e=>(this.apiFilterHandlerCheckForCommandError(e.result),t)))}applyHierarchicalFilterAsync(e,t,r,a,i){const n=s.VerbId.HierarchicalFilter,o={[s.ParameterId.FunctionName]:"applyHierarchicalFilterAsync"};o[s.ParameterId.VisualId]=e,o[s.ParameterId.FieldName]=t;const d=r.levels;return Array.isArray(d)&&d.length>0?o[s.ParameterId.FilterLevels]=d:r.length>0?o[s.ParameterId.FilterValues]=r:o[s.ParameterId.FilterLevels]=[],o[s.ParameterId.FilterUpdateType]=l.ExternalToInternalEnumMappings.filterUpdateType.convert(a),o[s.ParameterId.IsExcludeMode]=i&&!!i.isExcludeMode,this.execute(n,o).then((e=>t))}clearFilterAsync(e,t){const r=s.VerbId.ClearFilter,a={[s.ParameterId.FunctionName]:"clearFilterAsync"};return a[s.ParameterId.VisualId]=e,a[s.ParameterId.FieldName]=t,this.execute(r,a).then((e=>t))}applyRelativeDateFilterAsync(e,t,r){const a=s.VerbId.ApplyRelativeDateFilter,n={[s.ParameterId.FunctionName]:"applyRelativeDateFilterAsync"};if(n[s.ParameterId.VisualId]=e,n[s.ParameterId.FieldName]=t,n[s.ParameterId.PeriodType]=l.ExternalToInternalEnumMappings.periodType.convert(r.periodType),n[s.ParameterId.DateRangeType]=l.ExternalToInternalEnumMappings.dateRangeType.convert(r.rangeType),r.rangeType===i.DateRangeType.LastN||r.rangeType===i.DateRangeType.NextN){if(void 0===r.rangeN||null===r.rangeN)throw new o.TableauError(i.EmbeddingErrorCodes.MissingRangeNForRelativeDateFilters,"Missing rangeN field for a relative date filter of LASTN or NEXTN.");n[s.ParameterId.RangeN]=r.rangeN}return void 0!==r.anchorDate&&null!==r.anchorDate&&(n[s.ParameterId.AnchorDate]=this.convertAnchorDate(r.anchorDate)),this.execute(a,n).then((e=>e.result))}getFiltersAsync(e){const t=s.VerbId.GetFilters,r={[s.ParameterId.FunctionName]:"getFiltersAsync"};return r[s.ParameterId.VisualId]=e,this.execute(t,r).then((e=>{const t=e.result;return this.convertDomainFilters(t)}))}getCategoricalDomainAsync(e,t,r){const a=s.VerbId.GetCategoricalDomain,i={[s.ParameterId.FunctionName]:"getCategoricalDomainAsync"};return i[s.ParameterId.VisualId]={worksheet:e},i[s.ParameterId.FieldId]=t,i[s.ParameterId.DomainType]=l.ExternalToInternalEnumMappings.filterDomainType.convert(r),this.execute(a,i).then((e=>{const t=e.result;return this.convertCategoricalDomain(t,r)}))}getRangeDomainAsync(e,t,r){const a=s.VerbId.GetRangeDomain,i={[s.ParameterId.FunctionName]:"getRangeDomainAsync"};return i[s.ParameterId.VisualId]={worksheet:e},i[s.ParameterId.FieldId]=t,i[s.ParameterId.DomainType]=l.ExternalToInternalEnumMappings.filterDomainType.convert(r),this.execute(a,i).then((e=>{const t=e.result;return this.convertRangeDomain(t,r)}))}getDashboardFiltersAsync(){const e=s.VerbId.GetDashboardFilters,t={[s.ParameterId.FunctionName]:"getDashboardFiltersAsync"};return this.execute(e,t).then((e=>{const t=e.result;return this.convertDomainFilters(t)}))}applyDashboardFilterAsync(e,t,r,a){const i=s.VerbId.DashboardCategoricalFilter,n={[s.ParameterId.FunctionName]:"applyDashboardFilterAsync"};return n[s.ParameterId.FieldName]=e,n[s.ParameterId.FilterValues]=t,n[s.ParameterId.FilterUpdateType]=l.ExternalToInternalEnumMappings.filterUpdateType.convert(r),n[s.ParameterId.IsExcludeMode]=a&&!!a.isExcludeMode,this.execute(i,n).then((e=>e.result))}getAppliedWorksheetsAsync(e,t){var r;return a(this,void 0,void 0,(function*(){const a=yield this.executeGetAppliedWorksheets(e,t,"getAppliedWorksheetsAsync"),i=[];return null===(r=a.worksheets)||void 0===r||r.map((e=>{e.isSelected&&i.push(e.worksheetName)})),i}))}setAppliedWorksheetsAsync(e,t,r,n){return a(this,void 0,void 0,(function*(){const a=yield this.executeGetAppliedWorksheets(e,r,"getAppliedWorksheetsAsyncInternal");if(!a||!a.worksheets)throw new o.TableauError(i.SharedErrorCodes.InternalError,"This filter does not apply to multiple worksheets");const l=[];let d="";if(a.worksheets.forEach((e=>{e.isActive&&(d=e.worksheetName),(e.isSelected||e.isEnabled)&&l.push(e.worksheetName)})),""===d)throw new o.TableauError(i.SharedErrorCodes.InternalError,"No active worksheet");if(!n.includes(d))throw new o.TableauError(i.SharedErrorCodes.InternalError,`${d} must be included in the applied worksheets`);n.forEach((e=>{if(!l.includes(e))throw new o.TableauError(i.SharedErrorCodes.InternalError,`The field ${t} isn't applicable to the worksheet ${e}`)}));const c=s.VerbId.ChangeSharedFilter,u={};return u[s.ParameterId.FunctionName]="setAppliedWorksheetsAsync",u[s.ParameterId.VisualId]={worksheet:e},u[s.ParameterId.FieldId]=r,u[s.ParameterId.SharedFilterSheets]=n,this.execute(c,u).then((e=>n))}))}executeGetAppliedWorksheets(e,t,r){const a=s.VerbId.GetSharedFilter,i={};return i[s.ParameterId.FunctionName]=r,i[s.ParameterId.VisualId]={worksheet:e},i[s.ParameterId.FieldId]=t,this.execute(a,i).then((e=>e.result))}convertDomainFilters(e){const t=[];return e.forEach((e=>{switch(e.filterType){case s.FilterType.Categorical:{const r=e;if(!r)throw new Error("Invalid Categorical Filter");t.push(this.convertCategoricalFilter(r));break}case s.FilterType.Hierarchical:{const r=e;if(!r)throw new Error("Invalid Hierarchical Filter");t.push(this.convertHierarchicalFilter(r));break}case s.FilterType.Range:{const r=e;if(!r)throw new Error("Invalid Range Filter");t.push(this.convertRangeFilter(r));break}case s.FilterType.RelativeDate:{const r=e;if(!r)throw new Error("Invalid Relative Date Filter");t.push(this.convertRelativeDateFilter(r));break}}})),t}convertCategoricalFilter(e){const t=e.values.map((e=>u.DataValueFactory.MakeFilterDataValue(e)));return new c.CategoricalFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,s.FilterType.Categorical,this._registryId,t,e.isExclude,e.isAllSelected)}convertHierarchicalFilter(e){const t=e.values.map((e=>new c.HierarchicalDataValue(u.DataValueFactory.MakeFilterDataValue(e.value),e.hierarchicalPath,e.level))),r=e.levelInfo.map((e=>new c.HierarchicalLevelDetail(e.name,d.InternalToExternalEnumMappings.hierarchicalLevelSelectionState.convert(e.levelSelectionState))));return new c.HierarchicalFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,s.FilterType.Hierarchical,this._registryId,e.dimensionName,e.hierarchyCaption,e.levels,r,t,e.isAllSelected)}convertRangeFilter(e){const t=u.DataValueFactory.MakeFilterDataValue(e.min),r=u.DataValueFactory.MakeFilterDataValue(e.max);return new c.RangeFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,s.FilterType.Range,this._registryId,t,r,e.includeNullValues)}convertRelativeDateFilter(e){const t=u.DataValueFactory.MakeFilterDataValue(e.anchorDate);return new c.RelativeDateFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,i.FilterType.RelativeDate,this._registryId,t,d.InternalToExternalEnumMappings.dateStepPeriod.convert(e.periodType),d.InternalToExternalEnumMappings.dateRangeType.convert(e.rangeType),e.rangeN)}convertCategoricalDomain(e,t){const r=e.values.map((e=>u.DataValueFactory.MakeFilterDataValue(e)));return new c.CategoricalDomain(r,t)}convertRangeDomain(e,t){const r=u.DataValueFactory.MakeFilterDataValue(e.min),a=u.DataValueFactory.MakeFilterDataValue(e.max);return new c.RangeDomain(r,a,t)}convertAnchorDate(e){const t=e.getUTCFullYear(),r=e.getUTCMonth()+1,a=e.getUTCDate(),n=e.getUTCHours(),s=e.getUTCMinutes(),l=e.getUTCSeconds();if(isNaN(t)||isNaN(r)||isNaN(a)||isNaN(n)||isNaN(s)||isNaN(l))throw new o.TableauError(i.EmbeddingErrorCodes.InvalidDateParameter,"Invalid date parameter: anchorDate");return`${t}-${r}-${a} ${n}:${s}:${l}`}apiFilterHandlerCheckForCommandError(e){if(e[n.ParameterId.ParameterError]){if(e[n.ParameterId.InvalidFieldCaption])throw new o.TableauError(i.SharedErrorCodes.InvalidFilterFieldName,e[n.ParameterId.InvalidFieldCaption]);if(e[n.ParameterId.InvalidValues])throw new o.TableauError(i.SharedErrorCodes.InvalidFilterFieldValue,e[n.ParameterId.InvalidValues]);if(e[n.ParameterId.InvalidAggFieldName])throw new o.TableauError(i.SharedErrorCodes.InvalidAggregationFieldName,e[n.ParameterId.InvalidAggFieldName]);throw new o.TableauError(i.SharedErrorCodes.ServerError,"Server Error")}}}t.FilterServiceImpl=m},7712:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(6680),s=r(5136),o=r(1044),l=r(5068),d=r(7968),c=r(8052),u=r(3483),h=r(1776);class p extends h.ServiceImplBase{constructor(){super(...arguments),this.viewDataTableCacheId=n.v4()}get serviceName(){return"get-data-service"}getMaxRowLimit(){return 1e4}getViewDataTableCacheId(){return this.viewDataTableCacheId}getLimitedMaxRows(e,t){return e>0&&e{const t=e.result;return this.processResultsTable(t.data,t.isSummary)}))}getSummaryDataReaderAsync(e,t,r,a,n,s,l,c){const u={[i.ParameterId.FunctionName]:"getSummaryDataReaderAsync",[i.ParameterId.ViewDataTableCacheId]:this.getViewDataTableCacheId(),[i.ParameterId.VisualId]:e,[i.ParameterId.PageRowCount]:t,[i.ParameterId.IgnoreAliases]:r,[i.ParameterId.IgnoreSelection]:a,[i.ParameterId.IncludeAllColumns]:n,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(s),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(l),[i.ParameterId.ApplyWorksheetFormatting]:c};return this.execute(i.VerbId.GetDataSummaryDataReader,u).then((e=>{const r=e.result;return new d.DataTableReader(r.id,r.totalRowCount,t,this._registryId)}))}getSummaryColumnsInfoAsync(e){const t=i.VerbId.GetDataSummaryData,r={[i.ParameterId.FunctionName]:"getSummaryColumnsInfoAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.IgnoreAliases]:!0,[i.ParameterId.IgnoreSelection]:!0,[i.ParameterId.IncludeAllColumns]:!0,[i.ParameterId.MaxRows]:1,[i.ParameterId.ShowDataTableFormat]:i.ApiShowDataTableFormat.NativeValuesOnly};return this.execute(t,r).then((e=>e.result.data.headers.map((e=>new l.Column(e.fieldCaption,e.fieldName,e.dataType,e.isReferenced,e.index)))))}getSelectedMarksAsync(e){const t={[i.ParameterId.FunctionName]:"getSelectedMarksAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.GetSelectedMarks,t).then((e=>({data:e.result.data.map((e=>this.processResultsTable(e,!0)))})))}getHighlightedMarksAsync(e){const t={[i.ParameterId.FunctionName]:"getHighlightedMarksAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.GetHighlightedMarks,t).then((e=>({data:e.result.data.map((e=>this.processResultsTable(e,!0)))})))}getDataSourceDataAsync(e,t,r,a,n,s){const l={[i.ParameterId.FunctionName]:"getDataSourceDataAsync",[i.ParameterId.DataSourceId]:e,[i.ParameterId.IgnoreAliases]:t,[i.ParameterId.MaxRows]:this.getLimitedMaxRows(r,this.getMaxRowLimit()+1),[i.ParameterId.ColumnsToInclude]:this.verifyIncludeColumnArray(a),[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(n),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(s)};return this.execute(i.VerbId.GetDataSourceData,l).then((e=>{const t=e.result;return this.processResultsTable(t.data,!1)}))}getLogicalTableDataAsync(e,t,r,a,n,s,l){const d={[i.ParameterId.FunctionName]:"getLogicalTableDataAsync",[i.ParameterId.ColumnsToInclude]:n,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(s),[i.ParameterId.DataSourceId]:e,[i.ParameterId.IgnoreAliases]:r,[i.ParameterId.LogicalTableId]:t,[i.ParameterId.MaxRows]:this.getLimitedMaxRows(a,this.getMaxRowLimit()+1),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(l)};return this.execute(i.VerbId.GetLogicalTableData,d).then((e=>{const t=e.result;return this.processResultsTable(t.data,!1)}))}getLogicalTableDataReaderAsync(e,t,r,a,n,s){r=this.getLimitedMaxRows(r,this.getMaxRowLimit());const l={[i.ParameterId.FunctionName]:"getLogicalTableDataReaderAsync",[i.ParameterId.ViewDataTableCacheId]:this.getViewDataTableCacheId(),[i.ParameterId.DataSourceId]:e,[i.ParameterId.LogicalTableId]:t,[i.ParameterId.PageRowCount]:r,[i.ParameterId.IgnoreAliases]:a,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(n),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(s)};return this.execute(i.VerbId.GetLogicalTableDataReader,l).then((e=>{const t=e.result;return new d.DataTableReader(t.id,t.totalRowCount,r,this._registryId)}))}getUnderlyingTableDataAsync(e,t,r,a,n,s,l,d,c){const u={[i.ParameterId.FunctionName]:"getUnderlyingTableDataAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.LogicalTableId]:t,[i.ParameterId.IgnoreAliases]:r,[i.ParameterId.IgnoreSelection]:a,[i.ParameterId.IncludeAllColumns]:n,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(s),[i.ParameterId.MaxRows]:this.getLimitedMaxRows(l,this.getMaxRowLimit()+1),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(d),[i.ParameterId.ApplyWorksheetFormatting]:c};return this.execute(i.VerbId.GetUnderlyingTableData,u).then((e=>{const t=e.result;return this.processResultsTable(t.data,!1)}))}getUnderlyingTableDataReaderAsync(e,t,r,a,n,s,l,c,u){r=this.getLimitedMaxRows(r,this.getMaxRowLimit());const h={[i.ParameterId.FunctionName]:"getUnderlyingTableDataReaderAsync",[i.ParameterId.ViewDataTableCacheId]:this.getViewDataTableCacheId(),[i.ParameterId.VisualId]:e,[i.ParameterId.LogicalTableId]:t,[i.ParameterId.IgnoreAliases]:a,[i.ParameterId.IgnoreSelection]:n,[i.ParameterId.IncludeAllColumns]:s,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(l),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(c),[i.ParameterId.PageRowCount]:r,[i.ParameterId.ApplyWorksheetFormatting]:u};return this.execute(i.VerbId.GetUnderlyingTableDataReader,h).then((e=>{const t=e.result;return new d.DataTableReader(t.id,t.totalRowCount,r,this._registryId)}))}getPageAsync(e,t,r){const a={[i.ParameterId.FunctionName]:"getPageAsync",[i.ParameterId.ViewDataTableCacheId]:this.getViewDataTableCacheId(),[i.ParameterId.ViewDataTableId]:e,[i.ParameterId.DataRowIndex]:t*r};return this.execute(i.VerbId.GetDataTableReaderPage,a).then((t=>{const r=t.result;return this.processResultsPage(r,e===p.summaryTableId)}))}releaseAsync(e){const t={[i.ParameterId.FunctionName]:"release",[i.ParameterId.ViewDataTableCacheId]:this.getViewDataTableCacheId(),[i.ParameterId.ViewDataTableId]:e};return this.execute(i.VerbId.ReleaseDataTableReader,t).then((e=>{}))}verifyIncludeColumnArray(e){if(!Array.isArray(e))throw new s.TableauError(a.ErrorCodes.InvalidParameter,"columnsToInclude and columnsToIncludeById must be valid arrays");const t=new Set(e);return Array.from(t)}processResultsTable(e,t){const r=e.headers.map((e=>new l.Column(e.fieldCaption,e.fieldName,e.dataType,e.isReferenced,e.index)));let a;e.marks&&(a=e.marks.map((e=>new l.MarkInfo(e.type,e.color,e.tupleId))));const i=!1===t&&e.dataTable.length===this.getMaxRowLimit()+1;i&&(e.dataTable.length-=1);const n=e.dataTable.map((e=>e.map(((e,t)=>c.DataValueFactory.MakeTableDataValue(e,r[t].dataType)))));return a?new l.DataTable(n,r,n.length,i,t,a):new l.DataTable(n,r,n.length,i,t)}processResultsPage(e,t){const r=e.headers.map((e=>new l.Column(e.fieldCaption,e.fieldName,e.dataType,e.isReferenced,e.index)));let a;e.marks&&(a=e.marks.map((e=>new l.MarkInfo(e.type,e.color,e.tupleId))));const i=e.dataTable.map((e=>e.map(((e,t)=>c.DataValueFactory.MakeTableDataValue(e,r[t].dataType)))));return a?new l.DataTable(i,r,i.length,!1,t,a):new l.DataTable(i,r,i.length,!1,t)}}t.GetDataServiceImpl=p,p.summaryTableId=""},1288:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(8808);class i extends a.NotificationServiceImplBase{get serviceName(){return"notification-service"}}t.NotificationServiceImpl=i},8808:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});class r{constructor(e,t){this._filterFn=e,this._callbackFn=t}onNotification(e){this._filterFn(e)&&this._callbackFn(e)}}t.Registration=r,t.NotificationServiceImplBase=class{constructor(e){this.dispatcher=e,this._handlers={},this.dispatcher.registerNotificationHandler(this.onNotification.bind(this))}registerHandler(e,t,a){const i=this._handlers[e]||new Array,n=new r(t,a);return i.push(n),this._handlers[e]=i,()=>this.removeRegistration(e,n)}hasHandlersForNotificationType(e){return this._handlers.hasOwnProperty(e)}onNotification(e){this.hasHandlersForNotificationType(e.notificationId)&&this._handlers[e.notificationId].forEach((t=>t.onNotification(e.data)))}removeRegistration(e,t){this.hasHandlersForNotificationType(e)&&(this._handlers[e]=this._handlers[e].filter((e=>e!==t)))}}},7260:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(8552),s=r(6664),o=r(1776);class l extends o.ServiceImplBase{get serviceName(){return"parameters-service"}getParametersForSheetAsync(e){const t={[i.ParameterId.FunctionName]:"getParametersForSheetAsync",[i.ParameterId.SheetPath]:e};return this.getParametersAsync(t)}getAllParametersAsync(){const e={[i.ParameterId.FunctionName]:"getParametersForSheetAsync"};return this.getParametersAsync(e)}getParametersAsync(e){return this.execute(i.VerbId.GetParametersForSheet,e).then((e=>e.result.map((e=>new n.ParameterImpl(e,this._registryId)))))}changeParameterValueAsync(e,t){const r={[i.ParameterId.FunctionName]:"changeParameterValueAsync",[i.ParameterId.ParameterFieldName]:e,[i.ParameterId.ParameterValue]:t};return this.execute(i.VerbId.ChangeParameterValue,r).then((e=>e.result))}findParameterByNameAsync(e){return this.findParameterAsync(e,void 0)}findParameterByGlobalFieldNameAsync(e){return this.findParameterAsync(void 0,e)}findParameterAsync(e,t){const r={[i.ParameterId.FunctionName]:"findParameterAsync"};if(void 0!==e)r[i.ParameterId.ParameterCaption]=e;else{if(void 0===t)throw new s.TableauError(a.ErrorCodes.InvalidParameter,"name or fieldName must be provided to find parameter");r[i.ParameterId.ParameterFieldName]=t}return this.execute(i.VerbId.FindParameter,r).then((e=>{if("fieldName"in e.result){const t=e.result;return new n.ParameterImpl(t,this._registryId)}}))}}t.ParametersServiceImpl=l},8784:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(7104),s=r(6664),o=r(1172),l=r(1776);class d extends l.ServiceImplBase{get serviceName(){return"selection-service"}clearSelectedMarksAsync(e){const t={[i.ParameterId.FunctionName]:"clearSelectedMarksAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.ClearSelectedMarks,t).then((e=>{}))}selectMarksByValueAsync(e,t,r){if(0===t.length)throw new s.TableauError(a.ErrorCodes.InvalidParameter,"Selection criteria missing for selecting marks by value");const n=this.validateSelectionUpdateType(r),o=this.parseSelectionMarks(t),l={[i.ParameterId.FunctionName]:"selectMarksByValueAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.SelectionUpdateType]:n};return o.hierModelArr&&o.hierModelArr.length&&(l[i.ParameterId.HierValSelectionModels]=o.hierModelArr),o.quantModelArr&&o.quantModelArr.length&&(l[i.ParameterId.QuantRangeSelectionModels]=o.quantModelArr),o.dimModelArr&&o.dimModelArr.length&&(l[i.ParameterId.DimValSelectionModels]=o.dimModelArr),this.execute(i.VerbId.SelectByValue,l).then((e=>{this.apiFilterHandlerCheckForCommandError(e.result)}))}hoverTupleAsync(e,t,r,a){let s=new n.HoverTupleInteractionModel(e,this.ensureTupleIDIsNonNegative(t),r,a);const o={[i.ParameterId.FunctionName]:"hoverTupleAsync",[i.ParameterId.HoverTupleInteraction]:s};return this.execute(i.VerbId.RaiseHoverTupleNotification,o).then((e=>{}))}selectTuplesAsync(e,t,r,a){let s=new n.SelectTuplesInteractionModel(e,t,r,a);const o={[i.ParameterId.FunctionName]:"selectTuplesAsync",[i.ParameterId.SelectTuplesInteraction]:s};return this.execute(i.VerbId.RaiseSelectTuplesNotification,o).then((e=>{}))}apiFilterHandlerCheckForCommandError(e){if(e[i.ParameterId.ParameterError]){if(e[i.ParameterId.InvalidFields])throw new s.TableauError(a.SharedErrorCodes.InvalidSelectionFieldName,e[i.ParameterId.InvalidFields]);if(e[i.ParameterId.InvalidValues])throw new s.TableauError(a.SharedErrorCodes.InvalidSelectionValue,e[i.ParameterId.InvalidValues]);if(e[i.ParameterId.InvalidDates])throw new s.TableauError(a.SharedErrorCodes.InvalidSelectionDate,e[i.ParameterId.InvalidDates])}}selectMarksByIdAsync(e,t,r){if(0===t.length)throw new s.TableauError(a.ErrorCodes.InvalidParameter,"Marks info missing for selecting marks by Id");const n=this.validateSelectionUpdateType(r),o=this.parseSelectionIds(t),l={[i.ParameterId.FunctionName]:"selectMarksByIdAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.SelectionUpdateType]:n,[i.ParameterId.Selection]:o.selection};return this.execute(i.VerbId.SelectByValue,l).then((e=>{}))}parseSelectionIds(e){const t=[],r=new n.SelectionModelsContainer;for(let r=0;r0?e:0}}t.SelectionServiceImpl=d},1776:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(6557),i=r(6664),n=r(5520);t.ServiceImplBase=class{constructor(e,t){this._dispatcher=e,this._registryId=t}execute(e,t){return this._dispatcher.execute(e,t).catch((e=>{const t=e,r=a.InternalToExternalEnumMappings.errorCode.convert(t.errorCode,n.ShouldThrow.No);throw new i.TableauError(r,t.message)}))}}},4109:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(1776);class n extends i.ServiceImplBase{get serviceName(){return"size-service"}changeSizeAsync(e,t){var r,i,n,s;const o={[a.ParameterId.FunctionName]:"changeSizeAsync",[a.ParameterId.SheetName]:e,[a.ParameterId.MinHeight]:(null===(r=t.minSize)||void 0===r?void 0:r.height)||0,[a.ParameterId.MinWidth]:(null===(i=t.minSize)||void 0===i?void 0:i.width)||0,[a.ParameterId.MaxHeight]:(null===(n=t.maxSize)||void 0===n?void 0:n.height)||0,[a.ParameterId.MaxWidth]:(null===(s=t.maxSize)||void 0===s?void 0:s.width)||0};return this.execute(a.VerbId.SetSheetSize,o).then((e=>{}))}}t.SizeServiceImpl=n},2248:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(1776);class n extends i.ServiceImplBase{get serviceName(){return"story-activation-service"}activateNextStoryPointAsync(){const e=a.VerbId.ActivateNextStoryPoint,t={[a.ParameterId.FunctionName]:"activateNextStoryPointAsync"};return this.execute(e,t).then((e=>{}))}activatePreviousStoryPointAsync(){const e=a.VerbId.ActivatePreviousStoryPoint,t={[a.ParameterId.FunctionName]:"activatePreviousStoryPointAsync"};return this.execute(e,t).then((e=>{}))}activateStoryPointAsync(e){const t=a.VerbId.ActivateStoryPoint,r={[a.ParameterId.FunctionName]:"activateStoryPointAsync"};return r[a.ParameterId.StoryPointIndex]=e,this.execute(t,r).then((e=>{}))}revertStoryPointAsync(e){const t=a.VerbId.RevertStoryPoint,r={[a.ParameterId.FunctionName]:"revertStoryPointAsync"};return r[a.ParameterId.StoryPointIndex]=e,this.execute(t,r).then((e=>e.result))}}t.StoryActivationServiceImpl=n},6096:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(1776);class n extends i.ServiceImplBase{get serviceName(){return"visual-model-service"}getVisualSpecificationAsync(e){const t={[a.ParameterId.FunctionName]:"getVisualSpecificationAsync",[a.ParameterId.WorksheetName]:e.worksheet};return this.execute(a.VerbId.GetVisualSpecification,t).then((e=>e.result))}addMarksCardFieldsAsync(e,t,r,i,n){const s={[a.ParameterId.FunctionName]:"addMarksCardFieldsAsync",[a.ParameterId.WorksheetName]:e.worksheet,[a.ParameterId.MarksCardIndex]:t,[a.ParameterId.EncodingType]:r,[a.ParameterId.Columns]:i,[a.ParameterId.StartIndex]:n};return this.execute(a.VerbId.AddMarksCardFields,s).then((()=>{}))}moveMarksCardFieldAsync(e,t,r,i,n=1){const s={[a.ParameterId.FunctionName]:"addMarksCardFieldsAsync",[a.ParameterId.WorksheetName]:e.worksheet,[a.ParameterId.MarksCardIndex]:t,[a.ParameterId.FromIndex]:r,[a.ParameterId.ToIndex]:i,[a.ParameterId.FieldCount]:n};return this.execute(a.VerbId.MoveMarksCardField,s).then((()=>{}))}spliceMarksCardFieldsAsync(e,t,r,i,n,s){const o={[a.ParameterId.FunctionName]:"spliceMarksCardFieldsAsync",[a.ParameterId.WorksheetName]:e.worksheet,[a.ParameterId.MarksCardIndex]:t,[a.ParameterId.EncodingType]:r,[a.ParameterId.StartIndex]:i,[a.ParameterId.DeleteCount]:n,[a.ParameterId.Columns]:s};return this.execute(a.VerbId.SpliceMarksCardFields,o).then((()=>{}))}editAliasesDialogAsync(e){const t={[a.ParameterId.FunctionName]:"editAliasesDialogAsync",[a.ParameterId.FieldId]:e};return this.execute(a.VerbId.EditAliasesDialog,t).then((()=>{}))}}t.VisualModelServiceImpl=n},744:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(2520),n=r(1776);class s extends n.ServiceImplBase{get serviceName(){return"viz-service"}createVizImageAsync(e){const t={[a.ParameterId.FunctionName]:"createVizImageAsync",[a.ParameterId.VizAPIInputJson]:JSON.stringify(e)};return this.execute(a.VerbId.VizAPI,t).then((e=>e.result))}activateSheetAsync(e){const t={[a.ParameterId.FunctionName]:"activateSheetAsync",[a.ParameterId.SwitchToSheetName]:e};return this.execute(a.VerbId.ActivateSheet,t).then((()=>{}))}getCustomViewsAsync(){const e={[a.ParameterId.FunctionName]:"getCustomViewsAsync"};return this.execute(a.VerbId.GetCustomViews,e).then((e=>e.result.map((e=>new i.CustomViewImpl(e,this._registryId)))))}showCustomViewAsync(e){const t={[a.ParameterId.FunctionName]:"showCustomViewAsync",[a.ParameterId.CustomViewName]:e||""};return this.execute(a.VerbId.ShowCustomView,t).then((e=>{var t;const r=e.result;return(null===(t=r)||void 0===t?void 0:t.luid)?new i.CustomViewImpl(r,this._registryId):void 0}))}removeCustomViewAsync(e){const t={[a.ParameterId.FunctionName]:"removeCustomViewAsync",[a.ParameterId.CustomViewName]:e};return this.execute(a.VerbId.RemoveCustomView,t).then((e=>{const t=e.result;return new i.CustomViewImpl(t,this._registryId)}))}saveCustomViewAsync(e){const t={[a.ParameterId.FunctionName]:"saveCustomViewAsync",[a.ParameterId.CustomViewName]:e,[a.ParameterId.CustomViewIsDefault]:!1};return this.execute(a.VerbId.SaveWorkbookAsCustomView,t).then((e=>{const t=e.result;return new i.CustomViewImpl(t,this._registryId)}))}setActiveCustomViewAsDefaultAsync(){const e={[a.ParameterId.FunctionName]:"setActiveCustomViewAsDefaultAsync"};return this.execute(a.VerbId.SetActiveCustomViewAsDefault,e).then((()=>{}))}saveAsync(e){const t={[a.ParameterId.FunctionName]:"saveAsync",[a.ParameterId.CustomViewLuid]:e.luid,[a.ParameterId.CustomViewName]:e.name,[a.ParameterId.CustomViewIsDefault]:e.isDefault,[a.ParameterId.CustomViewIsPublic]:e.shared};return this.execute(a.VerbId.UpdateCustomView,t).then((e=>{const t=e.result;return new i.CustomViewImpl(t,this._registryId)}))}getCurrentSrcAsync(){const e={[a.ParameterId.FunctionName]:"getCurrentSrcAsync"};return this.execute(a.VerbId.GetCurrentSrc,e).then((e=>e.result))}}t.VizServiceImpl=s},8856:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(1044),s=r(7480),o=r(1172),l=r(1776);class d extends l.ServiceImplBase{get serviceName(){return"zone-service"}setVisibilityAsync(e,t,r){const l={[i.ParameterId.FunctionName]:"setVisibilityAsync",[i.ParameterId.Dashboard]:e,[i.ParameterId.ZoneIdsVisibilityMap]:{}};return o.Param.convertParameterToMap(r,"zoneVisibilityMap").forEach(((e,r)=>{s.ErrorHelpers.verifyZoneIsValid(t,Number.parseInt(r,10)),s.ErrorHelpers.verifyEnumValue(e,a.DashboardObjectVisibilityType,"DashboardObjectVisibilityType"),l[i.ParameterId.ZoneIdsVisibilityMap][r]=n.ExternalToInternalEnumMappings.setVisibilityType.convert(e)})),this.execute(i.VerbId.SetZoneVisibility,l).then((e=>{}))}moveAndResizeAsync(e,t,r){const a={[i.ParameterId.Dashboard]:e,[i.ParameterId.DashboardObjectPositionAndSizeUpdateList]:r};return r.forEach((e=>{s.ErrorHelpers.verifyZoneIsValidAndFloating(t,e.dashboardObjectID),s.ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(e)})),this.execute(i.VerbId.MoveAndResizeZones,a).then((e=>{}))}}t.ZoneServiceImpl=d},7603:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableSummary=class{constructor(e){this._tableInfo=e}get name(){return this._tableInfo.name}get id(){return this._tableInfo.id}get connectionId(){return this._tableInfo.connectionId}get customSQL(){return this._tableInfo.customSQL}}},6664:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});class r extends Error{constructor(e,t){super(`${e}: ${t}`),this._errorCode=e,Object.setPrototypeOf(this,r.prototype)}get errorCode(){return this._errorCode}}t.TableauError=r},8052:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(5068);t.DataValueFactory=class{static MakeParameterDataValue(e,t){return new i.DataValue(e.value,a.DataTypeConverter.convertStringValueToNativeValue(e.value,t),e.formattedValue,e.aliasedValue,e.hasAlias)}static MakeFilterDataValue(e){return new i.DataValue(e.value,e.value,e.formattedValue)}static MakeTableDataValue(e,t){return new i.DataValue(e.value,void 0!==e.value?a.DataTypeConverter.convertValueToNativeValue(e.value,t):void 0,e.formattedValue)}}},1724:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Deferred=class{constructor(){this._promise=new Promise(((e,t)=>{this._resolve=e,this._reject=t}))}get promise(){return this._promise}resolve(e){this._resolve&&this._resolve(e)}reject(e){this._reject&&this._reject(e)}},t.UnregisterTimeoutInMilliseconds=3e4},5520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664);var n;t.EnumConverter=class{constructor(e,t){this._mappings=e,this._defaultVal=t}convert(e,t=n.Yes){if(this._mappings.hasOwnProperty(e))return this._mappings[e];if(void 0!==this._defaultVal&&t!==n.Yes)return this._defaultVal;throw new i.TableauError(a.ErrorCodes.InternalError,`Enum Mapping not found for: ${e}`)}},function(e){e.Yes="yes",e.No="no"}(n=t.ShouldThrow||(t.ShouldThrow={}))},7480:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664),n=r(1172);class s{static apiNotImplemented(e){return new i.TableauError(a.SharedErrorCodes.InternalError,`${e} API not yet implemented.`)}static verifyInternalValue(e,t){if(null==e)throw new i.TableauError(a.SharedErrorCodes.InternalError,`${e} is invalid value for: ${t}`)}static verifyParameter(e,t){if(null==e)throw new i.TableauError(a.SharedErrorCodes.InvalidParameter,`${e} is invalid value for parameter: ${t}`)}static verifyParameterType(e,t,r){if(typeof e!==t)throw new i.TableauError(a.SharedErrorCodes.InvalidParameter,`${e} has invalid type for parameter: ${r}.`)}static verifyStringParameter(e,t){if(null==e||""===e)throw new i.TableauError(a.SharedErrorCodes.InvalidParameter,`${e} is invalid value for paramter: ${t}`)}static isValidEnumValue(e,t){let r=!1;return Object.keys(t).forEach((a=>{t[a]===e.toString()&&(r=!0)})),r}static verifyEnumValue(e,t,r){if(!s.isValidEnumValue(e,t))throw new i.TableauError(a.SharedErrorCodes.InvalidParameter,`${e} is invalid value for enum: ${r}.`)}static verifyRange(e,t,r){if(!(t<=e&&et.exportableSheetNamesFromDashboard.includes(e)))||e.every((e=>t.exportableSheetNamesFromWorkbook.includes(e)))||1===e.length&&e[0]===t.currentSheetName))throw new i.TableauError(a.SharedErrorCodes.InvalidSelectionSheet,"sheetNames parameter must have all its entries be exportable sheet names from the dashboard or all its entries be exportable sheet names from the workbook")}static verifyExportPDFOptions(e){try{this.verifyEnumValue(e.orientation,a.PrintOrientation,"PrintOrientation"),this.verifyEnumValue(e.pageSize,a.PrintPageSize,"PrintPageSize"),this.verifyEnumValue(e.scaling,a.PrintScaling,"PrintScaling")}catch(e){throw new i.TableauError(a.SharedErrorCodes.InvalidParameter,"options parameter must be of type ExportPDFOptions")}}}t.ErrorHelpers=s},5044:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(7419),n=r(6664);class s{static updateInternalExportPDFOptions(e,t,r){e.currentSheet=r[0],this.updateExportLayoutOptions(e,t),this.updateSheetOptions(e,r)}static updateExportLayoutOptions(e,t){const r=e.exportLayoutOptions;switch(r.imageHeight=this.DefaultLayoutOptions.imageHeight,r.imageWidth=this.DefaultLayoutOptions.imageWidth,t.orientation){case i.PrintOrientation.Landscape:r.pageOrientationOption=a.PageOrientation.Landscape;break;case i.PrintOrientation.Portrait:r.pageOrientationOption=a.PageOrientation.Portrait;break;default:throw new n.TableauError(i.SharedErrorCodes.InternalError,"invalid orientation for ExportPDFOption")}switch(t.pageSize){case i.PrintPageSize.A3:r.pageSizeOption=a.PageSizeOption.A3;break;case i.PrintPageSize.A4:r.pageSizeOption=a.PageSizeOption.A4;break;case i.PrintPageSize.A5:r.pageSizeOption=a.PageSizeOption.A5;break;case i.PrintPageSize.B4:r.pageSizeOption=a.PageSizeOption.B4;break;case i.PrintPageSize.B5:r.pageSizeOption=a.PageSizeOption.B5;break;case i.PrintPageSize.Executive:r.pageSizeOption=a.PageSizeOption.Executive;break;case i.PrintPageSize.Folio:r.pageSizeOption=a.PageSizeOption.Folio;break;case i.PrintPageSize.Ledger:r.pageSizeOption=a.PageSizeOption.Ledger;break;case i.PrintPageSize.Legal:r.pageSizeOption=a.PageSizeOption.Legal;break;case i.PrintPageSize.Letter:r.pageSizeOption=a.PageSizeOption.Letter;break;case i.PrintPageSize.Note:r.pageSizeOption=a.PageSizeOption.Note;break;case i.PrintPageSize.Quarto:r.pageSizeOption=a.PageSizeOption.Quarto;break;case i.PrintPageSize.Statement:r.pageSizeOption=a.PageSizeOption.Statement;break;case i.PrintPageSize.Tabloid:r.pageSizeOption=a.PageSizeOption.Tabloid;break;case i.PrintPageSize.Unspecified:r.pageSizeOption=a.PageSizeOption.Unspecified;break;default:throw new n.TableauError(i.SharedErrorCodes.InternalError,"invalid pageSize for ExportPDFOption")}switch(t.scaling){case i.PrintScaling.AtMost1PageHigh:this.setFitAndScaleValues(r,a.FitPages.FitOneHigh);break;case i.PrintScaling.AtMost1PageWide:this.setFitAndScaleValues(r,a.FitPages.FitOneWide);break;case i.PrintScaling.AtMost2PagesHigh:this.setFitAndScaleValues(r,a.FitPages.FitTwoHigh);break;case i.PrintScaling.AtMost2PagesWide:this.setFitAndScaleValues(r,a.FitPages.FitTwoWide);break;case i.PrintScaling.Automatic:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePctAuto);break;case i.PrintScaling.Perc100:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct100);break;case i.PrintScaling.Perc200:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct200);break;case i.PrintScaling.Perc25:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct25);break;case i.PrintScaling.Perc400:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct400);break;case i.PrintScaling.Perc50:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct50);break;case i.PrintScaling.Perc60:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct60);break;case i.PrintScaling.Perc75:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct75);break;case i.PrintScaling.Perc80:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct80);break;case i.PrintScaling.Perc90:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct90);break;default:throw new n.TableauError(i.SharedErrorCodes.InternalError,"invalid scaling for ExportPDFOption")}}static updateSheetOptions(e,t){const{exportLayoutOptions:r,sheetOptions:a}=e;for(const e of a)e.exportLayoutOptions=r,e.isSelected=t.includes(e.sheet)}static setFitAndScaleValues(e,t){let{pageFitHorizontal:r,pageFitVertical:i,pageScaleMode:n,pageScalePercent:s}=this.DefaultLayoutOptions;const o=this.fitRegex.exec(t),l=this.pctRegex.exec(t);o?([r,i]=o.slice(1).map((e=>Number(e))),n=a.ScaleMode.ScaleFitPages):l&&([s]=l.slice(1).map((e=>Number(e))),n=a.ScaleMode.ScalePercentage),e.pageFitHorizontal=r,e.pageFitVertical=i,e.pageScaleMode=n,e.pageScalePercent=s}}t.ExportHelpers=s,s.DefaultDataOptions={ignoreAliases:!1,columnsToIncludeById:[]},s.DefaultPDFOptions={scaling:i.PrintScaling.Automatic,pageSize:i.PrintPageSize.Letter,orientation:i.PrintOrientation.Portrait},s.DefaultLayoutOptions={imageHeight:0,imageWidth:0,pageFitHorizontal:1,pageFitVertical:1,pageOrientationOption:a.PageOrientation.Portrait,pageScaleMode:a.ScaleMode.ScaleAuto,pageScalePercent:100,pageSizeOption:a.PageSizeOption.Letter},s.fitRegex=new RegExp("fit([0-9]+)x([0-9]+)"),s.pctRegex=new RegExp("pct([0-9]+)")},1172:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664),n=r(7480);class s{static serializeDateForPlatform(e){return`${e.getUTCFullYear()}-${e.getUTCMonth()+1}-${e.getUTCDate()} ${e.getUTCHours()}:${e.getUTCMinutes()}:${e.getUTCSeconds()}`}static serializeBooleanForPlatform(e){return e?"true":"false"}static serializeNumberForPlatform(e){return e.toString(10)}static isTypeNumber(e){return"number"==typeof e||e instanceof Number}static isTypeDate(e){return e instanceof Date}static isTypeString(e){return"string"==typeof e||e instanceof String}static isTypeBool(e){return"boolean"==typeof e||e instanceof Boolean}static isNullOrUndefined(e){return null==e}static serializeParameterValue(e){if(s.isTypeNumber(e))return s.serializeNumberForPlatform(e);if(s.isTypeDate(e))return s.serializeDateForPlatform(e);if(s.isTypeBool(e))return s.serializeBooleanForPlatform(e);if(s.isTypeString(e))return e;throw new i.TableauError(a.ErrorCodes.InternalError,`Unexpected invalid value for: ${e}`)}static convertParameterToMap(e,t){if(n.ErrorHelpers.verifyParameterType(e,"object",t),Array.isArray(e))throw new i.TableauError(a.ErrorCodes.InvalidParameter,`Expecting object or Map for: ${t}.`);return e instanceof Map?e:new Map(Object.entries(e))}static tryParseNumber(e){if(s.isNullOrUndefined(e))return{success:!1};if(s.isTypeNumber(e))return{parsed:e,success:!0};const t=e.toString();if("NaN"===t)return{parsed:NaN,success:!0};const r=parseFloat(t);return isNaN(r)?{success:!1}:{parsed:r,success:!0}}}t.Param=s},2780:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(6664);t.SheetUtils=class{static getSheetSizeFromSizeConstraints(e){const{minWidth:t,minHeight:r,maxWidth:i,maxHeight:n}=e;if(0===r&&0===t)return 0===n&&0===i?{behavior:a.SheetSizeBehavior.Automatic}:{behavior:a.SheetSizeBehavior.AtMost,maxSize:{width:i,height:n}};if(0===n&&0===i)return{behavior:a.SheetSizeBehavior.AtLeast,minSize:{width:t,height:r}};if(n===r&&i===t&&t>0)return{behavior:a.SheetSizeBehavior.Exactly,minSize:{width:t,height:r},maxSize:{width:t,height:r}};const s=0===t&&0===i;return{behavior:a.SheetSizeBehavior.Range,minSize:{width:t,height:r},maxSize:{width:s?2147483647:i,height:n}}}static createAutomaticSize(){return{behavior:a.SheetSizeBehavior.Automatic,minSize:{width:0,height:0},maxSize:{width:0,height:0}}}static getPublishedSheetInfoByName(e,t){return t.find((t=>t.name===e))}static getSheetTypeEnum(e){let t;switch(e){case i.SheetType.Worksheet:t=a.SheetType.Worksheet;break;case i.SheetType.Dashboard:t=a.SheetType.Dashboard;break;case i.SheetType.Story:t=a.SheetType.Story;break;default:throw new n.TableauError(a.SharedErrorCodes.ServerError,"Invalid SheetType")}return t}static isValidSheetSize(e){return void 0!==e.behavior}}},3036:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664),n=r(1724);t.ShortLivedDeferred=class{constructor(e=n.UnregisterTimeoutInMilliseconds){this._timeoutInMilliseconds=e}getNewPromiseOrThrowIfBusy(){if(this._deferred)throw new i.TableauError(a.SharedErrorCodes.ApiExecutionError,"This api cannot be executed till previous call is resolved.");return this._deferred=new n.Deferred,this._timeoutId=setTimeout((()=>{const e=new i.TableauError(a.SharedErrorCodes.Timeout,`Api failed to complete in ${this._timeoutInMilliseconds/1e3} seconds`);this.reject(e)}),this._timeoutInMilliseconds),this._deferred.promise}resolve(e){this._deferred&&(clearTimeout(this._timeoutId),this._deferred.resolve(e),this._deferred=void 0)}reject(e){this._deferred&&(clearTimeout(this._timeoutId),this._deferred.reject(e),this._deferred=void 0)}}},1576:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664);t.VersionNumber=class{constructor(e,t){const r=e.split("-");this.build=this.getBuildNumber(r[1]);const n=(e=r[0]).split(".").map((e=>parseInt(e,10)));if(3!==n.length)throw new i.TableauError(a.ErrorCodes.InternalError,`Invalid version number: ${e}`);this.major=n[0],this.minor=n[1],this.fix=n[2],this.isAlpha=t}getBuildNumber(e){if(!e)return-1;const t=e.split(".");return t[1]?parseInt(t[1],10):-1}get formattedValue(){return`${this.major}.${this.minor}.${this.fix}`}get fullFormattedValue(){return`${this.major}.${this.minor}.${this.fix}-pre.${this.build}`}}},8648:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448);t.VersionedExternalApiDispatcher=class{constructor(e,t){this._apiDelegateDispatcher=e,this._versionConverter=a.CreateExternalCompatibleVersionConverter(a.INTERNAL_CONTRACT_VERSION,t),this._notificationHandlers=[],e.registerNotificationHandler((e=>{if(0===this._notificationHandlers.length)return;const t=this._versionConverter.upgradeNotification(e);this._notificationHandlers.forEach((e=>{e(t)}))}))}static needsVersionConverter(e){return a.VersionLessThan(e,a.INTERNAL_CONTRACT_VERSION)}execute(e,t){try{const r=this._versionConverter.downgradeExecuteCall(e,t);return this._apiDelegateDispatcher.execute(r.verb,r.parameters).then((r=>this._versionConverter.upgradeExecuteReturn(r,e,t)))}catch(e){return Promise.reject(e)}}registerNotificationHandler(e){this._notificationHandlers.push(e)}unregisterNotificationHandler(e){this._notificationHandlers=this._notificationHandlers.filter((t=>t!==e))}}},6680:(e,t,r)=>{"use strict";var a;r.r(t),r.d(t,{NIL:()=>F,parse:()=>y,stringify:()=>c,v1:()=>g,v3:()=>P,v4:()=>_,v5:()=>C,validate:()=>o,version:()=>x});var i=new Uint8Array(16);function n(){if(!a&&!(a="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return a(i)}const s=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,o=function(e){return"string"==typeof e&&s.test(e)};for(var l=[],d=0;d<256;++d)l.push((d+256).toString(16).substr(1));const c=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=(l[e[t+0]]+l[e[t+1]]+l[e[t+2]]+l[e[t+3]]+"-"+l[e[t+4]]+l[e[t+5]]+"-"+l[e[t+6]]+l[e[t+7]]+"-"+l[e[t+8]]+l[e[t+9]]+"-"+l[e[t+10]]+l[e[t+11]]+l[e[t+12]]+l[e[t+13]]+l[e[t+14]]+l[e[t+15]]).toLowerCase();if(!o(r))throw TypeError("Stringified UUID is invalid");return r};var u,h,p=0,m=0;const g=function(e,t,r){var a=t&&r||0,i=t||new Array(16),s=(e=e||{}).node||u,o=void 0!==e.clockseq?e.clockseq:h;if(null==s||null==o){var l=e.random||(e.rng||n)();null==s&&(s=u=[1|l[0],l[1],l[2],l[3],l[4],l[5]]),null==o&&(o=h=16383&(l[6]<<8|l[7]))}var d=void 0!==e.msecs?e.msecs:Date.now(),g=void 0!==e.nsecs?e.nsecs:m+1,y=d-p+(g-m)/1e4;if(y<0&&void 0===e.clockseq&&(o=o+1&16383),(y<0||d>p)&&void 0===e.nsecs&&(g=0),g>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");p=d,m=g,h=o;var I=(1e4*(268435455&(d+=122192928e5))+g)%4294967296;i[a++]=I>>>24&255,i[a++]=I>>>16&255,i[a++]=I>>>8&255,i[a++]=255&I;var v=d/4294967296*1e4&268435455;i[a++]=v>>>8&255,i[a++]=255&v,i[a++]=v>>>24&15|16,i[a++]=v>>>16&255,i[a++]=o>>>8|128,i[a++]=255&o;for(var S=0;S<6;++S)i[a+S]=s[S];return t||c(i)},y=function(e){if(!o(e))throw TypeError("Invalid UUID");var t,r=new Uint8Array(16);return r[0]=(t=parseInt(e.slice(0,8),16))>>>24,r[1]=t>>>16&255,r[2]=t>>>8&255,r[3]=255&t,r[4]=(t=parseInt(e.slice(9,13),16))>>>8,r[5]=255&t,r[6]=(t=parseInt(e.slice(14,18),16))>>>8,r[7]=255&t,r[8]=(t=parseInt(e.slice(19,23),16))>>>8,r[9]=255&t,r[10]=(t=parseInt(e.slice(24,36),16))/1099511627776&255,r[11]=t/4294967296&255,r[12]=t>>>24&255,r[13]=t>>>16&255,r[14]=t>>>8&255,r[15]=255&t,r};function I(e,t,r){function a(e,a,i,n){if("string"==typeof e&&(e=function(e){e=unescape(encodeURIComponent(e));for(var t=[],r=0;r>>9<<4)+1}function S(e,t){var r=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(r>>16)<<16|65535&r}function T(e,t,r,a,i,n){return S((s=S(S(t,e),S(a,n)))<<(o=i)|s>>>32-o,r);var s,o}function b(e,t,r,a,i,n,s){return T(t&r|~t&a,e,t,i,n,s)}function f(e,t,r,a,i,n,s){return T(t&a|r&~a,e,t,i,n,s)}function E(e,t,r,a,i,n,s){return T(t^r^a,e,t,i,n,s)}function A(e,t,r,a,i,n,s){return T(r^(t|~a),e,t,i,n,s)}const P=I("v3",48,(function(e){if("string"==typeof e){var t=unescape(encodeURIComponent(e));e=new Uint8Array(t.length);for(var r=0;r>5]>>>i%32&255,s=parseInt(a.charAt(n>>>4&15)+a.charAt(15&n),16);t.push(s)}return t}(function(e,t){e[t>>5]|=128<>5]|=(255&e[a/8])<>>32-t}const C=I("v5",80,(function(e){var t=[1518500249,1859775393,2400959708,3395469782],r=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof e){var a=unescape(encodeURIComponent(e));e=[];for(var i=0;i>>0;S=v,v=I,I=D(y,30)>>>0,y=g,g=f}r[0]=r[0]+g>>>0,r[1]=r[1]+y>>>0,r[2]=r[2]+I>>>0,r[3]=r[3]+v>>>0,r[4]=r[4]+S>>>0}return[r[0]>>24&255,r[0]>>16&255,r[0]>>8&255,255&r[0],r[1]>>24&255,r[1]>>16&255,r[1]>>8&255,255&r[1],r[2]>>24&255,r[2]>>16&255,r[2]>>8&255,255&r[2],r[3]>>24&255,r[3]>>16&255,r[3]>>8&255,255&r[3],r[4]>>24&255,r[4]>>16&255,r[4]>>8&255,255&r[4]]})),F="00000000-0000-0000-0000-000000000000",x=function(e){if(!o(e))throw TypeError("Invalid UUID");return parseInt(e.substr(14,1),16)}},5892:e=>{"use strict";e.exports=JSON.parse('{"major":1,"minor":188,"fix":0}')}},t={};function r(a){var i=t[a];if(void 0!==i)return i.exports;var n=t[a]={exports:{}};return e[a].call(n.exports,n,n.exports,r),n.exports}r.d=(e,t)=>{for(var a in t)r.o(t,a)&&!r.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var a={};(()=>{"use strict";var e=a;Object.defineProperty(e,"__esModule",{value:!0});const t=r(5136),i=r(976),n=r(5408);t.ApiVersion.SetVersionNumber("1.15.0-pre.15",!0);const s=new i.ExtensionsImpl;e.extensions=new n.Extensions(s);var o=r(7419);e.AnalyticsObjectType=o.AnalyticsObjectType,e.AnnotationType=o.AnnotationType,e.ClassNameKey=o.ClassNameKey,e.ColumnType=o.ColumnType,e.DashboardLayoutChange=o.DashboardLayoutChange,e.DashboardObjectType=o.DashboardObjectType,e.DashboardObjectVisibilityType=o.DashboardObjectVisibilityType,e.DataType=o.DataType,e.DateRangeType=o.DateRangeType,e.DialogStyle=o.DialogStyle,e.EncodingType=o.EncodingType,e.ErrorCodes=o.ErrorCodes,e.ExtensionContext=o.ExtensionContext,e.ExtensionMode=o.ExtensionMode,e.FieldAggregationType=o.FieldAggregationType,e.FieldRoleType=o.FieldRoleType,e.FilterDomainType=o.FilterDomainType,e.FilterNullOption=o.FilterNullOption,e.FilterType=o.FilterType,e.FilterUpdateType=o.FilterUpdateType,e.HierarchicalLevelSelectionState=o.HierarchicalLevelSelectionState,e.IncludeDataValuesOption=o.IncludeDataValuesOption,e.MarkType=o.MarkType,e.ParameterValueType=o.ParameterValueType,e.PeriodType=o.PeriodType,e.QuickTableCalcType=o.QuickTableCalcType,e.ReplaySpeedType=o.ReplaySpeedType,e.SelectionUpdateType=o.SelectionUpdateType,e.SelectOptions=o.SelectOptions,e.SheetType=o.SheetType,e.SortDirection=o.SortDirection,e.TableauEventType=o.TableauEventType,e.TrendLineModelType=o.TrendLineModelType,e.VizImageEncodingType=o.VizImageEncodingType,e.VizImagePaletteType=o.VizImagePaletteType,e.VizImageSizeSettingAlignmentType=o.VizImageSizeSettingAlignmentType,e.VizImageSizeSettingType=o.VizImageSizeSettingType,e.VizImageSortDirectionType=o.VizImageSortDirectionType,e.ZoneVisibilityType=o.ZoneVisibilityType})(),window.tableau=a})(); +//# sourceMappingURL=tableau.extensions.1.15.0-pre.15.beta.min.js.map \ No newline at end of file diff --git a/lib/beta/tableau.extensions.1.latest.beta.js b/lib/beta/tableau.extensions.1.latest.beta.js new file mode 100644 index 00000000..01521a26 --- /dev/null +++ b/lib/beta/tableau.extensions.1.latest.beta.js @@ -0,0 +1,13130 @@ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "../../node_modules/guid/guid.js": +/*!***************************************!*\ + !*** ../../node_modules/guid/guid.js ***! + \***************************************/ +/***/ ((module) => { + +(function () { + var validator = new RegExp("^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$", "i"); + + function gen(count) { + var out = ""; + for (var i=0; i { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +class DashboardLayoutChangedEvent extends TableauEvent_1.TableauEvent { + constructor(_dashboardLayoutChangeDetails) { + super(Contract.TableauEventType.DashboardLayoutChanged); + this._dashboardLayoutChangeDetails = _dashboardLayoutChangeDetails; + } + get dashboardLayoutChangeDetails() { + return this._dashboardLayoutChangeDetails; + } +} +exports.DashboardLayoutChangedEvent = DashboardLayoutChangedEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/FilterChangedEvent.js": +/*!************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/FilterChangedEvent.js ***! + \************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js"); +class FilterChangedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent { + constructor(worksheet, _fieldName, _fieldId) { + super(api_external_contract_js_1.TableauEventType.FilterChanged, worksheet); + this._fieldName = _fieldName; + this._fieldId = _fieldId; + } + get fieldName() { + return this._fieldName; + } + get fieldId() { + return this._fieldId; + } + getFilterAsync() { + return this._worksheet.getFiltersAsync().then((filters) => { + // TODO: Filtering of the filters should eventually be done platform side. + const eventedFilter = this.fieldId + ? filters.find((filter) => filter.fieldId === this.fieldId, this) + : filters.find((filter) => filter.fieldName === this.fieldName, this); + if (!eventedFilter) { + // We shouldn't hit this unless the filter was removed from the worksheet + // after the event was raised. + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.MissingFilter, `cannot find filter: ${this._fieldName}`); + } + return eventedFilter; + }); + } +} +exports.FilterChangedEvent = FilterChangedEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/MarksSelectedEvent.js": +/*!************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/MarksSelectedEvent.js ***! + \************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js"); +class MarksSelectedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent { + constructor(worksheet) { + super(api_external_contract_js_1.TableauEventType.MarkSelectionChanged, worksheet); + } + getMarksAsync() { + return this.worksheet.getSelectedMarksAsync(); + } +} +exports.MarksSelectedEvent = MarksSelectedEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/ParameterChangedEvent.js": +/*!***************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/ParameterChangedEvent.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const Parameter_1 = __webpack_require__(/*! ../Models/Parameter */ "./lib/src/ExtensionsApi/Models/Parameter.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +const TableauSheetEvent_1 = __webpack_require__(/*! ./TableauSheetEvent */ "./lib/src/ExtensionsApi/Events/TableauSheetEvent.js"); +class ParameterChangedEvent extends TableauSheetEvent_1.TableauSheetEvent { + constructor(_globalFieldName, sheet) { + super(api_external_contract_js_1.TableauEventType.ParameterChanged, sheet); + this._globalFieldName = _globalFieldName; + } + getParameterAsync() { + // Call down to our service to get the parameter back via its field name + const service = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("parameters-service" /* Parameters */); + return service.findParameterByGlobalFieldNameAsync(this._globalFieldName).then((parameterImpl) => { + if (parameterImpl === undefined) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.MissingParameter, `Cannot find parameter: ${this._globalFieldName}`); + } + return new Parameter_1.Parameter(parameterImpl, this.sheet); + }); + } +} +exports.ParameterChangedEvent = ParameterChangedEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/SummaryDataChangedEvent.js": +/*!*****************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/SummaryDataChangedEvent.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js"); +class SummaryDataChangedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent { + constructor(worksheet) { + super(api_external_contract_js_1.TableauEventType.SummaryDataChanged, worksheet); + } +} +exports.SummaryDataChangedEvent = SummaryDataChangedEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/TableauEvent.js": +/*!******************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/TableauEvent.js ***! + \******************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class TableauEvent { + constructor(type) { + this._type = type; + } + get type() { + return this._type; + } +} +exports.TableauEvent = TableauEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/TableauSheetEvent.js": +/*!***********************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/TableauSheetEvent.js ***! + \***********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +class TableauSheetEvent extends TableauEvent_1.TableauEvent { + constructor(type, sheet) { + super(type); + this._sheet = sheet; + } + get sheet() { + return this._sheet; + } +} +exports.TableauSheetEvent = TableauSheetEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js": +/*!***************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const TableauSheetEvent_1 = __webpack_require__(/*! ./TableauSheetEvent */ "./lib/src/ExtensionsApi/Events/TableauSheetEvent.js"); +class TableauWorksheetEvent extends TableauSheetEvent_1.TableauSheetEvent { + constructor(type, _worksheet) { + super(type, _worksheet); + this._worksheet = _worksheet; + } + get worksheet() { + return this._worksheet; + } +} +exports.TableauWorksheetEvent = TableauWorksheetEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js": +/*!************************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +class WorkbookFormattingChangedEvent extends TableauEvent_1.TableauEvent { + constructor(_formatting) { + super(Contract.TableauEventType.WorkbookFormattingChanged); + this._formatting = _formatting; + } + get formatting() { + return this._formatting; + } +} +exports.WorkbookFormattingChangedEvent = WorkbookFormattingChangedEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/WorksheetFormattingChangedEvent.js": +/*!*************************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/WorksheetFormattingChangedEvent.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js"); +class WorksheetFormattingChangedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent { + constructor(worksheet, _formatting) { + super(Contract.TableauEventType.WorksheetFormattingChanged, worksheet); + this._formatting = _formatting; + } + get formatting() { + return this._formatting; + } +} +exports.WorksheetFormattingChangedEvent = WorksheetFormattingChangedEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js": +/*!*******************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js ***! + \*******************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.BentonSansFontFamilyName = 'Benton Sans'; +exports.BentonSansLowDPIFontFamilyName = 'Benton Sans Low-DPI'; +exports.BentonSansBookFontFaceName = 'Benton Sans Book'; +exports.BentonSansBookItalicFontFaceName = 'Benton Sans Book Italic'; +exports.BentonSansSemiDemiFontFaceName = 'Benton Sans SemiDemi'; +exports.BentonSansSemiDemiItalicFontFaceName = 'Benton Sans SemiDemi Italic'; +exports.BentonSansLightFontFaceName = 'Benton Sans Light'; +exports.BentonSansMediumFontFaceName = 'Benton Sans Medium'; +exports.SupportedBentonSansFontFaces = [ + exports.BentonSansBookFontFaceName, + exports.BentonSansBookItalicFontFaceName, + exports.BentonSansSemiDemiFontFaceName, + exports.BentonSansSemiDemiItalicFontFaceName, + exports.BentonSansLightFontFaceName, + exports.BentonSansMediumFontFaceName, +]; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/ConnectedServer.js": +/*!*******************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/ConnectedServer.js ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class ConnectedServer { + constructor(_userId, _siteId, _siteNamespace, _workbookId) { + this._userId = _userId; + this._siteId = _siteId; + this._siteNamespace = _siteNamespace; + this._workbookId = _workbookId; + } + get userId() { + return this._userId; + } + get siteId() { + return this._siteId; + } + get siteNamespace() { + return this._siteNamespace; + } + get workbookId() { + return this._workbookId; + } +} +exports.ConnectedServer = ConnectedServer; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js": +/*!*************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js ***! + \*************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +class ExtensionWorkbookImpl extends api_shared_js_1.WorkbookImpl { + getAllDataSourcesAsync() { + const service = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("data-source-service" /* DataSourceService */); + return service.getAllDataSourcesAsync().then((result) => { + const dataSchema = result; + const dataSources = []; + // Loop through all data sources and add them. + Object.values(dataSchema.dataSources).forEach((ds) => { + dataSources.push(this.createDataSourceFromInfo(ds)); + }); + return dataSources; + }); + } + createDataSourceFromInfo(dataSourceInfo) { + const dataSourceImpl = new api_shared_js_1.DataSourceImpl(dataSourceInfo, ServiceRegistryUtil_1.ExtensionsRegistryId); + const dataSource = new api_shared_js_1.DataSource(dataSourceImpl); + dataSourceImpl.initializeWithPublicInterfaces(dataSource); + return dataSource; + } +} +exports.ExtensionWorkbookImpl = ExtensionWorkbookImpl; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/ExtensionsImpl.js": +/*!******************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/ExtensionsImpl.js ***! + \******************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const Dashboard_1 = __webpack_require__(/*! ../Models/Dashboard */ "./lib/src/ExtensionsApi/Models/Dashboard.js"); +const Workbook_1 = __webpack_require__(/*! ../Models/Workbook */ "./lib/src/ExtensionsApi/Models/Workbook.js"); +const Worksheet_1 = __webpack_require__(/*! ../Models/Worksheet */ "./lib/src/ExtensionsApi/Models/Worksheet.js"); +const DashboardContent_1 = __webpack_require__(/*! ../Namespaces/DashboardContent */ "./lib/src/ExtensionsApi/Namespaces/DashboardContent.js"); +const Environment_1 = __webpack_require__(/*! ../Namespaces/Environment */ "./lib/src/ExtensionsApi/Namespaces/Environment.js"); +const Settings_1 = __webpack_require__(/*! ../Namespaces/Settings */ "./lib/src/ExtensionsApi/Namespaces/Settings.js"); +const UI_1 = __webpack_require__(/*! ../Namespaces/UI */ "./lib/src/ExtensionsApi/Namespaces/UI.js"); +const WorkbookFormattingEnvUtil_1 = __webpack_require__(/*! ../Namespaces/WorkbookFormattingEnvUtil */ "./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js"); +const WorksheetContent_1 = __webpack_require__(/*! ../Namespaces/WorksheetContent */ "./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js"); +const RegisterAllExtensionsServices_1 = __webpack_require__(/*! ../Services/RegisterAllExtensionsServices */ "./lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +const BentonSansFontNameConstants_1 = __webpack_require__(/*! ./BentonSansFontNameConstants */ "./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js"); +const ExtensionWorkbookImpl_1 = __webpack_require__(/*! ./ExtensionWorkbookImpl */ "./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js"); +const LegacyInternalApiDispatcherHolder_1 = __webpack_require__(/*! ./LegacyInternalApiDispatcherHolder */ "./lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js"); +const SettingsImpl_1 = __webpack_require__(/*! ./SettingsImpl */ "./lib/src/ExtensionsApi/Impl/SettingsImpl.js"); +const TableauBookFontNameConstants_1 = __webpack_require__(/*! ./TableauBookFontNameConstants */ "./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js"); +const UIImpl_1 = __webpack_require__(/*! ./UIImpl */ "./lib/src/ExtensionsApi/Impl/UIImpl.js"); +class ExtensionsImpl { + initializeAsync(isExtensionDialog, contextMenuCallbacks) { + if (!this._initializationPromise) { + this._initializationPromise = new Promise((resolve, reject) => { + var _a; + const initOptions = { isAlpha: api_shared_js_1.ApiVersion.Instance.isAlpha }; + // First thing we want to do is check to see if there is a desktop dispatcher already registered for us + if (LegacyInternalApiDispatcherHolder_1.LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise(initOptions)) { + // Running in a pre-2019.3 desktop, use our legacy dispatcher promise + const desktopDispatcherPromise = LegacyInternalApiDispatcherHolder_1.LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise(initOptions); + (_a = desktopDispatcherPromise) === null || _a === void 0 ? void 0 : _a.then((dispatcherFactory) => this.onDispatcherReceived(dispatcherFactory, isExtensionDialog, contextMenuCallbacks)).then((openPayload) => { + resolve(openPayload); + }).catch((error) => { + reject(error); + }); + } + else { + // We must be running in server, so we should try to kick of the server dispatcher bootstrapping + const onDispatcherReceivedCallback = this.onDispatcherReceived.bind(this); + api_shared_js_1.doCrossFrameBootstrap(window, api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION, initOptions) + .then((factory) => { + return onDispatcherReceivedCallback(factory, isExtensionDialog, contextMenuCallbacks); + }) + .then((openPayload) => { + resolve(openPayload); + }) + .catch((error) => { + reject(error); + }); + } + }); + } + return this._initializationPromise; + } + createVizImageAsync(inputSpec) { + const vizService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("viz-service" /* Viz */); + return vizService.createVizImageAsync(inputSpec); + } + setClickThroughAsync(clickThroughEnabled) { + const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); + return uiService.setClickThroughAsync(clickThroughEnabled, this.extensionZoneId); + } + isDashboardExtensionLocator(locator) { + const dashboardExtensionLocator = locator; + if (!dashboardExtensionLocator.dashboardPath) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Unexpected error during initialization.'); + } + return true; + } + onDispatcherReceived(dispatcherFactory, isExtensionDialog, contextMenuFunctions) { + let dispatcher = dispatcherFactory(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); + // Call to register all the services which will use the newly initialized dispatcher + RegisterAllExtensionsServices_1.registerInitializationExtensionsServices(dispatcher); + // Get the initialization service and initialize this extension + const initializationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("InitializationService" /* InitializationService */); + const callbackMapKeys = contextMenuFunctions ? Object.keys(contextMenuFunctions) : []; + return initializationService.initializeDashboardExtensionsAsync(isExtensionDialog, callbackMapKeys).then((result) => { + // If we receive an invalid plaform version, this means that platform is runnning 1.4 or 2.1 and + // doesn't pass the platform version to external. In this case we assume the platform version to be 1.9 + const platformVersion = result.extensionEnvironment.platformVersion + ? result.extensionEnvironment.platformVersion + : { major: 1, minor: 9, fix: 0 }; + // Wrap our existing dispatcher in a dispatcher that can downgrade/upgrade for an older platform. + if (api_shared_js_1.VersionedExternalApiDispatcher.needsVersionConverter(platformVersion)) { + dispatcher = new api_shared_js_1.VersionedExternalApiDispatcher(dispatcher, platformVersion); + } + // Registration of services must happen before initializing content and environment + // Extensions doesn't need to pass in a registryId. By default, the service registry instance is associated with registryId=0. + api_shared_js_1.registerAllSharedServices(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId); + RegisterAllExtensionsServices_1.registerAllExtensionsServices(dispatcher); + if (result.extensionDashboardInfo && this.isDashboardExtensionLocator(result.extensionInstance.locator)) { + this.dashboardContent = this.initializeDashboardContent(result.extensionDashboardInfo, result.extensionInstance.locator.dashboardPath); + this.extensionZoneId = result.extensionDashboardInfo.extensionZoneId; + } + if (result.extensionWorksheetInfo) { + this.worksheetContent = this.initializeWorksheetContent(result.extensionWorksheetInfo); + } + this.environment = new Environment_1.Environment(result.extensionEnvironment); + this.settings = this.initializeSettings(result.extensionSettingsInfo); + this.ui = new UI_1.UI(new UIImpl_1.UIImpl()); + this.workbook = new Workbook_1.Workbook(new ExtensionWorkbookImpl_1.ExtensionWorkbookImpl()); + if (result.extensionEnvironment.workbookFormatting) { + this.initializeTableauFonts(dispatcher, result.extensionEnvironment.workbookFormatting); + this.applyAllFormatting(result.extensionEnvironment.workbookFormatting); + } + // After initialization has completed, setup listeners for the callback functions that + // are meant to be triggered whenever a context menu item is clicked. + this.initializeContextMenuCallbacks(contextMenuFunctions); + // Also set up listeners for ExtensionStylesChangedEvent + this.initializeWorkbookFormattingChangedEventCallback(dispatcher); + // In the normal initialization case, this will be an empty string. When returning from initializeAsync to the + // developer, we just ingore that string. In the case of initializing from an extension dialog, this string + // is an optional payload sent from the parent extension. + return result.extensionDialogPayload; + }); + } + applyAllFormatting(formattingModel) { + if (!this._styleElement) { + this._styleElement = document.createElement('style'); + this._styleElement.id = 'Tableau-Extension-Formatting'; + document.head.appendChild(this._styleElement); + } + if (!this._styleElement.sheet || !formattingModel) { + return; + } + const stylesheet = this._styleElement.sheet; + while (stylesheet.cssRules.length > 0) { + stylesheet.deleteRule(stylesheet.cssRules.length - 1); + } + formattingModel.formattingSheets.map((currentFormattingSheet) => { + this.applyFormattingSheetToStyleSheet(currentFormattingSheet, stylesheet); + }); + } + applyFormattingSheetToStyleSheet(currentFormattingSheet, stylesheet) { + let styleInfo = ''; + const cssProperties = currentFormattingSheet.cssProperties; + if (cssProperties.fontFamily) { + styleInfo += 'font-family: ' + cssProperties.fontFamily.toString() + '; '; + } + if (cssProperties.fontSize) { + styleInfo += 'font-size: ' + cssProperties.fontSize.toString() + '; '; + } + if (cssProperties.fontWeight) { + styleInfo += 'font-weight: ' + cssProperties.fontWeight.toString() + '; '; + } + if (cssProperties.fontStyle) { + styleInfo += 'font-style: ' + cssProperties.fontStyle.toString() + '; '; + } + if (cssProperties.textDecoration) { + styleInfo += 'text-decoration: ' + cssProperties.textDecoration.toString() + '; '; + } + if (cssProperties.color) { + styleInfo += 'color: ' + cssProperties.color + '; '; + } + const selector = '.' + currentFormattingSheet.classNameKey; + const rule = selector + ' { ' + styleInfo + ' }'; + stylesheet.insertRule(rule, stylesheet.cssRules.length); + } + initializeWorkbookFormattingChangedEventCallback(dispatcher) { + const notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + // Unregister function not used since these notifications should be + // observed for the full lifetime of the extension. + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorkbookFormattingChanged, () => true, (eventFormatting) => { + if (eventFormatting) { + this.initializeTableauFonts(dispatcher, eventFormatting); + this.applyAllFormatting(eventFormatting); + } + }); + } + initializeTableauFonts(dispatcher, workbookFormatting) { + const fontNames = [...BentonSansFontNameConstants_1.SupportedBentonSansFontFaces, ...TableauBookFontNameConstants_1.SupportedTableauFontFaces]; + workbookFormatting.formattingSheets.forEach((formattingSheet) => { + if (formattingSheet.cssProperties.fontFamily) { + fontNames.push(formattingSheet.cssProperties.fontFamily); + } + }); + if (fontNames.length > 0) { + const parameters = { [api_internal_contract_js_1.ParameterId.FontNameListItems]: fontNames }; + dispatcher + .execute(api_internal_contract_js_1.VerbId.GetFonts, parameters) + .then((response) => { + this.loadFonts(response.result); + }) + .catch(); + } + } + loadFonts(fonts) { + fonts.forEach((fontNameAndInfo) => { + if (TableauBookFontNameConstants_1.SupportedTableauFontFaces.includes(fontNameAndInfo.fontName)) { + this.loadTableauFonts(fontNameAndInfo); + } + else if (BentonSansFontNameConstants_1.SupportedBentonSansFontFaces.includes(fontNameAndInfo.fontName)) { + this.loadBentonSansFonts(fontNameAndInfo); + } + else { + document.fonts.add(new FontFace(fontNameAndInfo.fontName, fontNameAndInfo.fontBinaryInfo)); + } + }); + } + initializeDashboardContent(info, sheetPath) { + // sheets are always active for Extensions + const sheetInfoImpl = new api_shared_js_1.SheetInfoImpl(info.name, api_external_contract_js_1.SheetType.Dashboard, { width: info.size.w, height: info.size.h }, undefined, true); + const dashboardImpl = new api_shared_js_1.DashboardImpl(sheetInfoImpl, info.zones, sheetPath, ServiceRegistryUtil_1.ExtensionsRegistryId, null, info.activeDashboardObjectId); + const dashboard = new Dashboard_1.Dashboard(dashboardImpl); + return new DashboardContent_1.DashboardContent(dashboard); + } + initializeWorksheetContent(info) { + const sheetInfoImpl = new api_shared_js_1.SheetInfoImpl(info.visualId.worksheet, api_external_contract_js_1.SheetType.Worksheet, { width: info.size.w, height: info.size.h }, undefined, // index property is embedding specific + true); + const worksheetImpl = new api_shared_js_1.WorksheetImpl(sheetInfoImpl, ServiceRegistryUtil_1.ExtensionsRegistryId, info.visualId, null, // parentDashboard is always null for worksheet in WorksheetContent + null, // parentStoryPoint is only used for embedding + info.backgroundColor, WorkbookFormattingEnvUtil_1.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(info.formatting)); + const worksheet = new Worksheet_1.Worksheet(worksheetImpl); + return new WorksheetContent_1.WorksheetContent(worksheet); + } + initializeSettings(settingsInfo) { + const settingsImpl = new SettingsImpl_1.SettingsImpl(settingsInfo); + return new Settings_1.Settings(settingsImpl); + } + initializeContextMenuCallbacks(contextMenuFunctions) { + const notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + // Unregister function not used since these notifications should be + // observed for the full lifetime of the extension. + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ContextMenuClick, () => { + // Let through any context menu event, these are already filtered on api-core + // based on the extension locator. + return true; + }, (event) => { + // Execute the function associated with this context menu ID + if (contextMenuFunctions) { + if (!contextMenuFunctions[event.id]) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Received unexpected context menu Id from event: ${event.id}`); + } + contextMenuFunctions[event.id](); + } + }); + } + loadTableauFonts(fontNameAndInfo) { + switch (fontNameAndInfo.fontName) { + case TableauBookFontNameConstants_1.TableauBookFontFaceName: + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBookFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); + break; + case TableauBookFontNameConstants_1.TableauLightFontFaceName: + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauLightFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); + break; + case TableauBookFontNameConstants_1.TableauRegularFontFaceName: + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauRegularFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); + break; + case TableauBookFontNameConstants_1.TableauSemiBoldFontFaceName: + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauSemiboldFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauRegularFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); + break; + case TableauBookFontNameConstants_1.TableauBoldFontFaceName: + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBoldFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBoldFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauMediumFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauSemiboldFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); + break; + case TableauBookFontNameConstants_1.TableauMediumFontFaceName: + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauMediumFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauLightFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); + document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBookFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); + break; + default: + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `'attempted to load unsupported font: ${fontNameAndInfo.fontName}.'`); + } + } + loadBentonSansFonts(fontNameAndInfo) { + switch (fontNameAndInfo.fontName) { + case BentonSansFontNameConstants_1.BentonSansBookFontFaceName: + document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); + document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansLowDPIFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: '100', style: 'normal' })); + break; + case BentonSansFontNameConstants_1.BentonSansLightFontFaceName: + document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: '100', style: 'normal' })); + break; + case BentonSansFontNameConstants_1.BentonSansMediumFontFaceName: + document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); + document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansLowDPIFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); + break; + case BentonSansFontNameConstants_1.BentonSansSemiDemiFontFaceName: + document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansLowDPIFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); + break; + case BentonSansFontNameConstants_1.BentonSansBookItalicFontFaceName: + document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansFontFamilyName, fontNameAndInfo.fontBinaryInfo, { style: 'italic' })); + break; + case BentonSansFontNameConstants_1.BentonSansSemiDemiItalicFontFaceName: + document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansLowDPIFontFamilyName, fontNameAndInfo.fontBinaryInfo, { style: 'italic' })); + break; + default: + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `'attempted to load unsupported font: ${fontNameAndInfo.fontName}.'`); + } + } +} +exports.ExtensionsImpl = ExtensionsImpl; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js": +/*!*************************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +/** + * LegacyInternalApiDispatcherHolder has been moved (and renamed) from api-internal-contract. + * It supports running a newer external library against a pre 2019.3 desktop. + * Starting in 2019.3, we have a merged bootstrap style for both desktop and server. + * In addition, the alpha checking that is happening here is not necessary in external-api-js + * after 2019.3 because that checking happens in api-platform-js (ApiDispatcherTest.ts) + * TFSID: 1091561 tracks an improvement to this system to make it less complex and tie it directly to + * tableau beta release versions. + * @deprecated + */ +// eslint-disable-next-line @typescript-eslint/no-namespace +var LegacyInternalApiDispatcherHolder; +(function (LegacyInternalApiDispatcherHolder) { + /** + * @param options + */ + function getDesktopDispatcherPromise(options) { + var _a; + if ((!options || typeof options.isAlpha === 'undefined') && !window.__warningIssued) { + // tslint:disable-next-line:no-console + console.warn('This is a beta version of the Extensions API. Please upgrade to an official release.'); + window.__warningIssued = true; + } + else if (((_a = options) === null || _a === void 0 ? void 0 : _a.isAlpha) && window.__platformIsOfficialRelease) { + window.__tableauDesktopDispatcher + .then((dispatcherFactory) => { + const dispatcher = dispatcherFactory(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); + dispatcher.execute(api_internal_contract_js_1.VerbId.BlockExtension, {}).catch(); + }) + .catch(); + } + // this will be undefined if promise is rejected or throws + return window.__tableauDesktopDispatcher; + } + LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise = getDesktopDispatcherPromise; + /** + * @param options + */ + function hasDesktopApiDispatcherPromise(options) { + return !!getDesktopDispatcherPromise(options); + } + LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise = hasDesktopApiDispatcherPromise; +})(LegacyInternalApiDispatcherHolder = exports.LegacyInternalApiDispatcherHolder || (exports.LegacyInternalApiDispatcherHolder = {})); + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/SettingsImpl.js": +/*!****************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/SettingsImpl.js ***! + \****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const TableauEvent_1 = __webpack_require__(/*! ../Events/TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +class SettingsChangedEvent extends TableauEvent_1.TableauEvent { + constructor(_newSettings) { + super(Contract.TableauEventType.SettingsChanged); + this._newSettings = _newSettings; + } + get newSettings() { + return this._newSettings; + } +} +class SettingsImpl { + constructor(settingsInfo) { + // Since promises can't be introspected for state, keep a variable that + // indicates a save is in progress, so that set/erase can't be called during a save. + this._saveInProgress = false; + this.initializeSettings(settingsInfo); + } + erase(key) { + api_shared_js_1.ErrorHelpers.verifyParameter(key, 'key'); + // Only make a modification if we have the key already + if (this._currentSettings[key]) { + this.verifySettingsAreUnlocked(); + delete this._currentSettings[key]; + this._isModified = true; + } + } + get(key) { + api_shared_js_1.ErrorHelpers.verifyParameter(key, 'key'); + return this._currentSettings[key]; + } + getAll() { + // Returns a mutable copy of the settings + return Object.assign({}, this._currentSettings); + } + get isModified() { + return this._isModified; + } + saveAsync() { + this.verifySettingsAreUnlocked(); + // Just resolve immediately if settings are unchanged + if (!this._isModified) { + return Promise.resolve(this._currentSettings); + } + this._saveInProgress = true; + // Use the settings service to save settings to twb + const settingsService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("SettingsService" /* SettingsService */); + return settingsService.saveSettingsAsync(this._currentSettings).then((newSettings) => { + this._saveInProgress = false; + this._isModified = false; + if (this._currentSettings === undefined) { + this._currentSettings = newSettings; + } + else { + Object.assign(this._currentSettings, newSettings); + } + return newSettings; + }, (reason) => { + this._saveInProgress = false; + return Promise.reject(reason); + }); + } + set(key, value) { + api_shared_js_1.ErrorHelpers.verifyStringParameter(key, 'key'); // Key shouldn't be an empty string. + api_shared_js_1.ErrorHelpers.verifyParameter(value, 'value'); // Empty string value is allowed. + this.verifySettingsAreUnlocked(); + this._currentSettings[key] = value; + this._isModified = true; + } + /** + * Initializes all events relevant to settings object. This is only a settingsUpdate event currently. + * + * @returns {Array} Collection of event managers to pass to an EventListenerManager. + */ + initializeEvents() { + const results = new Array(); + let notificationService; + try { + notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + } + catch (e) { + // If we don't have this service registered, just return + return results; + } + const settingsChangedEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.SettingsChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SettingsChanged, () => true, (event) => { + this._currentSettings = event.newSettings; + settingsChangedEvent.triggerEvent(() => new SettingsChangedEvent(event.newSettings)); + }); + results.push(settingsChangedEvent); + return results; + } + initializeSettings(settingsInfo) { + api_shared_js_1.ErrorHelpers.verifyParameter(settingsInfo, 'settingsInfo'); + api_shared_js_1.ErrorHelpers.verifyParameter(settingsInfo.settingsValues, 'settingsInfo.SettingsValues'); + this._currentSettings = settingsInfo.settingsValues; + // Reset the isModified flag + this._isModified = false; + } + /** + * This helper should be called before any local update to this.currentSettings. + * Checks if a current save call is still in progress and throws an error if so. + */ + verifySettingsAreUnlocked() { + if (this._saveInProgress) { + throw new api_shared_js_1.TableauError(Contract.ErrorCodes.SettingSaveInProgress, SettingsImpl.ASYNC_SAVE_IN_PROGRESS); + } + } +} +exports.SettingsImpl = SettingsImpl; +SettingsImpl.ASYNC_SAVE_IN_PROGRESS = 'Async Save is in progress, updating settings is not allowed.'; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js": +/*!********************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TableauBookFontFamilyName = 'Tableau Book'; +exports.TableauLightFontFamilyName = 'Tableau Light'; +exports.TableauRegularFontFamilyName = 'Tableau Regular'; +exports.TableauMediumFontFamilyName = 'Tableau Medium'; +exports.TableauSemiboldFontFamilyName = 'Tableau Semibold'; +exports.TableauBoldFontFamilyName = 'Tableau Bold'; +exports.TableauBookFontFaceName = 'Tableau Book'; +exports.TableauBoldFontFaceName = 'Tableau Bold'; +exports.TableauLightFontFaceName = 'Tableau Light'; +exports.TableauMediumFontFaceName = 'Tableau Medium'; +exports.TableauRegularFontFaceName = 'Tableau Regular'; +exports.TableauSemiBoldFontFaceName = 'Tableau Semi Bold'; +exports.SupportedTableauFontFaces = [ + exports.TableauBookFontFaceName, + exports.TableauBoldFontFaceName, + exports.TableauLightFontFaceName, + exports.TableauMediumFontFaceName, + exports.TableauRegularFontFaceName, + exports.TableauSemiBoldFontFaceName, +]; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/UIImpl.js": +/*!**********************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/UIImpl.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const TableauEvent_1 = __webpack_require__(/*! ../Events/TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +class DialogMessageEvent extends TableauEvent_1.TableauEvent { + constructor(message) { + super(Contract.TableauEventType.DialogMessageReceived); + this.message = message; + } +} +exports.DialogMessageEvent = DialogMessageEvent; +class UIImpl { + constructor() { } + displayDialogAsync(url, payload, options) { + const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); + const notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + return new Promise((resolve, reject) => { + uiService + .displayDialogAsync(url, payload || '', options) + .then(() => { + const unregisterFn = notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ExtensionDialogUpdate, () => { + // Let through any dialog update event + return true; + }, (event) => { + if (event.isCloseEvent) { + if (event.closePayload === undefined) { + throw new api_shared_js_1.TableauError(Contract.ErrorCodes.InternalError, 'closePayload is undefined'); + } + resolve(event.closePayload); + } + else { + reject(new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.DialogClosedByUser, 'Extension dialog closed by user.')); + } + unregisterFn(); + }); + }) + .catch((error) => { + reject(error); + }); + }); + } + sendDialogMessageAsync(message, targetDialogUrl) { + const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); + uiService.sendDialogMessageAsync(message, targetDialogUrl); + } + closeDialog(payload) { + const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); + uiService.closeDialog(payload); + } + /** + * Initializes all events relevant to UI object. + * + * @returns {Array} Collection of event managers to pass to an EventListenerManager. + */ + initializeEvents() { + const results = new Array(); + let notificationService; + try { + notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + } + catch (e) { + // If we don't have this service registered, just return + return results; + } + const dialogMessageEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.DialogMessageReceived); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ExtensionDialogMessage, () => true, (event) => { + dialogMessageEvent.triggerEvent(() => new DialogMessageEvent(event.message)); + }); + results.push(dialogMessageEvent); + return results; + } +} +exports.UIImpl = UIImpl; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Models/Dashboard.js": +/*!***************************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Dashboard.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const DashboardLayoutChangedEvent_1 = __webpack_require__(/*! ../Events/DashboardLayoutChangedEvent */ "./lib/src/ExtensionsApi/Events/DashboardLayoutChangedEvent.js"); +const WorkbookFormattingChangedEvent_1 = __webpack_require__(/*! ../Events/WorkbookFormattingChangedEvent */ "./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +const DashboardObject_1 = __webpack_require__(/*! ./DashboardObject */ "./lib/src/ExtensionsApi/Models/DashboardObject.js"); +const Sheet_1 = __webpack_require__(/*! ./Sheet */ "./lib/src/ExtensionsApi/Models/Sheet.js"); +const Worksheet_1 = __webpack_require__(/*! ./Worksheet */ "./lib/src/ExtensionsApi/Models/Worksheet.js"); +class Dashboard extends Sheet_1.Sheet { + constructor(_dashboardImpl) { + super(_dashboardImpl); + this._dashboardImpl = _dashboardImpl; + _dashboardImpl.initializeWithPublicInterfaces(); + this.initializeEvents().forEach((e) => this.addNewEventType(e)); + } + get worksheets() { + return this._dashboardImpl.worksheetsImpl.map((worksheetImpl) => { + return new Worksheet_1.Worksheet(worksheetImpl); + }); + } + get objects() { + return this._dashboardImpl.objects.map((dashboardObjectImpl) => { + return new DashboardObject_1.DashboardObject(dashboardObjectImpl); + }); + } + get activeDashboardObjectId() { + return this._dashboardImpl.activeDashboardObjectId; + } + get activeDashboardName() { + return this._dashboardImpl.activeDashboardName; + } + setZoneVisibilityAsync(zoneVisibilityMap) { + return this._dashboardImpl.setDashboardObjectVisibilityAsync(zoneVisibilityMap); + } + setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap) { + return this._dashboardImpl.setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap); + } + getDashboardObjectById(dashboardObjectId) { + const zone = this._dashboardImpl.getDashboardObjectById(dashboardObjectId); + return zone && new DashboardObject_1.DashboardObject(zone); + } + initializeEvents() { + const results = new Array(); + // Initializing events and registering notification service + let notificationService; + try { + notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + } + catch (e) { + // If we don't have this service registered, just return (allows unit testing without NotificationService mock) + return results; + } + const dashboardLayoutChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.DashboardLayoutChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.DashboardLayoutChanged, () => true, (event) => { + const dashboardObjectChanges = this._dashboardImpl.updateZones(event.zones, event.activeZoneId, event.activeDashboardName); + dashboardLayoutChangedEvent.triggerEvent(() => new DashboardLayoutChangedEvent_1.DashboardLayoutChangedEvent(dashboardObjectChanges)); + }); + results.push(dashboardLayoutChangedEvent); + const workbookFormattingChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.WorkbookFormattingChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorkbookFormattingChanged, () => true, (eventFormatting) => { + workbookFormattingChangedEvent.triggerEvent(() => new WorkbookFormattingChangedEvent_1.WorkbookFormattingChangedEvent(eventFormatting)); + }); + results.push(workbookFormattingChangedEvent); + return results; + } + moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray) { + return this._dashboardImpl.moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray); + } + replayAnimationAsync(replaySpeed) { + return this._dashboardImpl.replayAnimationAsync(replaySpeed); + } + getFiltersAsync() { + return this._dashboardImpl.getFiltersAsync(); + } + applyFilterAsync(fieldName, values, updateType, options) { + return this._dashboardImpl.applyFilterAsync(fieldName, values, updateType, options); + } +} +exports.Dashboard = Dashboard; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Models/DashboardObject.js": +/*!*********************************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/DashboardObject.js ***! + \*********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Dashboard_1 = __webpack_require__(/*! ./Dashboard */ "./lib/src/ExtensionsApi/Models/Dashboard.js"); +const Worksheet_1 = __webpack_require__(/*! ./Worksheet */ "./lib/src/ExtensionsApi/Models/Worksheet.js"); +/** + * Implementation of the dashboard objects - the zones in a dashboard. + */ +class DashboardObject { + constructor(_dashboardObjectImpl) { + this._dashboardObjectImpl = _dashboardObjectImpl; + } + get dashboard() { + return new Dashboard_1.Dashboard(this._dashboardObjectImpl.dashboardImpl); + } + get type() { + return this._dashboardObjectImpl.type; + } + get position() { + return this._dashboardObjectImpl.position; + } + get size() { + return this._dashboardObjectImpl.size; + } + get worksheet() { + if (this._dashboardObjectImpl.worksheetImpl) { + return new Worksheet_1.Worksheet(this._dashboardObjectImpl.worksheetImpl); + } + return undefined; + } + get name() { + return this._dashboardObjectImpl.name; + } + get isFloating() { + return this._dashboardObjectImpl.isFloating; + } + get isVisible() { + return this._dashboardObjectImpl.isVisible; + } + get id() { + return this._dashboardObjectImpl.id; + } + get fieldId() { + return this._dashboardObjectImpl.fieldId; + } +} +exports.DashboardObject = DashboardObject; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Models/Parameter.js": +/*!***************************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Parameter.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const ParameterChangedEvent_1 = __webpack_require__(/*! ../Events/ParameterChangedEvent */ "./lib/src/ExtensionsApi/Events/ParameterChangedEvent.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +/** + * Implementation of the Parameter contract. Calls down to the impl + * class for almost all of the work it does. + */ +class Parameter extends api_shared_js_1.EventListenerManager { + constructor(parameterImpl, sheet) { + super(); + this.parameterImpl = parameterImpl; + // Initialize our event handling for this class + this.initializeEvents(sheet).forEach((e) => this.addNewEventType(e)); + } + get name() { + return this.parameterImpl.name; + } + get currentValue() { + return this.parameterImpl.currentValue; + } + get dataType() { + return this.parameterImpl.dataType; + } + get allowableValues() { + return this.parameterImpl.allowableValues; + } + get id() { + return this.parameterImpl.id; + } + changeValueAsync(newValue) { + return this.parameterImpl.changeValueAsync(newValue); + } + /** + * Helper method which goes through and registers each event type this impl knows about + * with the NotificationService. It returns an array of SingleEventManager objects which + * can then be passed to an EventListenerManager to handle user registration / unregistration. + * + * @param sheet The sheet object which will be included with the event notifications + * @returns {Array} Collection of event managers to pass to an EventListenerManager + */ + initializeEvents(sheet) { + api_shared_js_1.ErrorHelpers.verifyInternalValue(sheet, 'sheet'); + const results = new Array(); + let notificationService; + try { + notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + } + catch (e) { + // If we don't have this service registered, just return + return results; + } + // Initialize all of the event managers we'll need (one for each event type) + const parameterEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.ParameterChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ParameterChanged, (model) => { + const fieldName = model; + return fieldName === this.parameterImpl.id; + }, (fieldName) => { + parameterEvent.triggerEvent(() => new ParameterChangedEvent_1.ParameterChangedEvent(fieldName, sheet)); + }); + results.push(parameterEvent); + return results; + } +} +exports.Parameter = Parameter; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Models/Sheet.js": +/*!***********************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Sheet.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const Parameter_1 = __webpack_require__(/*! ./Parameter */ "./lib/src/ExtensionsApi/Models/Parameter.js"); +class Sheet extends api_shared_js_1.EventListenerManager { + constructor(_sheetImpl) { + super(); + this._sheetImpl = _sheetImpl; + } + get name() { + return this._sheetImpl.name; + } + get sheetType() { + return this._sheetImpl.sheetType; + } + get size() { + if (this.isValidSize(this._sheetImpl.size)) { + return this._sheetImpl.size; + } + throw new api_shared_js_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, 'Size not implemented'); + } + isValidSize(size) { + const testSize = size; + if (testSize.width !== undefined && testSize.height !== undefined) { + return true; + } + return false; + } + findParameterAsync(parameterName) { + return this._sheetImpl.findParameterAsync(parameterName).then((parameterImpl) => { + if (parameterImpl) { + return new Promise((resolve) => resolve(new Parameter_1.Parameter(parameterImpl, this))); + } + else { + return new Promise((resolve) => resolve(undefined)); + } + }); + } + getParametersAsync() { + return this._sheetImpl.getParametersAsync().then((parametersImpl) => { + return parametersImpl.map((parameterImpl) => { + return new Parameter_1.Parameter(parameterImpl, this); + }); + }); + } +} +exports.Sheet = Sheet; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Models/Workbook.js": +/*!**************************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Workbook.js ***! + \**************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class Workbook { + constructor(_workbookImpl) { + this._workbookImpl = _workbookImpl; + } + getAllDataSourcesAsync() { + return this._workbookImpl.getAllDataSourcesAsync(); + } +} +exports.Workbook = Workbook; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Models/Worksheet.js": +/*!***************************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Worksheet.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const FilterChangedEvent_1 = __webpack_require__(/*! ../Events/FilterChangedEvent */ "./lib/src/ExtensionsApi/Events/FilterChangedEvent.js"); +const MarksSelectedEvent_1 = __webpack_require__(/*! ../Events/MarksSelectedEvent */ "./lib/src/ExtensionsApi/Events/MarksSelectedEvent.js"); +const SummaryDataChangedEvent_1 = __webpack_require__(/*! ../Events/SummaryDataChangedEvent */ "./lib/src/ExtensionsApi/Events/SummaryDataChangedEvent.js"); +const WorksheetFormattingChangedEvent_1 = __webpack_require__(/*! ../Events/WorksheetFormattingChangedEvent */ "./lib/src/ExtensionsApi/Events/WorksheetFormattingChangedEvent.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +const Dashboard_1 = __webpack_require__(/*! ./Dashboard */ "./lib/src/ExtensionsApi/Models/Dashboard.js"); +const Sheet_1 = __webpack_require__(/*! ./Sheet */ "./lib/src/ExtensionsApi/Models/Sheet.js"); +class Worksheet extends Sheet_1.Sheet { + constructor(_worksheetImpl) { + super(_worksheetImpl); + this._worksheetImpl = _worksheetImpl; + // Call to initialize events and then call down to the event listener manager to handle things + this.initializeEvents().forEach((e) => this.addNewEventType(e)); + } + get parentDashboard() { + // This should never happen for Extensions if the DashboardImpls are created correctly + if (this._worksheetImpl.parentDashboard == null) { + throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `Parent dashboard not implemented`); + } + return new Dashboard_1.Dashboard(this._worksheetImpl.parentDashboard); + } + get backgroundColor() { + if (this._worksheetImpl.backgroundColor == null) { + throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `Worksheet background color is not available`); + } + return this._worksheetImpl.backgroundColor; + } + get formatting() { + if (this._worksheetImpl.formatting == null) { + throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `Worksheet formatting information is not available`); + } + return this._worksheetImpl.formatting; + } + /** + * Helper method which goes through and registers each event type this impl knows about + * with the NotificationService. It returns an array of SingleEventManager objects which + * can then be passed to an EventListenerManager to handle user registration / unregistration. + * + * @param {Worksheet} worksheet The worksheet object which will be included with the event notifications + * @returns {Array} Collection of event managers to pass to an EventListenerManager + */ + initializeEvents() { + const results = new Array(); + let notificationService; + try { + notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + } + catch (e) { + // If we don't have this service registered, just return + return results; + } + // Initialize all of the event managers we'll need (one for each event type) + const marksEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.MarkSelectionChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SelectedMarksChanged, (model) => { + const visualId = model; + return this.visualIdsAreEqual(visualId, this._worksheetImpl.visualId); + }, () => marksEvent.triggerEvent(() => new MarksSelectedEvent_1.MarksSelectedEvent(this))); + const filterEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.FilterChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.FilterChanged, (model) => { + const filterEventResponse = model; + return this._worksheetImpl.visualId.worksheet === filterEventResponse.visualId.worksheet; + }, (event) => { + filterEvent.triggerEvent(() => new FilterChangedEvent_1.FilterChangedEvent(this, event.fieldName, event.fieldId)); + }); + const summaryDataEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.SummaryDataChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SummaryDataChanged, (model) => { + const summaryDataEventResponse = model; + return this._worksheetImpl.visualId.worksheet === summaryDataEventResponse.visualId.worksheet; + }, (event) => { + summaryDataEvent.triggerEvent(() => new SummaryDataChangedEvent_1.SummaryDataChangedEvent(this)); + }); + const worksheetFormattingChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.WorksheetFormattingChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorksheetFormattingChanged, (model) => { + const worksheetFormattingChangedEvent = model; + return this._worksheetImpl.visualId.worksheet === worksheetFormattingChangedEvent.visualId.worksheet; + }, (eventFormatting) => { + worksheetFormattingChangedEvent.triggerEvent(() => new WorksheetFormattingChangedEvent_1.WorksheetFormattingChangedEvent(this, eventFormatting)); + }); + results.push(marksEvent); + results.push(filterEvent); + results.push(summaryDataEvent); + results.push(worksheetFormattingChangedEvent); + return results; + } + applyFilterAsync(fieldName, values, updateType, options) { + return this._worksheetImpl.applyFilterAsync(fieldName, values, updateType, options); + } + applyRangeFilterAsync(fieldName, filterOptions) { + return this._worksheetImpl.applyRangeFilterAsync(fieldName, filterOptions); + } + applyHierarchicalFilterAsync(fieldName, values, updateType, options) { + return this._worksheetImpl.applyHierarchicalFilterAsync(fieldName, values, updateType, options); + } + applyRelativeDateFilterAsync(fieldName, options) { + return this._worksheetImpl.applyRelativeDateFilterAsync(fieldName, options); + } + clearFilterAsync(fieldName) { + return this._worksheetImpl.clearFilterAsync(fieldName); + } + getDataSourcesAsync() { + return this._worksheetImpl.getDataSourcesAsync(); + } + getFiltersAsync() { + return this._worksheetImpl.getFiltersAsync(); + } + getSelectedMarksAsync() { + return this._worksheetImpl.getSelectedMarksAsync(); + } + getHighlightedMarksAsync() { + return this._worksheetImpl.getHighlightedMarksAsync(); + } + getSummaryDataAsync(options) { + return this._worksheetImpl.getSummaryDataAsync(options); + } + getSummaryDataReaderAsync(pageRowCount, options) { + return this._worksheetImpl.getSummaryDataReaderAsync(pageRowCount, options); + } + getSummaryColumnsInfoAsync() { + return this._worksheetImpl.getSummaryColumnsInfoAsync(); + } + getUnderlyingDataAsync(options) { + console.warn('Worksheet.getUnderlyingDataAsync is deprecated. Please use ' + + 'Worksheet.getUnderlyingTablesAsync and Worksheet.getUnderlyingTableDataAsync'); + return this._worksheetImpl.getUnderlyingDataAsync(options); + } + getUnderlyingTablesAsync() { + return this._worksheetImpl.getUnderlyingTablesAsync(); + } + getUnderlyingTableDataAsync(logicalTableId, options) { + return this._worksheetImpl.getUnderlyingTableDataAsync(logicalTableId, options); + } + getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options) { + return this._worksheetImpl.getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options); + } + getVisualSpecificationAsync() { + return this._worksheetImpl.getVisualSpecificationAsync(); + } + addMarksCardFieldsAsync(marksCardIndex, encodingType, columns, startIndex) { + return this._worksheetImpl.addMarksCardFieldsAsync(marksCardIndex, encodingType, columns, startIndex); + } + moveMarksCardFieldAsync(marksCardIndex, fromIndex, toIndex, fieldCount = 1) { + return this._worksheetImpl.moveMarksCardFieldAsync(marksCardIndex, fromIndex, toIndex, fieldCount); + } + spliceMarksCardFieldsAsync(marksCardIndex, encodingType, startIndex, deleteCount, columns) { + return this._worksheetImpl.spliceMarksCardFieldsAsync(marksCardIndex, encodingType, startIndex, deleteCount, columns); + } + clearSelectedMarksAsync() { + return this._worksheetImpl.clearSelectedMarksAsync(); + } + selectMarksByIDAsync(marksInfo, updateType) { + return this._worksheetImpl.selectMarksByIdAsync(marksInfo, updateType); + } + selectMarksByValueAsync(selections, selectionUpdateType) { + return this._worksheetImpl.selectMarksByValueAsync(selections, selectionUpdateType); + } + selectMarksByIdAsync(selections, selectionUpdateType) { + return this._worksheetImpl.selectMarksByIdAsync(selections, selectionUpdateType); + } + annotateMarkAsync(mark, annotationText) { + return this._worksheetImpl.annotateMarkAsync(mark, annotationText); + } + getAnnotationsAsync() { + return this._worksheetImpl.getAnnotationsAsync(); + } + removeAnnotationAsync(annotation) { + return this._worksheetImpl.removeAnnotationAsync(annotation); + } + hoverTupleAsync(hoveredTuple, tooltip, allowHoverActions = true) { + return this._worksheetImpl.hoverTupleAsync(hoveredTuple, tooltip, allowHoverActions); + } + selectTuplesAsync(selectedTuples, selectOption, tooltip) { + return this._worksheetImpl.selectTuplesAsync(selectedTuples, selectOption, tooltip); + } + getTooltipTextAsync(tupleId) { + return this._worksheetImpl.getTooltipTextAsync(tupleId); + } + leaveMarkNavigationAsync() { + return this._worksheetImpl.leaveMarkNavigationAsync(); + } + editAliasesDialogAsync(fieldName) { + return this._worksheetImpl.editAliasesDialogAsync(fieldName); + } + visualIdsAreEqual(a, b) { + return (a && + b && + a.worksheet === b.worksheet && + a.dashboard === b.dashboard && + a.storyboard === b.storyboard && + a.storyPointID === b.storyPointID); + } +} +exports.Worksheet = Worksheet; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/DashboardContent.js": +/*!**************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/DashboardContent.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the external DashboardContent namespace. + * This does not follow the Impl pattern as DashboardContent is + * currently just a (single) property bag. + */ +class DashboardContent { + constructor(_dashboard) { + this._dashboard = _dashboard; + } + get dashboard() { + return this._dashboard; + } +} +exports.DashboardContent = DashboardContent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/Environment.js": +/*!*********************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/Environment.js ***! + \*********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const ConnectedServer_1 = __webpack_require__(/*! ../Impl/ConnectedServer */ "./lib/src/ExtensionsApi/Impl/ConnectedServer.js"); +const WorkbookFormattingEnvUtil_1 = __webpack_require__(/*! ./WorkbookFormattingEnvUtil */ "./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js"); +/** + * Implementation of the external environment namespace. + * Environment does not follow the Impl pattern as it is + * just a property bag. + * First class extensions can get to ConnectedServer with: environment['connectedServer'] + */ +class Environment { + constructor(extensionEnvironment) { + this._apiVersion = api_shared_js_1.ApiVersion.Instance && api_shared_js_1.ApiVersion.Instance.formattedValue; // maj.min.fix (no build) + this._context = api_shared_js_1.InternalToExternalEnumMappings.extensionContext.convert(extensionEnvironment.extensionContext); + this._formatting = WorkbookFormattingEnvUtil_1.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(extensionEnvironment.workbookFormatting); + this._language = extensionEnvironment.extensionLanguage; + this._country = extensionEnvironment.extensionCountry; + this._locale = extensionEnvironment.extensionLocale; + this._mode = api_shared_js_1.InternalToExternalEnumMappings.extensionMode.convert(extensionEnvironment.extensionMode); + this._operatingSystem = extensionEnvironment.operatingSystem; + this._tableauVersion = extensionEnvironment.tableauVersion; + this._uniqueUserId = extensionEnvironment.uniqueUserId; + // If we have a userId, then we are a first class extension + if (extensionEnvironment.userId) { + this.connectedServer = new ConnectedServer_1.ConnectedServer(extensionEnvironment.userId, extensionEnvironment.siteId, extensionEnvironment.siteNamespace, extensionEnvironment.workbookId); + this.featureFlags = extensionEnvironment.featureFlags; + } + } + get apiVersion() { + return this._apiVersion; + } + get context() { + return this._context; + } + get workbookFormatting() { + return this._formatting; + } + get language() { + return this._language; + } + get country() { + return this._country; + } + get locale() { + return this._locale; + } + get mode() { + return this._mode; + } + get operatingSystem() { + return this._operatingSystem; + } + get tableauVersion() { + return this._tableauVersion; + } + get uniqueUserId() { + return this._uniqueUserId; + } +} +exports.Environment = Environment; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/Extensions.js": +/*!********************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/Extensions.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the external Extensions namespace. + */ +class Extensions { + constructor(extensionImpl) { + this.extensionImpl = extensionImpl; + this.extensionImpl = extensionImpl; + } + get dashboardContent() { + return this.extensionImpl.dashboardContent; + } + get worksheetContent() { + return this.extensionImpl.worksheetContent; + } + get environment() { + return this.extensionImpl.environment; + } + get settings() { + return this.extensionImpl.settings; + } + get ui() { + return this.extensionImpl.ui; + } + get workbook() { + return this.extensionImpl.workbook; + } + get dashboardObjectId() { + return this.extensionImpl.extensionZoneId; + } + initializeAsync(contextMenuCallbacks) { + return this.extensionImpl.initializeAsync(false, contextMenuCallbacks).then(); + } + initializeDialogAsync() { + return this.extensionImpl.initializeAsync(true); + } + createVizImageAsync(inputSpec) { + return this.extensionImpl.createVizImageAsync(inputSpec); + } + setClickThroughAsync(clickThroughEnabled) { + return this.extensionImpl.setClickThroughAsync(clickThroughEnabled); + } +} +exports.Extensions = Extensions; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/Settings.js": +/*!******************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/Settings.js ***! + \******************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +/** + * Implementation of the external settings namespace. + */ +class Settings extends api_shared_js_1.EventListenerManager { + constructor(_settingsImpl) { + super(); + this._settingsImpl = _settingsImpl; + // Initialize our event handling for this class + this._settingsImpl.initializeEvents().forEach((e) => this.addNewEventType(e)); + } + erase(key) { + this._settingsImpl.erase(key); + } + get(key) { + return this._settingsImpl.get(key); + } + getAll() { + return this._settingsImpl.getAll(); + } + get isModified() { + return this._settingsImpl.isModified; + } + saveAsync() { + return this._settingsImpl.saveAsync(); + } + set(key, value) { + this._settingsImpl.set(key, value); + } +} +exports.Settings = Settings; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/UI.js": +/*!************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/UI.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +/** + * Implementation of the external UI namespace. + */ +class UI extends api_shared_js_1.EventListenerManager { + constructor(_impl) { + super(); + this._impl = _impl; + // Initialize our event handling for this class + this._impl.initializeEvents().forEach((e) => this.addNewEventType(e)); + } + displayDialogAsync(url, payload, options) { + return this._impl.displayDialogAsync(url, payload, options); + } + sendDialogMessageAsync(message, targetDialogUrl) { + return this._impl.sendDialogMessageAsync(message, targetDialogUrl); + } + closeDialog(payload) { + this._impl.closeDialog(payload); + } +} +exports.UI = UI; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js": +/*!***********************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js ***! + \***********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +class WorkbookFormattingEnvUtil { + static convertToWorkbookFormatting(workbookFormattingModel) { + if (!workbookFormattingModel) { + return undefined; + } + else { + const formattingMap = workbookFormattingModel.formattingSheets.map((currentFormattingSheet) => { + const formattingSheet = { + classNameKey: api_shared_js_1.InternalToExternalEnumMappings.classNameKey.convert(currentFormattingSheet.classNameKey), + cssProperties: getCssProperties(currentFormattingSheet.classNameKey, currentFormattingSheet.cssProperties), + }; + return formattingSheet; + }); + const result = { + formattingSheets: formattingMap, + }; + return result; + } + } +} +exports.WorkbookFormattingEnvUtil = WorkbookFormattingEnvUtil; +function getCssProperties(classNameKey, cssProperties) { + if (classNameKey === "tableau-row-dividers" /* RowDividers */ || classNameKey === "tableau-column-dividers" /* ColumnDividers */) { + return { + borderColor: cssProperties.borderColor, + borderStyle: cssProperties.borderStyle, + borderWidth: cssProperties.borderWidth, + }; + } + return { + fontFamily: cssProperties.fontFamily, + fontSize: cssProperties.fontSize, + fontWeight: cssProperties.fontWeight, + fontStyle: cssProperties.fontStyle, + textDecoration: cssProperties.textDecoration, + color: cssProperties.color, + }; +} + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js": +/*!**************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the external WorksheetContent namespace. + * This does not follow the Impl pattern as WorksheetContent is + * currently just a (single) property bag. + */ +class WorksheetContent { + constructor(_worksheet) { + this._worksheet = _worksheet; + } + get worksheet() { + return this._worksheet; + } +} +exports.WorksheetContent = WorksheetContent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js": +/*!**************************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js ***! + \**************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +class InitializationServiceImpl extends api_shared_js_1.ServiceImplBase { + get serviceName() { + return "InitializationService" /* InitializationService */; + } + initializeDashboardExtensionsAsync(isExtensionDialog, contextMenuIds) { + const params = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'initializeDashboardExtensionsAsync', + [api_internal_contract_js_1.ParameterId.ExtensionContextMenuIds]: contextMenuIds, + [api_internal_contract_js_1.ParameterId.IsExtensionDialog]: isExtensionDialog, + }; + return this.execute(api_internal_contract_js_1.VerbId.InitializeExtension, params).then((response) => { + // TODO - Validate return value + const result = response.result; + return result; + }); + } +} +exports.InitializationServiceImpl = InitializationServiceImpl; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js": +/*!********************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +class SettingsServiceImpl extends api_shared_js_1.ServiceImplBase { + get serviceName() { + return "SettingsService" /* SettingsService */; + } + saveSettingsAsync(settings) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'saveSettingsAsync', + [api_internal_contract_js_1.ParameterId.SettingsValues]: settings, + }; + return this.execute(api_internal_contract_js_1.VerbId.SaveExtensionSettings, parameters).then((value) => { + const result = value.result; + if (!result || !result.settingsValues) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Unexpected error savings settings.'); + } + return result.settingsValues; + }); + } +} +exports.SettingsServiceImpl = SettingsServiceImpl; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js": +/*!**************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const DEFAULT_DIALOG_HEIGHT = 400; // in pixels +const DEFAULT_DIALOG_WIDTH = 600; // in pixels +const DEFAULT_DIALOG_STYLE = api_external_contract_js_1.DialogStyle.Window; +class UIServiceImpl extends api_shared_js_1.ServiceImplBase { + get serviceName() { + return "UIService" /* UIService */; + } + displayDialogAsync(url, payload, options) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'displayDialogAsync', + [api_internal_contract_js_1.ParameterId.ExtensionDialogUrl]: url, + [api_internal_contract_js_1.ParameterId.ExtensionDialogPayload]: payload, + }; + const h = options && options.height ? options.height : DEFAULT_DIALOG_HEIGHT; + const w = options && options.width ? options.width : DEFAULT_DIALOG_WIDTH; + const dialogStyle = options && options.dialogStyle ? options.dialogStyle : DEFAULT_DIALOG_STYLE; + // On the platform side, we do something reasonable regardess of whether the passed + // height and width are too large or too small. But this likely indicates a developer error, + // so we throw an error here to help with debugging. + if (h <= 0 || w <= 0) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'Size parameters for displayDialogAsync must be positive'); + } + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogH] = h; + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogW] = w; + api_shared_js_1.ErrorHelpers.verifyEnumValue(dialogStyle, api_external_contract_js_1.DialogStyle, 'DialogStyle'); + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogStyle] = api_shared_js_1.ExternalToInternalEnumMappings.dialogStyles.convert(dialogStyle); + return this.execute(api_internal_contract_js_1.VerbId.DisplayDialog, parameters).then((response) => { + const dialogResult = response.result; + switch (dialogResult) { + case api_internal_contract_js_1.ExtensionDialogResult.DialogAlreadyOpen: + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.DialogAlreadyOpen, 'There already exists an open dialog for this extension.'); + case api_internal_contract_js_1.ExtensionDialogResult.InvalidDomain: + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidDomainDialog, 'The url of an extension dialog must match the domain of the parent extension.'); + default: + // Success case + return; + } + }); + } + closeDialog(payload) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'closeDialog', + }; + if (payload) { + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogPayload] = payload; + } + return this.execute(api_internal_contract_js_1.VerbId.CloseDialog, parameters).then(() => { + return; + }); + } + sendDialogMessageAsync(message, targetDialogUrl) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'sendDialogMessage', + [api_internal_contract_js_1.ParameterId.ExtensionDialogMessage]: message, + }; + if (targetDialogUrl) { + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogUrl] = targetDialogUrl; + } + return this.execute(api_internal_contract_js_1.VerbId.SendDialogMessage, parameters).then(() => { + return; + }); + } + setClickThroughAsync(clickThroughEnabled, extensionZoneId) { + api_shared_js_1.ErrorHelpers.verifyParameterType(clickThroughEnabled, 'boolean', 'clickThroughEnabled'); + if (extensionZoneId === undefined || extensionZoneId <= 0) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Extension Id is invalid.'); + } + const parameters = { + [api_internal_contract_js_1.ParameterId.ExtensionZoneId]: extensionZoneId, + [api_internal_contract_js_1.ParameterId.ClickThroughEnabled]: clickThroughEnabled, + }; + return this.execute(api_internal_contract_js_1.VerbId.SetClickThrough, parameters).then(() => { + return; + }); + } +} +exports.UIServiceImpl = UIServiceImpl; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js": +/*!*************************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const InitializationServiceImpl_1 = __webpack_require__(/*! ./Impl/InitializationServiceImpl */ "./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js"); +const SettingsServiceImpl_1 = __webpack_require__(/*! ./Impl/SettingsServiceImpl */ "./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js"); +const UIServiceImpl_1 = __webpack_require__(/*! ./Impl/UIServiceImpl */ "./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ./ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +function registerAllExtensionsServices(dispatcher) { + api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).registerService(new SettingsServiceImpl_1.SettingsServiceImpl(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId)); + api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).registerService(new UIServiceImpl_1.UIServiceImpl(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId)); +} +exports.registerAllExtensionsServices = registerAllExtensionsServices; +function registerInitializationExtensionsServices(dispatcher) { + api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).registerService(new InitializationServiceImpl_1.InitializationServiceImpl(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId)); +} +exports.registerInitializationExtensionsServices = registerInitializationExtensionsServices; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js": +/*!***************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ExtensionsRegistryId = 0; + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/EmbeddingApiExternalContract.js": +/*!***************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/EmbeddingApiExternalContract.js ***! + \***************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +// This file re-exports everything which is part of the extensions api public interface +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +__export(__webpack_require__(/*! ./ExternalContract/Embedding/AskDataInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/AskDataInterfaces.js")); +var Enums_1 = __webpack_require__(/*! ./ExternalContract/Embedding/Enums */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js"); +exports.ApiMenuType = Enums_1.ApiMenuType; +exports.CrosstabFileFormat = Enums_1.CrosstabFileFormat; +exports.DeviceType = Enums_1.DeviceType; +exports.EmbeddingErrorCodes = Enums_1.EmbeddingErrorCodes; +exports.EmbeddingTableauEventType = Enums_1.TableauEventType; +exports.FileFormats = Enums_1.FileFormats; +exports.PrintOrientation = Enums_1.PrintOrientation; +exports.PrintPageSize = Enums_1.PrintPageSize; +exports.PrintScaling = Enums_1.PrintScaling; +exports.PulseErrorMessageVisibility = Enums_1.PulseErrorMessageVisibility; +exports.PulseLayout = Enums_1.PulseLayout; +exports.PulseTimeDimension = Enums_1.PulseTimeDimension; +exports.SheetSizeBehavior = Enums_1.SheetSizeBehavior; +exports.TableauDialogType = Enums_1.TableauDialogType; +exports.Toolbar = Enums_1.Toolbar; +__export(__webpack_require__(/*! ./ExternalContract/Embedding/PulseInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/PulseInterfaces.js")); +__export(__webpack_require__(/*! ./ExternalContract/Embedding/VizInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js")); +__export(__webpack_require__(/*! ./ExternalContract/Embedding/WebComponentInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/WebComponentInterfaces.js")); +__export(__webpack_require__(/*! ./SharedApiExternalContract */ "../api-external-contract-js/lib/src/SharedApiExternalContract.js")); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js": +/*!****************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js ***! + \****************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +// This file re-exports everything which is part of the extensions api public interface +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Tableau_1 = __webpack_require__(/*! ./ExternalContract/Extensions/Namespaces/Tableau */ "../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js"); +exports.ErrorCodes = Tableau_1.ErrorCodes; +exports.ExtensionContext = Tableau_1.ExtensionContext; +exports.ExtensionMode = Tableau_1.ExtensionMode; +exports.TableauEventType = Tableau_1.TableauEventType; +exports.VizImageEncodingType = Tableau_1.VizImageEncodingType; +exports.VizImagePaletteType = Tableau_1.VizImagePaletteType; +exports.VizImageSizeSettingAlignmentType = Tableau_1.VizImageSizeSettingAlignmentType; +exports.VizImageSizeSettingType = Tableau_1.VizImageSizeSettingType; +exports.VizImageSortDirectionType = Tableau_1.VizImageSortDirectionType; +__export(__webpack_require__(/*! ./SharedApiExternalContract */ "../api-external-contract-js/lib/src/SharedApiExternalContract.js")); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract.js": +/*!***************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +/** + * This is your main. This is where you re-export everything you want to be publicly available. + * + * The build enforces that the file has the same name as the global variable that is exported. + */ +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +__export(__webpack_require__(/*! ./EmbeddingApiExternalContract */ "../api-external-contract-js/lib/src/EmbeddingApiExternalContract.js")); +__export(__webpack_require__(/*! ./ExtensionsApiExternalContract */ "../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js")); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/AskDataInterfaces.js": +/*!*******************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/AskDataInterfaces.js ***! + \*******************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * The names of the string constants you can use as HTML attributes for the web component. + * @ignore + * @deprecated + */ +var AskDataAttributes; +(function (AskDataAttributes) { + AskDataAttributes["Origin"] = "origin"; + AskDataAttributes["ShowEmbed"] = "show-embed"; + AskDataAttributes["ShowPin"] = "show-pin"; + AskDataAttributes["ShowSave"] = "show-save"; + AskDataAttributes["ShowShare"] = "show-share"; +})(AskDataAttributes = exports.AskDataAttributes || (exports.AskDataAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js": +/*!*******************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js ***! + \*******************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +// All enum values made available to Embedding developers. +// Enums should be kept in alphabetical order. +// Most of them should match an enum on the server defined at +// workgroup/vqlweb/scriptsharp/src/ApiShared/PublicEnums.cs#L398:17 +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Crosstab file formats available to use with {@link Viz.exportCrosstabAsync} + */ +var CrosstabFileFormat; +(function (CrosstabFileFormat) { + CrosstabFileFormat["CSV"] = "csv"; + CrosstabFileFormat["Excel"] = "xlsx"; +})(CrosstabFileFormat = exports.CrosstabFileFormat || (exports.CrosstabFileFormat = {})); +/** + * Device types available to use with {@link Viz.device} + */ +var DeviceType; +(function (DeviceType) { + DeviceType["Default"] = "default"; + DeviceType["Desktop"] = "desktop"; + DeviceType["Tablet"] = "tablet"; + DeviceType["Phone"] = "phone"; +})(DeviceType = exports.DeviceType || (exports.DeviceType = {})); +/** + * All error codes used by the Embedding API. + */ +var EmbeddingErrorCodes; +(function (EmbeddingErrorCodes) { + /** + * Raised when a request to the auth endpoint fails. + */ + EmbeddingErrorCodes["AuthFailed"] = "auth-failed"; + /** + * The browser is not capable of supporting the Tableau Embedding API + */ + EmbeddingErrorCodes["BrowserNotCapable"] = "browser-not-capable"; + /** + * The permissions on a workbook or a view do not allow downloading the workbook. + */ + EmbeddingErrorCodes["DownloadWorkbookNotAllowed"] = "download-workbook-not-allowed"; + /** + * Thrown when an error occurs while attempting to perform a filter operation. + */ + EmbeddingErrorCodes["FilterCannotBePerformed"] = "filter-cannot-be-performed"; + /** + * Thrown when attempting to switch to a sheet by index that does not exist in the workbook. + */ + EmbeddingErrorCodes["IndexOutOfRange"] = "index-out-of-range"; + /** + * Thrown when an error occurs within the Tableau Embedding API. Contact Tableau Support. + */ + EmbeddingErrorCodes["InternalError"] = "internal-error"; + /** + * An operation was attempted on a custom view that does not exist. + */ + EmbeddingErrorCodes["InvalidCustomViewName"] = "invalid-custom-view-name"; + /** + * An invalid date was specified in a method that required a date parameter. + */ + EmbeddingErrorCodes["InvalidDateParameter"] = "invalid-date-parameter"; + /** + * Either a filter operation was attempted on a field that does not exist in the data source, or the value supplied + * in the filter operation is the wrong data type or format. + */ + EmbeddingErrorCodes["invalidFilterFieldNameOrValue"] = "invalid-filter-field-name"; + /** + * A parameter is not the correct data type or format. The name of the parameter is specified in the Error.message + * field. + */ + EmbeddingErrorCodes["InvalidParameter"] = "invalid-parameter"; + /** + * The currently applied time dimension could not be determined or is invalid. + */ + EmbeddingErrorCodes["InvalidTimeDimension"] = "invalid-time-dimension"; + /** + * A negative size was specified or the maxSize value is less than minSize in Sheet.changeSizeAsync(). + */ + EmbeddingErrorCodes["InvalidSize"] = "invalid-size"; + /** + * Attempted to get an authoring worksheet when the current sheet is not a worksheet. + * @ignore + */ + EmbeddingErrorCodes["InvalidSheetType"] = "invalid-sheet-type"; + /** + * A behavior value was found that is not included in the SheetSizeBehavior enum. + */ + EmbeddingErrorCodes["InvalidSizeBehavior"] = "invalid-size-behavior"; + /** + * A behavior other than SheetSizeBehavior.Automatic was specified in Sheet.changeSizeAsync() when the sheet is a + * Worksheet instance. + */ + EmbeddingErrorCodes["InvalidSizeBehaviorOnWorksheet"] = "invalid-size-behavior-on-worksheet"; + /** + * The URL specified in the Viz class constructor is not valid. + */ + EmbeddingErrorCodes["InvalidUrl"] = "invalid-url"; + /** + * The maxSize field is missing in Sheet.changeSizeAsync() when specifying SheetSizeBehavior.AtMost. + */ + EmbeddingErrorCodes["MissingMaxSize"] = "missing-max-size"; + /** + * The minSize field is missing in Sheet.changeSizeAsync() when specifying SheetSizeBehavior.AtLeast. + */ + EmbeddingErrorCodes["MissingMinSize"] = "missing-min-size"; + /** + * The minSize or maxSize field is missing in Sheet.changeSizeAsync() when specifying SheetSizeBehavior.Range. + */ + EmbeddingErrorCodes["MissingMinMaxSize"] = "missing-min-max-size"; + /** + * Can occur if the embedding app interacts with a parameter that has been removed from the worksheet. + */ + EmbeddingErrorCodes["MissingParameter"] = "missing-parameter"; + /** + * The rangeN field is missing for a relative date filter of type LASTN or NEXTN. + */ + EmbeddingErrorCodes["MissingRangeNForRelativeDateFilters"] = "missing-range-n-for-relative-date-filters"; + /** + * An attempt was made to access Sheet.getUrl() on a hidden sheet. Hidden sheets do not have URLs. + */ + EmbeddingErrorCodes["NoUrlForHiddenWorksheet"] = "no-url-for-hidden-worksheet"; + /** + * One or both of the parentElement or the URL parameters is not specified in the Viz constructor. + */ + EmbeddingErrorCodes["NoUrlOrParentElementNotFound"] = "no-url-or-parent-element-not-found"; + /** + * An operation was attempted on a sheet that is not active or embedded within the active dashboard. + */ + EmbeddingErrorCodes["NotActiveSheet"] = "not-active-sheet"; + /** + * A required parameter was not specified, null, or an empty string/array. + */ + EmbeddingErrorCodes["NullOrEmptyParameter"] = "null-or-empty-parameter"; + /** + * An operation was attempted on a sheet that does not exist in the workbook. + */ + EmbeddingErrorCodes["SheetNotInWorkbook"] = "sheet-not-in-workbook"; + /** + * An operation is performed on a CustomView object that is no longer valid (it has been removed). + */ + EmbeddingErrorCodes["StaleDataReference"] = "stale-data-reference"; + /** + * Unknown error triggered during the auth flow. + */ + EmbeddingErrorCodes["UnknownAuthError"] = "unknown-auth-error"; + /** + * An unknown event name was specified in the call to Viz.addEventListener or Viz.removeEventListener. + */ + EmbeddingErrorCodes["UnsupportedEventName"] = "unsupported-event-name"; + /** + * A Viz object has already been created as a child of the parentElement specified in the Viz constructor. + */ + EmbeddingErrorCodes["VizAlreadyInManager"] = "viz-already-in-manager"; + /** + * Function is not supported in the embedding api. + */ + EmbeddingErrorCodes["ImplementationError"] = "wrong-implementation"; + /** + * @NotImplemented + */ + EmbeddingErrorCodes["NotImplemented"] = "not-implemented"; + /** + * Unknown error during event initialization + */ + EmbeddingErrorCodes["EventInitializationError"] = "event-initialization-error"; + /** + * Version of the embedding api not supported by the version of tableau + */ + EmbeddingErrorCodes["IncompatibleVersionError"] = "incompatible-version-error"; + /** + * Unknown {@link TableauDialogType} passed in to Viz.displayDialogAsync. + */ + EmbeddingErrorCodes["UnknownDialogType"] = "unknown-dialog-type"; + /** + * Can occur if the API interacts with a filter that has been removed from the worksheet. + * Can also occurs if a {@link FilterType} has not been implemented. + */ + EmbeddingErrorCodes["FilterMissingOrNotImplemented"] = "filter-missing-not-implemented"; + /** + * Can occur if story point ids no longer match. + */ + EmbeddingErrorCodes["StoryPointIdMismatch"] = "storypoint-id-mismatch"; +})(EmbeddingErrorCodes = exports.EmbeddingErrorCodes || (exports.EmbeddingErrorCodes = {})); +/** + * Formats available to use with displayStaticImage in @VizInterfaces + */ +var FileFormats; +(function (FileFormats) { + FileFormats["PDF"] = "pdf"; + FileFormats["PNG"] = "png"; +})(FileFormats = exports.FileFormats || (exports.FileFormats = {})); +var PrintOrientation; +(function (PrintOrientation) { + PrintOrientation["Portrait"] = "portrait"; + PrintOrientation["Landscape"] = "landscape"; +})(PrintOrientation = exports.PrintOrientation || (exports.PrintOrientation = {})); +var PrintPageSize; +(function (PrintPageSize) { + PrintPageSize["Letter"] = "letter"; + PrintPageSize["Legal"] = "legal"; + PrintPageSize["Note"] = "note"; + PrintPageSize["Folio"] = "folio"; + PrintPageSize["Tabloid"] = "tabloid"; + PrintPageSize["Ledger"] = "ledger"; + PrintPageSize["Statement"] = "statement"; + PrintPageSize["Executive"] = "executive"; + PrintPageSize["A3"] = "A3"; + PrintPageSize["A4"] = "A4"; + PrintPageSize["A5"] = "A5"; + PrintPageSize["B4"] = "B4"; + PrintPageSize["B5"] = "B5"; + PrintPageSize["Quarto"] = "quarto"; + PrintPageSize["Unspecified"] = "unspecified"; +})(PrintPageSize = exports.PrintPageSize || (exports.PrintPageSize = {})); +var PrintScaling; +(function (PrintScaling) { + PrintScaling["Automatic"] = "automatic"; + PrintScaling["Perc25"] = "25%"; + PrintScaling["Perc50"] = "50%"; + PrintScaling["Perc60"] = "60%"; + PrintScaling["Perc75"] = "75%"; + PrintScaling["Perc80"] = "80%"; + PrintScaling["Perc90"] = "90%"; + PrintScaling["Perc100"] = "100%"; + PrintScaling["Perc200"] = "200%"; + PrintScaling["Perc400"] = "400%"; + PrintScaling["AtMost1PageHigh"] = "at-most-1-page-high"; + PrintScaling["AtMost2PagesHigh"] = "at-most-2-pages-high"; + PrintScaling["AtMost1PageWide"] = "at-most-1-page-wide"; + PrintScaling["AtMost2PagesWide"] = "at-most-2-pages-wide"; +})(PrintScaling = exports.PrintScaling || (exports.PrintScaling = {})); +var RevertVizSelection; +(function (RevertVizSelection) { + RevertVizSelection["All"] = "all"; + RevertVizSelection["Axes"] = "axes"; + RevertVizSelection["Filters"] = "filters"; + RevertVizSelection["Sorts"] = "sorts"; + RevertVizSelection["Shelves"] = "shelves"; +})(RevertVizSelection = exports.RevertVizSelection || (exports.RevertVizSelection = {})); +var ToolbarButtons; +(function (ToolbarButtons) { + ToolbarButtons["Alerts"] = "alerts"; + ToolbarButtons["AskData"] = "askData"; + ToolbarButtons["CustomViews"] = "customViews"; + ToolbarButtons["DataDetails"] = "dataDetails"; + ToolbarButtons["Share"] = "share"; + ToolbarButtons["Subscribe"] = "subscribe"; +})(ToolbarButtons = exports.ToolbarButtons || (exports.ToolbarButtons = {})); +var Toolbar; +(function (Toolbar) { + Toolbar["Top"] = "top"; + Toolbar["Bottom"] = "bottom"; + Toolbar["Hidden"] = "hidden"; +})(Toolbar = exports.Toolbar || (exports.Toolbar = {})); +var SheetSizeBehavior; +(function (SheetSizeBehavior) { + SheetSizeBehavior["Automatic"] = "automatic"; + SheetSizeBehavior["Exactly"] = "exactly"; + SheetSizeBehavior["Range"] = "range"; + SheetSizeBehavior["AtLeast"] = "atleast"; + SheetSizeBehavior["AtMost"] = "atmost"; +})(SheetSizeBehavior = exports.SheetSizeBehavior || (exports.SheetSizeBehavior = {})); +var PulseLayout; +(function (PulseLayout) { + PulseLayout["Default"] = "default"; + PulseLayout["Card"] = "card"; + PulseLayout["Ban"] = "ban"; +})(PulseLayout = exports.PulseLayout || (exports.PulseLayout = {})); +var PulseTimeDimension; +(function (PulseTimeDimension) { + PulseTimeDimension["Today"] = "Today"; + PulseTimeDimension["Yesterday"] = "Yesterday"; + PulseTimeDimension["WeekToDate"] = "WeekToDate"; + PulseTimeDimension["LastWeek"] = "LastWeek"; + PulseTimeDimension["MonthToDate"] = "MonthToDate"; + PulseTimeDimension["LastMonth"] = "LastMonth"; + PulseTimeDimension["QuarterToDate"] = "QuarterToDate"; + PulseTimeDimension["LastQuarter"] = "LastQuarter"; + PulseTimeDimension["YearToDate"] = "YearToDate"; + PulseTimeDimension["LastYear"] = "LastYear"; +})(PulseTimeDimension = exports.PulseTimeDimension || (exports.PulseTimeDimension = {})); +var PulseErrorMessageVisibility; +(function (PulseErrorMessageVisibility) { + PulseErrorMessageVisibility["Visible"] = "visible"; + PulseErrorMessageVisibility["Hidden"] = "hidden"; + PulseErrorMessageVisibility["Suppressed"] = "suppressed"; +})(PulseErrorMessageVisibility = exports.PulseErrorMessageVisibility || (exports.PulseErrorMessageVisibility = {})); +/** + * Be careful when adding new event types. Extensions and embedding follow two different patterns on how events are named. + * Events should be all lower case and without hyphens or underscores. + */ +/** + * Represents the type of tableau embedding event that can be listened for. + */ +var TableauEventType; +(function (TableauEventType) { + /** + * Raised when a custom view has finished loading. This event is raised after the callback function for {@link FirstInteractive} (if any) has been called. + * + * @category Viewing + */ + TableauEventType["CustomViewLoaded"] = "customviewloaded"; + /** + * Raised when a custom view has been removed. + * + * @category Viewing + */ + TableauEventType["CustomViewRemoved"] = "customviewremoved"; + /** + * Raised when a custom view has been saved (newly created or updated). + * + * @category Viewing + */ + TableauEventType["CustomViewSaved"] = "customviewsaved"; + /** + * Raised when a custom view has been set as the default view for a workbook. + * + * @category Viewing + */ + TableauEventType["CustomViewSetDefault"] = "customviewsetdefault"; + /** Raised when the user clicks on the Edit Button. + * + * @category Viewing + */ + TableauEventType["EditButtonClicked"] = "editbuttonclicked"; + /** Raised when the user clicks on the Edit In Desktop Button. + * + * @category Authoring, Viewing + */ + TableauEventType["EditInDesktopButtonClicked"] = "editindesktopbuttonclicked"; + /** Raised when any filter has changed state. You can use this event type with TableauViz objects. + * + * @category Viewing + */ + TableauEventType["FilterChanged"] = "filterchanged"; + /** Fired when viz size is known + * + * @category Authoring, Viewing + */ + TableauEventType["FirstVizSizeKnown"] = "firstvizsizeknown"; + /** Fired when a viz first becomes interactive + * + * @category Authoring, Viewing, Pulse + */ + TableauEventType["FirstInteractive"] = "firstinteractive"; + /** Raised when a custom mark context menu is clicked. + * + * @category Viewing + */ + TableauEventType["CustomMarkContextMenuEvent"] = "custommarkcontextmenu"; + /** The selected marks on a visualization have changed. You can use this event type with TableauViz objects. + * + * @category Viewing + */ + TableauEventType["MarkSelectionChanged"] = "markselectionchanged"; + /** A parameter has had its value modified. You can use this event type with [[Parameter]] objects. + * + * @category Viewing + */ + TableauEventType["ParameterChanged"] = "parameterchanged"; + /** Raised when a toolbar button or control becomes available or becomes unavailable. + * + * @category Viewing + */ + TableauEventType["ToolbarStateChanged"] = "toolbarstatechanged"; + /** Raised when the workbook is ready to close. This notification is sent when using embedded web authoring functionality. + * + * @category Authoring + */ + TableauEventType["WorkbookReadyToClose"] = "workbookreadytoclose"; + /** Raised when the workbook has been published. This notification is sent when using embedded web authoring functionality. + * + * @category Authoring + */ + TableauEventType["WorkbookPublished"] = "workbookpublished"; + /** Raised when "publish as" is successful. This notification is sent when using embedded web authoring functionality. + * + * @category Authoring + */ + TableauEventType["WorkbookPublishedAs"] = "workbookpublishedas"; + /** + * Raised when a URL action occurs. See the {@link UrlActionEvent} class. + * + * @category Viewing + */ + TableauEventType["UrlAction"] = "urlaction"; + /** + * Raised after a tab switch occurs (the active sheet has changed). Guarantees the viz object will be interactive after this. + * + * @category Viewing + */ + TableauEventType["TabSwitched"] = "tabswitched"; + /** + * + * Raised after a new story point becomes active. + * + * @category Viewing + */ + TableauEventType["StoryPointSwitched"] = "storypointswitched"; + /** + * + * Raised when an error occurs while loading the contents of the webcomponent. + * + * @category Authoring, Viewing, AskData + */ + TableauEventType["VizLoadError"] = "vizloaderror"; + /** + * Raised after the iframe src attribute has been updated + * + * @category Authoring, Viewing, AskData + */ + TableauEventType["IframeSrcUpdated"] = "iframesrcupdated"; + /** + * Raised when changes are made to summary data. + * + * @category Viewing + */ + TableauEventType["SummaryDataChanged"] = "summarydatachanged"; + /** + * Raised when tableau (viz-client) is ready to receive an auth token. + * Used for authentication in salesforce native mode. + * + * @hidden + * @category Authoring, Viewing, + */ + TableauEventType["ReadyToReceiveAuthToken"] = "readytoreceiveauthtoken"; + /** + * Fired when the Pulse metric size is known + * + * @category Pulse + */ + TableauEventType["FirstPulseMetricSizeKnown"] = "firstpulsemetricsizeknown"; + /** + * Fired when an internal Pulse error is encountered. + * + * @category Pulse + */ + TableauEventType["PulseError"] = "pulseerror"; + /** + * Fired when the Pulse filters change + * + * @category Pulse + */ + TableauEventType["PulseFiltersChanged"] = "pulsefilterschanged"; + /** + * Fired when a Pulse insight is discovered + * + * @category Pulse + */ + TableauEventType["PulseInsightDiscovered"] = "pulseinsightdiscovered"; + /** + * Fired when the Pulse metric size changes + * + * @category Pulse + */ + TableauEventType["PulseMetricSizeChanged"] = "pulsemetricsizechanged"; + /** + * Fired when the Pulse metric time dimension changes + * + * @category Pulse + */ + TableauEventType["PulseTimeDimensionChanged"] = "pulsetimedimensionchanged"; + /** + * Fired when the Pulse URL changes + * + * @category Pulse + */ + TableauEventType["PulseUrlChanged"] = "pulseurlchanged"; +})(TableauEventType = exports.TableauEventType || (exports.TableauEventType = {})); +/** + * Represents the location of a context menu where users can add external menu items. + */ +var ApiMenuType; +(function (ApiMenuType) { + /** External menu item will be injected in ubertip dialog */ + ApiMenuType["Ubertip"] = "ubertip"; +})(ApiMenuType = exports.ApiMenuType || (exports.ApiMenuType = {})); +/** You can use this type with a {@link Viz} object. */ +var TableauDialogType; +(function (TableauDialogType) { + /** + * Used to display the download PDF dialog. + */ + TableauDialogType["ExportPDF"] = "export-pdf"; + /** + * Used to display the download PowerPoint dialog. + */ + TableauDialogType["ExportPowerPoint"] = "export-powerpoint"; + /** + * Used to display the download Data dialog. + */ + TableauDialogType["ExportData"] = "export-data"; + /** + * Used to display the download CrossTab dialog. + */ + TableauDialogType["ExportCrossTab"] = "export-cross-tab"; + /** + * Used to display the download Workbook dialog. + */ + TableauDialogType["ExportWorkbook"] = "export-workbook"; + /** + * Used to display the Share dialog. + */ + TableauDialogType["Share"] = "share"; +})(TableauDialogType = exports.TableauDialogType || (exports.TableauDialogType = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/PulseInterfaces.js": +/*!*****************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/PulseInterfaces.js ***! + \*****************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * The names of the string constants you can use as HTML attributes for the web component. + * @ignore + */ +var PulseAttributes; +(function (PulseAttributes) { + PulseAttributes["DisableExploreFilter"] = "disable-explore-filter"; + PulseAttributes["Layout"] = "layout"; + PulseAttributes["OnFirstInteractive"] = "onFirstInteractive"; + PulseAttributes["OnFirstPulseMetricSizeKnown"] = "onFirstPulseMetricSizeKnown"; + PulseAttributes["OnPulseUrlError"] = "onPulseError"; + PulseAttributes["OnPulseFiltersChanged"] = "onPulseFiltersChanged"; + PulseAttributes["OnPulseInsightDiscovered"] = "onPulseInsightDiscovered"; + PulseAttributes["OnPulseMetricSizeChanged"] = "onPulseMetricSizeChanged"; + PulseAttributes["OnPulseTimeDimensionChanged"] = "onPulseTimeDimensionChanged"; + PulseAttributes["OnPulseUrlChanged"] = "onPulseUrlChanged"; + PulseAttributes["TimeDimension"] = "time-dimension"; + PulseAttributes["TokenOptional"] = "token-optional"; +})(PulseAttributes = exports.PulseAttributes || (exports.PulseAttributes = {})); +/** + * The names of the string constants you can use as child tags for TableauPulse custom element. + */ +var PulseChildElements; +(function (PulseChildElements) { + /** + * Custom styles applicable to the embedded iframe element itself (not inside it). + */ + PulseChildElements["IframeStyle"] = "iframe-style"; + /** + * A parameter to be used in the Pulse theme. + */ + PulseChildElements["ThemeParameter"] = "theme-parameter"; + /** + * Contains a list of filter parameters. + */ + PulseChildElements["PulseFilter"] = "pulse-filter"; +})(PulseChildElements = exports.PulseChildElements || (exports.PulseChildElements = {})); +/** + * The attributes of the child elements of . + */ +var PulseChildElementAttributes; +(function (PulseChildElementAttributes) { + PulseChildElementAttributes["Name"] = "name"; + PulseChildElementAttributes["Field"] = "field"; + PulseChildElementAttributes["Value"] = "value"; + PulseChildElementAttributes["Type"] = "type"; +})(PulseChildElementAttributes = exports.PulseChildElementAttributes || (exports.PulseChildElementAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js": +/*!***************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js ***! + \***************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * The shared string constants you can use as HTML attributes for the and web component. + * @ignore + */ +var VizSharedAttributes; +(function (VizSharedAttributes) { + VizSharedAttributes["TouchOptimize"] = "touch-optimize"; + VizSharedAttributes["HideEditInDesktopButton"] = "hide-edit-in-desktop-button"; + VizSharedAttributes["SuppressDefaultEditBehavior"] = "suppress-default-edit-behavior"; + VizSharedAttributes["DisableVersionCheck"] = "disable-version-check"; + VizSharedAttributes["OnEditInDesktopButtonClicked"] = "onEditInDesktopButtonClicked"; + VizSharedAttributes["OnFirstVizSizeKnown"] = "onFirstVizSizeKnown"; + VizSharedAttributes["OnFirstInteractive"] = "onFirstInteractive"; +})(VizSharedAttributes = exports.VizSharedAttributes || (exports.VizSharedAttributes = {})); +/** + * The names of the string constants you can use as HTML attributes for the web component. + * @ignore + */ +var VizAttributes; +(function (VizAttributes) { + VizAttributes["DisableUrlActionsPopups"] = "disable-url-actions"; + VizAttributes["HideTabs"] = "hide-tabs"; + VizAttributes["Toolbar"] = "toolbar"; + VizAttributes["InstanceIdToClone"] = "instance-id-to-clone"; + VizAttributes["Device"] = "device"; + VizAttributes["HideEditButton"] = "hide-edit-button"; + VizAttributes["OnEditButtonClicked"] = "onEditButtonClicked"; + VizAttributes["OnFilterChanged"] = "onFilterChanged"; + VizAttributes["OnCustomMarkContextMenuEvent"] = "onCustomMarkContextMenuEvent"; + VizAttributes["OnMarkSelectionChanged"] = "onMarkSelectionChanged"; + VizAttributes["OnParameterChanged"] = "onParameterChanged"; + VizAttributes["OnToolbarStateChanged"] = "onToolbarStateChanged"; + VizAttributes["OnUrlAction"] = "onUrlAction"; + VizAttributes["OnTabSwitched"] = "onTabSwitched"; + VizAttributes["OnCustomViewLoaded"] = "onCustomViewLoaded"; + VizAttributes["OnCustomViewRemoved"] = "onCustomViewRemoved"; + VizAttributes["OnCustomViewSaved"] = "onCustomViewSaved"; + VizAttributes["OnCustomViewSetDefault"] = "onCustomViewSetDefault"; + VizAttributes["OnStoryPointSwitched"] = "onStoryPointSwitched"; + VizAttributes["OnSummaryDataChanged"] = "onSummaryDataChanged"; + VizAttributes["OnReadyToReceiveAuthToken"] = "onReadyToReceiveAuthToken"; +})(VizAttributes = exports.VizAttributes || (exports.VizAttributes = {})); +/** + * The names of the string constants you can use as HTML attributes for the web component. + * @ignore + */ +var VizAuthoringAttributes; +(function (VizAuthoringAttributes) { + VizAuthoringAttributes["OnWorkbookPublished"] = "onWorkbookPublished"; + VizAuthoringAttributes["OnWorkbookPublishedAs"] = "onWorkbookPublishedAs"; + VizAuthoringAttributes["OnWorkbookReadyToClose"] = "onWorkbookReadyToClose"; + VizAuthoringAttributes["HideCloseButton"] = "hide-close-button"; +})(VizAuthoringAttributes = exports.VizAuthoringAttributes || (exports.VizAuthoringAttributes = {})); +/** + * The names of the string constants you can use as child tags for TableauViz and TableauAuthoringViz custom elements. + */ +var VizChildElements; +(function (VizChildElements) { + /** + * Contains a list of filter parameters. Available only in viewing mode. + */ + VizChildElements["VizFilter"] = "viz-filter"; + /** + * Contains a name and value for a parameter. Available only in viewing mode. + */ + VizChildElements["VizParameter"] = "viz-parameter"; + /** + * Contains a list of custom parameters. Available in both viewing and authoring modes. + */ + VizChildElements["CustomParameter"] = "custom-parameter"; + /** + * Custom styles applicable to the embedded iframe element itself (not inside it). Available in both viewing and authoring modes. + */ + VizChildElements["IframeStyle"] = "iframe-style"; +})(VizChildElements = exports.VizChildElements || (exports.VizChildElements = {})); +var VizChildElementAttributes; +(function (VizChildElementAttributes) { + VizChildElementAttributes["Field"] = "field"; + VizChildElementAttributes["Value"] = "value"; + VizChildElementAttributes["Name"] = "name"; +})(VizChildElementAttributes = exports.VizChildElementAttributes || (exports.VizChildElementAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/WebComponentInterfaces.js": +/*!************************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/WebComponentInterfaces.js ***! + \************************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * The names of the common string constants you can use as HTML attributes for the tableau web component. + * @ignore + */ +var WebComponentAttributes; +(function (WebComponentAttributes) { + WebComponentAttributes["Src"] = "src"; + WebComponentAttributes["Width"] = "width"; + WebComponentAttributes["Height"] = "height"; + WebComponentAttributes["Token"] = "token"; + WebComponentAttributes["Debug"] = "debug"; + WebComponentAttributes["IframeAuth"] = "iframe-auth"; + WebComponentAttributes["OnVizLoadError"] = "onvizloaderror"; + WebComponentAttributes["ForceTokenSync"] = "force-token-sync"; +})(WebComponentAttributes = exports.WebComponentAttributes || (exports.WebComponentAttributes = {})); +/** + * The names of the embedded iframe attributes whose values can be controlled. + * @ignore + */ +var EmbeddedIframeAttributes; +(function (EmbeddedIframeAttributes) { + EmbeddedIframeAttributes["Loading"] = "iframe-attr-loading"; + EmbeddedIframeAttributes["Style"] = "iframe-attr-style"; + EmbeddedIframeAttributes["Class"] = "iframe-attr-class"; +})(EmbeddedIframeAttributes = exports.EmbeddedIframeAttributes || (exports.EmbeddedIframeAttributes = {})); +/** + * The names of the string constants you can use as child tags for TableauViz, TableauAuthoringViz and TableauAskData custom elements. + * @ignore + */ +var WebComponentChildElements; +(function (WebComponentChildElements) { + /** + * Contains a list of custom parameters. Available in viz viewing, viz authoring and askdata. + */ + WebComponentChildElements["CustomParameter"] = "custom-parameter"; + /** + * Custom styles applicable to the embedded iframe element itself (not inside it). + */ + WebComponentChildElements["IframeStyle"] = "iframe-style"; +})(WebComponentChildElements = exports.WebComponentChildElements || (exports.WebComponentChildElements = {})); +var WebComponentChildElementAttributes; +(function (WebComponentChildElementAttributes) { + WebComponentChildElementAttributes["Field"] = "field"; + WebComponentChildElementAttributes["Value"] = "value"; + WebComponentChildElementAttributes["Name"] = "name"; +})(WebComponentChildElementAttributes = exports.WebComponentChildElementAttributes || (exports.WebComponentChildElementAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js": +/*!*********************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js ***! + \*********************************************************************************************/ +/***/ ((module) => { + +"use strict"; + +// All enum values made available to Extensions developers. +// Enums should be kept in alphabetical order. +var Tableau; +(function (Tableau) { + /** + * All error codes used by the Extensions API. + */ + let ErrorCodes; + (function (ErrorCodes) { + /** + * Thrown when caller attempts to execute command before initialization has completed. + */ + ErrorCodes["APINotInitialized"] = "api-not-initialized"; + /** + * Thrown when caller attempts to execute command while extension is not visible. + */ + ErrorCodes["VisibilityError"] = "visibility-error"; + /** + * Only one dialog can be opened at time with the UI namespace functionality. + */ + ErrorCodes["DialogAlreadyOpen"] = "dialog-already-open"; + /** + * The open dialog was closed by the user. + */ + ErrorCodes["DialogClosedByUser"] = "dialog-closed-by-user"; + /** + * An error occurred within the Tableau Extensions API. Contact Tableau Support. + */ + ErrorCodes["InternalError"] = "internal-error"; + /** + * A dialog must start on the same domain as the parent extenion. + */ + ErrorCodes["InvalidDomainDialog"] = "invalid-dialog-domain"; + /** + * A parameter is not the correct data type or format. The name of the parameter is specified in the Error.message field. + */ + ErrorCodes["InvalidParameter"] = "invalid-parameter"; + /** + * Can occur if the extension interacts with a filter that has been removed from the worksheet. + */ + ErrorCodes["MissingFilter"] = "missing-filter"; + /** + * Can occur if the extension interacts with a parameter that has been removed from the worksheet. + */ + ErrorCodes["MissingParameter"] = "missing-parameter"; + /** + * Internal Server Error + */ + ErrorCodes["ServerError"] = "server-error"; + /** + * Developer cannot save settings while another save is still in progress. + */ + ErrorCodes["SettingSaveInProgress"] = "setting-save-in-progress"; + /** + * An unknown event name was specified in the call to `addEventListener` or `removeEventListener`. + */ + ErrorCodes["UnsupportedEventName"] = "unsupported-event-name"; + /** + * A method was used for a type of data source that doesn't support that method (see getActiveTablesAsync for an example) + */ + ErrorCodes["UnsupportedMethodForDataSourceType"] = "unsupported-method-for-data-source-type"; + })(ErrorCodes = Tableau.ErrorCodes || (Tableau.ErrorCodes = {})); + /** + * The context in which the Extensions is currently running. + */ + let ExtensionContext; + (function (ExtensionContext) { + ExtensionContext["Desktop"] = "desktop"; + ExtensionContext["Server"] = "server"; + ExtensionContext["Cloud"] = "cloud"; + ExtensionContext["PublicWeb"] = "public-web"; + ExtensionContext["PublicDesktop"] = "public-desktop"; + })(ExtensionContext = Tableau.ExtensionContext || (Tableau.ExtensionContext = {})); + /** + * The mode in which the Extensions is currently running. + */ + let ExtensionMode; + (function (ExtensionMode) { + ExtensionMode["Authoring"] = "authoring"; + ExtensionMode["Viewing"] = "viewing"; + })(ExtensionMode = Tableau.ExtensionMode || (Tableau.ExtensionMode = {})); + /** + * Represents the type of event that can be listened for. + */ + let TableauEventType; + (function (TableauEventType) { + /** + * @experimental + * Raised when a message is received that was sent by a dialog or extension via `sendDialogMessageAsync`.*/ + TableauEventType["DialogMessageReceived"] = "dialog-message-received"; + /** Raised when any filter has changed state. You can use this event type with [Worksheet](../interfaces/worksheet.html) objects.*/ + TableauEventType["FilterChanged"] = "filter-changed"; + /** The selected marks on a visualization has changed. + * You can use this event type with [Worksheet](../interfaces/worksheet.html) objects. */ + TableauEventType["MarkSelectionChanged"] = "mark-selection-changed"; + /** The summary data backing a worksheet has changed + * You can use this event type with [Worksheet](../interfaces/worksheet.html) objects.*/ + TableauEventType["SummaryDataChanged"] = "summary-data-changed"; + /** A parameter has had its value modified. You can use this event type with [[Parameter]] objects. */ + TableauEventType["ParameterChanged"] = "parameter-changed"; + /** Settings have been changed for this extension. You can use this event type with [[Settings]] objects. */ + TableauEventType["SettingsChanged"] = "settings-changed"; + /** The dashboard layout has changed + * @category Dashboard Extensions + */ + TableauEventType["DashboardLayoutChanged"] = "dashboard-layout-changed"; + /** The workbook formatting has changed + * @category Dashboard Extensions + */ + TableauEventType["WorkbookFormattingChanged"] = "workbook-formatting-changed"; + /** The worksheet formatting has changed + * @category Viz Extensions + */ + TableauEventType["WorksheetFormattingChanged"] = "worksheet-formatting-changed"; + })(TableauEventType = Tableau.TableauEventType || (Tableau.TableauEventType = {})); + /** + * Enum that represents the data type of encodings for createVizImageAsync. + * @since 1.6.0 + */ + let VizImageEncodingType; + (function (VizImageEncodingType) { + VizImageEncodingType["Discrete"] = "discrete"; + VizImageEncodingType["Continuous"] = "continuous"; + })(VizImageEncodingType = Tableau.VizImageEncodingType || (Tableau.VizImageEncodingType = {})); + /** + * Enum that represents the sort direction for createVizImageAsync. + * @since 1.8.0 and Tableau 2021.4 + */ + let VizImageSortDirectionType; + (function (VizImageSortDirectionType) { + VizImageSortDirectionType["Ascending"] = "ascending"; + VizImageSortDirectionType["Descending"] = "descending"; + })(VizImageSortDirectionType = Tableau.VizImageSortDirectionType || (Tableau.VizImageSortDirectionType = {})); + /** + * Enum that represents the palette type for createVizImageAsync. + * @since 1.8.0 and Tableau 2021.4 + */ + let VizImagePaletteType; + (function (VizImagePaletteType) { + VizImagePaletteType["CustomDiverging"] = "custom-diverging"; + VizImagePaletteType["CustomSequential"] = "custom-sequential"; + })(VizImagePaletteType = Tableau.VizImagePaletteType || (Tableau.VizImagePaletteType = {})); + /** + * Enum that represents the Size Setting type for createVizImageAsync. + * @since 1.8.0 and Tableau 2021.4 + */ + let VizImageSizeSettingType; + (function (VizImageSizeSettingType) { + VizImageSizeSettingType["Fixed"] = "fixed"; + VizImageSizeSettingType["Manual"] = "manual"; + })(VizImageSizeSettingType = Tableau.VizImageSizeSettingType || (Tableau.VizImageSizeSettingType = {})); + /** + * Enum that represents the Size Setting alignment type for createVizImageAsync. + * @since 1.8.0 and Tableau 2021.4 + */ + let VizImageSizeSettingAlignmentType; + (function (VizImageSizeSettingAlignmentType) { + VizImageSizeSettingAlignmentType["Right"] = "right"; + VizImageSizeSettingAlignmentType["Left"] = "left"; + VizImageSizeSettingAlignmentType["Center"] = "center"; + })(VizImageSizeSettingAlignmentType = Tableau.VizImageSizeSettingAlignmentType || (Tableau.VizImageSizeSettingAlignmentType = {})); +})(Tableau || (Tableau = {})); +module.exports = Tableau; + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/Enums.js": +/*!****************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/Enums.js ***! + \****************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var SharedErrorCodes; +(function (SharedErrorCodes) { + /** + * A CSV or Excel file failed to be created in Viz.exportCrosstabAsync(). + */ + SharedErrorCodes["CrosstabCreationError"] = "crosstab-creation-error"; + /** + * A CSV file failed to be created in Viz.exportDataAsync(). + */ + SharedErrorCodes["DataCreationError"] = "data-creation-error"; + /** + * An invalid aggregation was specified for the filter, such as setting a range filter to "SUM(Sales)" instead of + * "Sales". + */ + SharedErrorCodes["InvalidAggregationFieldName"] = "invalid-aggregation-field-name"; + /** + * A filter operation was attempted on a field that does not exist in the data source. + */ + SharedErrorCodes["InvalidFilterFieldName"] = "invalid-filter-name"; + /** + * A filter operation was attempted using a value that is the wrong data type or format. + */ + SharedErrorCodes["InvalidFilterFieldValue"] = "invalid-filter-fieldValue"; + /** + * An invalid date value was specified in a Sheet.selectMarksAsync() call for a date field. + */ + SharedErrorCodes["InvalidSelectionDate"] = "invalid-selection-date"; + /** + * A field was specified in a Sheet.selectMarksAsync() call that does not exist in the data source. + */ + SharedErrorCodes["InvalidSelectionFieldName"] = "invalid-selection-fieldName"; + /** + * An invalid value was specified in a Sheet.selectMarksAsync() call. + */ + SharedErrorCodes["InvalidSelectionValue"] = "invalid-selection-value"; + /** + * A parameter did not include a valid sheet selection for exporting. + */ + SharedErrorCodes["InvalidSelectionSheet"] = "invalid-selection-sheet"; + /** + * An error occurred within the Tableau API. Contact Tableau Support. + */ + SharedErrorCodes["InternalError"] = "internal-error"; + /** + * A parameter is not the correct data type or format. The name of the parameter is specified in the Error.message field. + */ + SharedErrorCodes["InvalidParameter"] = "invalid-parameter"; + /** + * A PDF file failed to be created in Viz.exportPDFAsync(). + */ + SharedErrorCodes["PDFCreationError"] = "pdf-creation-error"; + /** + * A PowerPoint file failed to be created in Viz.exportPowerPointAsync(). + */ + SharedErrorCodes["PowerPointCreationError"] = "powerpoint-creation-error"; + /** + * An operation was attempted on a sheet that is not active or embedded within the active dashboard. + */ + SharedErrorCodes["NotActiveSheet"] = "not-active-sheet"; + /** + * Property or Function is not supported within the Tableau API. + */ + SharedErrorCodes["ImplementationError"] = "wrong-implementation"; + /** + * Can occur when two incompatible calls are triggered together. + */ + SharedErrorCodes["ApiExecutionError"] = "api-execution-error"; + /** + * A general-purpose server error occurred. Details are contained in the Error object. + */ + SharedErrorCodes["ServerError"] = "server-error"; + /** + * Can occur when an api call times out. + */ + SharedErrorCodes["Timeout"] = "timeout"; +})(SharedErrorCodes = exports.SharedErrorCodes || (exports.SharedErrorCodes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js": +/*!*****************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js ***! + \*****************************************************************************************/ +/***/ ((module) => { + +"use strict"; + +/** + * The tableau namespace exists for organization and to avoid polluting + * the global namespace. It contains no constructs other than sub-namespaces and the Tableau enumerations. + */ +var Tableau; +(function (Tableau) { + let AnalyticsObjectType; + (function (AnalyticsObjectType) { + AnalyticsObjectType["Cluster"] = "cluster"; + AnalyticsObjectType["Forecast"] = "forecast"; + AnalyticsObjectType["TrendLine"] = "trend-line"; + })(AnalyticsObjectType = Tableau.AnalyticsObjectType || (Tableau.AnalyticsObjectType = {})); + let AnnotationType; + (function (AnnotationType) { + AnnotationType["Mark"] = "mark"; + AnnotationType["Point"] = "point"; + AnnotationType["Area"] = "area"; + })(AnnotationType = Tableau.AnnotationType || (Tableau.AnnotationType = {})); + let ColumnType; + (function (ColumnType) { + ColumnType["Discrete"] = "discrete"; + ColumnType["Continuous"] = "continuous"; + ColumnType["Unknown"] = "unknown"; + })(ColumnType = Tableau.ColumnType || (Tableau.ColumnType = {})); + let ClassNameKey; + (function (ClassNameKey) { + ClassNameKey["WorksheetTitle"] = "tableau-worksheet-title"; + ClassNameKey["Worksheet"] = "tableau-worksheet"; + ClassNameKey["Tooltip"] = "tableau-tooltip"; + ClassNameKey["StoryTitle"] = "tableau-story-title"; + ClassNameKey["DashboardTitle"] = "tableau-dashboard-title"; + ClassNameKey["Pane"] = "tableau-pane"; + ClassNameKey["RowDividers"] = "tableau-row-dividers"; + ClassNameKey["ColumnDividers"] = "tableau-column-dividers"; + })(ClassNameKey = Tableau.ClassNameKey || (Tableau.ClassNameKey = {})); + /** + * What the object represents in a dashboard. + */ + let DashboardObjectType; + (function (DashboardObjectType) { + DashboardObjectType["Blank"] = "blank"; + DashboardObjectType["Worksheet"] = "worksheet"; + DashboardObjectType["QuickFilter"] = "quick-filter"; + DashboardObjectType["ParameterControl"] = "parameter-control"; + DashboardObjectType["PageFilter"] = "page-filter"; + DashboardObjectType["Legend"] = "legend"; + DashboardObjectType["Title"] = "title"; + DashboardObjectType["Text"] = "text"; + DashboardObjectType["Image"] = "image"; + DashboardObjectType["WebPage"] = "web-page"; + DashboardObjectType["Extension"] = "extension"; + })(DashboardObjectType = Tableau.DashboardObjectType || (Tableau.DashboardObjectType = {})); + /** + * Enum that represents the visibility state of a dashboard object. + * @since 1.7.0 + */ + let DashboardObjectVisibilityType; + (function (DashboardObjectVisibilityType) { + /** Used for turning on the visibility of a dashboard object.*/ + DashboardObjectVisibilityType["Show"] = "show"; + /** Used for turning off the visibility of a dashboard object.*/ + DashboardObjectVisibilityType["Hide"] = "hide"; + })(DashboardObjectVisibilityType = Tableau.DashboardObjectVisibilityType || (Tableau.DashboardObjectVisibilityType = {})); + /** + * The different types of data a value can have + */ + let DataType; + (function (DataType) { + DataType["String"] = "string"; + DataType["Int"] = "int"; + DataType["Float"] = "float"; + DataType["Bool"] = "bool"; + DataType["Date"] = "date"; + DataType["DateTime"] = "date-time"; + DataType["Spatial"] = "spatial"; + DataType["Unknown"] = "unknown"; + })(DataType = Tableau.DataType || (Tableau.DataType = {})); + /** + * Enum that represents the changes that occur to a dashboard object. + */ + let DashboardLayoutChange; + (function (DashboardLayoutChange) { + /** A dashboard object was added */ + DashboardLayoutChange["Added"] = "added"; + /** A dashboard object was removed */ + DashboardLayoutChange["Removed"] = "removed"; + /** A dashboard object's floating state changed */ + DashboardLayoutChange["IsFloatingChanged"] = "is-floating-changed"; + /** A dashboard object's visibility changed */ + DashboardLayoutChange["IsVisibleChanged"] = "is-visible-changed"; + /** A dashboard object's position changed */ + DashboardLayoutChange["PositionChanged"] = "position-changed"; + /** A dashboard object's size changed */ + DashboardLayoutChange["SizeChanged"] = "size-changed"; + /** A dashboard object was renamed */ + DashboardLayoutChange["NameChanged"] = "name-changed"; + /** A dashboard object is selected */ + DashboardLayoutChange["Selected"] = "selected"; + /** A dashboard object is deselected */ + DashboardLayoutChange["Deselected"] = "deselected"; + /** Navigate to another dashboard */ + DashboardLayoutChange["DashboardChanged"] = "dashboard-changed"; + })(DashboardLayoutChange = Tableau.DashboardLayoutChange || (Tableau.DashboardLayoutChange = {})); + /** + * Valid date ranges for a relative date filter. + */ + let DateRangeType; + (function (DateRangeType) { + DateRangeType["Last"] = "last"; + DateRangeType["LastN"] = "last-n"; + DateRangeType["Next"] = "next"; + DateRangeType["NextN"] = "next-n"; + DateRangeType["Current"] = "current"; + DateRangeType["ToDate"] = "to-date"; + })(DateRangeType = Tableau.DateRangeType || (Tableau.DateRangeType = {})); + /** + * Enum that represents the types of dialog popup styles. + */ + let DialogStyle; + (function (DialogStyle) { + DialogStyle["Window"] = "window"; + DialogStyle["Modal"] = "modal"; + DialogStyle["Modeless"] = "modeless"; + })(DialogStyle = Tableau.DialogStyle || (Tableau.DialogStyle = {})); + let EncodingType; + (function (EncodingType) { + EncodingType["Column"] = "column"; + EncodingType["Row"] = "row"; + EncodingType["Page"] = "page"; + EncodingType["Filter"] = "filter"; + EncodingType["MarksType"] = "marks-type"; + EncodingType["MeasureValues"] = "measure-values"; + EncodingType["Color"] = "color"; + EncodingType["Size"] = "size"; + EncodingType["Label"] = "label"; + EncodingType["Detail"] = "detail"; + EncodingType["Tooltip"] = "tooltip"; + EncodingType["Shape"] = "shape"; + EncodingType["Path"] = "path"; + EncodingType["Angle"] = "angle"; + EncodingType["Geometry"] = "geometry"; + EncodingType["Custom"] = "custom"; + })(EncodingType = Tableau.EncodingType || (Tableau.EncodingType = {})); + /** + * Type of aggregation on a field. + */ + let FieldAggregationType; + (function (FieldAggregationType) { + FieldAggregationType["Sum"] = "sum"; + FieldAggregationType["Avg"] = "avg"; + FieldAggregationType["Min"] = "min"; + FieldAggregationType["Max"] = "max"; + FieldAggregationType["Stdev"] = "stdev"; + FieldAggregationType["Stdevp"] = "stdevp"; + FieldAggregationType["Var"] = "var"; + FieldAggregationType["Varp"] = "varp"; + FieldAggregationType["Collect"] = "collect"; + FieldAggregationType["Count"] = "count"; + FieldAggregationType["Countd"] = "countd"; + FieldAggregationType["Median"] = "median"; + FieldAggregationType["Attr"] = "attr"; + FieldAggregationType["None"] = "none"; + FieldAggregationType["Year"] = "year"; + FieldAggregationType["Qtr"] = "qtr"; + FieldAggregationType["Month"] = "month"; + FieldAggregationType["Day"] = "day"; + FieldAggregationType["Hour"] = "hour"; + FieldAggregationType["Minute"] = "minute"; + FieldAggregationType["Second"] = "second"; + FieldAggregationType["Week"] = "week"; + FieldAggregationType["Weekday"] = "weekday"; + FieldAggregationType["MonthYear"] = "month-year"; + FieldAggregationType["Mdy"] = "mdy"; + FieldAggregationType["End"] = "end"; + FieldAggregationType["TruncYear"] = "trunc-year"; + FieldAggregationType["TruncQtr"] = "trunc-qtr"; + FieldAggregationType["TruncMonth"] = "trunc-month"; + FieldAggregationType["TruncWeek"] = "trunc-week"; + FieldAggregationType["TruncDay"] = "trunc-day"; + FieldAggregationType["TruncHour"] = "trunc-hour"; + FieldAggregationType["TruncMinute"] = "trunc-minute"; + FieldAggregationType["TruncSecond"] = "trunc-second"; + FieldAggregationType["Quart1"] = "quart1"; + FieldAggregationType["Quart3"] = "quart3"; + FieldAggregationType["Skewness"] = "skewness"; + FieldAggregationType["Kurtosis"] = "kurtosis"; + FieldAggregationType["InOut"] = "in-out"; + FieldAggregationType["User"] = "user"; + })(FieldAggregationType = Tableau.FieldAggregationType || (Tableau.FieldAggregationType = {})); + /** + * Role of a field. + */ + let FieldRoleType; + (function (FieldRoleType) { + FieldRoleType["Dimension"] = "dimension"; + FieldRoleType["Measure"] = "measure"; + FieldRoleType["Unknown"] = "unknown"; + })(FieldRoleType = Tableau.FieldRoleType || (Tableau.FieldRoleType = {})); + /** + * An enumeration of the valid types of filters that can be applied. + */ + let FilterType; + (function (FilterType) { + FilterType["Categorical"] = "categorical"; + FilterType["Range"] = "range"; + FilterType["Hierarchical"] = "hierarchical"; + FilterType["RelativeDate"] = "relative-date"; + })(FilterType = Tableau.FilterType || (Tableau.FilterType = {})); + /** + * The different update types for applying filter + */ + let FilterUpdateType; + (function (FilterUpdateType) { + FilterUpdateType["Add"] = "add"; + FilterUpdateType["All"] = "all"; + FilterUpdateType["Replace"] = "replace"; + FilterUpdateType["Remove"] = "remove"; + })(FilterUpdateType = Tableau.FilterUpdateType || (Tableau.FilterUpdateType = {})); + /** + * The domain type for a filter + */ + let FilterDomainType; + (function (FilterDomainType) { + /** + * The domain values that are relevant to the specified filter + * i.e. the domain is restricted by a previous filter + */ + FilterDomainType["Relevant"] = "relevant"; + /** + * list of all possible domain values from database + */ + FilterDomainType["Database"] = "database"; + })(FilterDomainType = Tableau.FilterDomainType || (Tableau.FilterDomainType = {})); + /** + * The option for specifying which values to include for filtering + * Indicates what to do with null values for a given filter or mark selection call. + */ + let FilterNullOption; + (function (FilterNullOption) { + FilterNullOption["NullValues"] = "null-values"; + FilterNullOption["NonNullValues"] = "non-null-values"; + FilterNullOption["AllValues"] = "all-values"; + })(FilterNullOption = Tableau.FilterNullOption || (Tableau.FilterNullOption = {})); + /** + * Enum that serves as a filter on the DataValues returned from `getSummaryDataReaderAsync`, + * `getUnderlyingTableDataReaderAsync` and `getLogicalTableDataReaderAsync`. + * This is an optimization of returned data values only. Tableau versions prior to 2021.2 + * will pass the data across and populate the DataValue properties. + * Please note that all properties not requested will be `undefined` in the DataValue results. + * @since 1.5.0 + */ + let IncludeDataValuesOption; + (function (IncludeDataValuesOption) { + /** DataValues will include all properties.*/ + IncludeDataValuesOption["AllValues"] = "all-values"; + /** DataValues will only include value and nativeValue properties.*/ + IncludeDataValuesOption["OnlyNativeValues"] = "only-native-values"; + /** DataValues will only include formattedValue properties. */ + IncludeDataValuesOption["OnlyFormattedValues"] = "only-formatted-values"; + })(IncludeDataValuesOption = Tableau.IncludeDataValuesOption || (Tableau.IncludeDataValuesOption = {})); + /** + * Type of mark for a given marks card in a viz. + */ + let MarkType; + (function (MarkType) { + MarkType["Bar"] = "bar"; + MarkType["Line"] = "line"; + MarkType["Area"] = "area"; + MarkType["Square"] = "square"; + MarkType["Circle"] = "circle"; + MarkType["Shape"] = "shape"; + MarkType["Text"] = "text"; + MarkType["Map"] = "map"; + MarkType["Pie"] = "pie"; + MarkType["GanttBar"] = "gantt-bar"; + MarkType["Polygon"] = "polygon"; + MarkType["Heatmap"] = "heatmap"; + MarkType["VizExtension"] = "viz-extension"; + })(MarkType = Tableau.MarkType || (Tableau.MarkType = {})); + /** + * An enumeration describing the different types of allowable values. + * This is used for restricting the domain of a parameter + */ + let ParameterValueType; + (function (ParameterValueType) { + ParameterValueType["All"] = "all"; + ParameterValueType["List"] = "list"; + ParameterValueType["Range"] = "range"; + })(ParameterValueType = Tableau.ParameterValueType || (Tableau.ParameterValueType = {})); + /** + * Date period used in filters and in parameters. + */ + let PeriodType; + (function (PeriodType) { + PeriodType["Years"] = "years"; + PeriodType["Quarters"] = "quarters"; + PeriodType["Months"] = "months"; + PeriodType["Weeks"] = "weeks"; + PeriodType["Days"] = "days"; + PeriodType["Hours"] = "hours"; + PeriodType["Minutes"] = "minutes"; + PeriodType["Seconds"] = "seconds"; + })(PeriodType = Tableau.PeriodType || (Tableau.PeriodType = {})); + let QuickTableCalcType; + (function (QuickTableCalcType) { + QuickTableCalcType["RunningTotal"] = "running-total"; + QuickTableCalcType["Difference"] = "difference"; + QuickTableCalcType["PercentDifference"] = "percent-difference"; + QuickTableCalcType["PercentOfTotal"] = "percent-of-total"; + QuickTableCalcType["Rank"] = "rank"; + QuickTableCalcType["Percentile"] = "percentile"; + QuickTableCalcType["MovingAverage"] = "moving-average"; + QuickTableCalcType["YTDTotal"] = "ytd-total"; + QuickTableCalcType["CompoundGrowthRate"] = "compound-growth-rate"; + QuickTableCalcType["YearOverYearGrowth"] = "year-over-year-growth"; + QuickTableCalcType["YTDGrowth"] = "ytd-growth"; + QuickTableCalcType["Undefined"] = "undefined"; + })(QuickTableCalcType = Tableau.QuickTableCalcType || (Tableau.QuickTableCalcType = {})); + /** + * Enum for specifying the selection type for select marks api. + */ + let SelectionUpdateType; + (function (SelectionUpdateType) { + SelectionUpdateType["Replace"] = "select-replace"; + SelectionUpdateType["Add"] = "select-add"; + SelectionUpdateType["Remove"] = "select-remove"; + })(SelectionUpdateType = Tableau.SelectionUpdateType || (Tableau.SelectionUpdateType = {})); + /** + * Enum for specifying the select option for the `extensions.Worksheet.selectTuplesAsync` method. + */ + let SelectOptions; + (function (SelectOptions) { + /** + * Clears existing selection before selecting the tuples specified + */ + SelectOptions["Simple"] = "select-options-simple"; + /** + * Adds specified tuples to the existing selection + */ + SelectOptions["Toggle"] = "select-options-toggle"; + })(SelectOptions = Tableau.SelectOptions || (Tableau.SelectOptions = {})); + /** + * The type of sheet a [[Sheet]] object represents + */ + let SheetType; + (function (SheetType) { + SheetType["Dashboard"] = "dashboard"; + SheetType["Story"] = "story"; + SheetType["Worksheet"] = "worksheet"; + })(SheetType = Tableau.SheetType || (Tableau.SheetType = {})); + let SortDirection; + (function (SortDirection) { + SortDirection["Increasing"] = "increasing"; + SortDirection["Decreasing"] = "decreasing"; + })(SortDirection = Tableau.SortDirection || (Tableau.SortDirection = {})); + let TrendLineModelType; + (function (TrendLineModelType) { + TrendLineModelType["Linear"] = "linear"; + TrendLineModelType["Logarithmic"] = "logarithmic"; + TrendLineModelType["Exponential"] = "exponential"; + TrendLineModelType["Polynomial"] = "polynomial"; + })(TrendLineModelType = Tableau.TrendLineModelType || (Tableau.TrendLineModelType = {})); + /** + * Enum that represents the replay speed of an animation. + * @since 1.7.0 + */ + let ReplaySpeedType; + (function (ReplaySpeedType) { + /** Used for setting the replay speed of an animation to 0.5x.*/ + ReplaySpeedType["Slow"] = "slow"; + /** Used for setting the replay speed of an animation to 1.0x.*/ + ReplaySpeedType["Normal"] = "normal"; + /** Used for setting the replay speed of an animation to 2.0x.*/ + ReplaySpeedType["Fast"] = "fast"; + })(ReplaySpeedType = Tableau.ReplaySpeedType || (Tableau.ReplaySpeedType = {})); + /** + * Enum that represents the selection state of a level in a hierarchical filter + * @since Extensions 1.10.0 + */ + let HierarchicalLevelSelectionState; + (function (HierarchicalLevelSelectionState) { + HierarchicalLevelSelectionState["AllSelected"] = "all-selected"; + HierarchicalLevelSelectionState["NoneSelected"] = "none-selected"; + HierarchicalLevelSelectionState["SomeSelected"] = "some-selected"; + HierarchicalLevelSelectionState["UnknownSelected"] = "unknown-selected"; + })(HierarchicalLevelSelectionState = Tableau.HierarchicalLevelSelectionState || (Tableau.HierarchicalLevelSelectionState = {})); + Tableau.ZoneVisibilityType = Object.assign({}, DashboardObjectVisibilityType); +})(Tableau || (Tableau = {})); +module.exports = Tableau; + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/SharedApiExternalContract.js": +/*!************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/SharedApiExternalContract.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +// This file re-exports everything which is part of the shared api public interface +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +__export(__webpack_require__(/*! ./ExternalContract/Shared/Enums */ "../api-external-contract-js/lib/src/ExternalContract/Shared/Enums.js")); +var Tableau_1 = __webpack_require__(/*! ./ExternalContract/Shared/Namespaces/Tableau */ "../api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js"); +exports.AnalyticsObjectType = Tableau_1.AnalyticsObjectType; +exports.AnnotationType = Tableau_1.AnnotationType; +exports.ClassNameKey = Tableau_1.ClassNameKey; +exports.ColumnType = Tableau_1.ColumnType; +exports.DashboardLayoutChange = Tableau_1.DashboardLayoutChange; +exports.DashboardObjectType = Tableau_1.DashboardObjectType; +exports.DashboardObjectVisibilityType = Tableau_1.DashboardObjectVisibilityType; +exports.DataType = Tableau_1.DataType; +exports.DateRangeType = Tableau_1.DateRangeType; +exports.DialogStyle = Tableau_1.DialogStyle; +exports.EncodingType = Tableau_1.EncodingType; +exports.FieldAggregationType = Tableau_1.FieldAggregationType; +exports.FieldRoleType = Tableau_1.FieldRoleType; +exports.FilterDomainType = Tableau_1.FilterDomainType; +exports.FilterNullOption = Tableau_1.FilterNullOption; +exports.FilterType = Tableau_1.FilterType; +exports.FilterUpdateType = Tableau_1.FilterUpdateType; +exports.HierarchicalLevelSelectionState = Tableau_1.HierarchicalLevelSelectionState; +exports.IncludeDataValuesOption = Tableau_1.IncludeDataValuesOption; +exports.MarkType = Tableau_1.MarkType; +exports.ParameterValueType = Tableau_1.ParameterValueType; +exports.PeriodType = Tableau_1.PeriodType; +exports.QuickTableCalcType = Tableau_1.QuickTableCalcType; +exports.ReplaySpeedType = Tableau_1.ReplaySpeedType; +exports.SelectOptions = Tableau_1.SelectOptions; +exports.SelectionUpdateType = Tableau_1.SelectionUpdateType; +exports.SheetType = Tableau_1.SheetType; +exports.SortDirection = Tableau_1.SortDirection; +exports.TrendLineModelType = Tableau_1.TrendLineModelType; +exports.ZoneVisibilityType = Tableau_1.ZoneVisibilityType; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/JsApiInternalContract.js": +/*!********************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/JsApiInternalContract.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +/** + * This is your main. This is where you re-export everything you want to be publicly available. + * + * The build enforces that the file has the same name as the global variable that is exported. + */ +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +// Export the version of the internal contract to be available at runtime +// This file is generated by yarn publish:bump via scripts/publish-check.ts +// updateInternalContractRuntimeVersion in the monorepo root. +const internalContractVersion = __webpack_require__(/*! ../internal-contract-version.json */ "../api-internal-contract-js/lib/internal-contract-version.json"); +exports.INTERNAL_CONTRACT_VERSION = internalContractVersion; +__export(__webpack_require__(/*! ./contract/DataTypeConverter */ "../api-internal-contract-js/lib/src/contract/DataTypeConverter.js")); +__export(__webpack_require__(/*! ./contract/Enums */ "../api-internal-contract-js/lib/src/contract/Enums.js")); +__export(__webpack_require__(/*! ./contract/Notifications */ "../api-internal-contract-js/lib/src/contract/Notifications.js")); +__export(__webpack_require__(/*! ./contract/Parameters */ "../api-internal-contract-js/lib/src/contract/Parameters.js")); +__export(__webpack_require__(/*! ./contract/Verbs */ "../api-internal-contract-js/lib/src/contract/Verbs.js")); +__export(__webpack_require__(/*! ./interface/AskDataInterface */ "../api-internal-contract-js/lib/src/interface/AskDataInterface.js")); +__export(__webpack_require__(/*! ./interface/PulseInterface */ "../api-internal-contract-js/lib/src/interface/PulseInterface.js")); +__export(__webpack_require__(/*! ./interface/VqlInterface */ "../api-internal-contract-js/lib/src/interface/VqlInterface.js")); +__export(__webpack_require__(/*! ./messaging/CrossFrameMessenger */ "../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js")); +__export(__webpack_require__(/*! ./messaging/interface/MessageTypes */ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js")); +__export(__webpack_require__(/*! ./versioning/external/ExternalIdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js")); +__export(__webpack_require__(/*! ./versioning/external/ExternalVersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js")); +__export(__webpack_require__(/*! ./versioning/VersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js")); +// Export the version number of messaging for consumers to use. +// Be very careful making any updates to this contract which break version compatibility. +exports.MESSAGING_VERSION = { + major: 1, + minor: 0, + fix: 0, +}; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/contract/DataTypeConverter.js": +/*!*************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/contract/DataTypeConverter.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Enums_1 = __webpack_require__(/*! ./Enums */ "../api-internal-contract-js/lib/src/contract/Enums.js"); +class DataTypeConverter { + static isSpecial(valueAsString) { + // Prior to ShowDataTablePresModel, special values come to us as + // '%null%', '%all%', '%wildcard%', '%missing%'... + // While this function will never return true for ShowDataTablePresModel conversion, + // it is as cheap as passing around a version and checking that. + // (See DataValueFormatter.cpp) + if (valueAsString.length > 2 && valueAsString[0] === '%' && valueAsString[valueAsString.length - 1] === '%') { + return true; + } + return false; + } + // tslint:disable-next-line:no-any + static parseBoolean(booleanString) { + // boolean values come to us as 'true'|'false' + const normalizedBoolean = booleanString.toLowerCase(); + return normalizedBoolean !== 'true' && normalizedBoolean !== 'false' ? this.specialValueIndicator : normalizedBoolean === 'true'; + } + // tslint:disable-next-line:no-any + static parseNumber(valueAsString) { + const value = Number(valueAsString); + return isNaN(value) ? this.specialValueIndicator : value; + } + static parseDate(dateAsString) { + // Note that without a time, the date is assumed to be UTC + // Input of 2020-03-25 is printed as: Mar 24 2020 17:00:00 GMT-0700 + // This matches style used in existing convertFilterValuePresModel + const value = new Date(dateAsString); + return Number.isNaN(value.getTime()) ? null : value; + } + static parseDateTime(dateAsString) { + // With a time, the date is assumed to be UTC. + // Our date format is always: yyyy-mm-dd hh:mm:ss + // Unfortunately, IE11 can't parse that format so we add a T between the day and time. + // We also add a Z so that it is UTC. (Without the Z, some browsers assume local, and others UTC) + // Even though we've dropped support for IE11, it's riskier/costlier to make updates here. + const formattedDateString = dateAsString.replace(' ', 'T').concat('Z'); + const value = new Date(formattedDateString); + return Number.isNaN(value.getTime()) ? null : value; + } + // It would be nice to merge this and the method FilterConverter::convertFilterValuePresModel in api-platform-js + static convertValueAsStringToValue(valueAsString, type) { + // This is both DataDictionary and ShowDataTablePresModel compatible. + // In the DataDictionary, valueAsString can be '%null%' or '%missing%', while in + // ShowDataTablePresModel, we can get 'null' or 'missing', or '%null%' for string special values. + // For either of these cases, we return specialValueIndicator (or the original special string). + // To maintain backwards compatibilty, this converter: + // 1. returns a string for any special values + // 2. returns a string for any date + // Parameter min/max values can be undefined, so result is also undefined + if (valueAsString === undefined || valueAsString === null) { + return undefined; + } + if (this.isSpecial(valueAsString)) { + return valueAsString; + } + switch (type) { + case Enums_1.DataType.Bool: + return this.parseBoolean(valueAsString); + case Enums_1.DataType.Int: + case Enums_1.DataType.Float: + // Return special value '%null%' for any failure in parsing. + // We need to do that because ShowDataTablePresModel will give us strings like 'null' + // for special values. + return this.parseNumber(valueAsString); + case Enums_1.DataType.Date: + // For ShowDataTablePresModel, special values will be "null" which will fail to parse. + // In that case, we return '%null%'. + return this.parseDate(valueAsString) === null ? this.specialValueIndicator : valueAsString; + case Enums_1.DataType.DateTime: + // For ShowDataTablePresModel, special values will be "null" which will fail to parse. + // In that case, we return '%null%' + return this.parseDateTime(valueAsString) === null ? this.specialValueIndicator : valueAsString; + case Enums_1.DataType.Spatial: + case Enums_1.DataType.String: + default: + return valueAsString; + } + } + // tslint:disable-next-line:no-any + static convertValueToNativeValue(value, type) { + // This converts from our 1.2 API that returns strings for specials, and dates as strings. + // It takes the special case of '%null%' and returns a null. + // For dates, it returns a Date object rather than a string. + // convertValueToNativeValue should be used to build a DataValue.nativeValue field. + // Parameter min/max can be undefined. If that is the case, nativeValue is treated like a special + if (value === undefined || value === null) { + return null; + } + switch (type) { + case Enums_1.DataType.Bool: + return typeof value === 'string' ? null : value; + case Enums_1.DataType.Int: + case Enums_1.DataType.Float: + return typeof value === 'string' ? null : value; + case Enums_1.DataType.Date: + // Convert the string to Date object (or null if parsing fails ... we assume special) + return this.parseDate(value); + case Enums_1.DataType.DateTime: + // Convert the string to Date object (or null if parsing fails ... we assume special) + return this.parseDateTime(value); + case Enums_1.DataType.String: + return this.isSpecial(value) ? null : value; + case Enums_1.DataType.Spatial: + default: + return value; + } + } + // tslint:disable-next-line:no-any + static convertStringValueToNativeValue(value, type) { + // This handles the conversion from string directly to native value for all types + return this.convertValueToNativeValue(this.convertValueAsStringToValue(value, type), type); + } +} +exports.DataTypeConverter = DataTypeConverter; +DataTypeConverter.specialValueIndicator = '%null%'; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/contract/Enums.js": +/*!*************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/contract/Enums.js ***! + \*************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var ExtensionContext; +(function (ExtensionContext) { + ExtensionContext["Desktop"] = "desktop"; + ExtensionContext["Server"] = "server"; + ExtensionContext["Unknown"] = "unknown"; + ExtensionContext["Cloud"] = "cloud"; + ExtensionContext["PublicWeb"] = "public-web"; + ExtensionContext["PublicDesktop"] = "public-desktop"; +})(ExtensionContext = exports.ExtensionContext || (exports.ExtensionContext = {})); +var ExtensionMode; +(function (ExtensionMode) { + ExtensionMode["Authoring"] = "authoring"; + ExtensionMode["Viewing"] = "viewing"; + ExtensionMode["Unknown"] = "unknown"; +})(ExtensionMode = exports.ExtensionMode || (exports.ExtensionMode = {})); +var AnnotateEnum; +(function (AnnotateEnum) { + AnnotateEnum["Mark"] = "mark"; + AnnotateEnum["Point"] = "point"; + AnnotateEnum["Area"] = "area"; +})(AnnotateEnum = exports.AnnotateEnum || (exports.AnnotateEnum = {})); +var ColumnType; +(function (ColumnType) { + ColumnType["Discrete"] = "discrete"; + ColumnType["Continuous"] = "continuous"; + ColumnType["Unknown"] = "unknown"; +})(ColumnType = exports.ColumnType || (exports.ColumnType = {})); +var DashboardObjectType; +(function (DashboardObjectType) { + DashboardObjectType["Blank"] = "blank"; + DashboardObjectType["Worksheet"] = "worksheet"; + DashboardObjectType["QuickFilter"] = "quick-filter"; + DashboardObjectType["ParameterControl"] = "parameter-control"; + DashboardObjectType["PageFilter"] = "page-filter"; + DashboardObjectType["Legend"] = "legend"; + DashboardObjectType["Title"] = "title"; + DashboardObjectType["Text"] = "text"; + DashboardObjectType["Image"] = "image"; + DashboardObjectType["WebPage"] = "web-page"; + DashboardObjectType["Extension"] = "extension"; +})(DashboardObjectType = exports.DashboardObjectType || (exports.DashboardObjectType = {})); +var DataType; +(function (DataType) { + DataType["String"] = "string"; + DataType["Int"] = "int"; + DataType["Float"] = "float"; + DataType["Bool"] = "bool"; + DataType["Date"] = "date"; + DataType["DateTime"] = "date-time"; + DataType["Spatial"] = "spatial"; + DataType["Unknown"] = "unknown"; +})(DataType = exports.DataType || (exports.DataType = {})); +var DialogStyle; +(function (DialogStyle) { + DialogStyle["Window"] = "window"; + DialogStyle["Modal"] = "modal"; + DialogStyle["Modeless"] = "modeless"; +})(DialogStyle = exports.DialogStyle || (exports.DialogStyle = {})); +var EncodedDataType; +(function (EncodedDataType) { + EncodedDataType["Number"] = "number"; + EncodedDataType["String"] = "string"; + EncodedDataType["Date"] = "date"; + EncodedDataType["Boolean"] = "boolean"; +})(EncodedDataType = exports.EncodedDataType || (exports.EncodedDataType = {})); +var ErrorCodes; +(function (ErrorCodes) { + ErrorCodes["INITIALIZATION_ERROR"] = "initialization-error"; + ErrorCodes["INTERNAL_ERROR"] = "internal-error"; + ErrorCodes["MISSING_ENUM_MAPPING"] = "missing-enum-mapping"; + ErrorCodes["MISSING_PARAMETER"] = "missing-parameter"; + ErrorCodes["PERMISSION_DENIED"] = "permission-denied"; + ErrorCodes["PRES_MODEL_PARSING_ERROR"] = "pres-model-parsing-error"; + ErrorCodes["VERSION_NOT_CONFIGURED"] = "version-not-configured"; + ErrorCodes["VISIBILITY_ERROR"] = "visibility-error"; + ErrorCodes["UNKNOWN_VERB_ID"] = "unknown-verb-id"; +})(ErrorCodes = exports.ErrorCodes || (exports.ErrorCodes = {})); +var FieldAggregationType; +(function (FieldAggregationType) { + FieldAggregationType["Sum"] = "sum"; + FieldAggregationType["Avg"] = "avg"; + FieldAggregationType["Min"] = "min"; + FieldAggregationType["Max"] = "max"; + FieldAggregationType["Stdev"] = "stdev"; + FieldAggregationType["Stdevp"] = "stdevp"; + FieldAggregationType["Var"] = "var"; + FieldAggregationType["Varp"] = "varp"; + FieldAggregationType["Collect"] = "collect"; + FieldAggregationType["Count"] = "count"; + FieldAggregationType["Countd"] = "countd"; + FieldAggregationType["Median"] = "median"; + FieldAggregationType["Attr"] = "attr"; + FieldAggregationType["None"] = "none"; + FieldAggregationType["Year"] = "year"; + FieldAggregationType["Qtr"] = "qtr"; + FieldAggregationType["Month"] = "month"; + FieldAggregationType["Day"] = "day"; + FieldAggregationType["Hour"] = "hour"; + FieldAggregationType["Minute"] = "minute"; + FieldAggregationType["Second"] = "second"; + FieldAggregationType["Week"] = "week"; + FieldAggregationType["Weekday"] = "weekday"; + FieldAggregationType["MonthYear"] = "month-year"; + FieldAggregationType["Mdy"] = "mdy"; + FieldAggregationType["End"] = "end"; + FieldAggregationType["TruncYear"] = "trunc-year"; + FieldAggregationType["TruncQtr"] = "trunc-qtr"; + FieldAggregationType["TruncMonth"] = "trunc-month"; + FieldAggregationType["TruncWeek"] = "trunc-week"; + FieldAggregationType["TruncDay"] = "trunc-day"; + FieldAggregationType["TruncHour"] = "trunc-hour"; + FieldAggregationType["TruncMinute"] = "trunc-minute"; + FieldAggregationType["TruncSecond"] = "trunc-second"; + FieldAggregationType["Quart1"] = "quart1"; + FieldAggregationType["Quart3"] = "quart3"; + FieldAggregationType["Skewness"] = "skewness"; + FieldAggregationType["Kurtosis"] = "kurtosis"; + FieldAggregationType["InOut"] = "in-out"; + FieldAggregationType["User"] = "user"; +})(FieldAggregationType = exports.FieldAggregationType || (exports.FieldAggregationType = {})); +var FieldRoleType; +(function (FieldRoleType) { + FieldRoleType["Dimension"] = "dimension"; + FieldRoleType["Measure"] = "measure"; + FieldRoleType["Unknown"] = "unknown"; +})(FieldRoleType = exports.FieldRoleType || (exports.FieldRoleType = {})); +/** + * The different update types for applying filter. + */ +var FilterUpdateType; +(function (FilterUpdateType) { + FilterUpdateType["Add"] = "add"; + FilterUpdateType["All"] = "all"; + FilterUpdateType["Replace"] = "replace"; + FilterUpdateType["Remove"] = "remove"; +})(FilterUpdateType = exports.FilterUpdateType || (exports.FilterUpdateType = {})); +var SheetType; +(function (SheetType) { + SheetType["Dashboard"] = "dashboard"; + SheetType["Story"] = "story"; + SheetType["Worksheet"] = "worksheet"; +})(SheetType = exports.SheetType || (exports.SheetType = {})); +var DomainRestrictionType; +(function (DomainRestrictionType) { + DomainRestrictionType["All"] = "all"; + DomainRestrictionType["List"] = "list"; + DomainRestrictionType["Range"] = "range"; +})(DomainRestrictionType = exports.DomainRestrictionType || (exports.DomainRestrictionType = {})); +var DateStepPeriod; +(function (DateStepPeriod) { + DateStepPeriod["Years"] = "years"; + DateStepPeriod["Quarters"] = "quarters"; + DateStepPeriod["Months"] = "months"; + DateStepPeriod["Weeks"] = "weeks"; + DateStepPeriod["Days"] = "days"; + DateStepPeriod["Hours"] = "hours"; + DateStepPeriod["Minutes"] = "minutes"; + DateStepPeriod["Seconds"] = "seconds"; +})(DateStepPeriod = exports.DateStepPeriod || (exports.DateStepPeriod = {})); +/** + * The option for specifying which values to include for filtering. + */ +var FilterNullOption; +(function (FilterNullOption) { + FilterNullOption["NullValues"] = "nullvalues"; + FilterNullOption["NonNullValues"] = "nonnullvalues"; + FilterNullOption["AllValues"] = "allvalues"; +})(FilterNullOption = exports.FilterNullOption || (exports.FilterNullOption = {})); +/** + * The type of filter domain + */ +var FilterDomainType; +(function (FilterDomainType) { + FilterDomainType["Relevant"] = "relevant"; + FilterDomainType["Database"] = "database"; +})(FilterDomainType = exports.FilterDomainType || (exports.FilterDomainType = {})); +/** + * Internal enum for specifying the selection type for select marks api. + */ +var SelectionUpdateType; +(function (SelectionUpdateType) { + SelectionUpdateType["Replace"] = "select-replace"; + SelectionUpdateType["Add"] = "select-add"; + SelectionUpdateType["Remove"] = "select-remove"; +})(SelectionUpdateType = exports.SelectionUpdateType || (exports.SelectionUpdateType = {})); +/** + * Internal enum for specifying the select option for the select tuples api. + */ +var SelectOptions; +(function (SelectOptions) { + SelectOptions["Simple"] = "select-options-simple"; + SelectOptions["Toggle"] = "select-options-toggle"; + SelectOptions["Menu"] = "select-options-menu"; + SelectOptions["Range"] = "select-options-range"; + SelectOptions["Search"] = "select-options-search"; +})(SelectOptions = exports.SelectOptions || (exports.SelectOptions = {})); +/** + * Internal enum for specifying the included values type for range selection. + */ +var QuantitativeIncludedValues; +(function (QuantitativeIncludedValues) { + QuantitativeIncludedValues["IncludeNull"] = "include-null"; + QuantitativeIncludedValues["IncludeNonNull"] = "include-non-null"; + QuantitativeIncludedValues["IncludeAll"] = "include-all"; +})(QuantitativeIncludedValues = exports.QuantitativeIncludedValues || (exports.QuantitativeIncludedValues = {})); +/** + * Internal enum for specifying a hierarchical level selection state. + */ +var HierarchicalLevelSelectionState; +(function (HierarchicalLevelSelectionState) { + HierarchicalLevelSelectionState["AllSelected"] = "all-selected"; + HierarchicalLevelSelectionState["NoneSelected"] = "none-selected"; + HierarchicalLevelSelectionState["SomeSelected"] = "some-selected"; + HierarchicalLevelSelectionState["UnknownSelected"] = "unknown-selected"; +})(HierarchicalLevelSelectionState = exports.HierarchicalLevelSelectionState || (exports.HierarchicalLevelSelectionState = {})); +/** + * Type of mark for a given marks card in a viz. + */ +var MarkType; +(function (MarkType) { + MarkType["Bar"] = "bar"; + MarkType["Line"] = "line"; + MarkType["Area"] = "area"; + MarkType["Square"] = "square"; + MarkType["Circle"] = "circle"; + MarkType["Shape"] = "shape"; + MarkType["Text"] = "text"; + MarkType["Map"] = "map"; + MarkType["Pie"] = "pie"; + MarkType["GanttBar"] = "gantt-bar"; + MarkType["Polygon"] = "polygon"; + MarkType["Heatmap"] = "heatmap"; + MarkType["VizExtension"] = "viz-extension"; +})(MarkType = exports.MarkType || (exports.MarkType = {})); +/** + * Internal enum for specifying the type of filter + */ +var FilterType; +(function (FilterType) { + FilterType["Categorical"] = "categorical"; + FilterType["Range"] = "range"; + FilterType["RelativeDate"] = "relativeDate"; + FilterType["Hierarchical"] = "hierarchical"; +})(FilterType = exports.FilterType || (exports.FilterType = {})); +/** + * Internal enum for specifying the DateRangeType of a relative date filter + */ +var DateRangeType; +(function (DateRangeType) { + /** + * Refers to the last day, week, month, etc. of the date period. + */ + DateRangeType["Last"] = "last"; + /** + * Refers to the last N days, weeks, months, etc. of the date period. + */ + DateRangeType["LastN"] = "lastN"; + /** + * Refers to the next day, week, month, etc. of the date period. + */ + DateRangeType["Next"] = "next"; + /** + * Refers to the next N days, weeks, months, etc. of the date period. + */ + DateRangeType["NextN"] = "nextN"; + /** + * Refers to the current day, week, month, etc. of the date period. + */ + DateRangeType["Current"] = "current"; + /** + * Refers to everything up to and including the current day, week, month, etc. of the date period. + */ + DateRangeType["ToDate"] = "toDate"; +})(DateRangeType = exports.DateRangeType || (exports.DateRangeType = {})); +/** + * Used to determine if the launching of an extension dialog succeeded or failed. + */ +var ExtensionDialogResult; +(function (ExtensionDialogResult) { + ExtensionDialogResult["DialogAlreadyOpen"] = "dialog-already-open"; + ExtensionDialogResult["InvalidDomain"] = "invalid-domain"; + ExtensionDialogResult["Success"] = "success"; +})(ExtensionDialogResult = exports.ExtensionDialogResult || (exports.ExtensionDialogResult = {})); +/** + * Used to optimize the getSummaryData/getUnderlyingTableData results + * Mapped from external IncludeDataValuesOption + */ +var ApiShowDataTableFormat; +(function (ApiShowDataTableFormat) { + ApiShowDataTableFormat["NativeValuesOnly"] = "native-values-only"; + ApiShowDataTableFormat["FormattedValuesOnly"] = "formatted-values-only"; + ApiShowDataTableFormat["NativeAndFormattedValues"] = "native-and-formatted-values"; +})(ApiShowDataTableFormat = exports.ApiShowDataTableFormat || (exports.ApiShowDataTableFormat = {})); +/** + * Used to set page size for export layout options. + */ +var PageSizeOption; +(function (PageSizeOption) { + PageSizeOption["Letter"] = "letter"; + PageSizeOption["Legal"] = "legal"; + PageSizeOption["Note"] = "note"; + PageSizeOption["Folio"] = "folio"; + PageSizeOption["Tabloid"] = "tabloid"; + PageSizeOption["Ledger"] = "ledger"; + PageSizeOption["Statement"] = "statement"; + PageSizeOption["Executive"] = "executive"; + PageSizeOption["A3"] = "a3"; + PageSizeOption["A4"] = "a4"; + PageSizeOption["A5"] = "a5"; + PageSizeOption["B4"] = "b4"; + PageSizeOption["B5"] = "b5"; + PageSizeOption["Quarto"] = "quarto"; + PageSizeOption["Unspecified"] = "unspecified"; +})(PageSizeOption = exports.PageSizeOption || (exports.PageSizeOption = {})); +/** + * Used to set the page orientation mode for export layout options. + */ +var PageOrientation; +(function (PageOrientation) { + PageOrientation["Printer"] = "printer"; + PageOrientation["Portrait"] = "portrait"; + PageOrientation["Landscape"] = "landscape"; +})(PageOrientation = exports.PageOrientation || (exports.PageOrientation = {})); +/** + * Used to set scale mode for export layout options. + */ +var ScaleMode; +(function (ScaleMode) { + ScaleMode["ScaleAuto"] = "auto"; + ScaleMode["ScalePercentage"] = "percent"; + ScaleMode["ScaleFitPages"] = "fit-pages"; +})(ScaleMode = exports.ScaleMode || (exports.ScaleMode = {})); +/** + * Used by setFitAndScaleValues to scale percent values + */ +var PageScalingOption; +(function (PageScalingOption) { + PageScalingOption["ScalePctAuto"] = "auto"; + PageScalingOption["ScalePct400"] = "pct400"; + PageScalingOption["ScalePct200"] = "pct200"; + PageScalingOption["ScalePct100"] = "pct100"; + PageScalingOption["ScalePct90"] = "pct90"; + PageScalingOption["ScalePct80"] = "pct80"; + PageScalingOption["ScalePct75"] = "pct75"; + PageScalingOption["ScalePct60"] = "pct60"; + PageScalingOption["ScalePct50"] = "pct50"; + PageScalingOption["ScalePct25"] = "pct25"; +})(PageScalingOption = exports.PageScalingOption || (exports.PageScalingOption = {})); +/** + * Used by setFitAndScaleValues to scale fit page values + */ +var FitPages; +(function (FitPages) { + FitPages["FitOneHigh"] = "fit0x1"; + FitPages["FitTwoHigh"] = "fit0x2"; + FitPages["FitOneWide"] = "fit1x0"; + FitPages["FitTwoWide"] = "fit2x0"; +})(FitPages = exports.FitPages || (exports.FitPages = {})); +/** + * Used by getVisualSpecificationAsync + */ +var EncodingType; +(function (EncodingType) { + EncodingType["Color"] = "color"; + EncodingType["Size"] = "size"; + EncodingType["Label"] = "label"; + EncodingType["Detail"] = "detail"; + EncodingType["Tooltip"] = "tooltip"; + EncodingType["Shape"] = "shape"; + EncodingType["Path"] = "path"; + EncodingType["Angle"] = "angle"; + EncodingType["Geometry"] = "geometry"; + EncodingType["Custom"] = "custom"; +})(EncodingType = exports.EncodingType || (exports.EncodingType = {})); +var PulseTimeDimension; +(function (PulseTimeDimension) { + PulseTimeDimension["Today"] = "Today"; + PulseTimeDimension["Yesterday"] = "Yesterday"; + PulseTimeDimension["WeekToDate"] = "WeekToDate"; + PulseTimeDimension["LastWeek"] = "LastWeek"; + PulseTimeDimension["MonthToDate"] = "MonthToDate"; + PulseTimeDimension["LastMonth"] = "LastMonth"; + PulseTimeDimension["QuarterToDate"] = "QuarterToDate"; + PulseTimeDimension["LastQuarter"] = "LastQuarter"; + PulseTimeDimension["YearToDate"] = "YearToDate"; + PulseTimeDimension["LastYear"] = "LastYear"; +})(PulseTimeDimension = exports.PulseTimeDimension || (exports.PulseTimeDimension = {})); +var PulseErrorMessageVisibility; +(function (PulseErrorMessageVisibility) { + PulseErrorMessageVisibility["Visible"] = "visible"; + PulseErrorMessageVisibility["Hidden"] = "hidden"; + PulseErrorMessageVisibility["Suppressed"] = "suppressed"; +})(PulseErrorMessageVisibility = exports.PulseErrorMessageVisibility || (exports.PulseErrorMessageVisibility = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/contract/Notifications.js": +/*!*********************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/contract/Notifications.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var NotificationId; +(function (NotificationId) { + NotificationId["CustomMarkContextMenuClicked"] = "custom-mark-context-menu-clicked"; + NotificationId["ContextMenuClick"] = "context-menu-click"; + NotificationId["CustomViewRemoved"] = "custom-view-removed"; + NotificationId["CustomViewSaved"] = "custom-view-saved"; + NotificationId["CustomViewSetDefault"] = "custom-view-set-default"; + NotificationId["CustomViewsLoaded"] = "custom-views-loaded"; + NotificationId["DashboardLayoutChanged"] = "dashboard-layout-changed"; + NotificationId["EditButtonClicked"] = "edit-button-clicked"; + NotificationId["EditInDesktopButtonClicked"] = "edit-in-desktop-button-clicked"; + NotificationId["ExtensionDialogUpdate"] = "extension-dialog-update"; + NotificationId["ExtensionDialogMessage"] = "extension-dialog-message"; + NotificationId["FilterChanged"] = "filter-changed"; + NotificationId["FirstVizSizeKnown"] = "first-viz-size-known"; + NotificationId["FirstPulseMetricSizeKnown"] = "first-pulse-metric-size-known"; + NotificationId["ParameterChanged"] = "parameter-changed"; + NotificationId["PulseError"] = "pulse-error"; + NotificationId["PulseFiltersChanged"] = "pulse-filters-changed"; + NotificationId["PulseMetricSizeChanged"] = "pulse-metric-size-changed"; + NotificationId["PulseInsightDiscovered"] = "pulse-insight-discovered"; + NotificationId["PulseInteractive"] = "pulse-interactive"; + NotificationId["PulseTimeDimensionChanged"] = "pulse-time-dimension-changed"; + NotificationId["PulseUrlChanged"] = "pulse-url-changed"; + NotificationId["SelectedMarksChanged"] = "selected-marks-changed"; + NotificationId["SettingsChanged"] = "settings-changed"; + NotificationId["SummaryDataChanged"] = "summary-data-changed"; + NotificationId["TestConversionNotification"] = "test-conversion-notification"; + NotificationId["ToolbarStateChanged"] = "toolbar-state-changed"; + NotificationId["VizInteractive"] = "viz-interactive"; + NotificationId["AskDataInteractive"] = "ask-data-interactive"; + NotificationId["WorkbookReadyToClose"] = "workbook-ready-to-close"; + NotificationId["WorkbookFormattingChanged"] = "workbook-formatting-changed"; + NotificationId["WorkbookPublished"] = "workbook-published"; + NotificationId["WorkbookPublishedAs"] = "workbook-published-as"; + NotificationId["WorksheetFormattingChanged"] = "worksheet-formatting-changed"; + NotificationId["UrlAction"] = "url-action"; + NotificationId["TabSwitched"] = "tab-switched"; + NotificationId["StoryPointSwitched"] = "story-point-switched"; + NotificationId["ReadyToReceiveAuthToken"] = "ready-to-receive-auth-token"; +})(NotificationId = exports.NotificationId || (exports.NotificationId = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/contract/Parameters.js": +/*!******************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/contract/Parameters.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// PLEASE KEEP IN ALPHABETICAL ORDER. This helps with visually finding entries, knowing where to put +// new ones, and merge conflicts. +var ParameterId; +(function (ParameterId) { + ParameterId["ActiveTablesInfo"] = "active-tables-info"; + ParameterId["AnchorDate"] = "anchor-date"; + ParameterId["AnnotateEnum"] = "annotate-enum"; + ParameterId["AnnotationList"] = "annotation-list"; + ParameterId["ApplyWorksheetFormatting"] = "apply-worksheet-formatting"; + ParameterId["CategoricalDomain"] = "categorical-domain"; + ParameterId["ClickThroughEnabled"] = "click-through-enabled"; + ParameterId["Columns"] = "columns"; + ParameterId["ColumnsToInclude"] = "columns-to-include"; + ParameterId["ColumnsToIncludeById"] = "columns-to-include-by-id"; + ParameterId["ConnectionDescriptionSummaries"] = "connection-description-summaries"; + ParameterId["CurrentSheetType"] = "current-sheet-type"; + ParameterId["CustomView"] = "custom-view"; + ParameterId["CustomViewIsDefault"] = "custom-view-is-default"; + ParameterId["CustomViewIsPublic"] = "custom-view-is-public"; + ParameterId["CustomViewLuid"] = "custom-view-luid"; + ParameterId["CustomViewName"] = "custom-view-name"; + ParameterId["CustomViews"] = "custom-views"; + ParameterId["Dashboard"] = "dashboard"; + ParameterId["DashboardFilters"] = "dashboard-filters"; + ParameterId["DashboardName"] = "dashboard"; + ParameterId["DashboardObjectPositionAndSizeUpdate"] = "dashboard-object-position-and-size-update"; + ParameterId["DashboardObjectPositionAndSizeUpdateList"] = "dashboard-object-position-and-size-update-list"; + ParameterId["DataRowIndex"] = "data-row-index"; + ParameterId["DataSchema"] = "data-schema"; + ParameterId["DataSource"] = "data-source"; + ParameterId["DataSourceDataTable"] = "data-source-data-table"; + ParameterId["DataSourceId"] = "data-source-id"; + ParameterId["DataSourceName"] = "data-source-name"; + ParameterId["DataTable"] = "data-table"; + ParameterId["DataTableReader"] = "data-table-reader"; + ParameterId["DateRangeType"] = "date-range-type"; + ParameterId["DeleteCount"] = "delete-count"; + ParameterId["DeltaTimeMs"] = "delta-time-ms"; + ParameterId["DimValSelectionModels"] = "dimensionValueSelectionModels"; + ParameterId["DomainType"] = "domain-type"; + ParameterId["EmbeddingAbstractQuery"] = "embedding-abstract-query"; + ParameterId["EmbeddingBootstrapInfo"] = "embedding-bootstrap-info"; + ParameterId["EncodingType"] = "encoding-type"; + ParameterId["ExportCrosstabSheetMap"] = "export-crosstab-sheet-map"; + ParameterId["ExportFile"] = "export-file"; + ParameterId["ExportOriginUrl"] = "export-origin-url"; + ParameterId["ExportPdfOptions"] = "export-pdf-options"; + ParameterId["ExtensionBootstrapInfo"] = "extension-bootstrap-info"; + ParameterId["ExtensionContextMenuIds"] = "extension-context-menu-ids"; + ParameterId["ExtensionDialogH"] = "extension-dialog-height"; + ParameterId["ExtensionDialogMessage"] = "extension-dialog-message"; + ParameterId["ExtensionDialogPayload"] = "extension-dialog-payload"; + ParameterId["ExtensionDialogResult"] = "extension-dialog-result"; + ParameterId["ExtensionDialogStyle"] = "extension-dialog-style"; + ParameterId["ExtensionDialogUrl"] = "extension-dialog-url"; + ParameterId["ExtensionDialogW"] = "extension-dialog-width"; + ParameterId["ExtensionLocator"] = "extension-locator"; + ParameterId["ExtensionSettingsInfo"] = "extension-settings-info"; + ParameterId["ExtensionZoneId"] = "extension-zone-id"; + ParameterId["ExternalMenuDescription"] = "external-menu-description"; + ParameterId["ExternalMenuHeader"] = "external-menu-header"; + ParameterId["ExternalMenuItemDisplayName"] = "external-menu-item-display-name"; + ParameterId["ExternalMenuItemId"] = "external-menu-item-id"; + ParameterId["Field"] = "field"; + ParameterId["FieldCount"] = "field-count"; + ParameterId["FieldId"] = "field-id"; + ParameterId["FieldName"] = "field-name"; + ParameterId["FilterLevels"] = "filter-levels"; + ParameterId["FilterRangeMax"] = "filter-range-max"; + ParameterId["FilterRangeMin"] = "filter-range-min"; + ParameterId["FilterRangeNullOption"] = "filter-range-null-option"; + ParameterId["FilterUpdateType"] = "filter-update-type"; + ParameterId["FilterValues"] = "filter-values"; + ParameterId["FontNameListItems"] = "font-name-list-items"; + ParameterId["FormattedText"] = "formatted-text"; + ParameterId["FunctionName"] = "function-name"; + ParameterId["FromIndex"] = "from-index"; + ParameterId["HierValSelectionModels"] = "hierarchicalValueSelectionModels"; + ParameterId["HighlightedData"] = "highlighted-data"; + ParameterId["HoverTupleInteraction"] = "hover-tuple-interaction"; + ParameterId["IgnoreAliases"] = "ignore-aliases"; + ParameterId["IgnoreSelection"] = "ignore-selection"; + ParameterId["IncludeAllColumns"] = "include-all-columns"; + ParameterId["InvalidAggFieldName"] = "invalid-agg-field-name"; + ParameterId["InvalidDates"] = "invalid-dates"; + ParameterId["InvalidFieldCaption"] = "invalid-field-caption"; + ParameterId["InvalidFields"] = "invalid-fields"; + ParameterId["InvalidValues"] = "invalid-values"; + ParameterId["IsAnalyticsAssistantAvailable"] = "is-analytics-assistant-available"; + ParameterId["IsExcludeMode"] = "is-exclude"; + ParameterId["IsExtensionDialog"] = "is-extension-dialog"; + ParameterId["IsFromCalcDialog"] = "is-from-calc-dialog"; + ParameterId["JoinDescription"] = "join-description"; + ParameterId["LogicalTableId"] = "logical-table-id"; + ParameterId["LogicalTableInfoList"] = "logical-table-info-list"; + ParameterId["MarksCardIndex"] = "marks-card-index"; + ParameterId["MaxHeight"] = "max-height"; + ParameterId["MaxRows"] = "max-rows"; + ParameterId["MaxWidth"] = "max-width"; + ParameterId["MinHeight"] = "min-height"; + ParameterId["MinWidth"] = "min-width"; + ParameterId["PageRowCount"] = "page-row-count"; + ParameterId["ParameterCaption"] = "paremeter-caption"; + ParameterId["ParameterError"] = "parameter-error"; + ParameterId["ParameterFieldName"] = "parameter-field-name"; + ParameterId["ParameterInfo"] = "parameter-info"; + ParameterId["ParameterInfos"] = "parameter-infos"; + ParameterId["ParameterValue"] = "parameter-value"; + ParameterId["PeriodType"] = "period-type"; + ParameterId["PulseFieldName"] = "fieldName"; + ParameterId["PulseFieldNames"] = "fieldNames"; + ParameterId["PulseFilterDomainType"] = "domainType"; + ParameterId["PulseFilterDomainSearchTerm"] = "searchTerm"; + ParameterId["PulsePageSize"] = "pageSize"; + ParameterId["PulseNextPageToken"] = "nextPageToken"; + ParameterId["PulseFilters"] = "filters"; + ParameterId["PulseTimeDimension"] = "timeDimension"; + ParameterId["QuantitativeDomain"] = "quantitative-dmain"; + ParameterId["QuantRangeSelectionModels"] = "quantativeRangeSelectionModels"; + ParameterId["RangeN"] = "range-n"; + ParameterId["ReplaySpeed"] = "replay-speed"; + ParameterId["SelectedData"] = "selected-data"; + ParameterId["SelectedSheetNames"] = "selected-sheet-names"; + ParameterId["Selection"] = "selection"; + ParameterId["SelectionList"] = "selection-list"; + ParameterId["SelectionUpdateType"] = "selectionUpdateType"; + ParameterId["SelectTuplesInteraction"] = "select-tuples-interaction"; + ParameterId["SendNotifications"] = "send-notifications"; + ParameterId["SettingsValues"] = "settings-values"; + ParameterId["SharedFilterSheets"] = "shared-filter-sheets"; + ParameterId["SharedFiltersInfo"] = "shared-filters-info"; + ParameterId["SheetIdentifier"] = "sheet-identifier"; + ParameterId["SheetName"] = "sheet-name"; + ParameterId["SheetPath"] = "sheet-path"; + ParameterId["ShouldRefreshDS"] = "should-refresh-ds"; + ParameterId["ShowDataTableFormat"] = "show-data-table-format"; + ParameterId["StartIndex"] = "start-index"; + ParameterId["State"] = "state"; + ParameterId["StoryPointIndex"] = "story-point-index"; + ParameterId["StoryPointInfo"] = "story-point-info"; + ParameterId["SwitchToSheetName"] = "switch-to-sheet-name"; + ParameterId["TargetPoint"] = "target-point"; + ParameterId["TestConversionParameter"] = "test-conversion-parameter"; + ParameterId["Text"] = "formatted-text"; + ParameterId["ToIndex"] = "to-index"; + ParameterId["TooltipContext"] = "tooltip-context"; + ParameterId["TooltipTextRequest"] = "tooltip-text-request"; + ParameterId["TooltipText"] = "tooltip-text"; + ParameterId["UnderlyingDataTable"] = "underlying-data-table"; + ParameterId["UnderlyingSummaryDataTable"] = "underlying-summary-data-table"; + ParameterId["Url"] = "url"; + ParameterId["UseTabDelimiters"] = "use-tab-delimiters"; + ParameterId["ViewDataTableCacheId"] = "view-data-table-cache-id"; + ParameterId["ViewDataTableId"] = "view-data-table-id"; + ParameterId["VisualId"] = "visual-id"; + ParameterId["VisualSpecification"] = "visual-specification"; + ParameterId["VizAPIInputJson"] = "vizapi-input-json"; + ParameterId["VizAPIStateWithDataModel"] = "vizapi-state-with-data-model"; + ParameterId["VizAPIStateWarningMsg"] = "vizapi-state-warning-msg"; + ParameterId["VizAPISVG"] = "vizapi-svg"; + ParameterId["WorksheetName"] = "worksheet-name"; + ParameterId["WorksheetFilters"] = "worksheet-filters"; + ParameterId["ZoneIdsVisibilityMap"] = "zone-ids-visibility-map"; +})(ParameterId = exports.ParameterId || (exports.ParameterId = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/contract/Verbs.js": +/*!*************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/contract/Verbs.js ***! + \*************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// Declare this key type and export the NotificationId to make this behave like a string enum. +// +// PLEASE KEEP IN ALPHABETICAL ORDER. This helps with visually finding entries, knowing where to put +// new ones, and merge conflicts. +var VerbId; +(function (VerbId) { + VerbId["ActivateNextStoryPoint"] = "activate-next-story-point"; + VerbId["ActivatePreviousStoryPoint"] = "activate-previous-story-point"; + VerbId["ActivateSheet"] = "activateSheet"; + VerbId["ActivateStoryPoint"] = "activate-story-point"; + VerbId["AddMarksCardFields"] = "add-marks-card-fields"; + VerbId["AppendExternalMenuItem"] = "append-external-menu-item"; + VerbId["ApplyCategoricalFilter"] = "categorical-filter"; + VerbId["ApplyPulseFilters"] = "apply-pulse-filters"; + VerbId["ApplyPulseTimeDimension"] = "apply-pulse-time-dimension"; + VerbId["ApplyRangeFilter"] = "range-filter"; + VerbId["ApplyRelativeDateFilter"] = "apply-relative-date-Filter"; + VerbId["Authenticate"] = "authenticate"; + VerbId["BlockExtension"] = "block-extension"; + VerbId["ChangeParameterValue"] = "change-parameter-value"; + VerbId["ChangeSharedFilter"] = "change-shared-filter"; + VerbId["ClearAllPulseFilters"] = "clear-all-pulse-filters"; + VerbId["ClearFilter"] = "clear-filter"; + VerbId["ClearPulseFilters"] = "clear-pulse-filters"; + VerbId["ClearSelectedMarks"] = "clear-selected-marks"; + VerbId["CloseDialog"] = "close-dialog"; + VerbId["CreateAnnotation"] = "create-annotation"; + VerbId["DashboardCategoricalFilter"] = "dashboard-categorical-filter"; + VerbId["DisplayDialog"] = "display-dialog"; + VerbId["DownloadWorkbook"] = "download-workbook"; + VerbId["EditAliasesDialog"] = "edit-aliases-dialog"; + VerbId["ExecuteExternalMenuItem"] = "execute-external-menu-item"; + VerbId["ExportCrosstab"] = "export-crosstab"; + VerbId["ExportCrosstabCsvDownload"] = "export-crosstab-csv-download"; + VerbId["ExportCrosstabExcelDownload"] = "export-crosstab-excel-download"; + VerbId["ExportData"] = "export-data"; + VerbId["ExportDataDownload"] = "export-data-download"; + VerbId["ExportImage"] = "export-image"; + VerbId["ExportPdf"] = "export-pdf"; + VerbId["ExportPdfDownload"] = "export-pdf-download"; + VerbId["ExportPowerpoint"] = "export-powerpoint"; + VerbId["ExportPowerpointDownload"] = "export-powerpoint-download"; + VerbId["FindParameter"] = "find-parameter"; + VerbId["GetActiveTables"] = "get-active-tables"; + VerbId["GetAllDataSources"] = "get-all-data-sources"; + VerbId["GetAnnotations"] = "get-annotations"; + VerbId["GetCategoricalDomain"] = "get-categorical-domain"; + VerbId["GetConnectionDescriptionSummaries"] = "get-connection-description-summaries"; + VerbId["GetCurrentSrc"] = "get-current-src"; + VerbId["GetCustomViews"] = "get-custom-views"; + VerbId["GetDashboardFilters"] = "get-dashboard-filters"; + VerbId["GetDataSource"] = "get-datasource"; + VerbId["GetDataSourceData"] = "get-datasource-data"; + VerbId["GetDataSources"] = "get-data-sources"; + VerbId["GetDataSummaryData"] = "get-summary-data"; + VerbId["GetDataSummaryDataReader"] = "get-summary-data-reader"; + VerbId["GetDataTableReaderPage"] = "get-data-table-reader-page"; + VerbId["GetEmbeddingAbstractQueryWithDataModel"] = "get-embedding-abstract-query-with-data-model"; + VerbId["GetEmbeddingClientInfo"] = "get-embedding-client-info"; + VerbId["GetVizStateWithDataModel"] = "get-viz-state-with-data-model"; + VerbId["GetExportCrosstabSheetMap"] = "get-export-crosstab-sheet-map"; + VerbId["GetExportPdfOptions"] = "get-export-pdf-options"; + VerbId["GetField"] = "get-field"; + VerbId["GetFieldAndDataSource"] = "get-field-and-datasource"; + VerbId["GetVisualSpecification"] = "get-visual-specification"; + VerbId["GetFilters"] = "get-filters"; + VerbId["GetFonts"] = "get-fonts"; + VerbId["GetHighlightedMarks"] = "get-highlighted-marks"; + VerbId["GetJoinDescription"] = "get-join-description"; + VerbId["GetLogicalTableData"] = "get-logical-table-data"; + VerbId["GetLogicalTableDataReader"] = "get-logical-table-data-reader"; + VerbId["GetLogicalTables"] = "get-logical-tables"; + VerbId["GetParametersForSheet"] = "get-parameters-for-sheet"; + VerbId["GetPulseCategoricalDomain"] = "get-pulse-categorical-domain"; + VerbId["GetPulseFilters"] = "get-pulse-filters"; + VerbId["GetPulseTimeDimension"] = "get-pulse-time-dimension"; + VerbId["GetRangeDomain"] = "get-range-domain"; + VerbId["GetSelectedMarks"] = "get-selected-marks"; + VerbId["GetSharedFilter"] = "get-shared-filter"; + VerbId["GetTooltipText"] = "get-tooltip-text"; + VerbId["GetUnderlyingData"] = "get-underlying-data"; + VerbId["GetUnderlyingTableData"] = "get-underlying-table-data"; + VerbId["GetUnderlyingTableDataReader"] = "get-underlying-table-data-reader"; + VerbId["GetUnderlyingTables"] = "get-underlying-tables"; + VerbId["HierarchicalFilter"] = "hierachical-filter"; + VerbId["InitializeExtension"] = "initialize-extension"; + VerbId["IsAnalyticsAssistantAvailable"] = "is-analytics-assistant-available"; + VerbId["LaunchAnalyticsAssistant"] = "launch-analytics-assistant"; + VerbId["MoveAndResizeZones"] = "move-and-resize-zones"; + VerbId["MoveMarksCardField"] = "move-marks-card-field"; + VerbId["RaiseLeaveMarkNavNotification"] = "raise-leave-mark-nav-notification"; + VerbId["RaiseHoverTupleNotification"] = "raise-hover-tuple-notification"; + VerbId["RaiseSelectTuplesNotification"] = "raise-select-tuples-notification"; + VerbId["Redo"] = "redo"; + VerbId["RefreshDataSource"] = "refresh-data-source"; + VerbId["ReleaseDataTableReader"] = "release-data-table-reader"; + VerbId["RemoveAnnotation"] = "remove-annotation"; + VerbId["RemoveCustomView"] = "remove-custom-view"; + VerbId["RemoveExternalMenuItem"] = "remove-external-menu-item"; + VerbId["RenameExternalMenu"] = "rename-external-menu"; + VerbId["ReplayAnimation"] = "replay-animation"; + VerbId["RevertStoryPoint"] = "revert-story-point"; + VerbId["RevertWorkbook"] = "revert-workbook"; + VerbId["SaveExtensionSettings"] = "save-extension-settings"; + VerbId["SaveWorkbookAsCustomView"] = "save-workbook-as-custom-view"; + VerbId["SelectByValue"] = "select-by-value"; + VerbId["SetActiveCustomViewAsDefault"] = "set-active-custom-view-as-default"; + VerbId["SetAutoUpdate"] = "set-auto-update"; + VerbId["SetClickThrough"] = "set-click-through"; + VerbId["SendDialogMessage"] = "send-dialog-message"; + VerbId["SetVizStateWithDataModel"] = "set-viz-state-with-data-model"; + VerbId["SetSheetSize"] = "set-sheet-size"; + VerbId["SetZoneVisibility"] = "set-zone-visibility"; + VerbId["Share"] = "share"; + VerbId["ShowCustomView"] = "show-custom-view"; + VerbId["SpliceMarksCardFields"] = "splice-marks-card-fields"; + VerbId["TestConversionVerb"] = "test-conversion-verb"; + VerbId["Undo"] = "undo"; + VerbId["UpdateCustomView"] = "update-custom-view"; + VerbId["VizAPI"] = "viz-api"; +})(VerbId = exports.VerbId || (exports.VerbId = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/interface/AskDataInterface.js": +/*!*************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/interface/AskDataInterface.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var AskDataOptionNames; +(function (AskDataOptionNames) { + AskDataOptionNames["token"] = "token"; + AskDataOptionNames["origin"] = "origin"; + AskDataOptionNames["showEmbed"] = "showEmbed"; + AskDataOptionNames["showPin"] = "showPin"; + AskDataOptionNames["showSave"] = "showSave"; + AskDataOptionNames["showShare"] = "showShare"; + AskDataOptionNames["debug"] = ":jsdebug"; + AskDataOptionNames["ApiID"] = ":apiID"; + AskDataOptionNames["ApiExternalVersion"] = ":apiExternalVersion"; + AskDataOptionNames["ApiInternalVersion"] = ":apiInternalVersion"; + AskDataOptionNames["AskDataWebComponent"] = ":askDataWebComponent"; +})(AskDataOptionNames = exports.AskDataOptionNames || (exports.AskDataOptionNames = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/interface/PulseInterface.js": +/*!***********************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/interface/PulseInterface.js ***! + \***********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var PulseOptionNames; +(function (PulseOptionNames) { + PulseOptionNames["embed"] = "embed"; + PulseOptionNames["token"] = "token"; + PulseOptionNames["disableExploreFilter"] = "disableExploreFilter"; + PulseOptionNames["layout"] = "embed_layout"; + PulseOptionNames["theme"] = "embed_theme"; + PulseOptionNames["ApiExternalVersion"] = ":apiExternalVersion"; + PulseOptionNames["ApiInternalVersion"] = ":apiInternalVersion"; + PulseOptionNames["PulseWebComponent"] = ":pulseWebComponent"; +})(PulseOptionNames = exports.PulseOptionNames || (exports.PulseOptionNames = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/interface/VqlInterface.js": +/*!*********************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/interface/VqlInterface.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * These strings were *manually copied* from the server, + * workgroup/src/silos/tableau-server/libraries/tab-controller-vizql/src/com/tableausoftware/ + * controller/vizql/constants/ParameterKeys.java#L9 + * should be exported instead + * parameters that vizql will accept in an embedding URL + **/ +var VqlParameterNames; +(function (VqlParameterNames) { + VqlParameterNames["ONE"] = "1"; + VqlParameterNames["ALERTS"] = ":alerts"; + VqlParameterNames["ALIAS"] = "alias"; + VqlParameterNames["ALLOW_DEFERRED_BOOTSTRAP"] = ":allowDeferredBootstrap"; + VqlParameterNames["ALLOW_AUTOGEN_WORKSHEET_PHONE_LAYOUTS"] = "allowAutogenWorksheetPhoneLayouts"; + VqlParameterNames["API_ID"] = ":apiID"; + VqlParameterNames["APP"] = ":app"; + VqlParameterNames["ATTACHMENT"] = "attachment"; + VqlParameterNames["IS_IPAD_APP"] = "app"; + VqlParameterNames["ANIMATE_TRANSITION"] = ":animate_transition"; + VqlParameterNames["ASCENDING"] = "ascending"; + VqlParameterNames["AUTHENTICATION"] = "authentication"; + VqlParameterNames["ATTRIBUTES"] = "attributes"; + VqlParameterNames["AUTHORING_SHEET"] = ":authSheet"; + VqlParameterNames["AXIS"] = "axis"; + VqlParameterNames["BOOTSTRAP_WHEN_NOTIFIED"] = ":bootstrapWhenNotified"; + VqlParameterNames["BROWSER_BACK_BUTTON_UNDO"] = ":browserBackButtonUndo"; + VqlParameterNames["BROWSER_RENDERING_ON"] = "isBrowserRendering"; + VqlParameterNames["BROWSER_RENDERING_THRESHOLD"] = "browserRenderingThreshold"; + VqlParameterNames["CHARSET"] = "charset"; + VqlParameterNames["CLIENT_DIMENSION"] = "clientDimension"; + VqlParameterNames["CLIENT_IP"] = "client_ip"; + VqlParameterNames["CLIENT_NUM"] = "clientNum"; + VqlParameterNames["COLON_EMBEDDED"] = ":embedded"; + VqlParameterNames["COLON_MOBILE"] = ":mobile"; + VqlParameterNames["COLON_DEEP_LINKING_DISABLED"] = ":deepLinkingDisabled"; + VqlParameterNames["COLON_WATERMARK"] = ":watermark"; + VqlParameterNames["COMMENTS"] = ":comments"; + VqlParameterNames["COMMENTING_ENABLED"] = ":commentingEnabled"; + VqlParameterNames["COMMENTING_MENTIONS_ENABLED"] = ":commentingMentions"; + VqlParameterNames["CONNECTION"] = "connection"; + VqlParameterNames["CREATED_BY_FEATURE"] = "createdByFeature"; + VqlParameterNames["CRYPTED_PASSWORD"] = "crypted"; + VqlParameterNames["CSSDEBUG"] = ":cssdebug"; + VqlParameterNames["CSV"] = "csv"; + VqlParameterNames["CUSTOM_VIEWS"] = ":customViews"; + VqlParameterNames["CV"] = ":cv"; + VqlParameterNames["CV_ID"] = "cvId"; + VqlParameterNames["DASHBOARD_PORT_SIZE"] = "dashboardPortSize"; + VqlParameterNames["DATA_DETAILS"] = ":dataDetails"; + VqlParameterNames["DATASOURCE"] = "datasource"; + VqlParameterNames["DEBUG"] = ":debug"; + VqlParameterNames["DELAY"] = ":delay"; + VqlParameterNames["DEPTH"] = "depth"; + VqlParameterNames["DEVICE_TYPE"] = ":device"; + VqlParameterNames["DEVICE_PIXEL_RATIO"] = "devicePixelRatio"; + VqlParameterNames["DEVICE_PREVIEW_MODE"] = ":devicepreviewmode"; + VqlParameterNames["DIMENSIONS"] = ":dimensions"; + VqlParameterNames["DISABLE_SHARED_SESSIONS"] = ":disable_shared_sessions"; + VqlParameterNames["DISABLE_URL_ACTIONS_POPUPS"] = ":disableUrlActionsPopups"; + VqlParameterNames["DIRECTION"] = "direction"; + VqlParameterNames["DISPLAY_OVERLAY"] = ":display_overlay"; + VqlParameterNames["DISPLAY_SHARE"] = ":display_share"; + VqlParameterNames["DISPLAY_SPINNER"] = ":display_spinner"; + VqlParameterNames["DISPLAY_STATIC_IMAGE"] = ":display_static_image"; + VqlParameterNames["DISPLAY_TABS"] = "display_tabs"; + VqlParameterNames["DISPLAY_VIEW_COUNT"] = ":display_count"; + VqlParameterNames["IGNORE_STICKY_SESSION"] = ":ignore_sticky_session"; + VqlParameterNames["INCREMENT_VIEW_COUNT"] = ":increment_view_count"; + VqlParameterNames["DOCMODE"] = "docmode"; + VqlParameterNames["DOMAIN"] = "domain"; + VqlParameterNames["DO_WORK"] = "do_work"; + VqlParameterNames["DX"] = "dx"; + VqlParameterNames["DY"] = "dy"; + VqlParameterNames["EDIT_DATA_ALERT"] = ":editDataAlert"; + VqlParameterNames["EMBED"] = ":embed"; + VqlParameterNames["EMBEDDED"] = "embedded"; + VqlParameterNames["ENCRYPTED"] = "encrypted"; + VqlParameterNames["API_EXTERNAL_VERSION"] = ":apiExternalVersion"; + VqlParameterNames["API_INTERNAL_VERSION"] = ":apiInternalVersion"; + VqlParameterNames["EXCLUDE"] = "exclude"; + VqlParameterNames["EXPORT_FORMAT"] = ":export_format"; + VqlParameterNames["FIELDNAME"] = "fieldname"; + VqlParameterNames["FIELD_NAME"] = "field_name"; + VqlParameterNames["FIELD_SEP"] = "field_sep"; + VqlParameterNames["FILE"] = "file"; + VqlParameterNames["FILTER_TILE_SIZE"] = "filterTileSize"; + VqlParameterNames["FN"] = "fn"; + VqlParameterNames["FOCUS"] = "focus"; + VqlParameterNames["FORCE_CACHE"] = "force_cache"; + VqlParameterNames["FORMAT"] = "format"; + VqlParameterNames["FORMAT_DATA_VALUE_LOCALLY"] = "formatDataValueLocally"; + VqlParameterNames["FROM_WG"] = ":from_wg"; + VqlParameterNames["GRAPHQL_DATABASE_ID"] = ":graphQLDatabaseId"; + VqlParameterNames["GRAPHQL_TABLE_ID"] = ":graphQLTableId"; + VqlParameterNames["GUID"] = ":guid"; + VqlParameterNames["H"] = "h"; + VqlParameterNames["HIDDEN"] = "hidden"; + VqlParameterNames["HIDE_CLOSE_BUTTON"] = ":hideCloseButton"; + VqlParameterNames["HIDE_EDIT_BUTTON"] = ":hideEditButton"; + VqlParameterNames["HIDE_EDIT_IN_DESKTOP_BUTTON"] = ":hideEditInDesktopButton"; + VqlParameterNames["HIGH_DPI"] = ":highdpi"; + VqlParameterNames["IMAGE_SIZE_LIMIT"] = "imageSizeLimit"; + VqlParameterNames["TRANSPARENT_LINE_MARKS_LIMIT"] = "transparentLineMarkLimit"; + VqlParameterNames["CLIENT_RENDER_PIXEL_LIMIT"] = "clientRenderPixelLimit"; + VqlParameterNames["IN"] = "in"; + VqlParameterNames["INSTANCE_ID"] = ":iid"; + VqlParameterNames["IS_GUEST_REDIRECT_FROM_VIZPORTAL"] = ":isGuestRedirectFromVizportal"; + VqlParameterNames["IS_MARK_ANIMATION_ENABLED"] = "isMarkAnimationEnabled"; + VqlParameterNames["IS_VIZPORTAL"] = ":isVizPortal"; + VqlParameterNames["INPUT_"] = "input_string"; + VqlParameterNames["JSDEBUG"] = ":jsdebug"; + VqlParameterNames["JSON"] = "json"; + VqlParameterNames["JSON_ONLY"] = ":jsonOnly"; + VqlParameterNames["KEEPFILE"] = "keepfile"; + VqlParameterNames["KEY"] = "key"; + VqlParameterNames["LANGUAGE"] = "language"; + VqlParameterNames["LANGUAGE_REQUESTED"] = ":language"; + VqlParameterNames["LINKTARGET"] = ":linktarget"; + VqlParameterNames["LOAD_ORDER_ID"] = ":loadOrderID"; + VqlParameterNames["LOAD_NEWEST_REVISION"] = ":loadNewestRevision"; + VqlParameterNames["LOCAL_PATHS"] = ":localPaths"; + VqlParameterNames["LOCALE"] = "locale"; + VqlParameterNames["LOCATION_ID"] = "locationid"; + VqlParameterNames["LOCATION_TYPE"] = "locationtype"; + VqlParameterNames["WORKBOOK_LOCALE"] = "workbookLocale"; + VqlParameterNames["MAXROWS"] = "maxrows"; + VqlParameterNames["MAX_AGE"] = "maxAge"; + VqlParameterNames["MAX_ROWS"] = "maxRows"; + VqlParameterNames["METHOD"] = "method"; + VqlParameterNames["MOBILE"] = "mobile"; + VqlParameterNames["MODIFIER"] = "modifier"; + VqlParameterNames["NAME"] = "name"; + VqlParameterNames["NAV_TYPE"] = "navType"; + VqlParameterNames["NAV_SRC"] = "navSrc"; + VqlParameterNames["NOATTACHMENT"] = "no-attachment"; + VqlParameterNames["NO_OVERWRITE"] = "no_overwrite"; + VqlParameterNames["OPEN_AUTHORING_IN_TOP_WINDOW"] = ":openAuthoringInTopWindow"; + VqlParameterNames["OPENID_HD"] = ":openid_hd"; + VqlParameterNames["OPENID_LOGIN_HINT"] = ":openid_login_hint"; + VqlParameterNames["OAUTHREQUEST"] = "oauthrequest"; + VqlParameterNames["OAUTH_CREDENTIAL_IDS"] = "oauth_credential_ids"; + VqlParameterNames["OFFLINE_MODE"] = ":offlinemode"; + VqlParameterNames["ORIGIN"] = ":origin"; + VqlParameterNames["OVERLAY"] = ":overlay"; + VqlParameterNames["P"] = "p"; + VqlParameterNames["PATH"] = "path"; + VqlParameterNames["PANE_RESOLVER_X"] = "paneResolverX"; + VqlParameterNames["PANE_RESOLVER_Y"] = "paneResolverY"; + VqlParameterNames["PARAM"] = "param"; + VqlParameterNames["PARENT_ID"] = "parent_id"; + VqlParameterNames["PASSWORD"] = "password"; + VqlParameterNames["PATTERN"] = "pattern"; + VqlParameterNames["PIXEL_RATIO"] = ":pixelratio"; + VqlParameterNames["PREFIX"] = ":prefix"; + VqlParameterNames["PREVIEW"] = ":preview"; + VqlParameterNames["PRIMARY_CONTENT_URL"] = "primary_content_url"; + VqlParameterNames["PROJECT"] = "project"; + VqlParameterNames["PROTOCOL"] = "protocol"; + VqlParameterNames["PSEUDO"] = ":pseudo"; + VqlParameterNames["QUERY"] = "query"; + VqlParameterNames["R"] = "r"; + VqlParameterNames["RANGE_TYPE"] = "range_type"; + VqlParameterNames["RECORD_SEP"] = "record_sep"; + VqlParameterNames["RECORD_CLIENT_PERFORMANCE"] = ":record_client_performance"; + VqlParameterNames["RECORD_PERFORMANCE"] = ":record_performance"; + VqlParameterNames["RECOVER_OLD_SESSION_ID"] = ":recover_old_session_id"; + VqlParameterNames["RECOVER_SESSION_STATE_TICKETS"] = ":recover_session_state_tickets"; + VqlParameterNames["REFRESH"] = ":refresh"; + VqlParameterNames["REFRESHUNMODIFIED"] = ":refreshunmodified"; + VqlParameterNames["REGION"] = "region"; + VqlParameterNames["RELOAD_ON_CUSTOM_VIEW_SAVE"] = ":reloadOnCustomViewSave"; + VqlParameterNames["RENDER"] = ":render"; + VqlParameterNames["RENDER_MAPS_CLIENT_SIDE"] = "renderMapsClientSide"; + VqlParameterNames["RETRY"] = ":retry"; + VqlParameterNames["REUSE"] = "reuse"; + VqlParameterNames["REUSE_FOREVER"] = "reuse_forever"; + VqlParameterNames["REVERT"] = ":revert"; + VqlParameterNames["SAVE_DB_PASSWORDS"] = "save_db_passwords"; + VqlParameterNames["SELECT_X"] = "select_x"; + VqlParameterNames["SELECT_Y"] = "select_y"; + VqlParameterNames["SESSION_FEATURE_PREFIX"] = ":ff_"; + VqlParameterNames["SESSION_FLAGS"] = ":session_feature_flags"; + VqlParameterNames["SHARE_BUTTON"] = "share_button"; + VqlParameterNames["SHEET_ID"] = "sheet_id"; + VqlParameterNames["SHARED"] = "shared"; + VqlParameterNames["SHOWALL"] = "showall"; + VqlParameterNames["SHOW_APP_BANNER"] = ":showAppBanner"; + VqlParameterNames["SHOW_ASK_DATA"] = ":showAskData"; + VqlParameterNames["SHOW_PARAMS"] = "showParams"; + VqlParameterNames["SHOW_SHARE_OPTIONS"] = ":showShareOptions"; + VqlParameterNames["SIZE"] = ":size"; + VqlParameterNames["SOURCE"] = "source"; + VqlParameterNames["STATE"] = "state"; + VqlParameterNames["STICKY_SESSION_KEY"] = "stickySessionKey"; + VqlParameterNames["SUBSCRIPTIONS"] = ":subscriptions"; + VqlParameterNames["SUMMARY"] = "summary"; + VqlParameterNames["SUPPRESS_DEFAULT_EDIT_BEHAVIOR"] = ":suppressDefaultEditBehavior"; + VqlParameterNames["SYNC_SESSION"] = ":sync_session"; + VqlParameterNames["SYNC_SESSION_STATE"] = "sync_session_state"; + VqlParameterNames["TABS"] = ":tabs"; + VqlParameterNames["TARGET"] = "target"; + VqlParameterNames["TARGET_SITE"] = "target_site"; + VqlParameterNames["TOOLBAR"] = ":toolbar"; + VqlParameterNames["TOOLTIP"] = ":tooltip"; + VqlParameterNames["TS"] = "ts"; + VqlParameterNames["UNDERLYING_TABLE_ID"] = "underlying_table_id"; + VqlParameterNames["UNDERLYING_TABLE_CAPTION"] = "underlying_table_caption"; + VqlParameterNames["UPDATE_TYPE"] = "update_type"; + VqlParameterNames["USE_GUEST"] = ":useGuest"; + VqlParameterNames["USE_INLINE_IMAGES"] = "use_inline_images"; + VqlParameterNames["USERAGENT"] = "useragent"; + VqlParameterNames["USERNAME"] = "username"; + VqlParameterNames["VALUE"] = "value"; + VqlParameterNames["VERBOSE_MODE"] = "verboseMode"; + VqlParameterNames["VIEW_ID"] = "views_id"; + VqlParameterNames["VIZ_SNAPSHOT_ID"] = "viz_snapshot_id"; + VqlParameterNames["VW"] = ":vw"; + VqlParameterNames["W"] = "w"; + VqlParameterNames["WORKSHEET_PORT_SIZE"] = "worksheetPortSize"; + VqlParameterNames["WATERMARK"] = "watermark"; + VqlParameterNames["WATERMARK_MARGIN"] = ":watermark_margin"; + VqlParameterNames["WB"] = ":wb"; + VqlParameterNames["WHICH"] = "which"; + VqlParameterNames["X"] = "x"; + VqlParameterNames["Y"] = "y"; + VqlParameterNames["ZID"] = "zid"; + VqlParameterNames["ZONE_ID"] = "zone_id"; + VqlParameterNames["KEYCHAIN_VERSION"] = "keychain_version"; + VqlParameterNames["DATASOURCE_ID"] = "datasource_id"; + VqlParameterNames["DATASOURCE_NAME"] = "datasource_name"; + VqlParameterNames["LENS_ID"] = "lens_id"; + VqlParameterNames["WIDTH"] = "width"; + VqlParameterNames["HEIGHT"] = "height"; + // Default Layout params + VqlParameterNames["LAYOUT_VIEWS"] = "views"; + VqlParameterNames["LAYOUT_MENUS"] = "menus"; + VqlParameterNames["LAYOUT_GEOMETRY"] = "geometry"; + VqlParameterNames["LAYOUT_PAGES"] = "pages"; + VqlParameterNames["LAYOUT_CACHEURL"] = "cacheurl"; + VqlParameterNames["LAYOUT_SHEET"] = "sheet"; + VqlParameterNames["LAYOUT_DEPTH"] = "depth"; +})(VqlParameterNames || (VqlParameterNames = {})); +/** + * parameters that are only relevant when working with Tableau Public + * maybe not really necessry to split them out + */ +var PublicParameterNames; +(function (PublicParameterNames) { + PublicParameterNames["SHOW_VIZ_HOME"] = ":showVizHome"; + // display view count +})(PublicParameterNames || (PublicParameterNames = {})); +/** + * Map the parameter names as used in the url to what we call them publicly in the embedding library. + * The only parameters listed here should be the ones that get sent to vizql + * - this should match the interface at external-contract:VizInterfaces:VizSettings + */ +var VizOptionNames; +(function (VizOptionNames) { + // publicName = internalStringValue + VizOptionNames["Size"] = ":size"; + VizOptionNames["Embed"] = ":embed"; + VizOptionNames["ApiInternalVersion"] = ":apiInternalVersion"; + VizOptionNames["ApiExternalVersion"] = ":apiExternalVersion"; + VizOptionNames["ShowVizHome"] = ":showVizHome"; + VizOptionNames["Jsdebug"] = ":jsdebug"; + VizOptionNames["BootstrapWhenNotified"] = ":bootstrapWhenNotified"; + VizOptionNames["NavType"] = "navType"; + VizOptionNames["NavSrc"] = "navSrc"; + VizOptionNames["debug"] = ":jsdebug"; + VizOptionNames["ApiID"] = ":apiID"; + VizOptionNames["disableUrlActionsPopups"] = ":disableUrlActionsPopups"; + VizOptionNames["hideTabs"] = ":tabs"; + VizOptionNames["toolbar"] = ":toolbar"; + VizOptionNames["device"] = ":device"; + VizOptionNames["instanceIdToClone"] = ":iid"; + VizOptionNames["touchOptimize"] = "mobile"; + VizOptionNames["hideEditButton"] = ":hideEditButton"; + VizOptionNames["hideEditInDesktopButton"] = ":hideEditInDesktopButton"; + VizOptionNames["suppressDefaultEditBehavior"] = ":suppressDefaultEditBehavior"; + VizOptionNames["hideCloseButton"] = ":hideCloseButton"; +})(VizOptionNames = exports.VizOptionNames || (exports.VizOptionNames = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js": +/*!****************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js ***! + \****************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const guid = __webpack_require__(/*! guid */ "../../node_modules/guid/guid.js"); +const JsApiInternalContract_1 = __webpack_require__(/*! ../JsApiInternalContract */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const CrossFramePreparedMessage_1 = __webpack_require__(/*! ./CrossFramePreparedMessage */ "../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js"); +const MessageTypeChecks_1 = __webpack_require__(/*! ./MessageTypeChecks */ "../api-internal-contract-js/lib/src/messaging/MessageTypeChecks.js"); +const MessageTypes_1 = __webpack_require__(/*! ./interface/MessageTypes */ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js"); +/** + * The CrossFrameMessenger is the primary export from the api-messaging module. An instance of + * this class can be instantiated on both sides of a frame boundary to facilitate communication + * in both directions between the frames. This class implements both the dispatcher and the listener + * portions, but doesn't require callers to care about both. + */ +class CrossFrameMessenger { + /** + * Creates an instance of CrossFrameMessenger. If you would like to use the CrossFrameMessenger as a MessageListener, + * be sure to call StartListening and register message handlers. + * @param thisWindow The window object which the CrossFrameMessenger lives. An onMessage listener will be added here. + * @param [otherWindow] Optional otherWindow which messages will be posted to. + * If defined, incoming messages must originate from otherWindow to be passed on + * @param [otherWindowOrigin] The target origin which otherWindow must have in order to receive dispatched messages. + * This value will be sent as the targetOrigin of a postMessage + * (https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) + */ + constructor(thisWindow, otherWindow, otherWindowOrigin) { + this.thisWindow = thisWindow; + this.otherWindow = otherWindow; + this.otherWindowOrigin = otherWindowOrigin; + // Make sure to call StartListening + } + ///// MessageListener Implementation + startListening() { + // Check if we already are listening, if not, hook up a message listener + if (!this.unregisterFunction) { + const boundHandler = this.onMessageReceived.bind(this); + this.thisWindow.addEventListener('message', boundHandler, true); + this.unregisterFunction = () => this.thisWindow.removeEventListener('message', boundHandler, true); + } + } + stopListening() { + // Stop listening if we have started listening + if (this.unregisterFunction) { + this.unregisterFunction(); + this.unregisterFunction = undefined; + } + } + setInitializeMessageHandler(handler) { + this.initializeMessageHandler = handler; + } + setCommandResponseMessageHandler(handler) { + this.commandResponseMessageHandler = handler; + } + setCommandMessageHandler(handler) { + this.commandMessageHandler = handler; + } + setNotificationMessageHandler(handler) { + this.notificationMessageHandler = handler; + } + setHandshakeMessageHandler(handler) { + this.handshakeMessageHandler = handler; + } + ///// MessageDispatcher Implementation + /** + * @param apiVersion api-internal-contract-js version (exported in JsApiInternalConntract) + * @param crossFrameVersion crossframe messaging version (exported in JsApiInternalConntract) + * @param options additional options that can be passed at initialization (information about the version of + * external being used for example) + */ + prepareInitializationMessage(apiVersion, crossFrameVersion, options) { + const message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.Initialize, + crossFrameVersion: crossFrameVersion, + apiVersion: apiVersion, + options: options, + }; + return this.prepareMessage(message); + } + prepareCommandMessage(verbId, parameters) { + const message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.Command, + verbId: verbId, + parameters: parameters, + }; + return this.prepareMessage(message); + } + prepareCommandResponseMessage(commandGuid, data, error) { + const message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.CommandResponse, + commandGuid: commandGuid, + data: data, + error: error, + }; + if (error) { + // stringify error object to remove unserializable fields like functions and prevent serialization errors + message.error = JSON.parse(JSON.stringify(error)); + } + return this.prepareMessage(message); + } + prepareNotificationMessage(notificationId, data) { + const message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.Notification, + notificationId: notificationId, + data: data, + }; + return this.prepareMessage(message); + } + prepareAckMessage() { + const message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.Ack, + platformVersion: JsApiInternalContract_1.INTERNAL_CONTRACT_VERSION, + }; + return this.prepareMessage(message); + } + /** + * Prepares a pending message for sending and returns the prepared message + * + * @param msg The message to be sent to this.otherWindow + * @returns The prepared message + */ + prepareMessage(msg) { + if (!this.otherWindow || !this.otherWindowOrigin) { + throw 'Other window not initialized, cannot dispatch messages'; + } + const preparedMessage = new CrossFramePreparedMessage_1.CrossFramePreparedMessage(msg, this.otherWindow, this.otherWindowOrigin); + return preparedMessage; + } + /** + * Called when a message is received. Does some validation of the message, and then + * calls an appropriate message handler if one is defined + * + * @param event The incoming MessageEvent + */ + onMessageReceived(event) { + // If we have an otherWindow defined, make sure the message is coming from there + if (this.otherWindow && event.source !== this.otherWindow) { + return; + } + // Do some validation on event.data to make sure that we have received a real message + if (!event.data) { + return; + } + const message = event.data; + if (!MessageTypeChecks_1.isMessage(message)) { + return; + } + // Check the declared message type, validate the message, and call an appropriate hander if one exists + switch (message.msgType) { + case MessageTypes_1.MessageType.Initialize: { + if (!MessageTypeChecks_1.isInitMessage(message) || !this.initializeMessageHandler) { + return; + } + this.initializeMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.CommandResponse: { + if (!MessageTypeChecks_1.isCommandResponseMessage(message) || !this.commandResponseMessageHandler) { + return; + } + this.commandResponseMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.Command: { + if (!MessageTypeChecks_1.isCommandMessage(message) || !this.commandMessageHandler) { + return; + } + this.commandMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.Notification: { + if (!MessageTypeChecks_1.isNotificationMessage(message) || !this.notificationMessageHandler) { + return; + } + this.notificationMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.Handshake: { + if (!MessageTypeChecks_1.isHandshakeMessage(message) || !this.handshakeMessageHandler) { + return; + } + this.handshakeMessageHandler(message, event.source); + break; + } + default: + // Just ignore this since we don't know how to handle the message type + } + } + setOtherWindow(otherWindow) { + this.otherWindow = otherWindow; + } + setOtherWindowOrigin(origin) { + this.otherWindowOrigin = origin; + } +} +exports.CrossFrameMessenger = CrossFrameMessenger; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js": +/*!**********************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the PreparedMessage interface used to post messages between + * two frames using window.postMessage + */ +class CrossFramePreparedMessage { + /** + * Creates an instance of CrossFramePreparedMessage. + * @param _message The message to be sent + * @param _target The target window where the message will be sent + * @param _origin The targetOrigin where this message can be received + */ + constructor(_message, _target, _origin) { + this._message = _message; + this._target = _target; + this._origin = _origin; + } + get messageGuid() { + return this._message.msgGuid; + } + send() { + this._target.postMessage(this._message, this._origin); + return this; + } +} +exports.CrossFramePreparedMessage = CrossFramePreparedMessage; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/MessageTypeChecks.js": +/*!**************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/MessageTypeChecks.js ***! + \**************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const guid = __webpack_require__(/*! guid */ "../../node_modules/guid/guid.js"); +const Notifications_1 = __webpack_require__(/*! ../contract/Notifications */ "../api-internal-contract-js/lib/src/contract/Notifications.js"); +const MessageTypes_1 = __webpack_require__(/*! ./interface/MessageTypes */ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js"); +const expectedEmptyNotifications = new Set([ + Notifications_1.NotificationId.EditButtonClicked, + Notifications_1.NotificationId.EditInDesktopButtonClicked, + Notifications_1.NotificationId.WorkbookPublished, + Notifications_1.NotificationId.WorkbookReadyToClose, + Notifications_1.NotificationId.ReadyToReceiveAuthToken, +]); +/* tslint:disable no-any */ +function isMessage(data) { + if (!data) { + return false; + } + const message = data; + if (!message || !message.msgGuid || !message.msgType) { + return false; + } + if (!guid.isGuid(message.msgGuid)) { + return false; + } + if (typeof message.msgType !== 'string') { + return false; + } + const messageTypes = [ + MessageTypes_1.MessageType.Command, + MessageTypes_1.MessageType.CommandResponse, + MessageTypes_1.MessageType.Initialize, + MessageTypes_1.MessageType.Notification, + MessageTypes_1.MessageType.Handshake, + ]; + if (messageTypes.indexOf(message.msgType) < 0) { + return false; + } + return true; +} +exports.isMessage = isMessage; +function isVersion(versionNumber) { + if (!versionNumber) { + return false; + } + const v = versionNumber; + if (typeof v !== 'object') { + return false; + } + if (typeof v.fix !== 'number' || typeof v.minor !== 'number' || typeof v.major !== 'number') { + return false; + } + return true; +} +exports.isVersion = isVersion; +function isInitMessage(message) { + if (!isMessage(message)) { + return false; + } + const initMessage = message; + if (initMessage.msgType !== MessageTypes_1.MessageType.Initialize) { + return false; + } + if (!initMessage.apiVersion || !isVersion(initMessage.apiVersion)) { + return false; + } + if (!initMessage.crossFrameVersion || !isVersion(initMessage.crossFrameVersion)) { + return false; + } + return true; +} +exports.isInitMessage = isInitMessage; +function isCommandResponseMessage(message) { + if (!isMessage(message)) { + return false; + } + const crMessage = message; + if (crMessage.msgType !== MessageTypes_1.MessageType.CommandResponse) { + return false; + } + if (!guid.isGuid(crMessage.commandGuid)) { + return false; + } + if (!crMessage.data && !crMessage.error) { + return false; + } + return true; +} +exports.isCommandResponseMessage = isCommandResponseMessage; +function isCommandMessage(message) { + if (!isMessage(message)) { + return false; + } + const commandMessage = message; + if (commandMessage.msgType !== MessageTypes_1.MessageType.Command) { + return false; + } + if (!commandMessage.parameters || typeof commandMessage.parameters !== 'object') { + return false; + } + if (!commandMessage.verbId || typeof commandMessage.verbId !== 'string') { + return false; + } + return true; +} +exports.isCommandMessage = isCommandMessage; +function isNotificationMessage(message) { + if (!isMessage(message)) { + return false; + } + const notificationMessage = message; + if (notificationMessage.msgType !== MessageTypes_1.MessageType.Notification) { + return false; + } + if (!notificationMessage.data && !expectedEmptyNotifications.has(notificationMessage.notificationId)) { + return false; + } + if (!notificationMessage.notificationId || typeof notificationMessage.notificationId !== 'string') { + return false; + } + return true; +} +exports.isNotificationMessage = isNotificationMessage; +function isHandshakeMessage(message) { + if (!isMessage(message)) { + return false; + } + const handshakeMessage = message; + if (handshakeMessage.msgType !== MessageTypes_1.MessageType.Handshake) { + return false; + } + return true; +} +exports.isHandshakeMessage = isHandshakeMessage; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js": +/*!*******************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js ***! + \*******************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Enum defining the 4 different types of messages we have defined + */ +var MessageType; +(function (MessageType) { + MessageType["Initialize"] = "initialize"; + MessageType["Notification"] = "notification"; + MessageType["Command"] = "command"; + MessageType["CommandResponse"] = "command-response"; + MessageType["Handshake"] = "v-handshake"; + MessageType["Ack"] = "v-ack"; +})(MessageType = exports.MessageType || (exports.MessageType = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js": +/*!**********************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// tslint:disable:no-any +/** + * This version converter doesn't actually do anything but is useful for testing or when we have + * a matching platform and internal version number + */ +class IdentityVersionConverter { + upgradeExecuteCall(verb, parameters) { + return { + verb: verb, + parameters: parameters, + }; + } + downgradeExecuteReturn(executeResponse) { + return executeResponse; + } + downgradeNotification(notification) { + return notification; + } +} +exports.IdentityVersionConverter = IdentityVersionConverter; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js": +/*!**********************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// tslint:disable:no-any +/** + * The version converter is designed to allow the platform and external modules + * to seemlessly communicate over two different versions of the internal API. The only + * mode it supports is external's version <= platform's version. When executing + * commands, it is used to upgrade the external representation to what platform knows on the way in + * and downgrade the representations on the way out. Similarly for notifications, it can + * downgrade those on the way from platform to external. + */ +class StackingVersionConverter { + /** + * Creates a new instance of the StackingVersionConverter + * + * @param _externalMajorVersion The major version of the internal contract api-external-js is using + * @param _platformMajorVersion The major version of the internal contract the api-platform-js is using + * @param _upgradeExecuteTranslations Ordered list of the translations to perform when upgrading cmd parameters + * @param _downgradeExecuteTranslations Ordered list of downgrade translations to perform after a cmd + * @param _downgradeNotificationTranslations Ordered list of downgrade translations to perform on a notification + */ + constructor(_externalMajorVersion, _platformMajorVersion, _upgradeExecuteTranslations, _downgradeExecuteTranslations, _downgradeNotificationTranslations) { + this._externalMajorVersion = _externalMajorVersion; + this._platformMajorVersion = _platformMajorVersion; + this._upgradeExecuteTranslations = _upgradeExecuteTranslations; + this._downgradeExecuteTranslations = _downgradeExecuteTranslations; + this._downgradeNotificationTranslations = _downgradeNotificationTranslations; + if (this._externalMajorVersion > this._platformMajorVersion) { + throw new Error(`Cannot convert between external version ${this._externalMajorVersion} and ${this._platformMajorVersion}`); + } + } + /** + * Creates a new instance of the StackingVersionConverter + * + * @param _externalVersion The version of the internal contract api-external-js is using + * @param _platformVersion The version of the internal contract the api-platform-js is using + * @param _upgradeExecuteTranslations Ordered list of the translations to perform when upgrading cmd parameters + * @param _downgradeExecuteTranslations Ordered list of downgrade translations to perform after a cmd + * @param _downgradeNotificationTranslations Ordered list of downgrade translations to perform on a notification + */ + static fromData(externalVersion, platformVersion, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations) { + return new this(externalVersion.major, platformVersion.major, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations); + } + upgradeExecuteCall(verb, parameters) { + // Perform the upgrade of the verb and parameters to the level that platform is using + let upgraded = { verb: verb, parameters: parameters }; + for (const upgradeTranslation of this._upgradeExecuteTranslations) { + upgraded = upgradeTranslation(upgraded.verb, upgraded.parameters); + } + return upgraded; + } + downgradeExecuteReturn(executeResponse) { + // Downgrade the response to what the external module is expecting + let downgraded = executeResponse; + for (const downgradeTranslation of this._downgradeExecuteTranslations) { + downgraded = downgradeTranslation(downgraded); + } + return downgraded; + } + downgradeNotification(notification) { + // Downgrade the notification to what the external module is expecting + let downgraded = notification; + for (const downgradeTranslation of this._downgradeNotificationTranslations) { + downgraded = downgradeTranslation(downgraded); + } + return downgraded; + } +} +exports.StackingVersionConverter = StackingVersionConverter; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js": +/*!*********************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js ***! + \*********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const IdentityVersionConverter_1 = __webpack_require__(/*! ./IdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js"); +const StackingVersionConverter_1 = __webpack_require__(/*! ./StackingVersionConverter */ "../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js"); +const VersionTranslations_1 = __webpack_require__(/*! ./VersionTranslations */ "../api-internal-contract-js/lib/src/versioning/VersionTranslations.js"); +/** + * @returns true if lhs < rhs (ignoring fix number) + * @param lhs + * @param rhs + */ +function VersionLessThan(lhs, rhs) { + if (lhs.major > rhs.major) { + return false; + } + if (lhs.major < rhs.major) { + return true; + } + return lhs.minor < rhs.minor; +} +exports.VersionLessThan = VersionLessThan; +/** + * @returns true if lhs == rhs (ignoring fix number) + * @param lhs + * @param rhs + */ +function VersionEqualTo(lhs, rhs) { + return lhs.major === rhs.major && lhs.minor === rhs.minor; +} +exports.VersionEqualTo = VersionEqualTo; +// A mapping from an older client version of internal-contract to the current platform version of this contract. +// Each version bump can have an array of translations to perform in order. Notice that this is +// different than the major upgrades/downgrades above because it handles both major and minor version changes. +// Also please note: downgradeExecuteCall is handled on the client/external side rather than platform side. +// When updating the major or minor version of our internal-contract, you will need to update these data structures. +// * If there are translations to add, add them to the version to "upgrade from" or "downgrade to". +exports.ExecuteMinorUpgrades = { + 1: { + 9: [], + }, +}; +exports.ExecuteMinorDowngrades = { + 1: { + 5: [VersionTranslations_1.DowngradeWorksheetNames], + 9: [], + 175: [VersionTranslations_1.DowngradeWorksheetFomatting175], + 182: [VersionTranslations_1.DowngradeExtensionEnvironmentContext], + }, +}; +exports.NotificationMinorDowngrades = { + 1: { + 9: [], + 10: [VersionTranslations_1.DowngradeFlipboardZoneID], + 175: [VersionTranslations_1.DowngradeWorksheetFomattingNotification175], + }, +}; +/** + * Creates a new InternalContractVersionConverter which has the ability to upgrade and downgrade the contract + * between the two versions, which are specified. If externalMajorVersion is greater than platformMajorVersion, + * an error will be thrown because we won't know how to do those conversions. + * This converter can handle both major and minor updates when the platform version is greater than external version. + * + * @param externalVersion VersionNumber of the internal api which the external module is using + * @param platformVersion VersionNumber of the internal api which the platform is using + */ +function CreateVersionConverter(externalVersion, platformVersion) { + return CreateVersionConverterWithTranslators(externalVersion, platformVersion, exports.ExecuteMinorUpgrades, exports.ExecuteMinorDowngrades, exports.NotificationMinorDowngrades); +} +exports.CreateVersionConverter = CreateVersionConverter; +/** + * Implementation of CreateVersionConverter. This function takes the upgrade, downgrade, and + * notification arrays so that all the logic can be tested. + * + * @param externalVersion VersionNumber of the internal api which the external module is using + * @param platformVersion VersionNumber of the internal api which the platform is using + * @param upgrades MajorMinorTranslators for upgrades + * @param downgrades MajorMinorTranslators for downgrades + * @param notificationDowngrades MajorMinorTranslators for notification downgrades + */ +function CreateVersionConverterWithTranslators(externalVersion, platformVersion, upgrades, downgrades, notificationDowngrades) { + const externalMajorVersion = externalVersion.major; + const externalMinorVersion = externalVersion.minor; + const platformMajorVersion = platformVersion.major; + if (externalMajorVersion > platformMajorVersion) { + throw new Error(`External version must be less than or equal to platform version. + externalMajorVersion=${externalMajorVersion} platformMajorVersion=${platformMajorVersion}`); + } + // If we are using the exact same versions (major.minor), just use the identity converter + if (VersionEqualTo(externalVersion, platformVersion)) { + return new IdentityVersionConverter_1.IdentityVersionConverter(); + } + // Walk the span between the versions we have here and collect the upgrade and downgrades necessary + const neededExecuteUpgrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, upgrades); + const neededExecuteDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, downgrades); + const neededNotificationDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, notificationDowngrades); + // We want to apply the downgrades in reverse order in case of dependencies between them + neededExecuteDowngrades.reverse(); + neededNotificationDowngrades.reverse(); + return StackingVersionConverter_1.StackingVersionConverter.fromData(externalVersion, platformVersion, neededExecuteUpgrades, neededExecuteDowngrades, neededNotificationDowngrades); +} +exports.CreateVersionConverterWithTranslators = CreateVersionConverterWithTranslators; +function GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, majorMinorTranslators) { + const neededTranslations = []; + for (let major = externalMajorVersion; major <= platformMajorVersion; major++) { + if (major in majorMinorTranslators) { + const start = major === externalMajorVersion ? externalMinorVersion : 0; + const maximumMinorVersion = GetMaximumMinorIndex(Object.keys(majorMinorTranslators[major])); + for (let minor = start; minor <= maximumMinorVersion; minor++) { + if (minor in majorMinorTranslators[major]) { + neededTranslations.push(...majorMinorTranslators[major][minor]); + } + } + } + } + return neededTranslations; +} +function GetMaximumMinorIndex(minorVersions) { + return minorVersions.map((a) => Number(a)).reduce((a, b) => (a > b ? a : b)); +} +exports.GetMaximumMinorIndex = GetMaximumMinorIndex; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/VersionTranslations.js": +/*!*****************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/VersionTranslations.js ***! + \*****************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const JsApiInternalContract_1 = __webpack_require__(/*! ../JsApiInternalContract */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const Notifications_1 = __webpack_require__(/*! ../contract/Notifications */ "../api-internal-contract-js/lib/src/contract/Notifications.js"); +// This is where we will start to define some of these translations. +// When modifying existing models, add the requisite conversion functions here, then use them +// in the VersionConverterFactory implementation. Import old versions as you would any other module +// 0 <-> Translations +// Uncomment this line to import from the V0 definition of the API +// import * as V0 from '@tableau-api-internal-contract-js_v0'; +// 1 <-> 2 Translations +// Uncomment this line to import from the V1 definition of the API +// import * as V1 from '@tableau-api-internal-contract-js_v1'; +function DowngradeWorksheetNames(executeResponse) { + // Fix the dashboard friendly name issue. The structures are compatible, + // so we still return the original reply, but we copy the SheetInfo.name + // into the DashboardZone.name, where v1 wants to find it. + const bootstrapInfo = executeResponse.result; + if (bootstrapInfo.extensionDashboardInfo !== undefined) { + bootstrapInfo.extensionDashboardInfo.zones.forEach((zone) => { + if (zone.sheetInfo) { + zone.name = zone.sheetInfo.name; + } + }); + } + return executeResponse; +} +exports.DowngradeWorksheetNames = DowngradeWorksheetNames; +function DowngradeFlipboardZoneID(notification) { + // Fix the FlipboardZoneId issue. Older external versions still check for flipboardZoneIDs. + // When running against a newer server, if flipboardZoneId is absent, set it to default(0). + if (notification.notificationId === Notifications_1.NotificationId.SelectedMarksChanged) { + const visualModel = notification.data; + if (visualModel.flipboardZoneID === undefined) { + visualModel.flipboardZoneID = 0; + } + } + return notification; +} +exports.DowngradeFlipboardZoneID = DowngradeFlipboardZoneID; +// Filter out formatting sheets that are specified in the classNames list +function DowngradeWorksheetFormatting(executeResponse, classNames) { + var _a, _b; + const bootstrapInfo = executeResponse.result; + if ((_b = (_a = bootstrapInfo) === null || _a === void 0 ? void 0 : _a.extensionWorksheetInfo) === null || _b === void 0 ? void 0 : _b.formatting) + bootstrapInfo.extensionWorksheetInfo.formatting.formattingSheets = + bootstrapInfo.extensionWorksheetInfo.formatting.formattingSheets.filter((x) => !classNames.includes(x.classNameKey)); + return executeResponse; +} +// Filter out formatting sheets that are specified in the classNames list +// Filter out formatting sheets that are specified in the classNames list +function DowngradeWorksheetFormattingNotification(notification, classNames) { + if (notification.notificationId === Notifications_1.NotificationId.WorksheetFormattingChanged) { + const formatting = notification.data; + notification.data = formatting.formattingSheets.filter((x) => !classNames.includes(x.classNameKey)); + } + return notification; +} +// We added new enum values for ClassNameKeys enum in 176. Need to filter them out if the client version is <176 +const ClassNameKeysToFilter175 = ["tableau-row-dividers" /* RowDividers */, "tableau-column-dividers" /* ColumnDividers */, "tableau-pane" /* Pane */]; +exports.DowngradeWorksheetFomatting175 = (response) => DowngradeWorksheetFormatting(response, ClassNameKeysToFilter175); +exports.DowngradeWorksheetFomattingNotification175 = (notification) => DowngradeWorksheetFormattingNotification(notification, ClassNameKeysToFilter175); +function DowngradeExtensionEnvironmentContext(executeResponse) { + // Fix the extension environment context issue. Replaces new enum values that go unrecognized + // by older extensions with their respective older enum values. + const bootstrapInfo = executeResponse.result; + if (bootstrapInfo.extensionEnvironment !== undefined) { + const context = bootstrapInfo.extensionEnvironment.extensionContext; + if (context === JsApiInternalContract_1.ExtensionContext.PublicWeb || context === JsApiInternalContract_1.ExtensionContext.Cloud) { + bootstrapInfo.extensionEnvironment.extensionContext = JsApiInternalContract_1.ExtensionContext.Server; + } + else if (context === JsApiInternalContract_1.ExtensionContext.PublicDesktop) { + bootstrapInfo.extensionEnvironment.extensionContext = JsApiInternalContract_1.ExtensionContext.Desktop; + } + } + return executeResponse; +} +exports.DowngradeExtensionEnvironmentContext = DowngradeExtensionEnvironmentContext; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js": +/*!***************************************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js ***! + \***************************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// tslint:disable:no-any +/** + * This version converter doesn't actually do anything but is useful for testing or when we have + * a matching platform and external version number + */ +class ExternalIdentityVersionConverter { + downgradeExecuteCall(verb, parameters) { + return { + verb: verb, + parameters: parameters, + }; + } + upgradeExecuteReturn(executeResponse, verb, parameters) { + return executeResponse; + } + upgradeNotification(notification) { + return notification; + } +} +exports.ExternalIdentityVersionConverter = ExternalIdentityVersionConverter; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js": +/*!***************************************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js ***! + \***************************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// tslint:disable:no-any +/** + * The version converter is designed to allow the platform and external modules + * to seemlessly communicate over two different versions of the internal API. This converter + * supports external's version(minor) >= platform's version(minor). When executing + * commands, it is used to downgrade the external representation to what platform knows on the way in + * and upgrade the representations on the way out. + */ +class ExternalStackingVersionConverter { + /** + * Creates a new instance of the StackingVersionConverter + * + * @param _externalVersion The version of the internal contract api-external-js is using + * @param _platformVersion The version of the internal contract the api-platform-js is using + * @param _downgradeExecuteCallTranslations Ordered list of the translations to perform when downgrading cmd parameters + * @param _upgradeExecuteReturnTranslations Ordered list of upgrade translations to perform after a cmd is executed + * @param _upgradeNotificationTranslations Ordered list of upgrade notfications to perform on events + */ + constructor(_externalVersion, _platformVersion, _downgradeExecuteCallTranslations, _upgradeExecuteReturnTranslations, _upgradeNotificationTranslations) { + this._externalVersion = _externalVersion; + this._platformVersion = _platformVersion; + this._downgradeExecuteCallTranslations = _downgradeExecuteCallTranslations; + this._upgradeExecuteReturnTranslations = _upgradeExecuteReturnTranslations; + this._upgradeNotificationTranslations = _upgradeNotificationTranslations; + if (this._externalVersion.major > this._platformVersion.major) { + throw new Error(`Cannot convert between external version ${this._externalVersion.major} + and ${this._platformVersion.major}`); + } + } + downgradeExecuteCall(verb, parameters) { + // Perform the downgrade of the verb and parameters to the level that platform is using + let downgraded = { verb: verb, parameters: parameters }; + for (const downgradeTranslation of this._downgradeExecuteCallTranslations) { + downgraded = downgradeTranslation(downgraded.verb, downgraded.parameters); + } + return downgraded; + } + upgradeExecuteReturn(executeResponse, verb, parameters) { + // Perform the upgrade of the response to what the external module is expecting + let upgraded = executeResponse; + for (const upgradeTranslation of this._upgradeExecuteReturnTranslations) { + upgraded = upgradeTranslation(upgraded, verb, parameters); + } + return upgraded; + } + upgradeNotification(notification) { + // Perform the upgrade of notification to what the external module is expecting + let upgraded = notification; + for (const upgradeNotification of this._upgradeNotificationTranslations) { + upgraded = upgradeNotification(upgraded); + } + return upgraded; + } +} +exports.ExternalStackingVersionConverter = ExternalStackingVersionConverter; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js": +/*!**************************************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js ***! + \**************************************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const VersionConverterFactory_1 = __webpack_require__(/*! ../VersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js"); +const ExternalIdentityVersionConverter_1 = __webpack_require__(/*! ./ExternalIdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js"); +const ExternalStackingVersionConverter_1 = __webpack_require__(/*! ./ExternalStackingVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js"); +// A mapping from the current client version of internal-contract to an older platform version of the contract. +// Each version bump can have an array of translations to perform in order. +// These translations handle downgradeExecuteCall and upgradeExecuteReturn and are meant to be called on the +// client/external side. +// When updating the major or minor version of our internal-contract, you will need to update these data structures. +// * If there are translations to add, add them to the version to 'upgrade from' or 'downgrade to'. +exports.ExecuteMinorDowngradeCallExternal = { + 1: { + 9: [], + }, +}; +exports.ExecuteMinorUpgradeReturnExternal = { + 1: { + 9: [], + }, +}; +exports.ExecuteMinorUpgradeNotification = { + 1: { + 9: [], + }, +}; +/** + * Creates a new ExternalContractVersionConverter which has the ability to upgrade and downgrade + * the contract between the two versions which are specified. If externalMajorVersion is less than + * platformMajorVersion, an ExternalIdentityVersionConverter will be returned. + * Handles upgrade/downgrade for both major and minor updates. + * + * @param externalVersion VersionNumber of the internal api which the external module is using + * @param platformVersion VersionNumber of the internal api which the platform is using + */ +function CreateExternalCompatibleVersionConverter(externalVersion, platformVersion) { + return CreateExternalCompatibleVersionConverterWithTranslators(externalVersion, platformVersion, exports.ExecuteMinorDowngradeCallExternal, exports.ExecuteMinorUpgradeReturnExternal, exports.ExecuteMinorUpgradeNotification); +} +exports.CreateExternalCompatibleVersionConverter = CreateExternalCompatibleVersionConverter; +/** + * Implementation of CreateExternalCompatibleVersionConverterWithTranslators. + * This function takes the upgrade, downgrade arrays so that all the logic can be tested. + * + * @param externalVersion VersionNumber of the internal contract which the external module is using + * @param platformVersion VersionNumber of the internal contract which the platform is using + * @param upgrades MajorMinorTranslators for response upgrades + * @param downgrades MajorMinorTranslators for execute call downgrades + */ +function CreateExternalCompatibleVersionConverterWithTranslators(externalVersion, platformVersion, downgrades, upgrades, upgradeNotifications) { + const externalMajorVersion = externalVersion.major; + const platformMajorVersion = platformVersion.major; + const platformMinorVersion = platformVersion.minor; + // This check is present in VersionConverterFactory. We throw the same error here as well. + // Hence we only need to check the minor versions for translations. + if (externalMajorVersion > platformMajorVersion) { + throw new Error(`External version must be less than or equal to platform version. + externalMajorVersion=${externalMajorVersion} platformMajorVersion=${platformMajorVersion}`); + } + if (externalMajorVersion < platformMajorVersion || VersionConverterFactory_1.VersionEqualTo(externalVersion, platformVersion)) { + return new ExternalIdentityVersionConverter_1.ExternalIdentityVersionConverter(); + } + // Walk the span between the versions we have here and collect the upgrade and downgrades necessary + const neededExecuteCallDowngrade = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, downgrades); + const neededExecuteReturnUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgrades); + const neededNotificationUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgradeNotifications); + // Reverse the downgrade calls, so that we start the downgrade from the external version to the platform version + neededExecuteCallDowngrade.reverse(); + return new ExternalStackingVersionConverter_1.ExternalStackingVersionConverter(externalVersion, platformVersion, neededExecuteCallDowngrade, neededExecuteReturnUpgrades, neededNotificationUpgrades); +} +exports.CreateExternalCompatibleVersionConverterWithTranslators = CreateExternalCompatibleVersionConverterWithTranslators; +function GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, majorMinorTranslators) { + const neededTranslations = []; + if (platformMajorVersion in majorMinorTranslators) { + const start = platformMinorVersion; + const maximumMinorVersion = VersionConverterFactory_1.GetMaximumMinorIndex(Object.keys(majorMinorTranslators[platformMajorVersion])); + for (let minor = start; minor <= maximumMinorVersion; minor++) { + if (minor in majorMinorTranslators[platformMajorVersion]) { + neededTranslations.push(...majorMinorTranslators[platformMajorVersion][minor]); + } + } + } + return neededTranslations; +} + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared.js": +/*!*********************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +// Export everything which had been previously in the api-shared module +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +var ApiVersion_1 = __webpack_require__(/*! ./ApiShared/ApiVersion */ "../api-shared-js/lib/src/ApiShared/ApiVersion.js"); +exports.ApiVersion = ApiVersion_1.ApiVersion; +__export(__webpack_require__(/*! ./ApiShared/CrossFrame/CrossFrameBootstrap */ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js")); +var CrossFrameDispatcher_1 = __webpack_require__(/*! ./ApiShared/CrossFrame/CrossFrameDispatcher */ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js"); +exports.CrossFrameDispatcher = CrossFrameDispatcher_1.CrossFrameDispatcher; +var DataSource_1 = __webpack_require__(/*! ./ApiShared/DataSource */ "../api-shared-js/lib/src/ApiShared/DataSource.js"); +exports.DataSource = DataSource_1.DataSource; +var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ./ApiShared/EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +exports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings; +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ./ApiShared/EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +exports.InternalToExternalEnumMappings = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings; +var EventListenerManager_1 = __webpack_require__(/*! ./ApiShared/EventListenerManager */ "../api-shared-js/lib/src/ApiShared/EventListenerManager.js"); +exports.EventListenerManager = EventListenerManager_1.EventListenerManager; +var Field_1 = __webpack_require__(/*! ./ApiShared/Field */ "../api-shared-js/lib/src/ApiShared/Field.js"); +exports.Field = Field_1.Field; +var CustomViewImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/CustomViewImpl */ "../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js"); +exports.CustomViewImpl = CustomViewImpl_1.CustomViewImpl; +var DashboardImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/DashboardImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js"); +exports.DashboardImpl = DashboardImpl_1.DashboardImpl; +var DashboardObjectImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/DashboardObjectImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js"); +exports.DashboardObjectImpl = DashboardObjectImpl_1.DashboardObjectImpl; +var DataSourceImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/DataSourceImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); +exports.DataSourceImpl = DataSourceImpl_1.DataSourceImpl; +var ParameterImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/ParameterImpl */ "../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js"); +exports.ParameterImpl = ParameterImpl_1.ParameterImpl; +var SheetImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +exports.SheetImpl = SheetImpl_1.SheetImpl; +var SheetInfoImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/SheetInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js"); +exports.SheetInfoImpl = SheetInfoImpl_1.SheetInfoImpl; +var SingleEventManagerImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/SingleEventManagerImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js"); +exports.SingleEventManagerImpl = SingleEventManagerImpl_1.SingleEventManagerImpl; +var StoryImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/StoryImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryImpl.js"); +exports.StoryImpl = StoryImpl_1.StoryImpl; +var StoryPointImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/StoryPointImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js"); +exports.StoryPointImpl = StoryPointImpl_1.StoryPointImpl; +var StoryPointInfoImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/StoryPointInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js"); +exports.StoryPointInfoImpl = StoryPointInfoImpl_1.StoryPointInfoImpl; +var WorkbookImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/WorkbookImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorkbookImpl.js"); +exports.WorkbookImpl = WorkbookImpl_1.WorkbookImpl; +var WorksheetImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/WorksheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js"); +exports.WorksheetImpl = WorksheetImpl_1.WorksheetImpl; +var Point_1 = __webpack_require__(/*! ./ApiShared/Point */ "../api-shared-js/lib/src/ApiShared/Point.js"); +exports.Point = Point_1.Point; +__export(__webpack_require__(/*! ./ApiShared/Services/RegisterAllSharedServices */ "../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js")); +__export(__webpack_require__(/*! ./ApiShared/Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js")); +var ClientInfoServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/ClientInfoServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js"); +exports.ClientInfoServiceImpl = ClientInfoServiceImpl_1.ClientInfoServiceImpl; +var NotificationServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/NotificationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js"); +exports.NotificationServiceImpl = NotificationServiceImpl_1.NotificationServiceImpl; +var NotificationServiceImplBase_1 = __webpack_require__(/*! ./ApiShared/Services/impl/NotificationServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js"); +exports.NotificationServiceImplBase = NotificationServiceImplBase_1.NotificationServiceImplBase; +exports.Registration = NotificationServiceImplBase_1.Registration; +var ServiceImplBase_1 = __webpack_require__(/*! ./ApiShared/Services/impl/ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +exports.ServiceImplBase = ServiceImplBase_1.ServiceImplBase; +var SizeServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/SizeServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js"); +exports.SizeServiceImpl = SizeServiceImpl_1.SizeServiceImpl; +var StoryActivationServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/StoryActivationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/StoryActivationServiceImpl.js"); +exports.StoryActivationServiceImpl = StoryActivationServiceImpl_1.StoryActivationServiceImpl; +var TableauError_1 = __webpack_require__(/*! ./ApiShared/TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +exports.TableauError = TableauError_1.TableauError; +var Deferred_1 = __webpack_require__(/*! ./ApiShared/Utils/Deferred */ "../api-shared-js/lib/src/ApiShared/Utils/Deferred.js"); +exports.Deferred = Deferred_1.Deferred; +var ErrorHelpers_1 = __webpack_require__(/*! ./ApiShared/Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +exports.ErrorHelpers = ErrorHelpers_1.ErrorHelpers; +var ExportHelpers_1 = __webpack_require__(/*! ./ApiShared/Utils/ExportHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js"); +exports.ExportHelpers = ExportHelpers_1.ExportHelpers; +var SheetUtils_1 = __webpack_require__(/*! ./ApiShared/Utils/SheetUtils */ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js"); +exports.SheetUtils = SheetUtils_1.SheetUtils; +var VersionNumber_1 = __webpack_require__(/*! ./ApiShared/VersionNumber */ "../api-shared-js/lib/src/ApiShared/VersionNumber.js"); +exports.VersionNumber = VersionNumber_1.VersionNumber; +var VersionedExternalApiDispatcher_1 = __webpack_require__(/*! ./VersionedExternalApiDispatcher */ "../api-shared-js/lib/src/VersionedExternalApiDispatcher.js"); +exports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher_1.VersionedExternalApiDispatcher; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/ApiVersion.js": +/*!********************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/ApiVersion.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const VersionNumber_1 = __webpack_require__(/*! ./VersionNumber */ "../api-shared-js/lib/src/ApiShared/VersionNumber.js"); +/** + * This is the singleton wrapper of VersionNumber + */ +class ApiVersion { + /** + * Gets the singleton instance of the version number. + */ + static get Instance() { + return ApiVersion._instance; + } + static SetVersionNumber(numString, isAlpha) { + ApiVersion._instance = new VersionNumber_1.VersionNumber(numString, isAlpha); + } +} +exports.ApiVersion = ApiVersion; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/ConnectionSummary.js": +/*!***************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/ConnectionSummary.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of a connection summary. + * This does not follow the Impl pattern as it is just a property bag. + */ +class ConnectionSummary { + constructor(_connectionInfo) { + this._connectionInfo = _connectionInfo; + } + get name() { + return this._connectionInfo.name; + } + get id() { + return this._connectionInfo.id; + } + get serverURI() { + return this._connectionInfo.serverURI; + } + get type() { + return this._connectionInfo.type; + } +} +exports.ConnectionSummary = ConnectionSummary; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js": +/*!****************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js ***! + \****************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const CrossFrameDispatcher_1 = __webpack_require__(/*! ./CrossFrameDispatcher */ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js"); +// Checks to see if we are running in an iframe currently: https://stackoverflow.com/a/326076/8821153 +function inIframe(thisWindow) { + try { + return thisWindow.self !== thisWindow.parent; + } + catch (e) { + return true; + } +} +/** + * Attempts to bootstrap the extension with a cross-frame parent where Tableau is running + * + * @param thisWindow The window which we are running in (injected for unit testing purposes) + * @param internalContractVersion The version number of the internal contract we are using + * @returns A promise which is doing the actual bootstrapping + */ +function doCrossFrameBootstrap(thisWindow, internalContractVersion, options) { + return new Promise((resolve, reject) => { + let parent; + // Normally, we are running inside an iframe. The exception to this is + // when we are running as an extension inside a dialog as part of the UINamespace + // functionality. In that case, we want the opener of this window rather than the parent. + if (!inIframe(thisWindow)) { + parent = thisWindow.opener; + } + else { + parent = thisWindow.parent; + } + if (!parent) { + reject('This extension is not running inside an iframe, desktop, or popup window. Initialization failed.'); + } + // Create the messenger which will do he communication between this window and our parent + // Since we don't know where we are running yet, we have to make this initial origin '*'. Once + // we have successfully initialized our extension, we will limit where we send messages + const messenger = new api_internal_contract_js_1.CrossFrameMessenger(thisWindow, parent, '*'); + // Prepare to send an initialization message to the parent frame + const initializationMessage = messenger.prepareInitializationMessage(internalContractVersion, api_internal_contract_js_1.MESSAGING_VERSION, options); + // When we receive a response back from the parent, we check to make sure the guids match and then we know + // that the parent is aware of us and we can start communicating + messenger.setCommandResponseMessageHandler(function (msg) { + // Verify we are getting a response from our initialize message + if (msg.commandGuid === initializationMessage.messageGuid) { + // The versioning of the dispatcher happens on the other side of our frame, and + // in a wrapper on this side. This one doesn't have any version knowledge. + const dispatcherFactory = () => new CrossFrameDispatcher_1.CrossFrameDispatcher(messenger); + resolve(dispatcherFactory); + } + }); + // Now that our handlers are ready, start listening and send our initialization message + messenger.startListening(); + initializationMessage.send(); + }); +} +exports.doCrossFrameBootstrap = doCrossFrameBootstrap; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js": +/*!*****************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js ***! + \*****************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +/** + * This is an implementation of the InternalApiDispatcher interface which functions by passing messages + * across a frame boundary. This is usually between the code where our javscript library has been included + * by a 3rd party dev and another frame where Tableau server has content. + */ +class CrossFrameDispatcher { + /** + * Creates an instance of CrossFrameDispatcher which will use the given messenger to communicate + * @param _messenger an instantiated and listening messenger object + */ + constructor(_messenger) { + this._messenger = _messenger; + // Collection of pending promises which are waiting to be resolved. When we receive a response back from the other frame, + // these promises can be either resolved or rejected + this._pendingPromises = {}; + // The collection of notification handlers which have been registered with this dispatcher + this._notificationHandlers = []; + if (!this._messenger) { + throw 'Missing messenger object'; + } + // Set up our message handlers. We only care about incoming notifications and command responses + this._messenger.setCommandResponseMessageHandler(this.onCommandResponse.bind(this)); + this._messenger.setNotificationMessageHandler(this.onNotification.bind(this)); + } + ////// Start InternalApiDispatcher implementation + execute(verb, parameters) { + // To execute a verb, we first prepare a command message and then define a promise. + const preparedMessage = this._messenger.prepareCommandMessage(verb, parameters); + const promise = new Promise((resolve, reject) => { + // Save off the pending promise by the messageGuid we are about to send. When a response is + // received, we'll be able to resolve this promise with the result + this._pendingPromises[preparedMessage.messageGuid] = { resolve: resolve, reject: reject }; + }); + // Actually send the message and return the promise + preparedMessage.send(); + return promise; + } + registerNotificationHandler(handler) { + this._notificationHandlers.push(handler); + } + unregisterNotificationHandler(handler) { + this._notificationHandlers = this._notificationHandlers.filter((h) => h !== handler); + } + ////// End InternalApiDispatcher implementation + onCommandResponse(response) { + // We got a command response, look through the pending promises and resolve + if (Object.keys(this._pendingPromises).indexOf(response.commandGuid) < 0) { + return; // We don't have any reference to this command, just return + } + const pendingPromise = this._pendingPromises[response.commandGuid]; + // If we have an error defined, reject the promise + if (response.error) { + pendingPromise.reject(response.error); + } + // If we have data defined, resolve the promise + if (response.data) { + pendingPromise.resolve({ result: response.data }); + } + // Clean up our pending promises object + delete this._pendingPromises[response.commandGuid]; + } + onNotification(notificationMessage) { + // Go through each notification handler we have registered and let them know a notification came in + for (const handler of this._notificationHandlers) { + try { + handler({ notificationId: notificationMessage.notificationId, data: notificationMessage.data }); + } + catch (e) { + // Incase of a IncompatibleVersionError, re-throw the error. + if (e.errorCode === api_external_contract_js_1.EmbeddingErrorCodes.IncompatibleVersionError) { + throw e; + } + // Else Ignore so if one handler errors, the other still get the message. + } + } + } +} +exports.CrossFrameDispatcher = CrossFrameDispatcher; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/DataSource.js": +/*!********************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/DataSource.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class DataSource { + constructor(_dataSourceImpl) { + this._dataSourceImpl = _dataSourceImpl; + } + get name() { + return this._dataSourceImpl.name; + } + get id() { + return this._dataSourceImpl.id; + } + get fields() { + return this._dataSourceImpl.fields; + } + get extractUpdateTime() { + return this._dataSourceImpl.extractUpdateTime; + } + get isExtract() { + return this._dataSourceImpl.isExtract; + } + get isPublished() { + return this._dataSourceImpl.isPublished; + } + publishedUrl() { + return this._dataSourceImpl.publishedUrl(); + } + refreshAsync() { + return this._dataSourceImpl.refreshAsync(); + } + getActiveTablesAsync() { + console.warn('DataSource.getActiveTablesAsync is deprecated. Please use DataSource.getLogicalTablesAsync.'); + return this._dataSourceImpl.getActiveTablesAsync(); + } + getConnectionSummariesAsync() { + return this._dataSourceImpl.getConnectionSummariesAsync(); + } + getUnderlyingDataAsync(options) { + console.warn('DataSource.getUnderlyingDataAsync is deprecated. Please use ' + + 'DataSource.getLogicalTablesAsync and DataSource.getLogicalTableDataAsync.'); + return this._dataSourceImpl.getUnderlyingDataAsync(options); + } + getLogicalTablesAsync() { + return this._dataSourceImpl.getLogicalTablesAsync(); + } + getLogicalTableDataAsync(logicalTableId, options) { + return this._dataSourceImpl.getLogicalTableDataAsync(logicalTableId, options); + } + getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options) { + return this._dataSourceImpl.getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options); + } +} +exports.DataSource = DataSource; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js": +/*!*****************************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js ***! + \*****************************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const EnumConverter_1 = __webpack_require__(/*! ../Utils/EnumConverter */ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); +/* tslint:disable:typedef - Disable this to make declaring these classes a bit easier */ +/** + * Maps enums used by the external-api-contract to the enums used + * in the internal-api-contract, which developers code against. + */ +class ExternalToInternalEnumMappings { +} +exports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings; +ExternalToInternalEnumMappings.filterDomainType = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.FilterDomainType.Relevant]: api_internal_contract_js_1.FilterDomainType.Relevant, + [api_external_contract_js_1.FilterDomainType.Database]: api_internal_contract_js_1.FilterDomainType.Database, +}); +ExternalToInternalEnumMappings.nullOptions = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.FilterNullOption.AllValues]: api_internal_contract_js_1.FilterNullOption.AllValues, + [api_external_contract_js_1.FilterNullOption.NonNullValues]: api_internal_contract_js_1.FilterNullOption.NonNullValues, + [api_external_contract_js_1.FilterNullOption.NullValues]: api_internal_contract_js_1.FilterNullOption.NullValues, +}); +ExternalToInternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.FilterUpdateType.Add]: api_internal_contract_js_1.FilterUpdateType.Add, + [api_external_contract_js_1.FilterUpdateType.All]: api_internal_contract_js_1.FilterUpdateType.All, + [api_external_contract_js_1.FilterUpdateType.Remove]: api_internal_contract_js_1.FilterUpdateType.Remove, + [api_external_contract_js_1.FilterUpdateType.Replace]: api_internal_contract_js_1.FilterUpdateType.Replace, +}); +ExternalToInternalEnumMappings.setVisibilityType = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.ZoneVisibilityType.Show]: true, + [api_external_contract_js_1.ZoneVisibilityType.Hide]: false, +}); +ExternalToInternalEnumMappings.setReplaySpeedType = new EnumConverter_1.EnumConverter({ + // these numbers are duration multipliers + // 2.0, for example, doubles the duration of the replay, slowing it down to 0.5x speed + [api_external_contract_js_1.ReplaySpeedType.Slow]: 2.0, + [api_external_contract_js_1.ReplaySpeedType.Normal]: 1.0, + [api_external_contract_js_1.ReplaySpeedType.Fast]: 0.5, +}); +ExternalToInternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.SheetType.Dashboard]: api_internal_contract_js_1.SheetType.Dashboard, + [api_external_contract_js_1.SheetType.Worksheet]: api_internal_contract_js_1.SheetType.Worksheet, + [api_external_contract_js_1.SheetType.Story]: api_internal_contract_js_1.SheetType.Story, +}); +ExternalToInternalEnumMappings.showDataTableFormatType = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.IncludeDataValuesOption.AllValues]: api_internal_contract_js_1.ApiShowDataTableFormat.NativeAndFormattedValues, + [api_external_contract_js_1.IncludeDataValuesOption.OnlyNativeValues]: api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly, + [api_external_contract_js_1.IncludeDataValuesOption.OnlyFormattedValues]: api_internal_contract_js_1.ApiShowDataTableFormat.FormattedValuesOnly, +}); +ExternalToInternalEnumMappings.periodType = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.PeriodType.Years]: api_internal_contract_js_1.DateStepPeriod.Years, + [api_external_contract_js_1.PeriodType.Quarters]: api_internal_contract_js_1.DateStepPeriod.Quarters, + [api_external_contract_js_1.PeriodType.Months]: api_internal_contract_js_1.DateStepPeriod.Months, + [api_external_contract_js_1.PeriodType.Weeks]: api_internal_contract_js_1.DateStepPeriod.Weeks, + [api_external_contract_js_1.PeriodType.Days]: api_internal_contract_js_1.DateStepPeriod.Days, + [api_external_contract_js_1.PeriodType.Hours]: api_internal_contract_js_1.DateStepPeriod.Hours, + [api_external_contract_js_1.PeriodType.Minutes]: api_internal_contract_js_1.DateStepPeriod.Minutes, + [api_external_contract_js_1.PeriodType.Seconds]: api_internal_contract_js_1.DateStepPeriod.Seconds, +}); +ExternalToInternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.DateRangeType.Last]: api_internal_contract_js_1.DateRangeType.Last, + [api_external_contract_js_1.DateRangeType.LastN]: api_internal_contract_js_1.DateRangeType.LastN, + [api_external_contract_js_1.DateRangeType.Next]: api_internal_contract_js_1.DateRangeType.Next, + [api_external_contract_js_1.DateRangeType.NextN]: api_internal_contract_js_1.DateRangeType.NextN, + [api_external_contract_js_1.DateRangeType.Current]: api_internal_contract_js_1.DateRangeType.Current, + [api_external_contract_js_1.DateRangeType.ToDate]: api_internal_contract_js_1.DateRangeType.ToDate, +}); +ExternalToInternalEnumMappings.dialogStyles = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.DialogStyle.Window]: api_internal_contract_js_1.DialogStyle.Window, + [api_external_contract_js_1.DialogStyle.Modal]: api_internal_contract_js_1.DialogStyle.Modal, + [api_external_contract_js_1.DialogStyle.Modeless]: api_internal_contract_js_1.DialogStyle.Modeless, +}); +/* tslint:enable:typedef */ + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js": +/*!*****************************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js ***! + \*****************************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const EnumConverter_1 = __webpack_require__(/*! ../Utils/EnumConverter */ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); +/* tslint:disable:typedef - Disable this to make declaring these classes a bit easier */ +/** + * Maps enums used by the internal-api-contract to the enums used + * in the external-api-contract, which developers code against. + */ +class InternalToExternalEnumMappings { +} +exports.InternalToExternalEnumMappings = InternalToExternalEnumMappings; +InternalToExternalEnumMappings.extensionContext = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.ExtensionContext.Desktop]: api_external_contract_js_1.ExtensionContext.Desktop, + [api_internal_contract_js_1.ExtensionContext.Server]: api_external_contract_js_1.ExtensionContext.Server, + [api_internal_contract_js_1.ExtensionContext.PublicWeb]: api_external_contract_js_1.ExtensionContext.PublicWeb, + [api_internal_contract_js_1.ExtensionContext.PublicDesktop]: api_external_contract_js_1.ExtensionContext.PublicDesktop, + [api_internal_contract_js_1.ExtensionContext.Cloud]: api_external_contract_js_1.ExtensionContext.Cloud, +}); +InternalToExternalEnumMappings.extensionMode = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.ExtensionMode.Authoring]: api_external_contract_js_1.ExtensionMode.Authoring, + [api_internal_contract_js_1.ExtensionMode.Viewing]: api_external_contract_js_1.ExtensionMode.Viewing, +}); +InternalToExternalEnumMappings.columnType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.ColumnType.Continuous]: api_external_contract_js_1.ColumnType.Continuous, + [api_internal_contract_js_1.ColumnType.Discrete]: api_external_contract_js_1.ColumnType.Discrete, + [api_internal_contract_js_1.ColumnType.Unknown]: api_external_contract_js_1.ColumnType.Unknown, +}); +InternalToExternalEnumMappings.fieldAggregationType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.FieldAggregationType.Attr]: api_external_contract_js_1.FieldAggregationType.Attr, + [api_internal_contract_js_1.FieldAggregationType.Avg]: api_external_contract_js_1.FieldAggregationType.Avg, + [api_internal_contract_js_1.FieldAggregationType.Collect]: api_external_contract_js_1.FieldAggregationType.Collect, + [api_internal_contract_js_1.FieldAggregationType.Count]: api_external_contract_js_1.FieldAggregationType.Count, + [api_internal_contract_js_1.FieldAggregationType.Countd]: api_external_contract_js_1.FieldAggregationType.Countd, + [api_internal_contract_js_1.FieldAggregationType.Day]: api_external_contract_js_1.FieldAggregationType.Day, + [api_internal_contract_js_1.FieldAggregationType.End]: api_external_contract_js_1.FieldAggregationType.End, + [api_internal_contract_js_1.FieldAggregationType.Hour]: api_external_contract_js_1.FieldAggregationType.Hour, + [api_internal_contract_js_1.FieldAggregationType.InOut]: api_external_contract_js_1.FieldAggregationType.InOut, + [api_internal_contract_js_1.FieldAggregationType.Kurtosis]: api_external_contract_js_1.FieldAggregationType.Kurtosis, + [api_internal_contract_js_1.FieldAggregationType.Max]: api_external_contract_js_1.FieldAggregationType.Max, + [api_internal_contract_js_1.FieldAggregationType.Mdy]: api_external_contract_js_1.FieldAggregationType.Mdy, + [api_internal_contract_js_1.FieldAggregationType.Median]: api_external_contract_js_1.FieldAggregationType.Median, + [api_internal_contract_js_1.FieldAggregationType.Min]: api_external_contract_js_1.FieldAggregationType.Min, + [api_internal_contract_js_1.FieldAggregationType.Minute]: api_external_contract_js_1.FieldAggregationType.Minute, + [api_internal_contract_js_1.FieldAggregationType.MonthYear]: api_external_contract_js_1.FieldAggregationType.MonthYear, + [api_internal_contract_js_1.FieldAggregationType.None]: api_external_contract_js_1.FieldAggregationType.None, + [api_internal_contract_js_1.FieldAggregationType.Qtr]: api_external_contract_js_1.FieldAggregationType.Qtr, + [api_internal_contract_js_1.FieldAggregationType.Quart1]: api_external_contract_js_1.FieldAggregationType.Quart1, + [api_internal_contract_js_1.FieldAggregationType.Quart3]: api_external_contract_js_1.FieldAggregationType.Quart3, + [api_internal_contract_js_1.FieldAggregationType.Second]: api_external_contract_js_1.FieldAggregationType.Second, + [api_internal_contract_js_1.FieldAggregationType.Skewness]: api_external_contract_js_1.FieldAggregationType.Skewness, + [api_internal_contract_js_1.FieldAggregationType.Stdev]: api_external_contract_js_1.FieldAggregationType.Stdev, + [api_internal_contract_js_1.FieldAggregationType.Stdevp]: api_external_contract_js_1.FieldAggregationType.Stdevp, + [api_internal_contract_js_1.FieldAggregationType.Sum]: api_external_contract_js_1.FieldAggregationType.Sum, + [api_internal_contract_js_1.FieldAggregationType.TruncDay]: api_external_contract_js_1.FieldAggregationType.TruncDay, + [api_internal_contract_js_1.FieldAggregationType.TruncHour]: api_external_contract_js_1.FieldAggregationType.TruncHour, + [api_internal_contract_js_1.FieldAggregationType.TruncMinute]: api_external_contract_js_1.FieldAggregationType.TruncMinute, + [api_internal_contract_js_1.FieldAggregationType.TruncMonth]: api_external_contract_js_1.FieldAggregationType.TruncMonth, + [api_internal_contract_js_1.FieldAggregationType.TruncQtr]: api_external_contract_js_1.FieldAggregationType.TruncQtr, + [api_internal_contract_js_1.FieldAggregationType.TruncSecond]: api_external_contract_js_1.FieldAggregationType.TruncSecond, + [api_internal_contract_js_1.FieldAggregationType.TruncWeek]: api_external_contract_js_1.FieldAggregationType.TruncWeek, + [api_internal_contract_js_1.FieldAggregationType.TruncYear]: api_external_contract_js_1.FieldAggregationType.TruncYear, + [api_internal_contract_js_1.FieldAggregationType.User]: api_external_contract_js_1.FieldAggregationType.User, + [api_internal_contract_js_1.FieldAggregationType.Var]: api_external_contract_js_1.FieldAggregationType.Var, + [api_internal_contract_js_1.FieldAggregationType.Varp]: api_external_contract_js_1.FieldAggregationType.Varp, + [api_internal_contract_js_1.FieldAggregationType.Week]: api_external_contract_js_1.FieldAggregationType.Week, + [api_internal_contract_js_1.FieldAggregationType.Weekday]: api_external_contract_js_1.FieldAggregationType.Weekday, + [api_internal_contract_js_1.FieldAggregationType.Year]: api_external_contract_js_1.FieldAggregationType.Year, +}); +InternalToExternalEnumMappings.fieldRoleType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.FieldRoleType.Dimension]: api_external_contract_js_1.FieldRoleType.Dimension, + [api_internal_contract_js_1.FieldRoleType.Measure]: api_external_contract_js_1.FieldRoleType.Measure, + [api_internal_contract_js_1.FieldRoleType.Unknown]: api_external_contract_js_1.FieldRoleType.Unknown, +}); +InternalToExternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.SheetType.Dashboard]: api_external_contract_js_1.SheetType.Dashboard, + [api_internal_contract_js_1.SheetType.Story]: api_external_contract_js_1.SheetType.Story, + [api_internal_contract_js_1.SheetType.Worksheet]: api_external_contract_js_1.SheetType.Worksheet, +}); +InternalToExternalEnumMappings.dashboardObjectType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.DashboardObjectType.Extension]: api_external_contract_js_1.DashboardObjectType.Extension, + [api_internal_contract_js_1.DashboardObjectType.Blank]: api_external_contract_js_1.DashboardObjectType.Blank, + [api_internal_contract_js_1.DashboardObjectType.Image]: api_external_contract_js_1.DashboardObjectType.Image, + [api_internal_contract_js_1.DashboardObjectType.Legend]: api_external_contract_js_1.DashboardObjectType.Legend, + [api_internal_contract_js_1.DashboardObjectType.PageFilter]: api_external_contract_js_1.DashboardObjectType.PageFilter, + [api_internal_contract_js_1.DashboardObjectType.ParameterControl]: api_external_contract_js_1.DashboardObjectType.ParameterControl, + [api_internal_contract_js_1.DashboardObjectType.QuickFilter]: api_external_contract_js_1.DashboardObjectType.QuickFilter, + [api_internal_contract_js_1.DashboardObjectType.Text]: api_external_contract_js_1.DashboardObjectType.Text, + [api_internal_contract_js_1.DashboardObjectType.Title]: api_external_contract_js_1.DashboardObjectType.Title, + [api_internal_contract_js_1.DashboardObjectType.WebPage]: api_external_contract_js_1.DashboardObjectType.WebPage, + [api_internal_contract_js_1.DashboardObjectType.Worksheet]: api_external_contract_js_1.DashboardObjectType.Worksheet, +}); +InternalToExternalEnumMappings.dataType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.DataType.Bool]: api_external_contract_js_1.DataType.Bool, + [api_internal_contract_js_1.DataType.Date]: api_external_contract_js_1.DataType.Date, + [api_internal_contract_js_1.DataType.DateTime]: api_external_contract_js_1.DataType.DateTime, + [api_internal_contract_js_1.DataType.Float]: api_external_contract_js_1.DataType.Float, + [api_internal_contract_js_1.DataType.Int]: api_external_contract_js_1.DataType.Int, + [api_internal_contract_js_1.DataType.Spatial]: api_external_contract_js_1.DataType.Spatial, + [api_internal_contract_js_1.DataType.String]: api_external_contract_js_1.DataType.String, +}); +InternalToExternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.FilterUpdateType.Add]: api_external_contract_js_1.FilterUpdateType.Add, + [api_internal_contract_js_1.FilterUpdateType.All]: api_external_contract_js_1.FilterUpdateType.All, + [api_internal_contract_js_1.FilterUpdateType.Remove]: api_external_contract_js_1.FilterUpdateType.Remove, + [api_internal_contract_js_1.FilterUpdateType.Replace]: api_external_contract_js_1.FilterUpdateType.Replace, +}); +InternalToExternalEnumMappings.allowableValues = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.DomainRestrictionType.All]: api_external_contract_js_1.ParameterValueType.All, + [api_internal_contract_js_1.DomainRestrictionType.List]: api_external_contract_js_1.ParameterValueType.List, + [api_internal_contract_js_1.DomainRestrictionType.Range]: api_external_contract_js_1.ParameterValueType.Range, +}); +InternalToExternalEnumMappings.dateStepPeriod = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.DateStepPeriod.Years]: api_external_contract_js_1.PeriodType.Years, + [api_internal_contract_js_1.DateStepPeriod.Quarters]: api_external_contract_js_1.PeriodType.Quarters, + [api_internal_contract_js_1.DateStepPeriod.Months]: api_external_contract_js_1.PeriodType.Months, + [api_internal_contract_js_1.DateStepPeriod.Weeks]: api_external_contract_js_1.PeriodType.Weeks, + [api_internal_contract_js_1.DateStepPeriod.Days]: api_external_contract_js_1.PeriodType.Days, + [api_internal_contract_js_1.DateStepPeriod.Hours]: api_external_contract_js_1.PeriodType.Hours, + [api_internal_contract_js_1.DateStepPeriod.Minutes]: api_external_contract_js_1.PeriodType.Minutes, + [api_internal_contract_js_1.DateStepPeriod.Seconds]: api_external_contract_js_1.PeriodType.Seconds, +}); +InternalToExternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.DateRangeType.Current]: api_external_contract_js_1.DateRangeType.Current, + [api_internal_contract_js_1.DateRangeType.Last]: api_external_contract_js_1.DateRangeType.Last, + [api_internal_contract_js_1.DateRangeType.LastN]: api_external_contract_js_1.DateRangeType.LastN, + [api_internal_contract_js_1.DateRangeType.Next]: api_external_contract_js_1.DateRangeType.Next, + [api_internal_contract_js_1.DateRangeType.NextN]: api_external_contract_js_1.DateRangeType.NextN, + [api_internal_contract_js_1.DateRangeType.ToDate]: api_external_contract_js_1.DateRangeType.ToDate, +}); +InternalToExternalEnumMappings.errorCode = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.ErrorCodes.INITIALIZATION_ERROR]: api_external_contract_js_1.ErrorCodes.InternalError, + [api_internal_contract_js_1.ErrorCodes.INTERNAL_ERROR]: api_external_contract_js_1.ErrorCodes.InternalError, + [api_internal_contract_js_1.ErrorCodes.MISSING_ENUM_MAPPING]: api_external_contract_js_1.ErrorCodes.InternalError, + [api_internal_contract_js_1.ErrorCodes.MISSING_PARAMETER]: api_external_contract_js_1.ErrorCodes.InternalError, + [api_internal_contract_js_1.ErrorCodes.PERMISSION_DENIED]: api_external_contract_js_1.ErrorCodes.InternalError, + [api_internal_contract_js_1.ErrorCodes.PRES_MODEL_PARSING_ERROR]: api_external_contract_js_1.ErrorCodes.InternalError, + [api_internal_contract_js_1.ErrorCodes.UNKNOWN_VERB_ID]: api_external_contract_js_1.ErrorCodes.InternalError, + [api_internal_contract_js_1.ErrorCodes.VERSION_NOT_CONFIGURED]: api_external_contract_js_1.ErrorCodes.APINotInitialized, + [api_internal_contract_js_1.ErrorCodes.VISIBILITY_ERROR]: api_external_contract_js_1.ErrorCodes.VisibilityError, +}, api_external_contract_js_1.ErrorCodes.InternalError); +InternalToExternalEnumMappings.filterType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.FilterType.Categorical]: api_external_contract_js_1.FilterType.Categorical, + [api_internal_contract_js_1.FilterType.Range]: api_external_contract_js_1.FilterType.Range, + [api_internal_contract_js_1.FilterType.RelativeDate]: api_external_contract_js_1.FilterType.RelativeDate, + [api_internal_contract_js_1.FilterType.Hierarchical]: api_external_contract_js_1.FilterType.Hierarchical, +}); +InternalToExternalEnumMappings.classNameKey = new EnumConverter_1.EnumConverter({ + ["tableau-dashboard-title" /* DashboardTitle */]: api_external_contract_js_1.ClassNameKey.DashboardTitle, + ["tableau-story-title" /* StoryTitle */]: api_external_contract_js_1.ClassNameKey.StoryTitle, + ["tableau-tooltip" /* Tooltip */]: api_external_contract_js_1.ClassNameKey.Tooltip, + ["tableau-worksheet" /* Worksheet */]: api_external_contract_js_1.ClassNameKey.Worksheet, + ["tableau-worksheet-title" /* WorksheetTitle */]: api_external_contract_js_1.ClassNameKey.WorksheetTitle, + ["tableau-pane" /* Pane */]: api_external_contract_js_1.ClassNameKey.Pane, + ["tableau-row-dividers" /* RowDividers */]: api_external_contract_js_1.ClassNameKey.RowDividers, + ["tableau-column-dividers" /* ColumnDividers */]: api_external_contract_js_1.ClassNameKey.ColumnDividers, + // Temporary until we fix 1317266 - Platform hasn't been updated currently because near branch is closed + ['dashboard-title']: api_external_contract_js_1.ClassNameKey.DashboardTitle, + ['story-title']: api_external_contract_js_1.ClassNameKey.StoryTitle, + ['tooltip']: api_external_contract_js_1.ClassNameKey.Tooltip, + ['worksheet']: api_external_contract_js_1.ClassNameKey.Worksheet, + ['worksheet-title']: api_external_contract_js_1.ClassNameKey.WorksheetTitle, + ['pane']: api_external_contract_js_1.ClassNameKey.Pane, + ['row-dividers']: api_external_contract_js_1.ClassNameKey.RowDividers, + ['column-dividers']: api_external_contract_js_1.ClassNameKey.ColumnDividers, +}); +InternalToExternalEnumMappings.hierarchicalLevelSelectionState = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.HierarchicalLevelSelectionState.AllSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.AllSelected, + [api_internal_contract_js_1.HierarchicalLevelSelectionState.NoneSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.NoneSelected, + [api_internal_contract_js_1.HierarchicalLevelSelectionState.SomeSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.SomeSelected, + [api_internal_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected, +}); +InternalToExternalEnumMappings.annotationType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.AnnotateEnum.Area]: api_external_contract_js_1.AnnotationType.Area, + [api_internal_contract_js_1.AnnotateEnum.Mark]: api_external_contract_js_1.AnnotationType.Mark, + [api_internal_contract_js_1.AnnotateEnum.Point]: api_external_contract_js_1.AnnotationType.Point, +}); +InternalToExternalEnumMappings.markType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.MarkType.Area]: api_external_contract_js_1.MarkType.Area, + [api_internal_contract_js_1.MarkType.Bar]: api_external_contract_js_1.MarkType.Bar, + [api_internal_contract_js_1.MarkType.Circle]: api_external_contract_js_1.MarkType.Circle, + [api_internal_contract_js_1.MarkType.GanttBar]: api_external_contract_js_1.MarkType.GanttBar, + [api_internal_contract_js_1.MarkType.Heatmap]: api_external_contract_js_1.MarkType.Heatmap, + [api_internal_contract_js_1.MarkType.Line]: api_external_contract_js_1.MarkType.Line, + [api_internal_contract_js_1.MarkType.Map]: api_external_contract_js_1.MarkType.Map, + [api_internal_contract_js_1.MarkType.Pie]: api_external_contract_js_1.MarkType.Pie, + [api_internal_contract_js_1.MarkType.Polygon]: api_external_contract_js_1.MarkType.Polygon, + [api_internal_contract_js_1.MarkType.Shape]: api_external_contract_js_1.MarkType.Shape, + [api_internal_contract_js_1.MarkType.Square]: api_external_contract_js_1.MarkType.Square, + [api_internal_contract_js_1.MarkType.Text]: api_external_contract_js_1.MarkType.Text, + [api_internal_contract_js_1.MarkType.VizExtension]: api_external_contract_js_1.MarkType.VizExtension, +}); +/* tslint:enable:typedef */ + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/EventListenerManager.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/EventListenerManager.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ./TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +/** + * Class designed to register and unregister handlers from a user. Only those events + * which are added via AddNewEventType will be supported by this instance + */ +class EventListenerManager { + constructor() { + this._eventListenerManagers = {}; + } + addEventListener(eventType, handler) { + if (!this._eventListenerManagers.hasOwnProperty(eventType)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedEventName, `Cannot add event, unsupported event type: ${eventType}`); + } + return this._eventListenerManagers[eventType].addEventListener(handler); + } + removeEventListener(eventType, handler) { + if (!this._eventListenerManagers.hasOwnProperty(eventType)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedEventName, `Cannot remove event, unsupported event type: ${eventType}`); + } + return this._eventListenerManagers[eventType].removeEventListener(handler); + } + addNewEventType(eventManager) { + this._eventListenerManagers[eventManager.eventType] = eventManager; + } +} +exports.EventListenerManager = EventListenerManager; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Field.js": +/*!***************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Field.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class Field { + constructor(_fieldImpl) { + this._fieldImpl = _fieldImpl; + } + get name() { + return this._fieldImpl.name; + } + get id() { + return this._fieldImpl.id; + } + get description() { + return this._fieldImpl.description; + } + get dataType() { + return this._fieldImpl.dataType; + } + get aggregation() { + return this._fieldImpl.aggregation; + } + get dataSource() { + return this._fieldImpl.dataSource; + } + get role() { + return this._fieldImpl.role; + } + get columnType() { + return this._fieldImpl.columnType; + } + get isCalculatedField() { + return this._fieldImpl.isCalculatedField; + } + get isCombinedField() { + return this._fieldImpl.isCombinedField; + } + get isGenerated() { + return this._fieldImpl.isGenerated; + } + get isGeospatial() { + return this._fieldImpl.isGeospatial; + } + get isHidden() { + return this._fieldImpl.isHidden; + } + get isPresentOnPublishedDatasource() { + return this._fieldImpl.isPresentOnPublishedDatasource; + } +} +exports.Field = Field; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const ApiShared_1 = __webpack_require__(/*! ../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); +class CustomViewImpl { + constructor(customViewModel, _registryId) { + this._registryId = _registryId; + this._luid = customViewModel.luid; + this._name = customViewModel.name; + this._shared = customViewModel.shared; + this._isDefault = customViewModel.isDefault; + this._ownerName = customViewModel.owner.userFriendlyName; + this._url = customViewModel.url; + } + get luid() { + return this._luid; + } + get name() { + return this._name; + } + set name(name) { + this._name = name; + } + get shared() { + return this._shared; + } + set shared(shared) { + this._shared = shared; + } + get isDefault() { + return this._isDefault; + } + set isDefault(isDefault) { + this._isDefault = isDefault; + } + get ownerName() { + return this._ownerName; + } + get url() { + return this._url; + } + saveAsync() { + const service = ApiShared_1.ApiServiceRegistry.get(this._registryId).getService("viz-service" /* Viz */); + return service.saveAsync(this); + } +} +exports.CustomViewImpl = CustomViewImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js": +/*!****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +const Point_1 = __webpack_require__(/*! ../Point */ "../api-shared-js/lib/src/ApiShared/Point.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const DashboardObjectImpl_1 = __webpack_require__(/*! ./DashboardObjectImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js"); +const SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +const SheetInfoImpl_1 = __webpack_require__(/*! ./SheetInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js"); +const WorksheetImpl_1 = __webpack_require__(/*! ./WorksheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js"); +class DashboardImpl extends SheetImpl_1.SheetImpl { + constructor(_sheetInfo, _zones, _sheetPath, _registryId, _parentStoryPointImpl, _activeDashboardObjectId = 0) { + super(_sheetInfo, _registryId); + this._zones = _zones; + this._sheetPath = _sheetPath; + this._parentStoryPointImpl = _parentStoryPointImpl; + this._activeDashboardObjectId = _activeDashboardObjectId; + } + get worksheetsImpl() { + return this._worksheetsImpl; + } + get objects() { + return this._objects; + } + get parentStoryPoint() { + return this._parentStoryPointImpl; + } + get activeDashboardObjectId() { + return this._activeDashboardObjectId; + } + get activeDashboardName() { + return this._sheetPath.sheetName; + } + initializeWithPublicInterfaces() { + this._worksheetsImpl = new Array(); + this._objects = new Array(); + this.zoneMap = new Map(); + // Process all the zones which are contained in this dashboard + for (const zone of this._zones) { + let worksheetImpl = undefined; + const zoneSize = { width: zone.width, height: zone.height }; + // As the dashboard is active, all other zones in the dashboard are inactive. + const isActive = false; + if (zone.zoneType === api_internal_contract_js_1.DashboardObjectType.Worksheet || zone.zoneType === api_internal_contract_js_1.DashboardObjectType.QuickFilter) { + let worksheetName = ''; + let worksheetUrl = ''; + let isHidden = false; + if (zone.sheetInfo) { + // zone.sheetInfo was not initialized prior to internal-contract 1.6.0 + worksheetName = zone.sheetInfo.name; + // worksheetUrl & isHidden is for Embedding only + worksheetUrl = zone.sheetInfo.url || ''; + // If there's a url, then it's not hidden + isHidden = worksheetUrl === ''; + } + else { + worksheetName = zone.name; + } + // Indexes, isActive and some more properties in sheetInfoImpl are embedding specific. + // But we init them for both extensions and embedding as the Models will only use what is relevant. + const sheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(worksheetName, api_external_contract_js_1.SheetType.Worksheet, zoneSize, this._worksheetsImpl.length, isActive, isHidden, worksheetUrl); + const vizId = { + worksheet: worksheetName, + dashboard: this._sheetInfoImpl.name, + storyboard: this._sheetPath.storyboard, + flipboardZoneID: this._sheetPath.flipboardZoneID, + storyPointID: this._sheetPath.storyPointID, + }; + worksheetImpl = new WorksheetImpl_1.WorksheetImpl(sheetInfoImpl, this._registryId, vizId, this, this._parentStoryPointImpl); + if (zone.zoneType === api_internal_contract_js_1.DashboardObjectType.Worksheet) { + this._worksheetsImpl.push(worksheetImpl); + } + } + const zonePoint = new Point_1.Point(zone.x, zone.y); + const dashboardObjectImpl = new DashboardObjectImpl_1.DashboardObjectImpl(this, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dashboardObjectType.convert(zone.zoneType), zonePoint, zoneSize, worksheetImpl, zone.name, zone.isFloating !== undefined ? zone.isFloating : false, // before 1.6.0 we didn't have isFloating, so we assume false + zone.isVisible !== undefined ? zone.isVisible : true, // before 1.6.0 we didn't have isVisible, so we assume true + zone.zoneId, zone.fieldId); + this._objects.push(dashboardObjectImpl); + this.zoneMap.set(zone.zoneId, dashboardObjectImpl); + } + } + setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap) { + const zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("zone-service" /* Zone */); + return zoneService.setVisibilityAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectVisibilityMap); + } + getDashboardObjectById(dashboardObjectId) { + return this.zoneMap.get(dashboardObjectId); + } + updateZones(newZones, newActiveZoneId = 0, newActiveDashboardName = '') { + // getting previous dashboard objects, active zone ID and active dashboard name + const oldDashboardObjects = this._objects; + const oldZoneMap = this.zoneMap; + const oldActiveZoneId = this._activeDashboardObjectId; + const oldActiveDashboardName = this._sheetPath.sheetName; + // updating zones and reinitializing instance variables + this._zones = newZones; + this._activeDashboardObjectId = newActiveZoneId; + if (newActiveDashboardName) { + this._sheetPath.sheetName = newActiveDashboardName; + this._sheetInfoImpl.name = newActiveDashboardName; + } + this.initializeWithPublicInterfaces(); + // getting new dashboard objects + const newDashboardObjects = this._objects; + const newZoneMap = this.zoneMap; + // initializing map for changes + const zoneChanges = new Map(); + // comparing old dashboard objects with new ones + oldDashboardObjects.forEach((oldObject) => { + const oldId = oldObject.id; + // checking if zone was removed + if (!newZoneMap.has(oldId)) { + this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Removed); + return; + } + const newObject = newZoneMap.get(oldId); + if (oldObject.isFloating !== newObject.isFloating) { + this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.IsFloatingChanged); + } + if (oldObject.isVisible !== newObject.isVisible) { + this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.IsVisibleChanged); + } + if (oldObject.name !== newObject.name) { + this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.NameChanged); + } + if (oldObject.position.x !== newObject.position.x || oldObject.position.y !== newObject.position.y) { + this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.PositionChanged); + } + if (oldObject.size.width !== newObject.size.width || oldObject.size.height !== newObject.size.height) { + this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.SizeChanged); + } + }); + // Checking for any added zones + newDashboardObjects.forEach((newObject) => { + if (!oldZoneMap.has(newObject.id)) { + this.addChange(newObject.id, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Added); + } + }); + // Checking if zone selection has changed + if (oldActiveZoneId !== newActiveZoneId) { + if (newActiveZoneId !== 0) { + this.addChange(newActiveZoneId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Selected); + } + if (oldActiveZoneId !== 0) { + this.addChange(oldActiveZoneId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Deselected); + } + } + // Checking if switched to another dashboard + if (newActiveDashboardName && oldActiveDashboardName !== newActiveDashboardName) { + this.addChange(0, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.DashboardChanged); + } + return zoneChanges; + } + addChange(zoneId, zoneChanges, change) { + if (!zoneChanges.has(zoneId)) { + zoneChanges.set(zoneId, []); + } + zoneChanges.get(zoneId).push(change); + } + moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray) { + const zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("zone-service" /* Zone */); + return zoneService.moveAndResizeAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectPositionAndSizeUpdateArray); + } + replayAnimationAsync(replaySpeed) { + const animationService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("animation-service" /* Animation */); + return animationService.replayAsync(replaySpeed); + } + getFiltersAsync() { + this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.getDashboardFiltersAsync(); + } + applyFilterAsync(fieldName, values, updateType, options) { + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'FilterUpdateType'); + ErrorHelpers_1.ErrorHelpers.verifyStringParameter(fieldName, 'fieldName'); + if (!Array.isArray(values)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'values parameter for applyDashboardFilterAsync must be an array'); + } + this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.applyDashboardFilterAsync(fieldName, values, updateType, options); + } + // @W-12986439: remove once initializeWithPublicInterfaces is moved to the constructor for this class + // This method only exists since worksheetsImpl can be undefined, but we need the worksheet names in the Export APIs + getWorksheetNamesFromZones() { + const worksheetNames = []; + for (const zone of this._zones) { + if (zone.zoneType !== api_internal_contract_js_1.DashboardObjectType.Worksheet) { + continue; + } + // zone.sheetInfo was not initialized prior to internal-contract 1.6.0 + const worksheetName = zone.sheetInfo ? zone.sheetInfo.name : zone.name; + worksheetNames.push(worksheetName); + } + return worksheetNames; + } + verifyActiveSheetOrEmbeddedInActiveStoryPoint() { + const isRootAndActiveDashboard = this.active; + const isWithinActiveStoryPoint = this.parentStoryPoint != null && this.parentStoryPoint.active; + if (!isRootAndActiveDashboard && !isWithinActiveStoryPoint) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.NotActiveSheet, 'Operation not allowed on non-active sheet'); + } + } +} +exports.DashboardImpl = DashboardImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js": +/*!**********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the dashboard objects - the zones in a dashboard. + * This does not follow the Impl pattern as it is just a property bag. + */ +class DashboardObjectImpl { + constructor(_dashboardImpl, _type, _position, _size, _worksheetImpl, _name, _isFloating, _isVisible, _id, _fieldId) { + this._dashboardImpl = _dashboardImpl; + this._type = _type; + this._position = _position; + this._size = _size; + this._worksheetImpl = _worksheetImpl; + this._name = _name; + this._isFloating = _isFloating; + this._isVisible = _isVisible; + this._id = _id; + this._fieldId = _fieldId; + } + get dashboardImpl() { + return this._dashboardImpl; + } + get type() { + return this._type; + } + get position() { + return this._position; + } + get size() { + return this._size; + } + get worksheetImpl() { + return this._worksheetImpl; + } + get name() { + return this._name; + } + get isFloating() { + return this._isFloating; + } + get isVisible() { + return this._isVisible; + } + get id() { + return this._id; + } + get fieldId() { + return this._fieldId; + } +} +exports.DashboardObjectImpl = DashboardObjectImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const ConnectionSummary_1 = __webpack_require__(/*! ../ConnectionSummary */ "../api-shared-js/lib/src/ApiShared/ConnectionSummary.js"); +const Field_1 = __webpack_require__(/*! ../Field */ "../api-shared-js/lib/src/ApiShared/Field.js"); +const LogicalTable_1 = __webpack_require__(/*! ../LogicalTable */ "../api-shared-js/lib/src/ApiShared/LogicalTable.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const TableSummary_1 = __webpack_require__(/*! ../TableSummary */ "../api-shared-js/lib/src/ApiShared/TableSummary.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const FieldImpl_1 = __webpack_require__(/*! ./FieldImpl */ "../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js"); +class DataSourceImpl { + constructor(_dataSourceInfo, _registryId) { + this._dataSourceInfo = _dataSourceInfo; + this._registryId = _registryId; + this._fields = _dataSourceInfo.fields.map((fieldModel) => { + const fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, this); + return new Field_1.Field(fieldImpl); + }); + } + get name() { + return this._dataSourceInfo.name; + } + get id() { + return this._dataSourceInfo.id; + } + get extractUpdateTime() { + return this._dataSourceInfo.extractUpdateTime; + } + get fields() { + return this._fields; + } + get isExtract() { + return this._dataSourceInfo.isExtract; + } + get isPublished() { + return this._dataSourceInfo.isPublished; + } + publishedUrl() { + return this._dataSourceInfo.publishedUrl; + } + getMaxPageRowLimit() { + return 10000; + } + refreshAsync() { + const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return dataSourceService.refreshAsync(this._dataSourceInfo.id); + } + getConnectionSummariesAsync() { + const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return dataSourceService.getConnectionSummariesAsync(this._dataSourceInfo.id).then((summaries) => { + return summaries.map((summary) => new ConnectionSummary_1.ConnectionSummary(summary)); + }); + } + getActiveTablesAsync() { + const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return dataSourceService.getActiveTablesAsync(this._dataSourceInfo.id).then((tableInfos) => { + return tableInfos.map((tableInfo) => new TableSummary_1.TableSummary(tableInfo)); + }); + } + getUnderlyingDataAsync(options) { + const getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return getDataService.getDataSourceDataAsync(this.id, !!options.ignoreAliases, options.maxRows || 0, // 0 and [] are defaults + options.columnsToInclude || [], options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + } + getLogicalTableDataAsync(logicalTableId, options) { + const getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return getDataService.getLogicalTableDataAsync(this.id, logicalTableId, !!options.ignoreAliases, options.maxRows || 0, // 0 and [] are defaults + options.columnsToInclude || [], options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + } + getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options) { + const getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return getDataService.getLogicalTableDataReaderAsync(this.id, logicalTableId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + } + initializeWithPublicInterfaces(dataSource) { + ErrorHelpers_1.ErrorHelpers.verifyInternalValue(dataSource, 'dataSource'); + this._fields = this._dataSourceInfo.fields.map((fieldModel) => { + const fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, dataSource); + return new Field_1.Field(fieldImpl); + }); + } + getLogicalTablesAsync() { + const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return dataSourceService.getLogicalTablesAsync(this.id).then((logicalTableInfos) => { + return logicalTableInfos.map((logicalTableInfo) => new LogicalTable_1.LogicalTable(logicalTableInfo)); + }); + } +} +exports.DataSourceImpl = DataSourceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js": +/*!************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js ***! + \************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +class FieldImpl { + constructor(_fieldInfo, _parentDataSource) { + this._fieldInfo = _fieldInfo; + this._parentDataSource = _parentDataSource; + } + get name() { + return this._fieldInfo.name; + } + get id() { + return this._fieldInfo.id; + } + get description() { + return this._fieldInfo.description; + } + get dataType() { + var _a; + return _a = this._fieldInfo.dataType, (_a !== null && _a !== void 0 ? _a : Contract.DataType.Unknown); + } + get aggregation() { + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation); + } + get dataSource() { + if (!this._parentDataSource) + throw new Error(`Data source information is not available for this field. Please use getFieldAsync method to get field's data source information`); + return this._parentDataSource; + } + get role() { + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldRoleType.convert(this._fieldInfo.role); + } + get columnType() { + let definedValue = this._fieldInfo.columnType || InternalContract.ColumnType.Unknown; + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.columnType.convert(definedValue); + } + get isCalculatedField() { + return this._fieldInfo.isCalculatedField; + } + get isCombinedField() { + return this._fieldInfo.isCombinedField; + } + get isGenerated() { + return this._fieldInfo.isGenerated; + } + get isGeospatial() { + return this._fieldInfo.isGeospatial; + } + get isHidden() { + return this._fieldInfo.isHidden; + } + get isPresentOnPublishedDatasource() { + return this._fieldInfo.isPresentOnPublishedDatasource; + } +} +exports.FieldImpl = FieldImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js": +/*!****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const DataValueFactory_1 = __webpack_require__(/*! ../Utils/DataValueFactory */ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const Param_1 = __webpack_require__(/*! ../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +class ParameterImpl { + constructor(parameterInfo, _registryId) { + this._registryId = _registryId; + this.setParameterInfo(parameterInfo); + } + get name() { + return this._parameterInfo.name; + } + get currentValue() { + return DataValueFactory_1.DataValueFactory.MakeParameterDataValue(this._parameterInfo.currentValue, this._parameterInfo.dataType); + } + get dataType() { + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dataType.convert(this._parameterInfo.dataType); + } + get id() { + return this._globalFieldName; + } + get allowableValues() { + return this._allowableValues; + } + changeValueAsync(newValue) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(newValue, 'newValue'); + const coercedValue = Param_1.Param.serializeParameterValue(newValue); + const parametersService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); + return parametersService.changeParameterValueAsync(this._globalFieldName, coercedValue).then((parameterInfo) => { + this.setParameterInfo(parameterInfo); + return this.currentValue; + }); + } + setParameterInfo(parameterInfo) { + this._parameterInfo = parameterInfo; + this._globalFieldName = parameterInfo.fieldName; + const type = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.allowableValues.convert(parameterInfo.allowableValuesType); + let listValues; + let minValue; + let maxValue; + let stepSize; + let dateStepPeriod; + if (type === api_external_contract_js_1.ParameterValueType.List) { + const values = parameterInfo.allowableValues || []; + listValues = values.map((val) => DataValueFactory_1.DataValueFactory.MakeParameterDataValue(val, parameterInfo.dataType)); + } + else if (type === api_external_contract_js_1.ParameterValueType.Range) { + minValue = parameterInfo.minValue && DataValueFactory_1.DataValueFactory.MakeParameterDataValue(parameterInfo.minValue, parameterInfo.dataType); + maxValue = parameterInfo.maxValue && DataValueFactory_1.DataValueFactory.MakeParameterDataValue(parameterInfo.maxValue, parameterInfo.dataType); + stepSize = parameterInfo.stepSize; + dateStepPeriod = parameterInfo.dateStepPeriod && InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateStepPeriod.convert(parameterInfo.dateStepPeriod); + } + this._allowableValues = { + type: type, + allowableValues: listValues, + minValue: minValue, + maxValue: maxValue, + stepSize: stepSize, + dateStepPeriod: dateStepPeriod, + }; + } +} +exports.ParameterImpl = ParameterImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js": +/*!************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js ***! + \************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const Param_1 = __webpack_require__(/*! ../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +const SheetUtils_1 = __webpack_require__(/*! ../Utils/SheetUtils */ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js"); +class SheetImpl { + constructor(_sheetInfoImpl, _registryId) { + this._sheetInfoImpl = _sheetInfoImpl; + this._registryId = _registryId; + } + get name() { + return this._sheetInfoImpl.name; + } + get sheetType() { + return this._sheetInfoImpl.sheetType; + } + get sheetPath() { + return this._sheetInfoImpl.sheetPath; + } + get size() { + return this._sheetInfoImpl.sheetSize; + } + get hidden() { + if (this._sheetInfoImpl.isHidden !== undefined) { + return this._sheetInfoImpl.isHidden; + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `isHidden not implemented`); + } + get active() { + if (this._sheetInfoImpl.isActive !== undefined) { + return this._sheetInfoImpl.isActive; + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `active not implemented`); + } + set active(active) { + if (this._sheetInfoImpl.isActive !== undefined) { + this._sheetInfoImpl.active = active; + } + } + get index() { + if (this._sheetInfoImpl.index !== undefined) { + return this._sheetInfoImpl.index; + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `index not implemented`); + } + get url() { + if (this._sheetInfoImpl.url !== undefined) { + return this._sheetInfoImpl.url; + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `url not implemented`); + } + getSheetSize() { + if (!SheetUtils_1.SheetUtils.isValidSheetSize(this.size)) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InternalError, 'size is not of type SheetSize'); + } + return this.size; + } + findParameterAsync(parameterName) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(parameterName, 'parameterName'); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); + return service.findParameterByNameAsync(parameterName); + } + getParametersAsync() { + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); + return service.getParametersForSheetAsync(this.sheetPath); + } + changeSizeAsync(newSize) { + const invalidSizeError = new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Invalid sheet size parameter'); + if (!newSize || !newSize.behavior) { + throw invalidSizeError; + } + const partialSheetSize = this.normalizeSheetSize(newSize); + const isAutomatic = partialSheetSize.behavior === Contract.SheetSizeBehavior.Automatic; + if (!isAutomatic && !partialSheetSize.minSize && !partialSheetSize.maxSize) { + throw invalidSizeError; + } + if (!isAutomatic && this.sheetType === Contract.SheetType.Worksheet) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSizeBehaviorOnWorksheet, 'Only SheetSizeBehavior.Automatic is allowed on Worksheets'); + } + if (isAutomatic && this.getSheetSize().behavior === partialSheetSize.behavior) { + return Promise.resolve(newSize); + } + const processedNewSize = this.processNewSize(partialSheetSize); + const sizeService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("size-service" /* Size */); + return sizeService.changeSizeAsync(this.name, processedNewSize).then(() => { + const clientInfoService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("client-info-service" /* ClientInfo */); + return clientInfoService.getClientInfoAsync().then((bootstrapInfo) => { + const sheet = bootstrapInfo.publishedSheets.find((s) => s.name === this.name); + if (!sheet) { + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InternalError, `Can't find sheet with name ${this.name}`); + } + const sheetSize = SheetUtils_1.SheetUtils.getSheetSizeFromSizeConstraints(sheet.sizeConstraint); + this._sheetInfoImpl.sheetSize = sheetSize; + return sheetSize; + }); + }); + } + normalizeSheetSize(newSize) { + const { behavior } = newSize; + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(behavior, Contract.SheetSizeBehavior, 'SheetSizeBehavior'); + const minSize = SheetImpl.parseDimensions(newSize.minSize); + const maxSize = SheetImpl.parseDimensions(newSize.maxSize); + return { behavior, minSize, maxSize }; + } + processNewSize(newSize) { + var _a, _b, _c, _d; + const { behavior, minSize: minSizeMaybe, maxSize: maxSizeMaybe } = newSize; + const hasMinWidth = !Param_1.Param.isNullOrUndefined((_a = minSizeMaybe) === null || _a === void 0 ? void 0 : _a.width); + const hasMinHeight = !Param_1.Param.isNullOrUndefined((_b = minSizeMaybe) === null || _b === void 0 ? void 0 : _b.height); + const hasMaxWidth = !Param_1.Param.isNullOrUndefined((_c = maxSizeMaybe) === null || _c === void 0 ? void 0 : _c.width); + const hasMaxHeight = !Param_1.Param.isNullOrUndefined((_d = maxSizeMaybe) === null || _d === void 0 ? void 0 : _d.height); + const hasValidMinSize = hasMinWidth && hasMinHeight; + const hasValidMaxSize = hasMaxWidth && hasMaxHeight; + switch (behavior) { + case Contract.SheetSizeBehavior.Automatic: { + return { behavior }; + } + case Contract.SheetSizeBehavior.AtMost: { + if (!maxSizeMaybe || !hasValidMaxSize) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMaxSize, 'Missing maxSize for SheetSizeBehavior.AtMost'); + } + const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; + if (maxSize.width < 0 || maxSize.height < 0) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Size value cannot be less than zero'); + } + return { behavior, maxSize }; + } + case Contract.SheetSizeBehavior.AtLeast: { + if (!minSizeMaybe || !hasValidMinSize) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMinSize, 'Missing minSize for SheetSizeBehavior.AtLeast'); + } + const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; + if (minSize.width < 0 || minSize.height < 0) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Size value cannot be less than zero'); + } + return { behavior, minSize }; + } + case Contract.SheetSizeBehavior.Range: { + if (!minSizeMaybe || !maxSizeMaybe || !hasValidMinSize || !hasValidMaxSize) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMinMaxSize, 'Missing minSize or maxSize for SheetSizeBehavior.Range'); + } + const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; + const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; + if (minSize.width < 0 || + minSize.height < 0 || + maxSize.width < 0 || + maxSize.height < 0 || + minSize.width > maxSize.width || + minSize.height > maxSize.height) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Missing minSize or maxSize for SheetSizeBehavior.Range'); + } + return { behavior, minSize, maxSize }; + } + case Contract.SheetSizeBehavior.Exactly: { + if (minSizeMaybe && maxSizeMaybe) { + if (hasValidMinSize && hasValidMaxSize) { + const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; + const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; + if (minSize.width !== maxSize.width || minSize.height !== maxSize.height) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Conflicting size values for SheetSizeBehavior.Exactly'); + } + return { behavior, minSize, maxSize }; + } + if (hasValidMinSize) { + const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; + return { behavior, minSize, maxSize: minSize }; + } + if (hasValidMaxSize) { + const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; + return { behavior, minSize: maxSize, maxSize }; + } + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Invalid sheet size parameter'); + } + default: { + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InternalError, `Unsupported sheet size behavior: ${behavior}`); + } + } + } +} +exports.SheetImpl = SheetImpl; +SheetImpl.parseDimensions = (size) => { + const empty = { width: undefined, height: undefined }; + if (!size) { + return empty; + } + const { success: widthParsed, parsed: parsedWidth } = Param_1.Param.tryParseNumber(size.width); + const { success: heightParsed, parsed: parsedHeight } = Param_1.Param.tryParseNumber(size.height); + if (widthParsed && heightParsed) { + return { width: parsedWidth, height: parsedHeight }; + } + if (widthParsed) { + return { width: parsedWidth }; + } + if (heightParsed) { + return { height: parsedHeight }; + } + return empty; +}; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js": +/*!****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +class SheetInfoImpl { + constructor(_name, _sheetType, _sheetSize, _index, _isActive, _isHidden, _url) { + this._name = _name; + this._sheetType = _sheetType; + this._sheetSize = _sheetSize; + this._index = _index; + this._isActive = _isActive; + this._isHidden = _isHidden; + this._url = _url; + } + get name() { + return this._name; + } + set name(sheetName) { + this._name = sheetName; + } + get sheetSize() { + return this._sheetSize; + } + set sheetSize(value) { + this._sheetSize = value; + } + get sheetType() { + return this._sheetType; + } + get sheetPath() { + return { + sheetName: this.name, + isDashboard: this.sheetType === api_external_contract_js_1.SheetType.Dashboard, + }; + } + get index() { + return this._index; + } + get isActive() { + return this._isActive; + } + set active(active) { + this._isActive = active; + } + get isHidden() { + return this._isHidden; + } + get url() { + return this._url; + } +} +exports.SheetInfoImpl = SheetInfoImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js": +/*!*************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * This class implements the SingleEventManager interface for a single type of Tableau event + * + * @template TEventType The Tableau event type this class specializes + */ +class SingleEventManagerImpl { + constructor(eventType) { + this._eventType = eventType; + this._handlers = []; + } + get eventType() { + return this._eventType; + } + addEventListener(handler) { + this._handlers.push(handler); + return () => this.removeEventListener(handler); + } + removeEventListener(handler) { + const beforeCount = this._handlers.length; + this._handlers = this._handlers.filter((h) => h !== handler); + return beforeCount > this._handlers.length; + } + triggerEvent(eventGenerator) { + for (const handler of this._handlers) { + try { + const eventModel = eventGenerator(); + handler(eventModel); + } + catch (e) { + // Since this handler could be outside our control, just catch anything it throws and continue on + continue; + } + } + } +} +exports.SingleEventManagerImpl = SingleEventManagerImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/StoryImpl.js": +/*!************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/StoryImpl.js ***! + \************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const ShortLivedDeferred_1 = __webpack_require__(/*! ../Utils/ShortLivedDeferred */ "../api-shared-js/lib/src/ApiShared/Utils/ShortLivedDeferred.js"); +const SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +const StoryPointImpl_1 = __webpack_require__(/*! ./StoryPointImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js"); +const StoryPointInfoImpl_1 = __webpack_require__(/*! ./StoryPointInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js"); +class StoryImpl extends SheetImpl_1.SheetImpl { + constructor(_sheetInfoImpl, storyModel, _publishedSheetInfos, _registryId) { + super(_sheetInfoImpl, _registryId); + this._sheetInfoImpl = _sheetInfoImpl; + this._publishedSheetInfos = _publishedSheetInfos; + this._registryId = _registryId; + this._storyPointInfoImpls = []; + this._deferred = new ShortLivedDeferred_1.ShortLivedDeferred(); + this.initializeStory(storyModel); + } + initializeStory(storyModel) { + storyModel.storyPoints.forEach((storyPointModel) => { + const isActive = storyPointModel.index === storyModel.activeStoryPointIndex; + const storyPointInfoImpl = new StoryPointInfoImpl_1.StoryPointInfoImpl(storyPointModel.caption, storyPointModel.index, storyPointModel.storyPointId, isActive, storyPointModel.updated, this); + this._storyPointInfoImpls.push(storyPointInfoImpl); + if (isActive) { + this._activeStoryPointImpl = new StoryPointImpl_1.StoryPointImpl(storyPointInfoImpl, this._publishedSheetInfos, this._registryId, storyPointModel.containedSheetInfo); + } + }); + } + updateStoryInfo(index, storyPointModel) { + if (!this._storyPointInfoImpls) { + return; + } + let storyInfoImpl = this._storyPointInfoImpls[index]; + if (storyInfoImpl.storyPointId !== storyPointModel.storyPointId) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.StoryPointIdMismatch, `We should not be updating a story point when the IDs don't match. Existing storyPointID=${storyInfoImpl.storyPointId}, newStoryPointID=${storyPointModel.storyPointId}`); + } + storyInfoImpl.caption = storyPointModel.caption; + storyInfoImpl.updated = storyPointModel.updated; + if (this._activeStoryPointImpl.storyPointId === storyPointModel.storyPointId) { + this._activeStoryPointImpl.updated = storyInfoImpl.updated; + } + } + updateStory(storyPointModel) { + if (!this._storyPointInfoImpls) { + return; + } + this._storyPointInfoImpls.forEach((storyPointInfoImpl) => { + const isActive = storyPointInfoImpl.storyPointId === storyPointModel.storyPointId; + if (isActive) { + // update the state + storyPointInfoImpl.caption = storyPointModel.caption; + storyPointInfoImpl.index = storyPointModel.index; + storyPointInfoImpl.active = true; + storyPointInfoImpl.updated = storyPointModel.updated; + // re-initialize activeStoryPointImpl + this._activeStoryPointImpl = new StoryPointImpl_1.StoryPointImpl(storyPointInfoImpl, this._publishedSheetInfos, this._registryId, storyPointModel.containedSheetInfo); + } + else { + // set old ones to false + storyPointInfoImpl.active = false; + } + }); + if (this.activeStoryPoint) { + this._deferred.resolve(this.activeStoryPoint); + } + } + get activeStoryPoint() { + return this._activeStoryPointImpl; + } + get storyPointsInfo() { + return this._storyPointInfoImpls; + } + get isActive() { + return this._sheetInfoImpl.active; + } + get isHidden() { + return !!this._sheetInfoImpl.isHidden; + } + activateNextStoryPointAsync() { + if (this._activeStoryPointImpl.index === this._storyPointInfoImpls.length - 1) { + return Promise.resolve(this._activeStoryPointImpl); + } + let promise = this._deferred.getNewPromiseOrThrowIfBusy(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + service.activateNextStoryPointAsync(); + return promise; + } + activatePreviousStoryPointAsync() { + if (this._activeStoryPointImpl.index === 0) { + return Promise.resolve(this._activeStoryPointImpl); + } + let promise = this._deferred.getNewPromiseOrThrowIfBusy(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + service.activatePreviousStoryPointAsync(); + return promise; + } + activateStoryPointAsync(index) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(index, 'index'); + ErrorHelpers_1.ErrorHelpers.verifyParameterType(index, 'number', 'index'); + if (index < 0 || index >= this._storyPointInfoImpls.length) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.IndexOutOfRange, 'The index passed to this command is out of range.'); + } + if (index === this._activeStoryPointImpl.index) { + return Promise.resolve(this._activeStoryPointImpl); + } + let promise = this._deferred.getNewPromiseOrThrowIfBusy(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + service.activateStoryPointAsync(index); + return promise; + } + revertStoryPointAsync(index) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(index, 'index'); + ErrorHelpers_1.ErrorHelpers.verifyParameterType(index, 'number', 'index'); + if (index < 0 || index >= this._storyPointInfoImpls.length) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.IndexOutOfRange, 'The index passed to this command is out of range.'); + } + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + return service.revertStoryPointAsync(index).then((response) => { + this.updateStoryInfo(response.index, response); + const storyPointInfoImpl = new StoryPointInfoImpl_1.StoryPointInfoImpl(response.caption, response.index, response.storyPointId, false, response.updated, this); + return storyPointInfoImpl; + }); + } + clearPendingPromises() { + if (this._deferred) { + this._deferred.reject('All pending promises cleared'); + } + } +} +exports.StoryImpl = StoryImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const SheetUtils_1 = __webpack_require__(/*! ../Utils/SheetUtils */ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js"); +const DashboardImpl_1 = __webpack_require__(/*! ./DashboardImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js"); +const SheetInfoImpl_1 = __webpack_require__(/*! ./SheetInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js"); +const WorksheetImpl_1 = __webpack_require__(/*! ./WorksheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js"); +class StoryPointImpl { + constructor(_storyPointInfoImpl, sheetInfos, registryId, containedSheetInfo) { + this._storyPointInfoImpl = _storyPointInfoImpl; + if (containedSheetInfo) { + this._containedSheetImpl = this.createContainedSheet(containedSheetInfo, sheetInfos, registryId); + } + } + get index() { + return this._storyPointInfoImpl.index; + } + get caption() { + return this._storyPointInfoImpl.caption; + } + get active() { + return this._storyPointInfoImpl.active; + } + get updated() { + return this._storyPointInfoImpl.updated; + } + set updated(updated) { + this._storyPointInfoImpl.updated = updated; + } + get parentStory() { + return this._storyPointInfoImpl.parentStory; + } + get containedSheet() { + return this._containedSheetImpl; + } + get storyPointId() { + return this._storyPointInfoImpl.storyPointId; + } + createContainedSheet(containedSheetInfo, sheetInfos, registryId) { + const containedSheetIdx = -1; + const publishedSheetInfo = SheetUtils_1.SheetUtils.getPublishedSheetInfoByName(containedSheetInfo.name, sheetInfos); + const containedSheetSize = SheetUtils_1.SheetUtils.createAutomaticSize(); + const isContainedSheetHidden = publishedSheetInfo === undefined; + const containedSheetUrl = publishedSheetInfo ? publishedSheetInfo.url : ''; + // Contained sheets aren't active - the containing sheet is active. + const containedSheetActive = false; + const containedSheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(containedSheetInfo.name, SheetUtils_1.SheetUtils.getSheetTypeEnum(containedSheetInfo.sheetType), containedSheetSize, containedSheetIdx, containedSheetActive, isContainedSheetHidden, containedSheetUrl); + let sheetImpl; + switch (containedSheetInfoImpl.sheetType) { + case Contract.SheetType.Worksheet: { + const vizId = { + worksheet: containedSheetInfoImpl.name, + }; + sheetImpl = new WorksheetImpl_1.WorksheetImpl(containedSheetInfoImpl, registryId, vizId, null, this); + break; + } + case Contract.SheetType.Dashboard: { + const sheetPath = { + sheetName: containedSheetInfoImpl.name, + isDashboard: true, + }; + sheetImpl = new DashboardImpl_1.DashboardImpl(containedSheetInfoImpl, containedSheetInfo.dashboardZones, sheetPath, registryId, this); + break; + } + default: { + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.ServerError, 'Invalid SheetType'); + } + } + return sheetImpl; + } +} +exports.StoryPointImpl = StoryPointImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js": +/*!*********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class StoryPointInfoImpl { + constructor(_caption, _index, _storyPointId, _active, _updated, _parentStoryImpl) { + this._caption = _caption; + this._index = _index; + this._storyPointId = _storyPointId; + this._active = _active; + this._updated = _updated; + this._parentStoryImpl = _parentStoryImpl; + } + get caption() { + return this._caption; + } + set caption(caption) { + this._caption = caption; + } + get index() { + return this._index; + } + set index(index) { + this._index = index; + } + get storyPointId() { + return this._storyPointId; + } + get active() { + return this._active; + } + set active(isActive) { + this._active = isActive; + } + get updated() { + return this._updated; + } + set updated(isUpdated) { + this._updated = isUpdated; + } + get parentStory() { + return this._parentStoryImpl; + } +} +exports.StoryPointInfoImpl = StoryPointInfoImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/WorkbookImpl.js": +/*!***************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/WorkbookImpl.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class WorkbookImpl { +} +exports.WorkbookImpl = WorkbookImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js": +/*!****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const DataSource_1 = __webpack_require__(/*! ../DataSource */ "../api-shared-js/lib/src/ApiShared/DataSource.js"); +const LogicalTable_1 = __webpack_require__(/*! ../LogicalTable */ "../api-shared-js/lib/src/ApiShared/LogicalTable.js"); +const GetDataService_1 = __webpack_require__(/*! ../Services/GetDataService */ "../api-shared-js/lib/src/ApiShared/Services/GetDataService.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const DataSourceImpl_1 = __webpack_require__(/*! ./DataSourceImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); +const SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +class WorksheetImpl extends SheetImpl_1.SheetImpl { + constructor(sheetInfoImpl, _registryId, _visualId, _parentDashboardImpl, _parentStoryPointImpl, _backgroundColor = null, _formatting = null) { + super(sheetInfoImpl, _registryId); + this._visualId = _visualId; + this._parentDashboardImpl = _parentDashboardImpl; + this._parentStoryPointImpl = _parentStoryPointImpl; + this._backgroundColor = _backgroundColor; + this._formatting = _formatting; + } + get parentDashboard() { + return this._parentDashboardImpl; + } + get parentStoryPoint() { + return this._parentStoryPointImpl; + } + get visualId() { + return this._visualId; + } + getMaxPageRowLimit() { + return 10000; + } + get backgroundColor() { + return this._backgroundColor; + } + get formatting() { + return this._formatting; + } + applyFilterAsync(fieldName, values, updateType, options) { + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'Contract.FilterUpdateType'); + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.applyFilterAsync(this.visualId, fieldName, values, updateType, options); + } + applyRangeFilterAsync(fieldName, filterOptions) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName'); + ErrorHelpers_1.ErrorHelpers.verifyParameter(filterOptions, 'filterOptions'); + if (filterOptions.nullOption) { + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(filterOptions.nullOption, api_external_contract_js_1.FilterNullOption, 'FilterNullOption'); + } + else { + ErrorHelpers_1.ErrorHelpers.verifyRangeParamType(filterOptions.min, filterOptions.max); + } + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.applyRangeFilterAsync(this.visualId, fieldName, filterOptions); + } + applyHierarchicalFilterAsync(fieldName, values, updateType, options) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName'); + ErrorHelpers_1.ErrorHelpers.verifyParameter(values, 'values'); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'Contract.FilterUpdateType'); + if (!Array.isArray(values) && !values.levels) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'values parameter for applyHierarchicalFilterAsync must be an array or contain a levels key'); + } + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.applyHierarchicalFilterAsync(this.visualId, fieldName, values, updateType, options); + } + clearFilterAsync(fieldName) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName'); + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.clearFilterAsync(this.visualId, fieldName); + } + applyRelativeDateFilterAsync(fieldName, options) { + ErrorHelpers_1.ErrorHelpers.verifyStringParameter(fieldName, 'fieldName'); + ErrorHelpers_1.ErrorHelpers.verifyParameter(options, 'options'); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(options.periodType, api_external_contract_js_1.PeriodType, 'PeriodType'); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(options.rangeType, api_external_contract_js_1.DateRangeType, 'DateRangeType'); + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.applyRelativeDateFilterAsync(this.visualId, fieldName, options); + } + getDataSourcesAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return service.getDataSourcesAsync(this.visualId).then((result) => { + const dataSchema = result; + const worksheetDataSourceInfo = dataSchema.worksheetDataSchemaMap[this.name]; + const dataSources = []; + // First, add the primary datasource. By convention, it comes first in the returned array. + const primaryId = worksheetDataSourceInfo.primaryDataSource; + dataSources.push(this.createDataSourceFromInfo(dataSchema.dataSources[primaryId])); + // Then, loop through any secondary data sources and add them. + for (const secondaryId of worksheetDataSourceInfo.referencedDataSourceList) { + if (secondaryId !== primaryId) { + dataSources.push(this.createDataSourceFromInfo(dataSchema.dataSources[secondaryId])); + } + } + return dataSources; + }); + } + getFiltersAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.getFiltersAsync(this.visualId); + } + getSelectedMarksAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + return service.getSelectedMarksAsync(this.visualId); + } + getHighlightedMarksAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + return service.getHighlightedMarksAsync(this.visualId); + } + getSummaryDataAsync(options) { + var _a; + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return service.getUnderlyingDataAsync(this.visualId, GetDataService_1.GetDataType.Summary, !!options.ignoreAliases, !!options.ignoreSelection, true, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false))); + } + getSummaryDataReaderAsync(pageRowCount, options) { + var _a; + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return service.getSummaryDataReaderAsync(this.visualId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, !!options.ignoreSelection, true, // includeAllColumns (can be overridden by columnsToIncludeById) + options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false))); + } + getVisualSpecificationAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); + return service.getVisualSpecificationAsync(this.visualId); + } + addMarksCardFieldsAsync(marksCardIndex, encodingType, columns, startIndex) { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); + return service.addMarksCardFieldsAsync(this.visualId, marksCardIndex, encodingType, columns, startIndex); + } + moveMarksCardFieldAsync(marksCardIndex, fromIndex, toIndex, fieldCount) { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); + return service.moveMarksCardFieldAsync(this.visualId, marksCardIndex, fromIndex, toIndex, fieldCount); + } + spliceMarksCardFieldsAsync(marksCardIndex, encodingType, startIndex, deleteCount, columns) { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); + return service.spliceMarksCardFieldsAsync(this.visualId, marksCardIndex, encodingType, startIndex, deleteCount, columns); + } + getSummaryColumnsInfoAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + return service.getSummaryColumnsInfoAsync(this.visualId); + } + getUnderlyingDataAsync(options) { + var _a; + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return service.getUnderlyingDataAsync(this.visualId, GetDataService_1.GetDataType.Underlying, !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false))); + } + getUnderlyingTablesAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return service.getUnderlyingTablesAsync(this.visualId).then((logicalTableInfos) => { + return logicalTableInfos.map((logicalTableInfo) => new LogicalTable_1.LogicalTable(logicalTableInfo)); + }); + } + getUnderlyingTableDataAsync(logicalTableId, options) { + var _a; + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return service.getUnderlyingTableDataAsync(this.visualId, logicalTableId, !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false))); + } + getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options) { + var _a; + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return service.getUnderlyingTableDataReaderAsync(this.visualId, logicalTableId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false))); + } + clearSelectedMarksAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + return service.clearSelectedMarksAsync(this.visualId); + } + selectMarksByValueAsync(selections, selectionUpdateType) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(selections, 'fieldName'); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(selectionUpdateType, api_external_contract_js_1.SelectionUpdateType, 'SelectionUpdateType'); + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + return service.selectMarksByValueAsync(this.visualId, selections, selectionUpdateType); + } + selectMarksByIdAsync(selections, selectionUpdateType) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(selections, 'fieldName'); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(selectionUpdateType, api_external_contract_js_1.SelectionUpdateType, 'SelectionUpdateType'); + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + return service.selectMarksByIdAsync(this.visualId, selections, selectionUpdateType); + } + annotateMarkAsync(mark, annotationText) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(mark, 'mark'); + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); + return service.annotateMarkAsync(this.visualId, mark, annotationText); + } + getAnnotationsAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); + return service.getAnnotationsAsync(this.visualId); + } + removeAnnotationAsync(annotation) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(annotation, 'annotation'); + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); + return service.removeAnnotationAsync(this.visualId, annotation); + } + appendContextMenuAsync(targetMenu, config) { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); + return service.appendContextMenuAsync(this.visualId.worksheet, targetMenu, config); + } + removeContextMenuAsync(targetMenu, menuItemId) { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); + return service.removeContextMenuAsync(this.visualId.worksheet, targetMenu, menuItemId); + } + executeContextMenuAsync(targetMenu, menuItemId) { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); + return service.executeContextMenuAsync(this.visualId.worksheet, targetMenu, menuItemId); + } + renameContextMenuAsync(targetMenu, menuHeader, menuDescription) { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); + return service.renameContextMenuAsync(this.visualId.worksheet, targetMenu, menuHeader, menuDescription); + } + hoverTupleAsync(hoveredTuple, tooltip, allowHoverActions) { + if (this.isInsideDashboardExtension()) { + return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `hoverTupleAsync is not supported in dashboard extensions`)); + } + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + return service.hoverTupleAsync(this.visualId, hoveredTuple, tooltip, allowHoverActions); + } + selectTuplesAsync(selectedTuples, selectOption, tooltip) { + if (this.isInsideDashboardExtension()) { + return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `selectTuplesAsync is not supported in dashboard extensions`)); + } + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + return service.selectTuplesAsync(this.visualId, selectedTuples, selectOption, tooltip); + } + getTooltipTextAsync(tupleId) { + if (this.isInsideDashboardExtension()) { + return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `getTooltipTextAsync is not supported in dashboard extensions`)); + } + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("accessibility" /* Accessibility */); + return service.getTooltipTextAsync(this.visualId, tupleId); + } + leaveMarkNavigationAsync() { + if (this.isInsideDashboardExtension()) { + return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `leaveMarkNavigationAsync is not supported in dashboard extensions`)); + } + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("accessibility" /* Accessibility */); + return service.leaveMarkNavigationAsync(this.visualId); + } + editAliasesDialogAsync(fieldName) { + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); + return service.editAliasesDialogAsync(fieldName); + } + createDataSourceFromInfo(dataSourceInfo) { + const dataSourceImpl = new DataSourceImpl_1.DataSourceImpl(dataSourceInfo, this._registryId); + const dataSource = new DataSource_1.DataSource(dataSourceImpl); + dataSourceImpl.initializeWithPublicInterfaces(dataSource); + return dataSource; + } + verifyActiveSheet() { + const isRootAndActiveWorksheet = this.active; + const isInsideActiveDashboard = this.isInsideActiveDashboard(); + const isInsideActiveStoryPoint = this.isInsideActiveStoryPoint(); + if (!isRootAndActiveWorksheet && !isInsideActiveDashboard && !isInsideActiveStoryPoint) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.NotActiveSheet, 'Operation not allowed on non-active sheet'); + } + } + isInsideActiveStoryPoint() { + return this._parentStoryPointImpl && this._parentStoryPointImpl.active; + } + isInsideActiveDashboard() { + return this._parentDashboardImpl && this._parentDashboardImpl.active; + } + isInsideDashboardExtension() { + return this._parentDashboardImpl !== null; + } +} +exports.WorksheetImpl = WorksheetImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/LogicalTable.js": +/*!**********************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/LogicalTable.js ***! + \**********************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of a logical table. + * This does not follow the Impl pattern as it is just a property bag. + */ +class LogicalTable { + constructor(_logicalTable) { + this._logicalTable = _logicalTable; + } + get id() { + return this._logicalTable.id; + } + get caption() { + return this._logicalTable.caption; + } +} +exports.LogicalTable = LogicalTable; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Models/AccessibilityModels.js": +/*!************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Models/AccessibilityModels.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class TooltipTextRequestModel { + constructor(visualIdPresModel, tupleId) { + this.visualIdPresModel = visualIdPresModel; + this.tupleId = tupleId; + } +} +exports.TooltipTextRequestModel = TooltipTextRequestModel; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Models/FilterModels.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Models/FilterModels.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +class Filter { + constructor(_worksheetName, _fieldName, _filterType, _fieldId, _registryId) { + this._worksheetName = _worksheetName; + this._fieldName = _fieldName; + this._filterType = _filterType; + this._fieldId = _fieldId; + this._registryId = _registryId; + } + get worksheetName() { + return this._worksheetName; + } + get fieldName() { + return this._fieldName; + } + get fieldId() { + return this._fieldId; + } + get filterType() { + return this._filterType; + } + getFieldAsync() { + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return service.getFieldAsync(this._fieldId); + } + getAppliedWorksheetsAsync() { + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.getAppliedWorksheetsAsync(this._worksheetName, this._fieldId); + } + setAppliedWorksheetsAsync(applyToWorksheets) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(applyToWorksheets, 'applyToWorksheets'); + const uniqueWorksheets = new Set(applyToWorksheets); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.setAppliedWorksheetsAsync(this._worksheetName, this._fieldName, this._fieldId, Array.from(uniqueWorksheets)); + } +} +exports.Filter = Filter; +class CategoricalFilter extends Filter { + constructor(worksheetName, fieldName, fieldId, filterType, registryId, _appliedValues, _isExcludeMode, _isAllSelected) { + super(worksheetName, fieldName, filterType, fieldId, registryId); + this._appliedValues = _appliedValues; + this._isExcludeMode = _isExcludeMode; + this._isAllSelected = _isAllSelected; + } + get isAllSelected() { + return this._isAllSelected; + } + get appliedValues() { + return this._appliedValues; + } + get isExcludeMode() { + return this._isExcludeMode; + } + getDomainAsync(domainType) { + if (!domainType) { + domainType = api_external_contract_js_1.FilterDomainType.Relevant; + } + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(domainType, api_external_contract_js_1.FilterDomainType, 'FilterDomainType'); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.getCategoricalDomainAsync(this._worksheetName, this._fieldId, domainType); + } +} +exports.CategoricalFilter = CategoricalFilter; +class HierarchicalDataValue { + constructor(_value, _hierarchicalPath, _level) { + this._value = _value; + this._hierarchicalPath = _hierarchicalPath; + this._level = _level; + } + get value() { + return this._value; + } + get hierarchicalPath() { + return this._hierarchicalPath; + } + get level() { + return this._level; + } +} +exports.HierarchicalDataValue = HierarchicalDataValue; +class HierarchicalLevelDetail { + constructor(_name, _levelSelectionState) { + this._name = _name; + this._levelSelectionState = _levelSelectionState; + } + get name() { + return this._name; + } + get levelSelectionState() { + return this._levelSelectionState; + } +} +exports.HierarchicalLevelDetail = HierarchicalLevelDetail; +class HierarchicalFilter extends Filter { + constructor(worksheetName, fieldName, fieldId, filterType, registryId, _dimensionName, _hierarchyCaption, _numberOfLevels, _levelDetails, _appliedValues, _isAllSelected) { + super(worksheetName, fieldName, filterType, fieldId, registryId); + this._dimensionName = _dimensionName; + this._hierarchyCaption = _hierarchyCaption; + this._numberOfLevels = _numberOfLevels; + this._levelDetails = _levelDetails; + this._appliedValues = _appliedValues; + this._isAllSelected = _isAllSelected; + } + getDomainAsync(domainType) { + throw new Error('Method not implemented.'); + } + get dimensionName() { + return this._dimensionName; + } + get hierarchyCaption() { + return this._hierarchyCaption; + } + get numberOfLevels() { + return this._numberOfLevels; + } + get levelDetails() { + return this._levelDetails; + } + get isAllSelected() { + return this._isAllSelected; + } + get appliedValues() { + return this._appliedValues; + } +} +exports.HierarchicalFilter = HierarchicalFilter; +class RangeFilter extends Filter { + constructor(worksheetName, fieldName, fieldId, filterType, registryId, _min, _max, _includeNullValues) { + super(worksheetName, fieldName, filterType, fieldId, registryId); + this._min = _min; + this._max = _max; + this._includeNullValues = _includeNullValues; + } + get minValue() { + return this._min; + } + get maxValue() { + return this._max; + } + get includeNullValues() { + return this._includeNullValues; + } + getDomainAsync(domainType) { + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + if (!domainType) { + domainType = api_external_contract_js_1.FilterDomainType.Relevant; + } + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(domainType, api_external_contract_js_1.FilterDomainType, 'FilterDomainType'); + return service.getRangeDomainAsync(this._worksheetName, this._fieldId, domainType); + } +} +exports.RangeFilter = RangeFilter; +class RelativeDateFilter extends Filter { + constructor(worksheetName, fieldName, fieldId, filterType, registryId, _anchorDate, _periodType, _rangeType, _rangeN) { + super(worksheetName, fieldName, filterType, fieldId, registryId); + this._anchorDate = _anchorDate; + this._periodType = _periodType; + this._rangeType = _rangeType; + this._rangeN = _rangeN; + } + get anchorDate() { + return this._anchorDate; + } + get periodType() { + return this._periodType; + } + get rangeType() { + return this._rangeType; + } + get rangeN() { + return this._rangeN; + } +} +exports.RelativeDateFilter = RelativeDateFilter; +class CategoricalDomain { + constructor(_values, _domainType) { + this._values = _values; + this._domainType = _domainType; + } + get values() { + return this._values; + } + get type() { + return this._domainType; + } +} +exports.CategoricalDomain = CategoricalDomain; +class RangeDomain { + constructor(_min, _max, _domainType) { + this._min = _min; + this._max = _max; + this._domainType = _domainType; + } + get type() { + return this._domainType; + } + get min() { + return this._min; + } + get max() { + return this._max; + } +} +exports.RangeDomain = RangeDomain; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class DataTable { + constructor(_data, _columns, _totalRowCount, _isTotalRowCountLimited, _isSummaryData, _marksInfo) { + this._data = _data; + this._columns = _columns; + this._totalRowCount = _totalRowCount; + this._isTotalRowCountLimited = _isTotalRowCountLimited; + this._isSummaryData = _isSummaryData; + this._marksInfo = _marksInfo; + this._name = _isSummaryData ? 'Summary Data Table' : 'Underlying Data Table'; + } + get name() { + return this._name; + } + get data() { + return this._data; + } + get columns() { + return this._columns; + } + get marksInfo() { + return this._marksInfo; + } + get totalRowCount() { + return this._totalRowCount; + } + get isTotalRowCountLimited() { + return this._isTotalRowCountLimited; + } + get isSummaryData() { + return this._isSummaryData; + } +} +exports.DataTable = DataTable; +class MarkInfo { + constructor(_type, _color, _tupleId) { + this._type = _type; + this._color = _color; + this._tupleId = _tupleId; + } + get type() { + return this._type; + } + get color() { + return this._color; + } + get tupleId() { + return this._tupleId; + } +} +exports.MarkInfo = MarkInfo; +class Column { + constructor(_fieldName, _fieldId, _dataType, _isReferenced, _index) { + this._fieldName = _fieldName; + this._fieldId = _fieldId; + this._dataType = _dataType; + this._isReferenced = _isReferenced; + this._index = _index; + } + get fieldName() { + return this._fieldName; + } + get fieldId() { + return this._fieldId; + } + get dataType() { + return this._dataType; + } + get isReferenced() { + return this._isReferenced; + } + get index() { + return this._index; + } +} +exports.Column = Column; +class DataValue { + /* tslint:disable:no-any */ + constructor(_value, _nativeValue, _formattedValue, _aliasValue, _hasAlias) { + this._value = _value; + this._nativeValue = _nativeValue; + this._formattedValue = _formattedValue; + this._aliasValue = _aliasValue; + this._hasAlias = _hasAlias; + } + get value() { + return this._value; + } + get nativeValue() { + return this._nativeValue; + } + get formattedValue() { + return this._formattedValue; + } + get aliasValue() { + return this._aliasValue; + } + get hasAlias() { + return this._hasAlias; + } +} +exports.DataValue = DataValue; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Models/GetDataTableReaderModels.js": +/*!*****************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Models/GetDataTableReaderModels.js ***! + \*****************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +class DataTableReader { + constructor(_id, _totalRowCount, _pageRowCount, _registryId) { + this._id = _id; + this._totalRowCount = _totalRowCount; + this._pageRowCount = _pageRowCount; + this._registryId = _registryId; + this._pageCount = Math.ceil(_totalRowCount / _pageRowCount); + } + get totalRowCount() { + return this._totalRowCount; + } + get pageCount() { + return this._pageCount; + } + getPageAsync(pageNumber) { + ErrorHelpers_1.ErrorHelpers.verifyRange(pageNumber, 0, this._pageCount); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + return service.getPageAsync(this._id, pageNumber, this._pageRowCount); + } + getAllPagesAsync(maxRows) { + return __awaiter(this, void 0, void 0, function* () { + const firstPage = yield this.getPageAsync(0); + maxRows = maxRows || this.totalRowCount; + const rowsRequested = Math.min(maxRows, this.totalRowCount); + const pagesRequested = Math.ceil(rowsRequested / this._pageRowCount); + // Fetch up to 400 pages, with a default of 10,000 pageRowCount that gives us 4,000,000 rows + const pagesToFetch = Math.min(pagesRequested, 400); + const isDataLimited = pagesToFetch < pagesRequested; + let remainingData = []; + for (let i = 1; i < pagesToFetch; i++) { + const page = yield this.getPageAsync(i); + remainingData.push(page.data); + } + let fullData = firstPage.data.concat(...remainingData); + // This slices the array only if maxRows has been set and is less than totalRowCount + fullData.length = rowsRequested; + return { + name: firstPage.name, + data: fullData, + columns: firstPage.columns, + totalRowCount: isDataLimited ? pagesToFetch * this._pageRowCount : rowsRequested, + isTotalRowCountLimited: isDataLimited, + isSummaryData: firstPage.isSummaryData, + }; + }); + } + releaseAsync() { + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + return service.releaseAsync(this._id); + } +} +exports.DataTableReader = DataTableReader; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js": +/*!********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Selection Model. + */ +class SelectionModel { +} +exports.SelectionModel = SelectionModel; +/** + * Value based selection model. Meant for hierarchical, range and categorical selections. + */ +class ValueSelectionModel extends SelectionModel { + constructor() { + super(...arguments); + this.selectValues = []; + } +} +exports.ValueSelectionModel = ValueSelectionModel; +/** + * Hierarchical value selection model + */ +class HierarchicalSelectionModel extends ValueSelectionModel { +} +exports.HierarchicalSelectionModel = HierarchicalSelectionModel; +/** + * Range based value selection model + */ +class RangeSelectionModel extends SelectionModel { +} +exports.RangeSelectionModel = RangeSelectionModel; +/** + * Dimension value selection model + */ +class DimensionSelectionModel extends ValueSelectionModel { +} +exports.DimensionSelectionModel = DimensionSelectionModel; +/** + * Tuple based selection model + */ +class TupleSelectionModel { + constructor() { + this.objectIds = []; + } +} +exports.TupleSelectionModel = TupleSelectionModel; +/** + * Container class to populate all the selection models when parsing input + */ +class SelectionModelsContainer { + constructor() { + this.hierModelArr = []; + this.dimModelArr = []; + this.quantModelArr = []; + } +} +exports.SelectionModelsContainer = SelectionModelsContainer; +class SelectTuplesInteractionModel { + constructor(visualIdPresModel, tupleIds = [], selectOptions, tooltipContext) { + this.visualIdPresModel = visualIdPresModel; + this.tupleIds = tupleIds; + this.selectOptions = selectOptions; + this.tooltipContext = tooltipContext; + } +} +exports.SelectTuplesInteractionModel = SelectTuplesInteractionModel; +class HoverTupleInteractionModel { + constructor(visualIdPresModel, tupleId, tooltipContext, allowHoverActions) { + this.visualIdPresModel = visualIdPresModel; + this.tupleId = tupleId; + this.tooltipContext = tooltipContext; + this.allowHoverActions = allowHoverActions; + } +} +exports.HoverTupleInteractionModel = HoverTupleInteractionModel; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Point.js": +/*!***************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Point.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class Point { + constructor(_x, _y) { + this._x = _x; + this._y = _y; + } + get x() { + return this._x; + } + get y() { + return this._y; + } +} +exports.Point = Point; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/GetDataService.js": +/*!*********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/GetDataService.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Defines which type of getData call to make. + */ +var GetDataType; +(function (GetDataType) { + GetDataType["Summary"] = "summary"; + GetDataType["Underlying"] = "underlying"; +})(GetDataType = exports.GetDataType || (exports.GetDataType = {})); + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js": +/*!********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js ***! + \********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const ServiceRegistry_1 = __webpack_require__(/*! ./ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const AccessibilityServiceImpl_1 = __webpack_require__(/*! ./impl/AccessibilityServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/AccessibilityServiceImpl.js"); +const AnimationServiceImpl_1 = __webpack_require__(/*! ./impl/AnimationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js"); +const AnnotationServiceImpl_1 = __webpack_require__(/*! ./impl/AnnotationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js"); +const DataSourceServiceImpl_1 = __webpack_require__(/*! ./impl/DataSourceServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js"); +const ExportServiceImpl_1 = __webpack_require__(/*! ./impl/ExportServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ExportServiceImpl.js"); +const ExternalContextMenuServiceImpl_1 = __webpack_require__(/*! ./impl/ExternalContextMenuServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js"); +const FilterServiceImpl_1 = __webpack_require__(/*! ./impl/FilterServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js"); +const GetDataServiceImpl_1 = __webpack_require__(/*! ./impl/GetDataServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js"); +const NotificationServiceImpl_1 = __webpack_require__(/*! ./impl/NotificationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js"); +const ParametersServiceImpl_1 = __webpack_require__(/*! ./impl/ParametersServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js"); +const SelectionServiceImpl_1 = __webpack_require__(/*! ./impl/SelectionServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js"); +const SizeServiceImpl_1 = __webpack_require__(/*! ./impl/SizeServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js"); +const VisualModelServiceImpl_1 = __webpack_require__(/*! ./impl/VisualModelServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js"); +const VizServiceImpl_1 = __webpack_require__(/*! ./impl/VizServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js"); +const ZoneServiceImpl_1 = __webpack_require__(/*! ./impl/ZoneServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js"); +function registerAllSharedServices(dispatcher, registryId) { + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new AnimationServiceImpl_1.AnimationServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new DataSourceServiceImpl_1.DataSourceServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ExportServiceImpl_1.ExportServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new GetDataServiceImpl_1.GetDataServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new FilterServiceImpl_1.FilterServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new NotificationServiceImpl_1.NotificationServiceImpl(dispatcher)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ParametersServiceImpl_1.ParametersServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new SelectionServiceImpl_1.SelectionServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new AnnotationServiceImpl_1.AnnotationServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ZoneServiceImpl_1.ZoneServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new SizeServiceImpl_1.SizeServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new VisualModelServiceImpl_1.VisualModelServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new VizServiceImpl_1.VizServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ExternalContextMenuServiceImpl_1.ExternalContextMenuServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new AccessibilityServiceImpl_1.AccessibilityServiceImpl(dispatcher, registryId)); +} +exports.registerAllSharedServices = registerAllSharedServices; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js": +/*!**********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +if (typeof window !== 'undefined') { + window.__tableauApiServiceRegistry = window.__tableauApiServiceRegistry || {}; +} +class ServiceRegistryImpl { + constructor() { + this._services = {}; + } + registerService(service) { + this._services[service.serviceName] = service; + } + getService(serviceName) { + if (!this._services.hasOwnProperty(serviceName)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Service not registered: ${serviceName}`); + } + return this._services[serviceName]; + } +} +/** + * Static class used for getting access to the single instance + * of the ApiServiceRegistry associated with the registryId. + * + * Extensions by design don't need to store/access multiple service registries. Their single instance of ServiceRegistry is + * stored/access with registryId = 0. + * + * Whereas Embedding needs to be aware of which ServiceRegistry to use when there are multiple vizzes embedded. + * An example of how window.__tableauApiServiceRegistry will look when there are two vizzes: { 0 : ServiceRegistry, 1 : ServiceRegistry} + * where registry ID of 0 & 1 refers to viz's internal identifier (which is generated by VizManager). + */ +class ApiServiceRegistry { + /** + * Gets the singleton instance of the ServiceRegistry + */ + static get(registryId) { + if (!window.__tableauApiServiceRegistry || !window.__tableauApiServiceRegistry[registryId]) { + ApiServiceRegistry.setInstance(registryId, new ServiceRegistryImpl()); + } + if (!window.__tableauApiServiceRegistry[registryId]) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Service registry failed'); + } + return window.__tableauApiServiceRegistry[registryId]; + } + /** + * Helper method that sets the service registry instance for the corresponding registryId. Can be used by unit tests + * + * @param {ServiceRegistry} serviceRegistry The new registry + */ + static setInstance(registryId, serviceRegistry) { + if (!window.__tableauApiServiceRegistry) { + window.__tableauApiServiceRegistry = {}; + } + window.__tableauApiServiceRegistry[registryId] = serviceRegistry; + } + /** + * Only used by unit tests + */ + static clearRegistry() { + window.__tableauApiServiceRegistry = {}; + } + // Private to avoid anyone constructing this + constructor() { } +} +exports.ApiServiceRegistry = ApiServiceRegistry; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/AccessibilityServiceImpl.js": +/*!************************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/AccessibilityServiceImpl.js ***! + \************************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const AccessibilityModels_1 = __webpack_require__(/*! ../../Models/AccessibilityModels */ "../api-shared-js/lib/src/ApiShared/Models/AccessibilityModels.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class AccessibilityServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "accessibility" /* Accessibility */; + } + getTooltipTextAsync(visualId, tupleId) { + let tooltipTextRequest = new AccessibilityModels_1.TooltipTextRequestModel(visualId, tupleId); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getTooltipTextAsync', + [api_internal_contract_js_1.ParameterId.TooltipTextRequest]: tooltipTextRequest, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetTooltipText, parameters).then((response) => { + return response.result; + }); + } + leaveMarkNavigationAsync(visualId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'leaveMarkNavigationAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + }; + return this.execute(api_internal_contract_js_1.VerbId.RaiseLeaveMarkNavNotification, parameters).then((response) => { + return; + }); + } +} +exports.AccessibilityServiceImpl = AccessibilityServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js": +/*!********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js ***! + \********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class AnimationServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "animation-service" /* Animation */; + } + replayAsync(replaySpeed) { + const parameters = { + [api_internal_contract_js_1.ParameterId.ReplaySpeed]: 1.0, + }; + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(replaySpeed, api_external_contract_js_1.ReplaySpeedType, 'ReplaySpeedType'); + parameters[api_internal_contract_js_1.ParameterId.ReplaySpeed] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.setReplaySpeedType.convert(replaySpeed); + return this.execute(api_internal_contract_js_1.VerbId.ReplayAnimation, parameters).then((response) => { + return; + }); + } +} +exports.AnimationServiceImpl = AnimationServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js": +/*!*********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js ***! + \*********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +const SelectionModels_1 = __webpack_require__(/*! ../../Models/SelectionModels */ "../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js"); +const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class AnnotationServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "annotation-service" /* Annotation */; + } + /** + * Method to annotate a mark on the given worksheet. + * + * @param visualId + * @param mark + * @param annotationText + */ + annotateMarkAsync(visualId, mark, annotationText) { + const selectionModelContainer = this.parseMarkSelectionIds([mark]); + const dummyTargetPoint = { x: 0, y: 0 }; + const formattedText = `${annotationText}`; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'annotateMarkAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.AnnotateEnum]: api_internal_contract_js_1.AnnotateEnum.Mark, + [api_internal_contract_js_1.ParameterId.TargetPoint]: dummyTargetPoint, + [api_internal_contract_js_1.ParameterId.SelectionList]: [selectionModelContainer.selection], + [api_internal_contract_js_1.ParameterId.FormattedText]: formattedText, + }; + return this.execute(api_internal_contract_js_1.VerbId.CreateAnnotation, parameters).then((response) => { + // Expecting an empty model and hence the void response. + return; + }); + } + /** + * Method to retrieve annotations for the given worksheet. + * + * @param visualId + * @returns {Promise>} + */ + getAnnotationsAsync(visualId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getAnnotationsAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetAnnotations, parameters).then((response) => { + const annotationsList = response.result; + return this.annotationFilterMap(annotationsList); + }); + } + /** + * Method to remove an annotation from a given worksheet. + * + * @param visualId + * @param annotation + */ + removeAnnotationAsync(visualId, annotation) { + const selectionModelContainer = this.parseAnnotationSelectionIds([annotation]); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'removeAnnotationAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.SelectionList]: [selectionModelContainer.selection], + }; + return this.execute(api_internal_contract_js_1.VerbId.RemoveAnnotation, parameters).then((response) => { + // Expecting an empty model and hence the void response. + return; + }); + } + /** + * Method to prepare the pres models for selection by MarksInfo + * @param marks + */ + parseMarkSelectionIds(marks) { + const ids = []; + const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + marks.forEach((mark) => { + const tupleId = mark.tupleId; + if (tupleId !== undefined && tupleId !== null && tupleId > 0) { + ids.push(tupleId.toString()); // collect the tuple ids + } + else { + throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'invalid tupleId'); + } + }); + if (ids.length !== 0) { + // tuple ids based selection + const tupleSelectionModel = new SelectionModels_1.TupleSelectionModel(); + tupleSelectionModel.selectionType = 'tuples'; + tupleSelectionModel.objectIds = ids; + selectionModelContainer.selection = tupleSelectionModel; + } + return selectionModelContainer; + } + /** + * Method to prepare the pres models for selection by MarkAnnotationInfo + * @param marks + */ + parseAnnotationSelectionIds(annotations) { + const ids = []; + const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + annotations.forEach((annotation) => { + const annotationId = annotation.annotationId; + if (annotationId !== undefined && annotationId !== null && annotationId >= 0) { + ids.push(annotationId.toString()); // collect the annotation ids + } + else { + throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'invalid annotationId'); + } + }); + if (ids.length !== 0) { + // annotation ids based selection + const tupleSelectionModel = new SelectionModels_1.TupleSelectionModel(); + tupleSelectionModel.selectionType = 'annotations'; + tupleSelectionModel.objectIds = ids; + selectionModelContainer.selection = tupleSelectionModel; + } + return selectionModelContainer; + } + /** + * Method to map Annotation to MarkAnnotationInfo + * @param annotation + * @returns {Annotation} + */ + mapAnnotation(annotation) { + return { + annotationHTML: annotation.annotationText, + annotationId: annotation.annotationId, + annotationText: annotation.annotationPlainText, + annotationType: InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.annotationType.convert(annotation.annotateEnum), + tupleId: annotation.tupleId, + }; + } + /** + * Filter the Annotations to Mark Annotations, and map them to MarkAnnotationInfo + * @param annotations + * @returns {Array} + */ + annotationFilterMap(annotations) { + const annotationInfos = annotations.map((annotation) => this.mapAnnotation(annotation)); + return annotationInfos; + } +} +exports.AnnotationServiceImpl = AnnotationServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js": +/*!*********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js ***! + \*********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class ClientInfoServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "client-info-service" /* ClientInfo */; + } + getClientInfoAsync() { + const verb = api_internal_contract_js_1.VerbId.GetEmbeddingClientInfo; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getClientInfoAsync', + }; + return this.execute(verb, parameters).then((response) => { + const clientInfo = response.result; + return clientInfo; + }); + } +} +exports.ClientInfoServiceImpl = ClientInfoServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js": +/*!*********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js ***! + \*********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const DataSource_1 = __webpack_require__(/*! ../../DataSource */ "../api-shared-js/lib/src/ApiShared/DataSource.js"); +const Field_1 = __webpack_require__(/*! ../../Field */ "../api-shared-js/lib/src/ApiShared/Field.js"); +const DataSourceImpl_1 = __webpack_require__(/*! ../../Impl/DataSourceImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); +const FieldImpl_1 = __webpack_require__(/*! ../../Impl/FieldImpl */ "../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js"); +const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class DataSourceServiceImpl extends ServiceImplBase_1.ServiceImplBase { + // Since Object Model is supported since Tableau 2020.2, DataSourceServiceImpl can be initialized with the + // platform version when OM was supported. Once we drop support for Tableau versions <= 2020.1, all additional + // code in here for Object Model can be removed. + constructor(dispatcher, registryId) { + super(dispatcher, registryId); + } + get serviceName() { + return "data-source-service" /* DataSourceService */; + } + refreshAsync(dataSourceId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'refreshAsync', + [api_internal_contract_js_1.ParameterId.DeltaTimeMs]: 0, + [api_internal_contract_js_1.ParameterId.ShouldRefreshDS]: true, + }; + // On server: Not passing the datasource id will refresh all datasources. + if (dataSourceId) { + parameters[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId; + } + return this.execute(api_internal_contract_js_1.VerbId.RefreshDataSource, parameters).then((response) => { + return; + }); + } + getActiveTablesAsync(dataSourceId) { + const joinParameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getActiveTablesAsync', + [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId, + }; + // Get the description of the tables used by this connection + return this.execute(api_internal_contract_js_1.VerbId.GetActiveTables, joinParameters).then((joinResponse) => { + const tableInfos = joinResponse.result; + // getActiveTables is unsupported for cubes and GA. We do not have a connection type property + // available from the platform (intentionally, to reduce code churn as new connections are added). + // Instead,just check if any tables are returned. This array will be empty for any non-table based datasource. + if (tableInfos.tables.length === 0) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedMethodForDataSourceType, `getActiveTables is not supported for: ${dataSourceId}`); + } + return tableInfos.tables; + }); + } + getDataSourcesAsync(visualId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getDataSourcesAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetDataSources, parameters).then((response) => { + const dataSchema = response.result; + return dataSchema; + }); + } + getAllDataSourcesAsync() { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getAllDataSourcesAsync', + }; + return this.execute(api_internal_contract_js_1.VerbId.GetAllDataSources, parameters).then((response) => { + const dataSchema = response.result; + return dataSchema; + }); + } + getConnectionSummariesAsync(dataSourceId) { + const params = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getConnectionSummariesAsync', + [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId, + }; + // Get the description of the tables used by this connection + return this.execute(api_internal_contract_js_1.VerbId.GetConnectionDescriptionSummaries, params).then((response) => { + const descriptionSummaries = response.result; + return descriptionSummaries; + }); + } + getFieldAsync(globalfieldName) { + const verb = api_internal_contract_js_1.VerbId.GetFieldAndDataSource; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getFieldAsync', + [api_internal_contract_js_1.ParameterId.FieldId]: globalfieldName, + }; + return this.execute(verb, parameters).then((response) => { + const dataSource = response.result[api_internal_contract_js_1.ParameterId.DataSource]; + const field = response.result[api_internal_contract_js_1.ParameterId.Field]; + return this.convertField(field, this.convertDataSource(dataSource)); + }); + } + getLogicalTablesAsync(dataSourceId) { + const params = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getLogicalTablesAsync', + [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTables, params).then((response) => { + return response.result; + }); + } + getUnderlyingTablesAsync(visualId) { + const params = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getUnderlyingTablesAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTables, params).then((response) => { + return response.result; + }); + } + convertField(field, dataSource) { + return new Field_1.Field(new FieldImpl_1.FieldImpl(field, dataSource)); + } + convertDataSource(dataSource) { + return new DataSource_1.DataSource(new DataSourceImpl_1.DataSourceImpl(dataSource, this._registryId)); + } +} +exports.DataSourceServiceImpl = DataSourceServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ExportServiceImpl.js": +/*!*****************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ExportServiceImpl.js ***! + \*****************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +const ExportHelpers_1 = __webpack_require__(/*! ../../Utils/ExportHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class ExportServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "export-service" /* Export */; + } + getExportCrosstabSheetMapAsync(currentSheetType) { + const verb = api_internal_contract_js_1.VerbId.GetExportCrosstabSheetMap; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getExportCrosstabSheetMapAsync', + [api_internal_contract_js_1.ParameterId.CurrentSheetType]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.sheetType.convert(currentSheetType), + }; + return this.execute(verb, parameters).then((response) => { + const result = response.result; + return result; + }); + } + exportCrosstabAsync(sheetName, format, exportableWorksheetNames, currentSheetType) { + return __awaiter(this, void 0, void 0, function* () { + ErrorHelpers_1.ErrorHelpers.verifySheetName(exportableWorksheetNames, sheetName); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(format, api_external_contract_js_1.CrosstabFileFormat, 'CrosstabFileFormat'); + // The pres layer command for exporting Crosstab uses SimpleSheetIdentifiers instead of sheet names. + // The extensions-and-embedding-api current does not store references to the SimpleSheetIdentifiers of its sheets + // so we call a pres layer command that gives us the SimpleSheetIdentifier for each sheet name that appears in the + // export Crosstab dialog popup. + const sheetNameToIdMap = yield this.getExportCrosstabSheetMapAsync(currentSheetType); + if (!sheetNameToIdMap[sheetName]) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'missing sheet doc id from sheetMap'); + } + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportCrosstabAsync', + [api_internal_contract_js_1.ParameterId.SheetIdentifier]: sheetNameToIdMap[sheetName], + [api_internal_contract_js_1.ParameterId.SendNotifications]: true, + }; + // pres layer command invoked depends on the crosstab file format + let verb; + switch (format) { + case api_external_contract_js_1.CrosstabFileFormat.CSV: + verb = api_internal_contract_js_1.VerbId.ExportCrosstabCsvDownload; + // CSV only parameter: see browser-clients/export-crosstab-options-dialog repo + parameters[api_internal_contract_js_1.ParameterId.UseTabDelimiters] = true; + break; + case api_external_contract_js_1.CrosstabFileFormat.Excel: + verb = api_internal_contract_js_1.VerbId.ExportCrosstabExcelDownload; + break; + default: + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'unsupported Crosstab file format.'); + } + return this.execute(verb, parameters) + .then((response) => { + const result = response.result; + return result; + }) + .catch(() => { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.CrosstabCreationError, 'An unexpected error occurred while generating the document.'); + }); + }); + } + exportDataAsync(visualId, options) { + var _a; + ErrorHelpers_1.ErrorHelpers.verifyExportDataOptions(options); + // Remove any duplicates from the input array + const columnsAsSet = new Set(options.columnsToIncludeById); + const columnsToIncludeById = Array.from(columnsAsSet); + const verb = api_internal_contract_js_1.VerbId.ExportDataDownload; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportDataAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: (_a = options.ignoreAliases, (_a !== null && _a !== void 0 ? _a : false)), + [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: columnsToIncludeById, + }; + return this.execute(verb, parameters) + .then(() => { }) + .catch(() => { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.DataCreationError, 'An unexpected error occurred while generating the document.'); + }); + } + exportPowerPointAsync(sheetNames, exportScenarios) { + ErrorHelpers_1.ErrorHelpers.verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios); + // Note: the ExportOriginUrl param is listed as optional for the pres layer command we are invoking; however, + // recent changes were made that enforced the use of the empty string when invoking this command with no ExportOriginUrl. + // see browser-clients/export-powerpoint-options-dialog repo. + const verb = api_internal_contract_js_1.VerbId.ExportPowerpointDownload; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportPowerPointAsync', + [api_internal_contract_js_1.ParameterId.ExportOriginUrl]: '', + [api_internal_contract_js_1.ParameterId.SelectedSheetNames]: sheetNames, + }; + return this.execute(verb, parameters) + .then((response) => { + const result = response.result; + return result; + }) + .catch(() => { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.PowerPointCreationError, 'An error occured while attempting to generate the PowerPoint file.'); + }); + } + exportPDFAsync(sheetNames, externalExportPdfOptions, exportScenarios) { + return __awaiter(this, void 0, void 0, function* () { + ErrorHelpers_1.ErrorHelpers.verifyExportPDFOptions(externalExportPdfOptions); + ErrorHelpers_1.ErrorHelpers.verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios); + const internalExportPdfOptions = yield this.getExportPDFOptionsAsync(); + ExportHelpers_1.ExportHelpers.updateInternalExportPDFOptions(internalExportPdfOptions, externalExportPdfOptions, sheetNames); + const verb = api_internal_contract_js_1.VerbId.ExportPdfDownload; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportPDFAsync', + [api_internal_contract_js_1.ParameterId.ExportPdfOptions]: internalExportPdfOptions, + }; + return this.execute(verb, parameters) + .then((response) => { + const result = response.result; + return result; + }) + .catch(() => { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.PDFCreationError, 'Unable to create PDF because something went wrong. Try again.'); + }); + }); + } + getExportPDFOptionsAsync() { + const verb = api_internal_contract_js_1.VerbId.GetExportPdfOptions; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getExportPdfOptionsAsync', + }; + return this.execute(verb, parameters).then((response) => { + const result = response.result; + return result; + }); + } +} +exports.ExportServiceImpl = ExportServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js": +/*!******************************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js ***! + \******************************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class ExternalContextMenuServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "external-context-menu-service" /* ExternalContextMenu */; + } + appendContextMenuAsync(sheetName, targetMenu, config) { + const verb = api_internal_contract_js_1.VerbId.AppendExternalMenuItem; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'appendContextMenuAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName, + [api_internal_contract_js_1.ParameterId.ExternalMenuItemDisplayName]: config.displayName, + }; + return this.execute(verb, parameters).then((response) => { + const newMenuItemId = response.result; + return newMenuItemId; + }); + } + removeContextMenuAsync(sheetName, targetMenu, menuItemId) { + const verb = api_internal_contract_js_1.VerbId.RemoveExternalMenuItem; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'removeContextMenuAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName, + [api_internal_contract_js_1.ParameterId.ExternalMenuItemId]: menuItemId, + }; + return this.execute(verb, parameters).then((response) => { + return; + }); + } + executeContextMenuAsync(sheetName, targetMenu, menuItemId) { + const verb = api_internal_contract_js_1.VerbId.ExecuteExternalMenuItem; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'executeContextMenuAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName, + [api_internal_contract_js_1.ParameterId.ExternalMenuItemId]: menuItemId, + }; + return this.execute(verb, parameters).then((response) => { + return; + }); + } + renameContextMenuAsync(sheetName, targetMenu, menuHeader, menuDescription) { + const verb = api_internal_contract_js_1.VerbId.RenameExternalMenu; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'renameContextMenuAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName, + [api_internal_contract_js_1.ParameterId.ExternalMenuHeader]: menuHeader, + [api_internal_contract_js_1.ParameterId.ExternalMenuDescription]: menuDescription, + }; + return this.execute(verb, parameters).then((response) => { + return; + }); + } +} +exports.ExternalContextMenuServiceImpl = ExternalContextMenuServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js": +/*!*****************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js ***! + \*****************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ApiShared_1 = __webpack_require__(/*! ../../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); +const ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +const FilterModels_1 = __webpack_require__(/*! ../../Models/FilterModels */ "../api-shared-js/lib/src/ApiShared/Models/FilterModels.js"); +const DataValueFactory_1 = __webpack_require__(/*! ../../Utils/DataValueFactory */ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); +const Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class FilterServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "filter-service" /* Filter */; + } + applyFilterAsync(visualId, fieldName, values, updateType, filterOptions) { + const verb = api_internal_contract_js_1.VerbId.ApplyCategoricalFilter; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyFilterAsync', + }; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; + if (!Array.isArray(values)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'values parameter for applyFilterAsync must be an array'); + } + parameters[api_internal_contract_js_1.ParameterId.FilterValues] = values; + parameters[api_internal_contract_js_1.ParameterId.FilterUpdateType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterUpdateType.convert(updateType); + parameters[api_internal_contract_js_1.ParameterId.IsExcludeMode] = + filterOptions === undefined || filterOptions.isExcludeMode === undefined ? false : filterOptions.isExcludeMode; + return this.execute(verb, parameters).then((response) => { + return fieldName; + }); + } + applyRangeFilterAsync(visualId, fieldName, filterOptions) { + const verb = api_internal_contract_js_1.VerbId.ApplyRangeFilter; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyRangeFilterAsync', + }; + if (filterOptions.min !== undefined && filterOptions.min !== null) { + let min; + if (filterOptions.min instanceof Date) { + min = Param_1.Param.serializeDateForPlatform(filterOptions.min); + } + else { + min = filterOptions.min; + } + parameters[api_internal_contract_js_1.ParameterId.FilterRangeMin] = min; + } + if (filterOptions.max !== undefined && filterOptions.max !== null) { + let max; + if (filterOptions.max instanceof Date) { + max = Param_1.Param.serializeDateForPlatform(filterOptions.max); + } + else { + max = filterOptions.max; + } + parameters[api_internal_contract_js_1.ParameterId.FilterRangeMax] = max; + } + // The null option is used with min+max for 'include-range' or 'include-range-or-null' + if (filterOptions.nullOption) { + parameters[api_internal_contract_js_1.ParameterId.FilterRangeNullOption] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.nullOptions.convert(filterOptions.nullOption); + } + parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + return this.execute(verb, parameters).then((response) => { + this.apiFilterHandlerCheckForCommandError(response.result); + return fieldName; + }); + } + applyHierarchicalFilterAsync(visualId, fieldName, values, updateType, filterOptions) { + const verb = api_internal_contract_js_1.VerbId.HierarchicalFilter; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyHierarchicalFilterAsync', + }; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; + const hierarchicalLevels = values.levels; + if (Array.isArray(hierarchicalLevels) && hierarchicalLevels.length > 0) { + parameters[api_internal_contract_js_1.ParameterId.FilterLevels] = hierarchicalLevels; + } + else if (values.length > 0) { + parameters[api_internal_contract_js_1.ParameterId.FilterValues] = values; + } + else { + // the server command expects empty list for clearing the filter + // it also expects eithers FilterLevels or FilterValues to be set + parameters[api_internal_contract_js_1.ParameterId.FilterLevels] = []; + } + parameters[api_internal_contract_js_1.ParameterId.FilterUpdateType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterUpdateType.convert(updateType); + parameters[api_internal_contract_js_1.ParameterId.IsExcludeMode] = filterOptions && !!filterOptions.isExcludeMode; + return this.execute(verb, parameters).then((response) => { + return fieldName; + }); + } + clearFilterAsync(visualId, fieldName) { + const verb = api_internal_contract_js_1.VerbId.ClearFilter; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'clearFilterAsync', + }; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; + return this.execute(verb, parameters).then((resposne) => { + return fieldName; + }); + } + applyRelativeDateFilterAsync(visualId, fieldName, options) { + const verb = api_internal_contract_js_1.VerbId.ApplyRelativeDateFilter; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyRelativeDateFilterAsync', + }; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; + parameters[api_internal_contract_js_1.ParameterId.PeriodType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.periodType.convert(options.periodType); + parameters[api_internal_contract_js_1.ParameterId.DateRangeType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.dateRangeType.convert(options.rangeType); + if (options.rangeType === api_external_contract_js_1.DateRangeType.LastN || options.rangeType === api_external_contract_js_1.DateRangeType.NextN) { + if (options.rangeN === undefined || options.rangeN === null) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.EmbeddingErrorCodes.MissingRangeNForRelativeDateFilters, 'Missing rangeN field for a relative date filter of LASTN or NEXTN.'); + } + parameters[api_internal_contract_js_1.ParameterId.RangeN] = options.rangeN; + } + if (options.anchorDate !== undefined && options.anchorDate !== null) { + parameters[api_internal_contract_js_1.ParameterId.AnchorDate] = this.convertAnchorDate(options.anchorDate); + } + return this.execute(verb, parameters).then((response) => { + return response.result; + }); + } + getFiltersAsync(visualId) { + const verb = api_internal_contract_js_1.VerbId.GetFilters; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getFiltersAsync', + }; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + return this.execute(verb, parameters).then((response) => { + const filters = response.result; + return this.convertDomainFilters(filters); + }); + } + getCategoricalDomainAsync(worksheetName, fieldId, domainType) { + const verb = api_internal_contract_js_1.VerbId.GetCategoricalDomain; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getCategoricalDomainAsync', + }; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = { + worksheet: worksheetName, + }; + parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; + parameters[api_internal_contract_js_1.ParameterId.DomainType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterDomainType.convert(domainType); + return this.execute(verb, parameters).then((response) => { + const domain = response.result; + return this.convertCategoricalDomain(domain, domainType); + }); + } + getRangeDomainAsync(worksheetName, fieldId, domainType) { + const verb = api_internal_contract_js_1.VerbId.GetRangeDomain; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getRangeDomainAsync', + }; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = { + worksheet: worksheetName, + }; + parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; + parameters[api_internal_contract_js_1.ParameterId.DomainType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterDomainType.convert(domainType); + return this.execute(verb, parameters).then((response) => { + const domain = response.result; + return this.convertRangeDomain(domain, domainType); + }); + } + getDashboardFiltersAsync() { + const verb = api_internal_contract_js_1.VerbId.GetDashboardFilters; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getDashboardFiltersAsync', + }; + return this.execute(verb, parameters).then((response) => { + const filters = response.result; + return this.convertDomainFilters(filters); + }); + } + applyDashboardFilterAsync(fieldName, values, updateType, filterOptions) { + const verb = api_internal_contract_js_1.VerbId.DashboardCategoricalFilter; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyDashboardFilterAsync', + }; + parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; + parameters[api_internal_contract_js_1.ParameterId.FilterValues] = values; + parameters[api_internal_contract_js_1.ParameterId.FilterUpdateType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterUpdateType.convert(updateType); + parameters[api_internal_contract_js_1.ParameterId.IsExcludeMode] = filterOptions && !!filterOptions.isExcludeMode; + return this.execute(verb, parameters).then((response) => { + return response.result; + }); + } + getAppliedWorksheetsAsync(worksheetName, fieldId) { + var _a; + return __awaiter(this, void 0, void 0, function* () { + const sharedFilterModel = yield this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsync'); + const worksheetNames = []; + (_a = sharedFilterModel.worksheets) === null || _a === void 0 ? void 0 : _a.map((worksheetInfo) => { + if (worksheetInfo.isSelected) { + worksheetNames.push(worksheetInfo.worksheetName); + } + }); + return worksheetNames; + }); + } + setAppliedWorksheetsAsync(worksheetName, fieldName, fieldId, applyToWorksheets) { + return __awaiter(this, void 0, void 0, function* () { + const sharedFilterModel = yield this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsyncInternal'); + if (!sharedFilterModel || !sharedFilterModel.worksheets) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'This filter does not apply to multiple worksheets'); + } + const allowedWorksheets = []; + let activeWorksheet = ''; + sharedFilterModel.worksheets.forEach((worksheet) => { + // Get active worksheet + if (worksheet.isActive) { + activeWorksheet = worksheet.worksheetName; + } + // Populate allowed worksheets + if (worksheet.isSelected || worksheet.isEnabled) { + allowedWorksheets.push(worksheet.worksheetName); + } + }); + if (activeWorksheet === '') { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'No active worksheet'); + } + if (!applyToWorksheets.includes(activeWorksheet)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `${activeWorksheet} must be included in the applied worksheets`); + } + applyToWorksheets.forEach((sheet) => { + // check if it's present within compatible sheets + if (!allowedWorksheets.includes(sheet)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `The field ${fieldName} isn't applicable to the worksheet ${sheet}`); + } + }); + const verb = api_internal_contract_js_1.VerbId.ChangeSharedFilter; + const parameters = {}; + parameters[api_internal_contract_js_1.ParameterId.FunctionName] = 'setAppliedWorksheetsAsync'; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = { + worksheet: worksheetName, + }; + parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; + parameters[api_internal_contract_js_1.ParameterId.SharedFilterSheets] = applyToWorksheets; + return this.execute(verb, parameters).then((response) => { + return applyToWorksheets; + }); + }); + } + // Helper Methods + executeGetAppliedWorksheets(worksheetName, fieldId, telemetryFunctionName) { + const verb = api_internal_contract_js_1.VerbId.GetSharedFilter; + const parameters = {}; + parameters[api_internal_contract_js_1.ParameterId.FunctionName] = telemetryFunctionName; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = { + worksheet: worksheetName, + }; + parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; + return this.execute(verb, parameters).then((response) => { + const sharedFilterModel = response.result; + return sharedFilterModel; + }); + } + convertDomainFilters(domainFilters) { + const filters = []; + domainFilters.forEach((domainFilter) => { + switch (domainFilter.filterType) { + case api_internal_contract_js_1.FilterType.Categorical: { + const filter = domainFilter; + if (filter) { + filters.push(this.convertCategoricalFilter(filter)); + } + else { + throw new Error('Invalid Categorical Filter'); + } + break; + } + case api_internal_contract_js_1.FilterType.Hierarchical: { + const filter = domainFilter; + if (filter) { + filters.push(this.convertHierarchicalFilter(filter)); + } + else { + throw new Error('Invalid Hierarchical Filter'); + } + break; + } + case api_internal_contract_js_1.FilterType.Range: { + const filter = domainFilter; + if (filter) { + filters.push(this.convertRangeFilter(filter)); + } + else { + throw new Error('Invalid Range Filter'); + } + break; + } + case api_internal_contract_js_1.FilterType.RelativeDate: { + const filter = domainFilter; + if (filter) { + filters.push(this.convertRelativeDateFilter(filter)); + } + else { + throw new Error('Invalid Relative Date Filter'); + } + break; + } + default: { + break; + } + } + }); + return filters; + } + convertCategoricalFilter(domainFilter) { + const appliedValues = domainFilter.values.map((dv) => { + return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(dv); + }); + return new FilterModels_1.CategoricalFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Categorical, this._registryId, appliedValues, domainFilter.isExclude, domainFilter.isAllSelected); + } + convertHierarchicalFilter(domainFilter) { + const appliedValues = domainFilter.values.map((hierarchicalDataValue) => { + return new FilterModels_1.HierarchicalDataValue(DataValueFactory_1.DataValueFactory.MakeFilterDataValue(hierarchicalDataValue.value), hierarchicalDataValue.hierarchicalPath, hierarchicalDataValue.level); + }); + const levelDetails = domainFilter.levelInfo.map((aLevel) => { + return new FilterModels_1.HierarchicalLevelDetail(aLevel.name, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.hierarchicalLevelSelectionState.convert(aLevel.levelSelectionState)); + }); + return new FilterModels_1.HierarchicalFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Hierarchical, this._registryId, domainFilter.dimensionName, domainFilter.hierarchyCaption, domainFilter.levels, levelDetails, appliedValues, domainFilter.isAllSelected); + } + convertRangeFilter(domainFilter) { + const minValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.min); + const maxValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.max); + return new FilterModels_1.RangeFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Range, this._registryId, minValue, maxValue, domainFilter.includeNullValues); + } + convertRelativeDateFilter(domainFilter) { + const anchorDateValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.anchorDate); + return new FilterModels_1.RelativeDateFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_external_contract_js_1.FilterType.RelativeDate, this._registryId, anchorDateValue, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateStepPeriod.convert(domainFilter.periodType), InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateRangeType.convert(domainFilter.rangeType), domainFilter.rangeN); + } + convertCategoricalDomain(domain, domainType) { + const values = domain.values.map((domainDv) => { + return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainDv); + }); + return new FilterModels_1.CategoricalDomain(values, domainType); + } + convertRangeDomain(domain, domainType) { + const min = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.min); + const max = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.max); + return new FilterModels_1.RangeDomain(min, max, domainType); + } + convertAnchorDate(anchorDate) { + // Converts a Date object into a string format that the server expects for date/time values. + // If anchorDate doesn't represent a valid Date object, any of these would be NaN. + const year = anchorDate.getUTCFullYear(); + const month = anchorDate.getUTCMonth() + 1; + const day = anchorDate.getUTCDate(); + const hh = anchorDate.getUTCHours(); + const mm = anchorDate.getUTCMinutes(); + const sec = anchorDate.getUTCSeconds(); + if (isNaN(year) || isNaN(month) || isNaN(day) || isNaN(hh) || isNaN(mm) || isNaN(sec)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.EmbeddingErrorCodes.InvalidDateParameter, 'Invalid date parameter: anchorDate'); + } + const result = `${year}-${month}-${day} ${hh}:${mm}:${sec}`; + return result; + } + apiFilterHandlerCheckForCommandError(serverPm) { + if (!serverPm[InternalContract.ParameterId.ParameterError]) { + return; + } + if (serverPm[InternalContract.ParameterId.InvalidFieldCaption]) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidFilterFieldName, serverPm[InternalContract.ParameterId.InvalidFieldCaption]); + } + if (serverPm[InternalContract.ParameterId.InvalidValues]) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidFilterFieldValue, serverPm[InternalContract.ParameterId.InvalidValues]); + } + if (serverPm[InternalContract.ParameterId.InvalidAggFieldName]) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidAggregationFieldName, serverPm[InternalContract.ParameterId.InvalidAggFieldName]); + } + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.ServerError, 'Server Error'); + } +} +exports.FilterServiceImpl = FilterServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js": +/*!******************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js ***! + \******************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const uuid_1 = __webpack_require__(/*! uuid */ "../api-shared-js/node_modules/uuid/dist/esm-browser/index.js"); +const ApiShared_1 = __webpack_require__(/*! ../../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); +const ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +const GetDataModels_1 = __webpack_require__(/*! ../../Models/GetDataModels */ "../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js"); +const GetDataTableReaderModels_1 = __webpack_require__(/*! ../../Models/GetDataTableReaderModels */ "../api-shared-js/lib/src/ApiShared/Models/GetDataTableReaderModels.js"); +const DataValueFactory_1 = __webpack_require__(/*! ../../Utils/DataValueFactory */ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); +const GetDataService_1 = __webpack_require__(/*! ../GetDataService */ "../api-shared-js/lib/src/ApiShared/Services/GetDataService.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class GetDataServiceImpl extends ServiceImplBase_1.ServiceImplBase { + constructor() { + super(...arguments); + // The extension/embedding instance uses the same cache for all DataTableReaders. + this.viewDataTableCacheId = uuid_1.v4(); + } + get serviceName() { + return "get-data-service" /* GetData */; + } + getMaxRowLimit() { + return 10000; + } + getViewDataTableCacheId() { + return this.viewDataTableCacheId; + } + getLimitedMaxRows(requestedRows, rowCountLimit) { + return requestedRows > 0 && requestedRows < rowCountLimit ? requestedRows : rowCountLimit; + } + getUnderlyingDataAsync(visualId, getType, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption, applyWorksheetFormatting) { + // Create all of our parameters + const summaryData = getType === GetDataService_1.GetDataType.Summary; + const functionName = summaryData ? 'getSummaryDataAsync' : 'getUnderlyingDataAsync'; + const verb = summaryData ? api_internal_contract_js_1.VerbId.GetDataSummaryData : api_internal_contract_js_1.VerbId.GetUnderlyingData; + const requestMaxRows = verb === api_internal_contract_js_1.VerbId.GetUnderlyingData ? this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1) : maxRows; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: functionName, + }; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + parameters[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases; + parameters[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection; + parameters[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns; + parameters[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById); + parameters[api_internal_contract_js_1.ParameterId.MaxRows] = requestMaxRows; + parameters[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption); + parameters[api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting] = applyWorksheetFormatting; + return this.execute(verb, parameters).then((response) => { + const responseData = response.result; + return this.processResultsTable(responseData.data, responseData.isSummary); + }); + } + getSummaryDataReaderAsync(visualId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption, applyWorksheetFormatting) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getSummaryDataReaderAsync', + [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(), + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.PageRowCount]: pageRowCount, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, + [api_internal_contract_js_1.ParameterId.IgnoreSelection]: ignoreSelection, + [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: includeAllColumns, + [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), + [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + [api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting]: applyWorksheetFormatting, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetDataSummaryDataReader, parameters).then((response) => { + const responseData = response.result; + return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, this._registryId); + }); + } + getSummaryColumnsInfoAsync(visualId) { + // Create all the parameters for GetDataType of Summary with 1 row, and only native values + // Then return just the columns + const verb = api_internal_contract_js_1.VerbId.GetDataSummaryData; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getSummaryColumnsInfoAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: true, + [api_internal_contract_js_1.ParameterId.IgnoreSelection]: true, + [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: true, + [api_internal_contract_js_1.ParameterId.MaxRows]: 1, + [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly, + }; + return this.execute(verb, parameters).then((response) => { + const underlyingDataTable = response.result; + const dataTable = underlyingDataTable.data; + const columns = dataTable.headers.map((h) => new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index)); + return columns; + }); + } + getSelectedMarksAsync(visualId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getSelectedMarksAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetSelectedMarks, parameters).then((response) => { + const responseData = response.result; + return { + data: responseData.data.map((table) => this.processResultsTable(table, true)), + }; + }); + } + getHighlightedMarksAsync(visualId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getHighlightedMarksAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetHighlightedMarks, parameters).then((response) => { + const responseData = response.result; + return { + data: responseData.data.map((table) => this.processResultsTable(table, true)), + }; + }); + } + getDataSourceDataAsync(dataSourceId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getDataSourceDataAsync', + [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, + [api_internal_contract_js_1.ParameterId.MaxRows]: this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1), + [api_internal_contract_js_1.ParameterId.ColumnsToInclude]: this.verifyIncludeColumnArray(columnsToInclude), + [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), + [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + }; + return this.execute(api_internal_contract_js_1.VerbId.GetDataSourceData, parameters).then((response) => { + const responseData = response.result; + return this.processResultsTable(responseData.data, false); + }); + } + getLogicalTableDataAsync(datasourceId, logicalTableId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getLogicalTableDataAsync', + [api_internal_contract_js_1.ParameterId.ColumnsToInclude]: columnsToInclude, + [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), + [api_internal_contract_js_1.ParameterId.DataSourceId]: datasourceId, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, + [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId, + [api_internal_contract_js_1.ParameterId.MaxRows]: this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1), + [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + }; + return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableData, parameters).then((response) => { + const responseData = response.result; + return this.processResultsTable(responseData.data, false); + }); + } + getLogicalTableDataReaderAsync(datasourceId, logicalTableId, pageRowCount, ignoreAliases, columnsToIncludeById, includeDataValuesOption) { + pageRowCount = this.getLimitedMaxRows(pageRowCount, this.getMaxRowLimit()); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getLogicalTableDataReaderAsync', + [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(), + [api_internal_contract_js_1.ParameterId.DataSourceId]: datasourceId, + [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId, + [api_internal_contract_js_1.ParameterId.PageRowCount]: pageRowCount, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, + [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), + [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + }; + return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableDataReader, parameters).then((response) => { + const responseData = response.result; + return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, this._registryId); + }); + } + getUnderlyingTableDataAsync(visualId, logicalTableId, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption, applyWorksheetFormatting) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getUnderlyingTableDataAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, + [api_internal_contract_js_1.ParameterId.IgnoreSelection]: ignoreSelection, + [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: includeAllColumns, + [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), + [api_internal_contract_js_1.ParameterId.MaxRows]: this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1), + [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + [api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting]: applyWorksheetFormatting, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableData, parameters).then((response) => { + const responseData = response.result; + return this.processResultsTable(responseData.data, false); + }); + } + getUnderlyingTableDataReaderAsync(visualId, logicalTableId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption, applyWorksheetFormatting) { + pageRowCount = this.getLimitedMaxRows(pageRowCount, this.getMaxRowLimit()); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getUnderlyingTableDataReaderAsync', + [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(), + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, + [api_internal_contract_js_1.ParameterId.IgnoreSelection]: ignoreSelection, + [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: includeAllColumns, + [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), + [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + [api_internal_contract_js_1.ParameterId.PageRowCount]: pageRowCount, + [api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting]: applyWorksheetFormatting, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableDataReader, parameters).then((response) => { + const responseData = response.result; + return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, this._registryId); + }); + } + getPageAsync(tableId, pageNumber, pageSize) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getPageAsync', + [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(), + [api_internal_contract_js_1.ParameterId.ViewDataTableId]: tableId, + [api_internal_contract_js_1.ParameterId.DataRowIndex]: pageNumber * pageSize, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetDataTableReaderPage, parameters).then((response) => { + const responseData = response.result; + return this.processResultsPage(responseData, tableId === GetDataServiceImpl.summaryTableId ? true : false); + }); + } + releaseAsync(tableId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'release', + [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(), + [api_internal_contract_js_1.ParameterId.ViewDataTableId]: tableId, + }; + return this.execute(api_internal_contract_js_1.VerbId.ReleaseDataTableReader, parameters).then((response) => { + return; + }); + } + verifyIncludeColumnArray(columns) { + // columns must be a valid array + if (!Array.isArray(columns)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'columnsToInclude and columnsToIncludeById must be valid arrays'); + } + // Remove any duplicates from the input array + const columnsAsSet = new Set(columns); + return Array.from(columnsAsSet); + } + processResultsTable(responseData, isSummary) { + const headers = responseData.headers.map((h) => new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index)); + // TODO This should be controlled by a flag indicating whether this api will respond marks info or not + let marks; + if (responseData.marks) { + marks = responseData.marks.map((h) => new GetDataModels_1.MarkInfo(h.type, h.color, h.tupleId)); + } + // Limit+1 is our sentinal that underlying data contains more rows than user is allowed to fetch. + // Remove the last element so we always return MaxRowLimit + const isTotalRowCountLimited = isSummary === false && responseData.dataTable.length === this.getMaxRowLimit() + 1; + if (isTotalRowCountLimited) { + responseData.dataTable.length -= 1; + } + const table = responseData.dataTable.map((row) => { + return row.map((cell, index) => { + return DataValueFactory_1.DataValueFactory.MakeTableDataValue(cell, headers[index].dataType); + }); + }); + if (marks) { + return new GetDataModels_1.DataTable(table, headers, table.length, isTotalRowCountLimited, isSummary, marks); + } + return new GetDataModels_1.DataTable(table, headers, table.length, isTotalRowCountLimited, isSummary); + } + processResultsPage(responseData, isSummary) { + const headers = responseData.headers.map((h) => new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index)); + let marks; + if (responseData.marks) { + marks = responseData.marks.map((h) => new GetDataModels_1.MarkInfo(h.type, h.color, h.tupleId)); + } + const table = responseData.dataTable.map((row) => { + return row.map((cell, index) => { + return DataValueFactory_1.DataValueFactory.MakeTableDataValue(cell, headers[index].dataType); + }); + }); + if (marks) { + return new GetDataModels_1.DataTable(table, headers, table.length, false, isSummary, marks); + } + return new GetDataModels_1.DataTable(table, headers, table.length, false, isSummary); + } +} +exports.GetDataServiceImpl = GetDataServiceImpl; +GetDataServiceImpl.summaryTableId = ''; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js": +/*!***********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js ***! + \***********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const NotificationServiceImplBase_1 = __webpack_require__(/*! ./NotificationServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js"); +class NotificationServiceImpl extends NotificationServiceImplBase_1.NotificationServiceImplBase { + get serviceName() { + return "notification-service" /* Notification */; + } +} +exports.NotificationServiceImpl = NotificationServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js": +/*!***************************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js ***! + \***************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +class Registration { + constructor(_filterFn, _callbackFn) { + this._filterFn = _filterFn; + this._callbackFn = _callbackFn; + // Nothing Here + } + onNotification(notificationModel) { + if (this._filterFn(notificationModel)) { + this._callbackFn(notificationModel); + } + } +} +exports.Registration = Registration; +class NotificationServiceImplBase { + constructor(dispatcher) { + this.dispatcher = dispatcher; + this._handlers = {}; + this.dispatcher.registerNotificationHandler(this.onNotification.bind(this)); + } + registerHandler(id, filterFn, handler) { + const handlers = this._handlers[id] || new Array(); + const registration = new Registration(filterFn, handler); + handlers.push(registration); + this._handlers[id] = handlers; + return () => this.removeRegistration(id, registration); + } + hasHandlersForNotificationType(id) { + // eslint-disable-next-line no-prototype-builtins + return this._handlers.hasOwnProperty(id); + } + onNotification(notification) { + if (!this.hasHandlersForNotificationType(notification.notificationId)) { + return; + } + // Go through and check for all the handlers of this particular notification + this._handlers[notification.notificationId].forEach((h) => h.onNotification(notification.data)); + } + removeRegistration(id, registration) { + if (!this.hasHandlersForNotificationType(id)) { + return; + } + this._handlers[id] = this._handlers[id].filter((reg) => reg !== registration); + } +} +exports.NotificationServiceImplBase = NotificationServiceImplBase; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js": +/*!*********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js ***! + \*********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ParameterImpl_1 = __webpack_require__(/*! ../../Impl/ParameterImpl */ "../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js"); +const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class ParametersServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "parameters-service" /* Parameters */; + } + getParametersForSheetAsync(sheetPath) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getParametersForSheetAsync', + [api_internal_contract_js_1.ParameterId.SheetPath]: sheetPath, + }; + return this.getParametersAsync(parameters); + } + getAllParametersAsync() { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getParametersForSheetAsync', + }; + return this.getParametersAsync(parameters); + } + getParametersAsync(inputParameters) { + return this.execute(api_internal_contract_js_1.VerbId.GetParametersForSheet, inputParameters).then((response) => { + const result = response.result; + return result.map((parameterInfo) => { + return new ParameterImpl_1.ParameterImpl(parameterInfo, this._registryId); + }); + }); + } + changeParameterValueAsync(fieldName, newValue) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'changeParameterValueAsync', + [api_internal_contract_js_1.ParameterId.ParameterFieldName]: fieldName, + [api_internal_contract_js_1.ParameterId.ParameterValue]: newValue, + }; + return this.execute(api_internal_contract_js_1.VerbId.ChangeParameterValue, parameters).then((response) => { + const result = response.result; + return result; + }); + } + findParameterByNameAsync(name) { + return this.findParameterAsync(name, undefined); + } + findParameterByGlobalFieldNameAsync(fieldName) { + return this.findParameterAsync(undefined, fieldName); + } + findParameterAsync(name, fieldName) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'findParameterAsync', + }; + if (name !== undefined) { + parameters[api_internal_contract_js_1.ParameterId.ParameterCaption] = name; + } + else if (fieldName !== undefined) { + parameters[api_internal_contract_js_1.ParameterId.ParameterFieldName] = fieldName; + } + else { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'name or fieldName must be provided to find parameter'); + } + return this.execute(api_internal_contract_js_1.VerbId.FindParameter, parameters).then((response) => { + const instanceOfParameterInfo = (object) => { + return 'fieldName' in object; + }; + // We need to check to see if we got a valid response back again + if (instanceOfParameterInfo(response.result)) { + const result = response.result; + return new ParameterImpl_1.ParameterImpl(result, this._registryId); + } + else { + return undefined; + } + }); + } +} +exports.ParametersServiceImpl = ParametersServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js": +/*!********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js ***! + \********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const SelectionModels_1 = __webpack_require__(/*! ../../Models/SelectionModels */ "../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js"); +const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class SelectionServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "selection-service" /* Selection */; + } + /** + * Method to clear all the selected marks for the given worksheet. + * + * @param visualId + */ + clearSelectedMarksAsync(visualId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'clearSelectedMarksAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + }; + return this.execute(api_internal_contract_js_1.VerbId.ClearSelectedMarks, parameters).then((response) => { + return; // Expecting an empty model and hence the void response. + }); + } + /** + * Method to select marks for the given worksheet. + * + * @param visualId + * @param selectionCriteria + * @param selectionUpdateType + */ + selectMarksByValueAsync(visualId, selectionCriterias, selectionUpdateType) { + if (selectionCriterias.length === 0) { + throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Selection criteria missing for selecting marks by value'); + } + const selectionType = this.validateSelectionUpdateType(selectionUpdateType); + const selectionModelContainer = this.parseSelectionMarks(selectionCriterias); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'selectMarksByValueAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.SelectionUpdateType]: selectionType, + }; + if (selectionModelContainer.hierModelArr && selectionModelContainer.hierModelArr.length) { + parameters[api_internal_contract_js_1.ParameterId.HierValSelectionModels] = selectionModelContainer.hierModelArr; + } + if (selectionModelContainer.quantModelArr && selectionModelContainer.quantModelArr.length) { + parameters[api_internal_contract_js_1.ParameterId.QuantRangeSelectionModels] = selectionModelContainer.quantModelArr; + } + if (selectionModelContainer.dimModelArr && selectionModelContainer.dimModelArr.length) { + parameters[api_internal_contract_js_1.ParameterId.DimValSelectionModels] = selectionModelContainer.dimModelArr; + } + return this.execute(api_internal_contract_js_1.VerbId.SelectByValue, parameters).then((response) => { + this.apiFilterHandlerCheckForCommandError(response.result); + return; + }); + } + /** + * Method to execute hover actions and render tooltip for a given tuple representing a mark in the visualization. + * If the tooltip parameter is included it will show the tooltip on hover. If not, no tooltip is shown. + * + * @param visualId + * @param hoveredTuple + * @param tooltip + * @returns empty promise that resolves when the extension host has successfully been informed of the request and rejects on error + */ + hoverTupleAsync(visualId, hoveredTuple, tooltip, allowHoverActions) { + let interactionModel = new SelectionModels_1.HoverTupleInteractionModel(visualId, this.ensureTupleIDIsNonNegative(hoveredTuple), tooltip, allowHoverActions); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'hoverTupleAsync', + [api_internal_contract_js_1.ParameterId.HoverTupleInteraction]: interactionModel, + }; + return this.execute(api_internal_contract_js_1.VerbId.RaiseHoverTupleNotification, parameters).then((response) => { + return; + }); + } + /** + * Method to modify selection, execute select actions and render tooltip for a given list of tuples representing a mark or marks in the visualization. + * If the tooltip parameter is included it will show the tooltip on select. If not, no tooltip is shown. + * + * @param visualId + * @param selectedTuples + * @param selectOption + * @param tooltip + * @returns empty promise that resolves when the extension host has successfully been informed of the request and rejects on error + */ + selectTuplesAsync(visualId, selectedTuples, selectOption, tooltip) { + let interactionModel = new SelectionModels_1.SelectTuplesInteractionModel(visualId, selectedTuples, selectOption, tooltip); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'selectTuplesAsync', + [api_internal_contract_js_1.ParameterId.SelectTuplesInteraction]: interactionModel, + }; + return this.execute(api_internal_contract_js_1.VerbId.RaiseSelectTuplesNotification, parameters).then((response) => { + return; + }); + } + apiFilterHandlerCheckForCommandError(serverPm) { + if (!serverPm[api_internal_contract_js_1.ParameterId.ParameterError]) { + return; + } + if (serverPm[api_internal_contract_js_1.ParameterId.InvalidFields]) { + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InvalidSelectionFieldName, serverPm[api_internal_contract_js_1.ParameterId.InvalidFields]); + } + if (serverPm[api_internal_contract_js_1.ParameterId.InvalidValues]) { + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InvalidSelectionValue, serverPm[api_internal_contract_js_1.ParameterId.InvalidValues]); + } + if (serverPm[api_internal_contract_js_1.ParameterId.InvalidDates]) { + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InvalidSelectionDate, serverPm[api_internal_contract_js_1.ParameterId.InvalidDates]); + } + } + /** + * Method to select marks for the given worksheet. + * + * @param visualId + * @param MarkInfo + * @param selectionUpdateType + */ + selectMarksByIdAsync(visualId, marks, selectionUpdateType) { + if (marks.length === 0) { + throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Marks info missing for selecting marks by Id'); + } + const selectionType = this.validateSelectionUpdateType(selectionUpdateType); + const selectionModelContainer = this.parseSelectionIds(marks); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'selectMarksByIdAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.SelectionUpdateType]: selectionType, + [api_internal_contract_js_1.ParameterId.Selection]: selectionModelContainer.selection, + }; + return this.execute(api_internal_contract_js_1.VerbId.SelectByValue, parameters).then((response) => { + // Expecting an empty model and hence the void response. + return; + // TODO Investigate the error response with multiple output params and throw error accordingly. + }); + } + /** + * Method to prepare the pres models for selection by MarksInfo + * @param marks + */ + parseSelectionIds(marks) { + const ids = []; + const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + for (let i = 0; i < marks.length; i++) { + const tupleId = marks[i].tupleId; + if (tupleId !== undefined && tupleId !== null) { + // If tuple id is provided use that instead of pair + ids.push(tupleId.toString()); // collect the tuple ids + } + else { + throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'tupleId parsing error'); + } + } + if (ids.length !== 0) { + // tuple ids based selection + const tupleSelectionModel = new SelectionModels_1.TupleSelectionModel(); + tupleSelectionModel.selectionType = 'tuples'; + tupleSelectionModel.objectIds = ids; + selectionModelContainer.selection = tupleSelectionModel; + } + return selectionModelContainer; + } + /** + * Method to prepare the pres models for selection by values. + * + * Supports 3 types for selection: + * 1) Hierarchical value based selection + * 2) Range value based selection + * 3) Dimension value based selection + * + * @param marks + */ + parseSelectionMarks(selectionCriterias) { + const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + for (let i = 0; i < selectionCriterias.length; i++) { + const st = selectionCriterias[i]; + if (!(st.fieldName && st.value !== undefined && st.value !== null)) { + throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'Selection Criteria parsing error'); + } + const catRegex = new RegExp('([[A-Za-z0-9]+]).*', 'g'); + const rangeOption = st.value; + if (catRegex.test(st.fieldName)) { + // Hierarchical value selection + const hierModel = this.addToParamsList(st.fieldName, st.value); + selectionModelContainer.hierModelArr.push(hierModel); + } + else if (rangeOption.min !== undefined && rangeOption.max !== undefined) { + // Range value selection + const quantModel = this.addToRangeParamsList(st.fieldName, rangeOption); + selectionModelContainer.quantModelArr.push(quantModel); + } + else { + // Dimension value selection + const dimModel = this.addToParamsList(st.fieldName, st.value); + selectionModelContainer.dimModelArr.push(dimModel); + } + } + return selectionModelContainer; + } + /** + * Method to transform the key value pair into value based pres model object. + * + * @param valueSelectionModel + * @param fieldName + * @param value + */ + addToParamsList(fieldName, value) { + const valueSelectionModel = new SelectionModels_1.ValueSelectionModel(); + const markValues = []; + if (value instanceof Array) { + const valueArr = value; + for (let i = 0; i < valueArr.length; i++) { + markValues.push(Param_1.Param.serializeParameterValue(valueArr[i])); + } + } + else { + markValues.push(Param_1.Param.serializeParameterValue(value)); + } + valueSelectionModel.qualifiedFieldCaption = fieldName; + valueSelectionModel.selectValues = markValues; + return valueSelectionModel; + } + /** + * Method to transform the key value pair into range based selection pres model. + * + * TODO: Need to handle the parsing of date type values. + * + * @param valueSelectionModel + * @param fieldName + * @param value + */ + addToRangeParamsList(fieldName, value) { + const rangeSelectionModel = new SelectionModels_1.RangeSelectionModel(); + rangeSelectionModel.qualifiedFieldCaption = fieldName; + if (value.max !== undefined && value.max !== null) { + rangeSelectionModel.maxValue = Param_1.Param.serializeParameterValue(value.max); + } + if (value.min !== undefined && value.min !== null) { + rangeSelectionModel.minValue = Param_1.Param.serializeParameterValue(value.min); + } + rangeSelectionModel.included = this.validateNullOptionType(value.nullOption); + return rangeSelectionModel; + } + /** + * Method to validate the selection update type. + * + * @param selectionUpdateType + */ + validateSelectionUpdateType(selectionUpdateType) { + if (selectionUpdateType === Contract.SelectionUpdateType.Replace) { + return api_internal_contract_js_1.SelectionUpdateType.Replace; + } + else if (selectionUpdateType === Contract.SelectionUpdateType.Add) { + return api_internal_contract_js_1.SelectionUpdateType.Add; + } + else if (selectionUpdateType === Contract.SelectionUpdateType.Remove) { + return api_internal_contract_js_1.SelectionUpdateType.Remove; + } + return api_internal_contract_js_1.SelectionUpdateType.Replace; + } + /** + * Method to validate the include type for range selection. + * + * @param nullOption + */ + validateNullOptionType(nullOption) { + if (nullOption) { + if (nullOption === Contract.FilterNullOption.NullValues) { + return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeNull; + } + else if (nullOption === Contract.FilterNullOption.NonNullValues) { + return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeNonNull; + } + else if (nullOption === Contract.FilterNullOption.AllValues) { + return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeAll; + } + } + return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeAll; + } + ensureTupleIDIsNonNegative(tupleId) { + if (tupleId && tupleId > 0) { + return tupleId; + } + // 0 will not refer to a valid tuple (since tuple ids are 1-based), + // but can be used for clearing the current hover or selection + return 0; + } +} +exports.SelectionServiceImpl = SelectionServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js": +/*!***************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js ***! + \***************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const EnumConverter_1 = __webpack_require__(/*! ../../Utils/EnumConverter */ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); +/** + * Each ServceImpl should extend this base class for the sake of + * proper error handling. This base handles the conversion + * from internal errors to external errors that we throw to developers + */ +class ServiceImplBase { + constructor(_dispatcher, _registryId) { + this._dispatcher = _dispatcher; + this._registryId = _registryId; + } + execute(verb, params) { + return this._dispatcher.execute(verb, params).catch((error) => { + // Any internal error that comes from the dispatcher should be converted + // to an external error using the enum mapper for error codes. + const internalError = error; + const externalErrorCode = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.errorCode.convert(internalError.errorCode, EnumConverter_1.ShouldThrow.No); + throw new TableauError_1.TableauError(externalErrorCode, internalError.message); + }); + } +} +exports.ServiceImplBase = ServiceImplBase; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js": +/*!***************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js ***! + \***************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class SizeServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "size-service" /* Size */; + } + changeSizeAsync(name, newSize) { + var _a, _b, _c, _d; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'changeSizeAsync', + [api_internal_contract_js_1.ParameterId.SheetName]: name, + [api_internal_contract_js_1.ParameterId.MinHeight]: ((_a = newSize.minSize) === null || _a === void 0 ? void 0 : _a.height) || 0, + [api_internal_contract_js_1.ParameterId.MinWidth]: ((_b = newSize.minSize) === null || _b === void 0 ? void 0 : _b.width) || 0, + [api_internal_contract_js_1.ParameterId.MaxHeight]: ((_c = newSize.maxSize) === null || _c === void 0 ? void 0 : _c.height) || 0, + [api_internal_contract_js_1.ParameterId.MaxWidth]: ((_d = newSize.maxSize) === null || _d === void 0 ? void 0 : _d.width) || 0, + }; + return this.execute(api_internal_contract_js_1.VerbId.SetSheetSize, parameters).then((_response) => { + return; + }); + } +} +exports.SizeServiceImpl = SizeServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/StoryActivationServiceImpl.js": +/*!**************************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/StoryActivationServiceImpl.js ***! + \**************************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class StoryActivationServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "story-activation-service" /* StoryActivation */; + } + activateNextStoryPointAsync() { + const verb = api_internal_contract_js_1.VerbId.ActivateNextStoryPoint; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'activateNextStoryPointAsync', + }; + return this.execute(verb, parameters).then((response) => { + return; + }); + } + activatePreviousStoryPointAsync() { + const verb = api_internal_contract_js_1.VerbId.ActivatePreviousStoryPoint; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'activatePreviousStoryPointAsync', + }; + return this.execute(verb, parameters).then((response) => { + return; + }); + } + activateStoryPointAsync(index) { + const verb = api_internal_contract_js_1.VerbId.ActivateStoryPoint; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'activateStoryPointAsync', + }; + parameters[api_internal_contract_js_1.ParameterId.StoryPointIndex] = index; + return this.execute(verb, parameters).then((response) => { + return; + }); + } + revertStoryPointAsync(index) { + const verb = api_internal_contract_js_1.VerbId.RevertStoryPoint; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'revertStoryPointAsync', + }; + parameters[api_internal_contract_js_1.ParameterId.StoryPointIndex] = index; + return this.execute(verb, parameters).then((response) => { + return response.result; + }); + } +} +exports.StoryActivationServiceImpl = StoryActivationServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js": +/*!**********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class VisualModelServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "visual-model-service" /* VisualModel */; + } + getVisualSpecificationAsync(visualId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getVisualSpecificationAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetVisualSpecification, parameters).then((response) => { + const result = response.result; + return result; + }); + } + addMarksCardFieldsAsync(visualId, marksCardIndex, encodingType, columns, startIndex) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'addMarksCardFieldsAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet, + [api_internal_contract_js_1.ParameterId.MarksCardIndex]: marksCardIndex, + [api_internal_contract_js_1.ParameterId.EncodingType]: encodingType, + [api_internal_contract_js_1.ParameterId.Columns]: columns, + [api_internal_contract_js_1.ParameterId.StartIndex]: startIndex, + }; + return this.execute(api_internal_contract_js_1.VerbId.AddMarksCardFields, parameters).then(() => { + return; + }); + } + moveMarksCardFieldAsync(visualId, marksCardIndex, fromIndex, toIndex, fieldCount = 1) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'addMarksCardFieldsAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet, + [api_internal_contract_js_1.ParameterId.MarksCardIndex]: marksCardIndex, + [api_internal_contract_js_1.ParameterId.FromIndex]: fromIndex, + [api_internal_contract_js_1.ParameterId.ToIndex]: toIndex, + [api_internal_contract_js_1.ParameterId.FieldCount]: fieldCount, + }; + return this.execute(api_internal_contract_js_1.VerbId.MoveMarksCardField, parameters).then(() => { + return; + }); + } + spliceMarksCardFieldsAsync(visualId, marksCardIndex, encodingType, startIndex, deleteCount, columns) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'spliceMarksCardFieldsAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet, + [api_internal_contract_js_1.ParameterId.MarksCardIndex]: marksCardIndex, + [api_internal_contract_js_1.ParameterId.EncodingType]: encodingType, + [api_internal_contract_js_1.ParameterId.StartIndex]: startIndex, + [api_internal_contract_js_1.ParameterId.DeleteCount]: deleteCount, + [api_internal_contract_js_1.ParameterId.Columns]: columns, + }; + return this.execute(api_internal_contract_js_1.VerbId.SpliceMarksCardFields, parameters).then(() => { + return; + }); + } + editAliasesDialogAsync(fieldName) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'editAliasesDialogAsync', + [api_internal_contract_js_1.ParameterId.FieldId]: fieldName, + }; + return this.execute(api_internal_contract_js_1.VerbId.EditAliasesDialog, parameters).then(() => { + return; + }); + } +} +exports.VisualModelServiceImpl = VisualModelServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js": +/*!**************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js ***! + \**************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const CustomViewImpl_1 = __webpack_require__(/*! ../../Impl/CustomViewImpl */ "../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class VizServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "viz-service" /* Viz */; + } + createVizImageAsync(inputSpec) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'createVizImageAsync', + [api_internal_contract_js_1.ParameterId.VizAPIInputJson]: JSON.stringify(inputSpec), + }; + return this.execute(api_internal_contract_js_1.VerbId.VizAPI, parameters).then((response) => { + const result = response.result; + return result; + }); + } + activateSheetAsync(name) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'activateSheetAsync', + [api_internal_contract_js_1.ParameterId.SwitchToSheetName]: name, + }; + return this.execute(api_internal_contract_js_1.VerbId.ActivateSheet, parameters).then(() => { + return; + }); + } + getCustomViewsAsync() { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getCustomViewsAsync', + }; + return this.execute(api_internal_contract_js_1.VerbId.GetCustomViews, parameters).then((response) => { + const customViews = response.result; + return customViews.map((customView) => { + return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId); + }); + }); + } + showCustomViewAsync(customViewName) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'showCustomViewAsync', + [api_internal_contract_js_1.ParameterId.CustomViewName]: customViewName || '', + }; + return this.execute(api_internal_contract_js_1.VerbId.ShowCustomView, parameters).then((response) => { + var _a; + const customView = response.result; + return ((_a = customView) === null || _a === void 0 ? void 0 : _a.luid) ? new CustomViewImpl_1.CustomViewImpl(customView, this._registryId) : undefined; + }); + } + removeCustomViewAsync(customViewName) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'removeCustomViewAsync', + [api_internal_contract_js_1.ParameterId.CustomViewName]: customViewName, + }; + return this.execute(api_internal_contract_js_1.VerbId.RemoveCustomView, parameters).then((response) => { + const customView = response.result; + return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId); + }); + } + saveCustomViewAsync(customViewName) { + // CustomViewIsDefault is a required parameter, but our API has not been updated to allow it to be specified yet. + // We should add a 'default' parameter to the interface. + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'saveCustomViewAsync', + [api_internal_contract_js_1.ParameterId.CustomViewName]: customViewName, + [api_internal_contract_js_1.ParameterId.CustomViewIsDefault]: false, + }; + return this.execute(api_internal_contract_js_1.VerbId.SaveWorkbookAsCustomView, parameters).then((response) => { + const customView = response.result; + return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId); + }); + } + setActiveCustomViewAsDefaultAsync() { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'setActiveCustomViewAsDefaultAsync', + }; + return this.execute(api_internal_contract_js_1.VerbId.SetActiveCustomViewAsDefault, parameters).then(() => { + return; + }); + } + saveAsync(customView) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'saveAsync', + [api_internal_contract_js_1.ParameterId.CustomViewLuid]: customView.luid, + [api_internal_contract_js_1.ParameterId.CustomViewName]: customView.name, + [api_internal_contract_js_1.ParameterId.CustomViewIsDefault]: customView.isDefault, + [api_internal_contract_js_1.ParameterId.CustomViewIsPublic]: customView.shared, + }; + return this.execute(api_internal_contract_js_1.VerbId.UpdateCustomView, parameters).then((response) => { + const customView = response.result; + return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId); + }); + } + getCurrentSrcAsync() { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getCurrentSrcAsync', + }; + return this.execute(api_internal_contract_js_1.VerbId.GetCurrentSrc, parameters).then((response) => response.result); + } +} +exports.VizServiceImpl = VizServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js": +/*!***************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js ***! + \***************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class ZoneServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "zone-service" /* Zone */; + } + setVisibilityAsync(dashboard, dashboardZoneMap, zoneVisibilityMap) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'setVisibilityAsync', + [api_internal_contract_js_1.ParameterId.Dashboard]: dashboard, + [api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap]: {}, + }; + // zoneVisibilityMap can be either an object or a Map - convert it to a Map + const parameterAsMap = Param_1.Param.convertParameterToMap(zoneVisibilityMap, 'zoneVisibilityMap'); + parameterAsMap.forEach((value, key) => { + ErrorHelpers_1.ErrorHelpers.verifyZoneIsValid(dashboardZoneMap, Number.parseInt(key, 10)); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(value, api_external_contract_js_1.DashboardObjectVisibilityType, 'DashboardObjectVisibilityType'); + parameters[api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap][key] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.setVisibilityType.convert(value); + }); + return this.execute(api_internal_contract_js_1.VerbId.SetZoneVisibility, parameters).then((response) => { + return; + }); + } + moveAndResizeAsync(dashboard, dashboardZoneMap, dashboardObjectPositionAndSizeUpdateArray) { + const parameters = { + [api_internal_contract_js_1.ParameterId.Dashboard]: dashboard, + [api_internal_contract_js_1.ParameterId.DashboardObjectPositionAndSizeUpdateList]: dashboardObjectPositionAndSizeUpdateArray, + }; + dashboardObjectPositionAndSizeUpdateArray.forEach((dashboardObject) => { + ErrorHelpers_1.ErrorHelpers.verifyZoneIsValidAndFloating(dashboardZoneMap, dashboardObject.dashboardObjectID); + ErrorHelpers_1.ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(dashboardObject); + }); + return this.execute(api_internal_contract_js_1.VerbId.MoveAndResizeZones, parameters).then((response) => { + return; + }); + } +} +exports.ZoneServiceImpl = ZoneServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/TableSummary.js": +/*!**********************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/TableSummary.js ***! + \**********************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of a table summary. + * This does not follow the Impl pattern as it is just a property bag. + */ +class TableSummary { + constructor(_tableInfo) { + this._tableInfo = _tableInfo; + } + get name() { + return this._tableInfo.name; + } + get id() { + return this._tableInfo.id; + } + get connectionId() { + return this._tableInfo.connectionId; + } + get customSQL() { + return this._tableInfo.customSQL; + } +} +exports.TableSummary = TableSummary; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/TableauError.js": +/*!**********************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/TableauError.js ***! + \**********************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Custom error class that extends the default JavaScript Error object. + * This allows us to provide a field with a specific error code + * so that developers can more easily programmatically respond + * to error scenarios. + */ +class TableauError extends Error { + constructor(_errorCode, message) { + super(`${_errorCode}: ${message}`); + this._errorCode = _errorCode; + /*tslint:disable-next-line */ + // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work + // Error inheritance does not work propertly when compiling to ES5, this is a workaround to force + // the proto chain to be built correctly. See the github link above for details. + Object.setPrototypeOf(this, TableauError.prototype); + } + get errorCode() { + return this._errorCode; + } +} +exports.TableauError = TableauError; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js": +/*!********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const GetDataModels_1 = __webpack_require__(/*! ../Models/GetDataModels */ "../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js"); +/** + * In version 2 of the interface, we should collapse value into nativeValue, and do all this work over + * in the platform. + */ +class DataValueFactory { + static MakeParameterDataValue(internalDataValue, dataType) { + // Parameter values are all strings, convert from string to value + return new GetDataModels_1.DataValue(internalDataValue.value, InternalContract.DataTypeConverter.convertStringValueToNativeValue(internalDataValue.value, dataType), internalDataValue.formattedValue, internalDataValue.aliasedValue, internalDataValue.hasAlias); + } + static MakeFilterDataValue(internalDataValue) { + // Filters already have native type in value, just use that for nativeValue also + return new GetDataModels_1.DataValue(internalDataValue.value, internalDataValue.value, internalDataValue.formattedValue); + } + static MakeTableDataValue(internalDataValue, dataType) { + // DataTables contain boolean | number | string | date as string | '%null% + // convertValueToNativeValue converts dates as string to dates, and any special to null + // (boolean, numbers, strings are passed through) + // Because of IncludeDataValuesOption - we can have undefined values, which are different than any special + return new GetDataModels_1.DataValue(internalDataValue.value, internalDataValue.value !== undefined + ? InternalContract.DataTypeConverter.convertValueToNativeValue(internalDataValue.value, dataType) + : undefined, internalDataValue.formattedValue); + } +} +exports.DataValueFactory = DataValueFactory; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Utils/Deferred.js": +/*!************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Utils/Deferred.js ***! + \************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * A Promise wrapper class allowing for resolving/rejecting the Promise outside the context of its constructor. + * + * @export + * @class Deferred + * @template TResolve The type used to resolve the promise. + * @template TReject The type used to reject the promise. Defaults to any. + * @link https://stackoverflow.com/a/34637436 + */ +class Deferred { + /** + * Creates an instance of Deferred. + */ + constructor() { + this._promise = new Promise((resolve, reject) => { + this._resolve = resolve; + this._reject = reject; + }); + } + /** + * Gets the Promise. + * + * @readonly + * @type {Promise} + */ + get promise() { + return this._promise; + } + /** + * Resolves the wrapped Promise. + * + * @param {(TResolve | PromiseLike)} response The argument to be resolved by the Promise. + * @returns {*} {void} + */ + resolve(response) { + if (!this._resolve) { + return; + } + this._resolve(response); + } + /** + * + * + * @param {TReject} [reason] The reason why the Promise rejected. + * @returns {*} {void} + */ + reject(reason) { + if (!this._reject) { + return; + } + this._reject(reason); + } +} +exports.Deferred = Deferred; +exports.UnregisterTimeoutInMilliseconds = 30000; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +/** + * This class converts from a source enum value to destination enum + * value given a mapping from source to destination when constructed. + * + * Note: This exact same class is defined in api-core. Given its small + * nature, it is not worth having in a separate project to share this between + * api-core and api-shared. If more utility functionality is added that is used by api-core + * and api-shared but has no other dependecies, a utiltity project might be merited, + * and this class could be moved. + */ +class EnumConverter { + constructor(_mappings, _defaultVal) { + this._mappings = _mappings; + this._defaultVal = _defaultVal; + } + convert(enumVal, throwIfMissing = ShouldThrow.Yes) { + if (this._mappings.hasOwnProperty(enumVal)) { + return this._mappings[enumVal]; + } + if (this._defaultVal !== undefined && throwIfMissing !== ShouldThrow.Yes) { + return this._defaultVal; + } + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Enum Mapping not found for: ${enumVal}`); + } +} +exports.EnumConverter = EnumConverter; +var ShouldThrow; +(function (ShouldThrow) { + ShouldThrow["Yes"] = "yes"; + ShouldThrow["No"] = "no"; +})(ShouldThrow = exports.ShouldThrow || (exports.ShouldThrow = {})); + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js": +/*!****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const Param_1 = __webpack_require__(/*! ./Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +/** + * This class is used to construct common errors throughout the external + * projects (api-shared, extensions-api, etc.). It has some duplication with + * the ErrorHelpers class in api-core, but is separate due to the need to throw + * an external TableauError vs. an InternalTableauError. + */ +class ErrorHelpers { + /** + * Throws with code InternalError. + * + * @param apiName name of api that was called. + */ + static apiNotImplemented(apiName) { + return new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `${apiName} API not yet implemented.`); + } + /** + * Throws an internal error if argument is null or undefined. + * + * @param argumentValue value to verify + * @param argumentName name of argument to verify + */ + /*tslint:disable-next-line */ + static verifyInternalValue(argumentValue, argumentName) { + if (argumentValue === null || argumentValue === undefined) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `${argumentValue} is invalid value for: ${argumentName}`); + } + } + /** + * Throws an InvalidParameter error if argument is null or undefined. + * + * @param argumentValue value to verify + * @param argumentName name of argument to verify + */ + /*tslint:disable-next-line */ + static verifyParameter(argumentValue, argumentName) { + if (argumentValue === null || argumentValue === undefined) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${argumentValue} is invalid value for parameter: ${argumentName}`); + } + } + /** + * Throws an InvalidParameter error if argument is not the specified type. + * For objects, it just tests that it is an object + * + * @param argumentValue value to verify + * @param expectedType expected result of typeof + * @param argumentName name of argument to verify + */ + /*tslint:disable-next-line */ + static verifyParameterType(argumentValue, expectedType, argumentName) { + if (typeof argumentValue !== expectedType) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${argumentValue} has invalid type for parameter: ${argumentName}.`); + } + } + /** + * Throws an InvalidParameter error if argument is empty string, null or undefined. + * + * @param argumentValue value to verify + * @param argumentName name of argument to verify + */ + /*tslint:disable-next-line */ + static verifyStringParameter(argumentValue, argumentName) { + if (argumentValue === null || argumentValue === undefined || argumentValue === '') { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${argumentValue} is invalid value for paramter: ${argumentName}`); + } + } + /** + * Verifies passed value is a valid value for that enum. + * + * String enums are {string : string} dictionaries which are not reverse mappable + * This is an ugly workaround + * + * @param enumValue value to verify + * @param enumType enum to verify against + */ + /*tslint:disable-next-line */ + static isValidEnumValue(enumValue, enumType) { + let isValid = false; + Object.keys(enumType).forEach((enumKey) => { + if (enumType[enumKey] === enumValue.toString()) { + isValid = true; + } + }); + return isValid; + } + /** + * Verifies passed value is a valid value for that enum. + * Throws an InvalidParameter error if the enum value is not valid. + * + * String enums are {string : string} dictionaries which are not reverse mappable + * This is an ugly workaround + * + * @param enumValue value to verify + * @param enumType enum to verify against + * @param enumName enum name for clear error message + */ + /*tslint:disable-next-line */ + static verifyEnumValue(enumValue, enumType, enumName) { + if (!ErrorHelpers.isValidEnumValue(enumValue, enumType)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${enumValue} is invalid value for enum: ${enumName}.`); + } + } + /** + * Verifies passed value is between [min, max) ... min <= value < max + * Throws an InvalidParameter error if the value is not valid. + * + * + * @param value value to verify + * @param min value must be >= min + * @param max value must be < max + */ + static verifyRange(value, min, max) { + let isValid = min <= value && value < max; + if (!isValid) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${value} is invalid value for range: [${min}..${max})`); + } + } + /** + * Verifies the params min and max for applying range filter. + * Throws with error code InvalidParameter if range is invalid. + * + * @param min range min + * @param max range max + */ + static verifyRangeParamType(min, max) { + const isMinDefined = min !== undefined; + const isMaxDefined = max !== undefined; + if (!isMinDefined && !isMaxDefined) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'Unexpected invalid param value, at least one of min or max is required.'); + } + if (isMinDefined && !Param_1.Param.isTypeNumber(min) && !Param_1.Param.isTypeDate(min)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'Unexpected invalid param value, only Date and number are allowed for parameter min.'); + } + if (isMaxDefined && !Param_1.Param.isTypeNumber(max) && !Param_1.Param.isTypeDate(max)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'Unexpected invalid param value, only Date and number are allowed for parameter max.'); + } + if (isMinDefined && isMaxDefined && typeof min !== typeof max) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'Unexpected invalid param value, parameters min and max should be of the same type.'); + } + } + /** + * Verifies that the zoneId is present in the current dashboard. + * Throws with error code InvalidParameter if either condition is false. + * + * @param dashboardZoneMap A map of zoneId's to the corresponding dashboard object. + * @param zoneID ZoneId to be validated + */ + static verifyZoneIsValid(dashboardZoneMap, zoneID) { + if (dashboardZoneMap.has(zoneID)) { + return; + } + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `Unexpected invalid param value, Dashboard Object Id: ${zoneID} is not present in dashboard.`); + } + /** + * Verifies that the zone is present and floating in the current dashboard. + * Throws with error code InvalidParameter if either condition is false. + * + * @param dashboardZoneMap A map of zoneId's to the corresponding dashboard object. + * @param zoneID ZoneId to be validated + */ + static verifyZoneIsValidAndFloating(dashboardZoneMap, zoneID) { + if (dashboardZoneMap.has(zoneID) && dashboardZoneMap.get(zoneID).isFloating) { + return; + } + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `Unexpected invalid param value, Dashboard Object Id: ${zoneID} is not present or is a fixed zone in the dashboard.`); + } + /** + * Verifies that width and height are > 0 for each DashboardObjectPositionAndSizeUpdate object. + * Throws with error code InvalidParameter if either condition is false. + * + * @param dashboardObjectPositionAndSizeUpdate DashboardObjectPositionAndSizeUpdate object for which width and height will be validated + */ + static verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(dashboardObjectPositionAndSizeUpdate) { + if (dashboardObjectPositionAndSizeUpdate.width < 0 || dashboardObjectPositionAndSizeUpdate.height < 0) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `Unexpected invalid param value for dashboard object ID ${dashboardObjectPositionAndSizeUpdate.dashboardObjectID}:` + + ` negative widths and heights are not allowed.`); + } + } + /** + * Verifies is the given sheet name is in the list of sheets names allowed for exporting. + * Throws with error code InvalidParameter if the condition above is false. + * + * @param exportableSheetNames A list of sheet names allowed for exporting + * @param sheetName the name of the sheet selected for export + */ + static verifySheetName(exportableSheetNames, sheetName) { + if (!exportableSheetNames.includes(sheetName)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidSelectionSheet, 'sheetName parameter must belong to a worksheet within the current view'); + } + } + /** + * Verifies the ExportDataOptions object + * Throws with error code InvalidParameter if the parameter is not of ExportDataOptions type. + * + * @param options The ExportDataOptions object used to configure the output CSV file for exportDataAsync. + */ + static verifyExportDataOptions(options) { + if ((!Param_1.Param.isNullOrUndefined(options.ignoreAliases) && !Param_1.Param.isTypeBool(options.ignoreAliases)) || + (!Param_1.Param.isNullOrUndefined(options.columnsToIncludeById) && !Array.isArray(options.columnsToIncludeById))) + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'options paramater must be of type ExportDataOptions'); + } + /** + * Verifies if the sheet names are included in any of the export scenarios. + * Throws with error code InvalidParameter if the parameter is not an array. + * Throws with error code InvalidSelectionSheet if there are array entries that dont exist or if there is mixing between sheets from the dashboard and sheet from the workbook. + * + * @param sheetNames List of sheet names selected for exporting. + * @param exportScenarios an object containing the current sheet name, exportable sheets from the dashboard, and exportable sheets from the workbook. + */ + static verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios) { + if (!Array.isArray(sheetNames)) + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'sheetNames parameter must be an array'); + if (sheetNames.length === 0) + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'sheetNames should not be empty'); + const isIncludedInDashboard = sheetNames.every((sheetName) => exportScenarios.exportableSheetNamesFromDashboard.includes(sheetName)); + if (isIncludedInDashboard) { + return; + } + const isIncludedInWorkbook = sheetNames.every((sheetName) => exportScenarios.exportableSheetNamesFromWorkbook.includes(sheetName)); + if (isIncludedInWorkbook) { + return; + } + const isCurrentSheet = sheetNames.length === 1 && sheetNames[0] === exportScenarios.currentSheetName; + if (isCurrentSheet) { + return; + } + // Export requirement: all sheet names must be included in the list of exportable sheets in the dashboard or + // all sheet names must be included in the list of exportable sheets in the workbook, or the sheet name is the current sheet + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidSelectionSheet, 'sheetNames parameter must have all its entries be exportable sheet names from the dashboard or all its entries be exportable sheet names from the workbook'); + } + /** + * Verifies the external ExportPDFOptions object's properties. + * Throws with error code InvalidParameter if the parameter is not of external ExportPDFOptions type. + * + * @param options The external user-facing ExportPDFOptions object used to configure the output PDF file for exportPDFAsync. + */ + static verifyExportPDFOptions(options) { + try { + this.verifyEnumValue(options.orientation, api_external_contract_js_1.PrintOrientation, 'PrintOrientation'); + this.verifyEnumValue(options.pageSize, api_external_contract_js_1.PrintPageSize, 'PrintPageSize'); + this.verifyEnumValue(options.scaling, api_external_contract_js_1.PrintScaling, 'PrintScaling'); + } + catch (_a) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'options parameter must be of type ExportPDFOptions'); + } + } +} +exports.ErrorHelpers = ErrorHelpers; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +/** + * Helper methods for Export APIs. + * + * @class ExportHelpers + */ +class ExportHelpers { + /** + * Modifies the internal ExportPDFOptions' properties based on the given PDF export configuration. + * This method will construct the internal ExportPDFOptions identically to how the 'Export PDF' dialog constructs the ExportPdfOptionsPresModel. + * See the handleExportClick method in @browser-clients/export-pdf-options-dialog for reference. + * + * @param internalExportPdfOptions The internal ExportPDFOptions pres model used to configure the output PDF file. + * @param externalExportPdfOptions The external ExportPDFOptions user-facing object passed to exportPDFAsync. + * @param sheetNames The list of sheets selected for export. + */ + static updateInternalExportPDFOptions(internalExportPdfOptions, externalExportPdfOptions, sheetNames) { + internalExportPdfOptions.currentSheet = sheetNames[0]; + this.updateExportLayoutOptions(internalExportPdfOptions, externalExportPdfOptions); + this.updateSheetOptions(internalExportPdfOptions, sheetNames); + } + /** + * Helper method for updateInternalExportPDFOptions. + * Modifies the exportLayoutOptions property of the internal ExportPDFOptions based on the external ExportPDFOptions. + * See the getExportLayoutOptions method in @browser-clients/export-pdf-options-dialog for reference. + * + * @param internalExportPdfOptions The internal ExportPDFOptions pres model used to configure the output PDF file. + * @param externalExportPdfOptions The external ExportPDFOptions user-facing object passed to exportPDFAsync. + */ + static updateExportLayoutOptions(internalExportPdfOptions, externalExportPdfOptions) { + const exportLayoutOptions = internalExportPdfOptions.exportLayoutOptions; + // setting the image height and width properties to their default values + exportLayoutOptions.imageHeight = this.DefaultLayoutOptions.imageHeight; + exportLayoutOptions.imageWidth = this.DefaultLayoutOptions.imageWidth; + // setting the orientation value for the exportLayoutOptions + switch (externalExportPdfOptions.orientation) { + case api_external_contract_js_1.PrintOrientation.Landscape: + exportLayoutOptions.pageOrientationOption = api_internal_contract_js_1.PageOrientation.Landscape; + break; + case api_external_contract_js_1.PrintOrientation.Portrait: + exportLayoutOptions.pageOrientationOption = api_internal_contract_js_1.PageOrientation.Portrait; + break; + default: + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'invalid orientation for ExportPDFOption'); + } + // setting the page size value for the exportLayoutOptions + switch (externalExportPdfOptions.pageSize) { + case api_external_contract_js_1.PrintPageSize.A3: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.A3; + break; + case api_external_contract_js_1.PrintPageSize.A4: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.A4; + break; + case api_external_contract_js_1.PrintPageSize.A5: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.A5; + break; + case api_external_contract_js_1.PrintPageSize.B4: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.B4; + break; + case api_external_contract_js_1.PrintPageSize.B5: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.B5; + break; + case api_external_contract_js_1.PrintPageSize.Executive: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Executive; + break; + case api_external_contract_js_1.PrintPageSize.Folio: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Folio; + break; + case api_external_contract_js_1.PrintPageSize.Ledger: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Ledger; + break; + case api_external_contract_js_1.PrintPageSize.Legal: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Legal; + break; + case api_external_contract_js_1.PrintPageSize.Letter: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Letter; + break; + case api_external_contract_js_1.PrintPageSize.Note: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Note; + break; + case api_external_contract_js_1.PrintPageSize.Quarto: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Quarto; + break; + case api_external_contract_js_1.PrintPageSize.Statement: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Statement; + break; + case api_external_contract_js_1.PrintPageSize.Tabloid: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Tabloid; + break; + case api_external_contract_js_1.PrintPageSize.Unspecified: + exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Unspecified; + break; + default: + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'invalid pageSize for ExportPDFOption'); + } + // setting the scaling values for the exportLayoutOptions + switch (externalExportPdfOptions.scaling) { + case api_external_contract_js_1.PrintScaling.AtMost1PageHigh: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.FitPages.FitOneHigh); + break; + case api_external_contract_js_1.PrintScaling.AtMost1PageWide: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.FitPages.FitOneWide); + break; + case api_external_contract_js_1.PrintScaling.AtMost2PagesHigh: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.FitPages.FitTwoHigh); + break; + case api_external_contract_js_1.PrintScaling.AtMost2PagesWide: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.FitPages.FitTwoWide); + break; + case api_external_contract_js_1.PrintScaling.Automatic: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePctAuto); + break; + case api_external_contract_js_1.PrintScaling.Perc100: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct100); + break; + case api_external_contract_js_1.PrintScaling.Perc200: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct200); + break; + case api_external_contract_js_1.PrintScaling.Perc25: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct25); + break; + case api_external_contract_js_1.PrintScaling.Perc400: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct400); + break; + case api_external_contract_js_1.PrintScaling.Perc50: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct50); + break; + case api_external_contract_js_1.PrintScaling.Perc60: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct60); + break; + case api_external_contract_js_1.PrintScaling.Perc75: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct75); + break; + case api_external_contract_js_1.PrintScaling.Perc80: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct80); + break; + case api_external_contract_js_1.PrintScaling.Perc90: + this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct90); + break; + default: + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'invalid scaling for ExportPDFOption'); + } + } + /** + * Helper method for updateInternalExportPDFOptions. + * Modifies the sheetOptions property of the internal ExportPDFOptions based on the sheets selected for export. + * See the handleExportClick method in @browser-clients/export-pdf-options-dialog for reference. + * + * @param internalExportPdfOptions The internal ExportPDFOptions pres model used to configure the output PDF file. + * @param sheetNames The list of sheets selected for export. + */ + static updateSheetOptions(internalExportPdfOptions, sheetNames) { + const { exportLayoutOptions, sheetOptions } = internalExportPdfOptions; + // updating the export layouts options for each sheet and selecting sheet for export if included in list + for (const sheetOption of sheetOptions) { + sheetOption.exportLayoutOptions = exportLayoutOptions; + sheetOption.isSelected = sheetNames.includes(sheetOption.sheet); + } + } + /** + * Helper method for updateExportLayoutOptons. + * This method is a spoof of the getFitAndScaleValues method used in @browser-clients/export-pdf-options to set the exportLayoutOptions' scaling properties. + * In the future, this file should be refactored to import the method directly from @browser-clients/export-pdf-options. + * + * @param scalingSelection string used for setting the exportLayoutOptions based on the PrintScaling property from the ExternalExportPDFOptions. + * @param exportLayoutOptions the ExportLayoutOptions used by the internal ExportPDFOptions pres model. + */ + static setFitAndScaleValues(exportLayoutOptions, scalingSelection) { + let { pageFitHorizontal, pageFitVertical, pageScaleMode, pageScalePercent } = this.DefaultLayoutOptions; + const fitMatch = this.fitRegex.exec(scalingSelection); + const percentMatch = this.pctRegex.exec(scalingSelection); + if (fitMatch) { + [pageFitHorizontal, pageFitVertical] = fitMatch.slice(1).map((value) => Number(value)); + pageScaleMode = api_internal_contract_js_1.ScaleMode.ScaleFitPages; + } + else if (percentMatch) { + [pageScalePercent] = percentMatch.slice(1).map((value) => Number(value)); + pageScaleMode = api_internal_contract_js_1.ScaleMode.ScalePercentage; + } + // getFitAndScaleValues returns the properties below, but instead this method will set them. + exportLayoutOptions.pageFitHorizontal = pageFitHorizontal; + exportLayoutOptions.pageFitVertical = pageFitVertical; + exportLayoutOptions.pageScaleMode = pageScaleMode; + exportLayoutOptions.pageScalePercent = pageScalePercent; + } +} +exports.ExportHelpers = ExportHelpers; +ExportHelpers.DefaultDataOptions = { + ignoreAliases: false, + columnsToIncludeById: [], +}; +ExportHelpers.DefaultPDFOptions = { + scaling: api_external_contract_js_1.PrintScaling.Automatic, + pageSize: api_external_contract_js_1.PrintPageSize.Letter, + orientation: api_external_contract_js_1.PrintOrientation.Portrait, +}; +ExportHelpers.DefaultLayoutOptions = { + imageHeight: 0, + imageWidth: 0, + pageFitHorizontal: 1, + pageFitVertical: 1, + pageOrientationOption: api_internal_contract_js_1.PageOrientation.Portrait, + pageScaleMode: api_internal_contract_js_1.ScaleMode.ScaleAuto, + pageScalePercent: 100, + pageSizeOption: api_internal_contract_js_1.PageSizeOption.Letter, +}; +ExportHelpers.fitRegex = new RegExp('fit([0-9]+)x([0-9]+)'); +ExportHelpers.pctRegex = new RegExp('pct([0-9]+)'); + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Utils/Param.js": +/*!*********************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Utils/Param.js ***! + \*********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ./ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +class Param { + /** + * serializes the date into the format that the server expects. + * @param date the date to serialize + */ + static serializeDateForPlatform(date) { + const year = date.getUTCFullYear(); + const month = date.getUTCMonth() + 1; + const day = date.getUTCDate(); + const hh = date.getUTCHours(); + const mm = date.getUTCMinutes(); + const sec = date.getUTCSeconds(); + return `${year}-${month}-${day} ${hh}:${mm}:${sec}`; + } + static serializeBooleanForPlatform(bool) { + return bool ? 'true' : 'false'; + } + static serializeNumberForPlatform(num) { + return num.toString(10); + } + /** + * Verifies the input is a number + */ + /* tslint:disable-next-line:no-any */ + static isTypeNumber(input) { + return typeof input === 'number' || input instanceof Number; + } + /** + * Verifies the input is a Date + */ + /* tslint:disable-next-line:no-any */ + static isTypeDate(input) { + return input instanceof Date; + } + /* tslint:disable-next-line:no-any */ + static isTypeString(input) { + return typeof input === 'string' || input instanceof String; + } + /* tslint:disable-next-line:no-any */ + static isTypeBool(input) { + return typeof input === 'boolean' || input instanceof Boolean; + } + /** + * Determines if the input is null or undefined + */ + /* tslint:disable-next-line:no-any */ + static isNullOrUndefined(input) { + return input === null || input === undefined; + } + /* tslint:disable-next-line:no-any */ + static serializeParameterValue(value) { + if (Param.isTypeNumber(value)) { + return Param.serializeNumberForPlatform(value); + } + else if (Param.isTypeDate(value)) { + return Param.serializeDateForPlatform(value); + } + else if (Param.isTypeBool(value)) { + return Param.serializeBooleanForPlatform(value); + } + else if (Param.isTypeString(value)) { + return value; + } + else { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Unexpected invalid value for: ${value}`); + } + } + /** + * Verifies that the parameter is already a Map, or converts an object to a Map. + * If the parameter is an object, we convert it to a Map using Object.entries. + * @throws if the parameter is not an object or Map + */ + // tslint:disable-next-line:no-any + static convertParameterToMap(param, paramName) { + ErrorHelpers_1.ErrorHelpers.verifyParameterType(param, 'object', paramName); + if (Array.isArray(param)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, `Expecting object or Map for: ${paramName}.`); + } + return param instanceof Map ? param : new Map(Object.entries(param)); + } + /* tslint:disable-next-line:no-any */ + static tryParseNumber(value) { + if (Param.isNullOrUndefined(value)) { + return { success: false }; + } + if (Param.isTypeNumber(value)) { + return { parsed: value, success: true }; + } + const valueString = value.toString(); + if (valueString === 'NaN') { + // 'NaN' parses as NaN which is indistinguishable from a failed parse. + return { parsed: NaN, success: true }; + } + const parsed = parseFloat(valueString); + if (isNaN(parsed)) { + return { success: false }; + } + return { parsed, success: true }; + } +} +exports.Param = Param; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js": +/*!**************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +class SheetUtils { + // This is a direct port from SheetSize.cs - SheetSizeFactory + static getSheetSizeFromSizeConstraints(sizeConstraint) { + const { minWidth, minHeight, maxWidth, maxHeight } = sizeConstraint; + if (minHeight === 0 && minWidth === 0) { + if (maxHeight === 0 && maxWidth === 0) { + return { + behavior: Contract.SheetSizeBehavior.Automatic, + }; + } + return { + behavior: Contract.SheetSizeBehavior.AtMost, + maxSize: { width: maxWidth, height: maxHeight }, + }; + } + if (maxHeight === 0 && maxWidth === 0) { + return { + behavior: Contract.SheetSizeBehavior.AtLeast, + minSize: { width: minWidth, height: minHeight }, + }; + } + if (maxHeight === minHeight && maxWidth === minWidth && minWidth > 0) { + return { + behavior: Contract.SheetSizeBehavior.Exactly, + minSize: { width: minWidth, height: minHeight }, + maxSize: { width: minWidth, height: minHeight }, + }; + } + // 'Fit Width' for a DSD layout + const isDsdLayout = minWidth === 0 && maxWidth === 0; + return { + behavior: Contract.SheetSizeBehavior.Range, + minSize: { width: minWidth, height: minHeight }, + maxSize: { width: isDsdLayout ? 2147483647 : maxWidth, height: maxHeight }, + }; + } + static createAutomaticSize() { + let behavior = Contract.SheetSizeBehavior.Automatic; + let minSize = { width: 0, height: 0 }; + let maxSize = { width: 0, height: 0 }; + return { behavior, minSize, maxSize }; + } + static getPublishedSheetInfoByName(name, sheetInfos) { + const sheetInfo = sheetInfos.find((sheet) => sheet.name === name); + return sheetInfo; + } + static getSheetTypeEnum(internalSheetType) { + let sheetType; + switch (internalSheetType) { + case api_internal_contract_js_1.SheetType.Worksheet: { + sheetType = Contract.SheetType.Worksheet; + break; + } + case api_internal_contract_js_1.SheetType.Dashboard: { + sheetType = Contract.SheetType.Dashboard; + break; + } + case api_internal_contract_js_1.SheetType.Story: { + sheetType = Contract.SheetType.Story; + break; + } + default: { + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.ServerError, 'Invalid SheetType'); + } + } + return sheetType; + } + static isValidSheetSize(sizeObject) { + return sizeObject.behavior !== undefined; + } +} +exports.SheetUtils = SheetUtils; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Utils/ShortLivedDeferred.js": +/*!**********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Utils/ShortLivedDeferred.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const Deferred_1 = __webpack_require__(/*! ./Deferred */ "../api-shared-js/lib/src/ApiShared/Utils/Deferred.js"); +/** + * A Deferred wrapper class adding functionality to reject unresponsive promises after timeout + * + * this class handles two things: + + * 1. Adds timeout logic for deferred + * 2. It blocks multiple calls from executing at the same time. + * + * @export + * @class ShortLivedDeferred + * @template TResolve The type used to resolve the promise. + * @template TReject The type used to reject the promise. Defaults to any. + * + */ +class ShortLivedDeferred { + constructor(_timeoutInMilliseconds = Deferred_1.UnregisterTimeoutInMilliseconds) { + this._timeoutInMilliseconds = _timeoutInMilliseconds; + } + getNewPromiseOrThrowIfBusy() { + if (this._deferred) { + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.ApiExecutionError, 'This api cannot be executed till previous call is resolved.'); + } + this._deferred = new Deferred_1.Deferred(); + this._timeoutId = setTimeout(() => { + const error = new TableauError_1.TableauError(Contract.SharedErrorCodes.Timeout, `Api failed to complete in ${this._timeoutInMilliseconds / 1000} seconds`); + this.reject(error); + }, this._timeoutInMilliseconds); + return this._deferred.promise; + } + resolve(response) { + if (this._deferred) { + clearTimeout(this._timeoutId); + this._deferred.resolve(response); + this._deferred = undefined; + } + } + reject(error) { + if (this._deferred) { + clearTimeout(this._timeoutId); + this._deferred.reject(error); + this._deferred = undefined; + } + } +} +exports.ShortLivedDeferred = ShortLivedDeferred; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/VersionNumber.js": +/*!***********************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/VersionNumber.js ***! + \***********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ./TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +/** + * Represents the current version of the extensions, embedding + * and extensions-api-types library + */ +class VersionNumber { + // private constructor so everyone uses the singleton instance + // build numbers have this form: M.m.f-pre.N + constructor(versionString, isAlpha) { + const partStr = versionString.split('-'); + this.build = this.getBuildNumber(partStr[1]); + versionString = partStr[0]; + const parts = versionString.split('.').map((p) => parseInt(p, 10)); + if (parts.length !== 3) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Invalid version number: ${versionString}`); + } + this.major = parts[0]; + this.minor = parts[1]; + this.fix = parts[2]; + this.isAlpha = isAlpha; + } + getBuildNumber(preReleaseString) { + const noBuildNumber = -1; + if (!preReleaseString) { + return noBuildNumber; + } + // The preRelease string has this form: pre.N, but we don't depend on the actual string being 'pre' + const partStr = preReleaseString.split('.'); + return partStr[1] ? parseInt(partStr[1], 10) : noBuildNumber; + } + get formattedValue() { + return `${this.major}.${this.minor}.${this.fix}`; + } + get fullFormattedValue() { + return `${this.major}.${this.minor}.${this.fix}-pre.${this.build}`; + } +} +exports.VersionNumber = VersionNumber; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/VersionedExternalApiDispatcher.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/lib/src/VersionedExternalApiDispatcher.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +/** + * Implementation of the InternalApiDispatcher which supports upgrading and downgrading the input + * internal contract to the version that this module is built against + * + * @class VersionedExternalApiDispatcher + * @implements {InternalApiDispatcher} + */ +class VersionedExternalApiDispatcher { + /** + * Creates a new instance of the VersionedExternalApiDispatcher + * We have multiple version converting dispatchers that work together. + * If needed, the VersionedExternalApiDispatcher wraps either the InternalApiDispatcher (desktop) + * or the CrossFrameDispatcher (server). + * The Internal/CrossFrame dispatchers handle an updated platform with an older external library. + * (The CrossFrameDispatcher sends messages across the frame, and it is handled by the PresLayerHandler.) + * Meanwhile, the VersionedExternalApiDispatcher handles an updated external library with an older platform. + + * @param _apiDelegateDispatcher The delegate that does the actual work. + * @param platformVersionNumber The version of the internal contract which the platform module is using. + * This number will be used to figure out how to downgrade incoming commands and upgrade the results + */ + constructor(_apiDelegateDispatcher, platformVersionNumber) { + this._apiDelegateDispatcher = _apiDelegateDispatcher; + this._versionConverter = api_internal_contract_js_1.CreateExternalCompatibleVersionConverter(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION, platformVersionNumber); + this._notificationHandlers = []; + _apiDelegateDispatcher.registerNotificationHandler((notification) => { + if (this._notificationHandlers.length === 0) { + return; + } + const upgradedNotification = this._versionConverter.upgradeNotification(notification); + this._notificationHandlers.forEach((handler) => { + handler(upgradedNotification); + }); + }); + } + static needsVersionConverter(platformVersion) { + // If our platform is less than external library version, then we need a converter + return api_internal_contract_js_1.VersionLessThan(platformVersion, api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); + } + execute(verb, parameters) { + try { + const downgradeParameters = this._versionConverter.downgradeExecuteCall(verb, parameters); + return this._apiDelegateDispatcher.execute(downgradeParameters.verb, downgradeParameters.parameters).then((response) => { + const upgradeResponse = this._versionConverter.upgradeExecuteReturn(response, verb, parameters); + return upgradeResponse; + }); + } + catch (e) { + return Promise.reject(e); + } + } + registerNotificationHandler(handler) { + this._notificationHandlers.push(handler); + } + unregisterNotificationHandler(handler) { + this._notificationHandlers = this._notificationHandlers.filter((h) => h !== handler); + } +} +exports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher; + + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/index.js": +/*!********************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/index.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ NIL: () => (/* reexport safe */ _nil_js__WEBPACK_IMPORTED_MODULE_4__["default"]), +/* harmony export */ parse: () => (/* reexport safe */ _parse_js__WEBPACK_IMPORTED_MODULE_8__["default"]), +/* harmony export */ stringify: () => (/* reexport safe */ _stringify_js__WEBPACK_IMPORTED_MODULE_7__["default"]), +/* harmony export */ v1: () => (/* reexport safe */ _v1_js__WEBPACK_IMPORTED_MODULE_0__["default"]), +/* harmony export */ v3: () => (/* reexport safe */ _v3_js__WEBPACK_IMPORTED_MODULE_1__["default"]), +/* harmony export */ v4: () => (/* reexport safe */ _v4_js__WEBPACK_IMPORTED_MODULE_2__["default"]), +/* harmony export */ v5: () => (/* reexport safe */ _v5_js__WEBPACK_IMPORTED_MODULE_3__["default"]), +/* harmony export */ validate: () => (/* reexport safe */ _validate_js__WEBPACK_IMPORTED_MODULE_6__["default"]), +/* harmony export */ version: () => (/* reexport safe */ _version_js__WEBPACK_IMPORTED_MODULE_5__["default"]) +/* harmony export */ }); +/* harmony import */ var _v1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v1.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v1.js"); +/* harmony import */ var _v3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v3.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v3.js"); +/* harmony import */ var _v4_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v4.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v4.js"); +/* harmony import */ var _v5_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v5.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v5.js"); +/* harmony import */ var _nil_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./nil.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/nil.js"); +/* harmony import */ var _version_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./version.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/version.js"); +/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./validate.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js"); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./stringify.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js"); +/* harmony import */ var _parse_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./parse.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js"); + + + + + + + + + + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/md5.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/md5.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* + * Browser-compatible JavaScript MD5 + * + * Modification of JavaScript MD5 + * https://github.com/blueimp/JavaScript-MD5 + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + * + * Based on + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + * Digest Algorithm, as defined in RFC 1321. + * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for more info. + */ +function md5(bytes) { + if (typeof bytes === 'string') { + var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape + + bytes = new Uint8Array(msg.length); + + for (var i = 0; i < msg.length; ++i) { + bytes[i] = msg.charCodeAt(i); + } + } + + return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8)); +} +/* + * Convert an array of little-endian words to an array of bytes + */ + + +function md5ToHexEncodedArray(input) { + var output = []; + var length32 = input.length * 32; + var hexTab = '0123456789abcdef'; + + for (var i = 0; i < length32; i += 8) { + var x = input[i >> 5] >>> i % 32 & 0xff; + var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16); + output.push(hex); + } + + return output; +} +/** + * Calculate output length with padding and bit length + */ + + +function getOutputLength(inputLength8) { + return (inputLength8 + 64 >>> 9 << 4) + 14 + 1; +} +/* + * Calculate the MD5 of an array of little-endian words, and a bit length. + */ + + +function wordsToMd5(x, len) { + /* append padding */ + x[len >> 5] |= 0x80 << len % 32; + x[getOutputLength(len) - 1] = len; + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + var d = 271733878; + + for (var i = 0; i < x.length; i += 16) { + var olda = a; + var oldb = b; + var oldc = c; + var oldd = d; + a = md5ff(a, b, c, d, x[i], 7, -680876936); + d = md5ff(d, a, b, c, x[i + 1], 12, -389564586); + c = md5ff(c, d, a, b, x[i + 2], 17, 606105819); + b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330); + a = md5ff(a, b, c, d, x[i + 4], 7, -176418897); + d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426); + c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341); + b = md5ff(b, c, d, a, x[i + 7], 22, -45705983); + a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416); + d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417); + c = md5ff(c, d, a, b, x[i + 10], 17, -42063); + b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162); + a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682); + d = md5ff(d, a, b, c, x[i + 13], 12, -40341101); + c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290); + b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329); + a = md5gg(a, b, c, d, x[i + 1], 5, -165796510); + d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632); + c = md5gg(c, d, a, b, x[i + 11], 14, 643717713); + b = md5gg(b, c, d, a, x[i], 20, -373897302); + a = md5gg(a, b, c, d, x[i + 5], 5, -701558691); + d = md5gg(d, a, b, c, x[i + 10], 9, 38016083); + c = md5gg(c, d, a, b, x[i + 15], 14, -660478335); + b = md5gg(b, c, d, a, x[i + 4], 20, -405537848); + a = md5gg(a, b, c, d, x[i + 9], 5, 568446438); + d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690); + c = md5gg(c, d, a, b, x[i + 3], 14, -187363961); + b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501); + a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467); + d = md5gg(d, a, b, c, x[i + 2], 9, -51403784); + c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473); + b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734); + a = md5hh(a, b, c, d, x[i + 5], 4, -378558); + d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463); + c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562); + b = md5hh(b, c, d, a, x[i + 14], 23, -35309556); + a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060); + d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353); + c = md5hh(c, d, a, b, x[i + 7], 16, -155497632); + b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640); + a = md5hh(a, b, c, d, x[i + 13], 4, 681279174); + d = md5hh(d, a, b, c, x[i], 11, -358537222); + c = md5hh(c, d, a, b, x[i + 3], 16, -722521979); + b = md5hh(b, c, d, a, x[i + 6], 23, 76029189); + a = md5hh(a, b, c, d, x[i + 9], 4, -640364487); + d = md5hh(d, a, b, c, x[i + 12], 11, -421815835); + c = md5hh(c, d, a, b, x[i + 15], 16, 530742520); + b = md5hh(b, c, d, a, x[i + 2], 23, -995338651); + a = md5ii(a, b, c, d, x[i], 6, -198630844); + d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415); + c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905); + b = md5ii(b, c, d, a, x[i + 5], 21, -57434055); + a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571); + d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606); + c = md5ii(c, d, a, b, x[i + 10], 15, -1051523); + b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799); + a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359); + d = md5ii(d, a, b, c, x[i + 15], 10, -30611744); + c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380); + b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649); + a = md5ii(a, b, c, d, x[i + 4], 6, -145523070); + d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379); + c = md5ii(c, d, a, b, x[i + 2], 15, 718787259); + b = md5ii(b, c, d, a, x[i + 9], 21, -343485551); + a = safeAdd(a, olda); + b = safeAdd(b, oldb); + c = safeAdd(c, oldc); + d = safeAdd(d, oldd); + } + + return [a, b, c, d]; +} +/* + * Convert an array bytes to an array of little-endian words + * Characters >255 have their high-byte silently ignored. + */ + + +function bytesToWords(input) { + if (input.length === 0) { + return []; + } + + var length8 = input.length * 8; + var output = new Uint32Array(getOutputLength(length8)); + + for (var i = 0; i < length8; i += 8) { + output[i >> 5] |= (input[i / 8] & 0xff) << i % 32; + } + + return output; +} +/* + * Add integers, wrapping at 2^32. This uses 16-bit operations internally + * to work around bugs in some JS interpreters. + */ + + +function safeAdd(x, y) { + var lsw = (x & 0xffff) + (y & 0xffff); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return msw << 16 | lsw & 0xffff; +} +/* + * Bitwise rotate a 32-bit number to the left. + */ + + +function bitRotateLeft(num, cnt) { + return num << cnt | num >>> 32 - cnt; +} +/* + * These functions implement the four basic operations the algorithm uses. + */ + + +function md5cmn(q, a, b, x, s, t) { + return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b); +} + +function md5ff(a, b, c, d, x, s, t) { + return md5cmn(b & c | ~b & d, a, b, x, s, t); +} + +function md5gg(a, b, c, d, x, s, t) { + return md5cmn(b & d | c & ~d, a, b, x, s, t); +} + +function md5hh(a, b, c, d, x, s, t) { + return md5cmn(b ^ c ^ d, a, b, x, s, t); +} + +function md5ii(a, b, c, d, x, s, t) { + return md5cmn(c ^ (b | ~d), a, b, x, s, t); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (md5); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/nil.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/nil.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ('00000000-0000-0000-0000-000000000000'); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js": +/*!********************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js"); + + +function parse(uuid) { + if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { + throw TypeError('Invalid UUID'); + } + + var v; + var arr = new Uint8Array(16); // Parse ########-....-....-....-............ + + arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24; + arr[1] = v >>> 16 & 0xff; + arr[2] = v >>> 8 & 0xff; + arr[3] = v & 0xff; // Parse ........-####-....-....-............ + + arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8; + arr[5] = v & 0xff; // Parse ........-....-####-....-............ + + arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8; + arr[7] = v & 0xff; // Parse ........-....-....-####-............ + + arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8; + arr[9] = v & 0xff; // Parse ........-....-....-....-############ + // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes) + + arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff; + arr[11] = v / 0x100000000 & 0xff; + arr[12] = v >>> 24 & 0xff; + arr[13] = v >>> 16 & 0xff; + arr[14] = v >>> 8 & 0xff; + arr[15] = v & 0xff; + return arr; +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (parse); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/regex.js": +/*!********************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/regex.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ rng) +/* harmony export */ }); +// Unique ID creation requires a high quality random # generator. In the browser we therefore +// require the crypto API and do not support built-in fallback to lower quality random number +// generators (like Math.random()). +var getRandomValues; +var rnds8 = new Uint8Array(16); +function rng() { + // lazy load so that environments that need to polyfill have a chance to do so + if (!getRandomValues) { + // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also, + // find the complete implementation of crypto (msCrypto) on IE11. + getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto); + + if (!getRandomValues) { + throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported'); + } + } + + return getRandomValues(rnds8); +} + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/sha1.js": +/*!*******************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/sha1.js ***! + \*******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +// Adapted from Chris Veness' SHA1 code at +// http://www.movable-type.co.uk/scripts/sha1.html +function f(s, x, y, z) { + switch (s) { + case 0: + return x & y ^ ~x & z; + + case 1: + return x ^ y ^ z; + + case 2: + return x & y ^ x & z ^ y & z; + + case 3: + return x ^ y ^ z; + } +} + +function ROTL(x, n) { + return x << n | x >>> 32 - n; +} + +function sha1(bytes) { + var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6]; + var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]; + + if (typeof bytes === 'string') { + var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape + + bytes = []; + + for (var i = 0; i < msg.length; ++i) { + bytes.push(msg.charCodeAt(i)); + } + } else if (!Array.isArray(bytes)) { + // Convert Array-like to Array + bytes = Array.prototype.slice.call(bytes); + } + + bytes.push(0x80); + var l = bytes.length / 4 + 2; + var N = Math.ceil(l / 16); + var M = new Array(N); + + for (var _i = 0; _i < N; ++_i) { + var arr = new Uint32Array(16); + + for (var j = 0; j < 16; ++j) { + arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3]; + } + + M[_i] = arr; + } + + M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32); + M[N - 1][14] = Math.floor(M[N - 1][14]); + M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff; + + for (var _i2 = 0; _i2 < N; ++_i2) { + var W = new Uint32Array(80); + + for (var t = 0; t < 16; ++t) { + W[t] = M[_i2][t]; + } + + for (var _t = 16; _t < 80; ++_t) { + W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1); + } + + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + + for (var _t2 = 0; _t2 < 80; ++_t2) { + var s = Math.floor(_t2 / 20); + var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0; + e = d; + d = c; + c = ROTL(b, 30) >>> 0; + b = a; + a = T; + } + + H[0] = H[0] + a >>> 0; + H[1] = H[1] + b >>> 0; + H[2] = H[2] + c >>> 0; + H[3] = H[3] + d >>> 0; + H[4] = H[4] + e >>> 0; + } + + return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff]; +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (sha1); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js": +/*!************************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js"); + +/** + * Convert array of 16 byte values to UUID string format of the form: + * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX + */ + +var byteToHex = []; + +for (var i = 0; i < 256; ++i) { + byteToHex.push((i + 0x100).toString(16).substr(1)); +} + +function stringify(arr) { + var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + // Note: Be careful editing this code! It's been tuned for performance + // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 + var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one + // of the following: + // - One or more input array values don't map to a hex octet (leading to + // "undefined" in the uuid) + // - Invalid input values for the RFC `version` or `variant` fields + + if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { + throw TypeError('Stringified UUID is invalid'); + } + + return uuid; +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (stringify); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v1.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v1.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _rng_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rng.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js"); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js"); + + // **`v1()` - Generate time-based UUID** +// +// Inspired by https://github.com/LiosK/UUID.js +// and http://docs.python.org/library/uuid.html + +var _nodeId; + +var _clockseq; // Previous uuid creation time + + +var _lastMSecs = 0; +var _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details + +function v1(options, buf, offset) { + var i = buf && offset || 0; + var b = buf || new Array(16); + options = options || {}; + var node = options.node || _nodeId; + var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not + // specified. We do this lazily to minimize issues related to insufficient + // system entropy. See #189 + + if (node == null || clockseq == null) { + var seedBytes = options.random || (options.rng || _rng_js__WEBPACK_IMPORTED_MODULE_0__["default"])(); + + if (node == null) { + // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) + node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]]; + } + + if (clockseq == null) { + // Per 4.2.2, randomize (14 bit) clockseq + clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff; + } + } // UUID timestamps are 100 nano-second units since the Gregorian epoch, + // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so + // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' + // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. + + + var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock + // cycle to simulate higher resolution clock + + var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs) + + var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression + + if (dt < 0 && options.clockseq === undefined) { + clockseq = clockseq + 1 & 0x3fff; + } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new + // time interval + + + if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) { + nsecs = 0; + } // Per 4.2.1.2 Throw error if too many uuids are requested + + + if (nsecs >= 10000) { + throw new Error("uuid.v1(): Can't create more than 10M uuids/sec"); + } + + _lastMSecs = msecs; + _lastNSecs = nsecs; + _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch + + msecs += 12219292800000; // `time_low` + + var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; + b[i++] = tl >>> 24 & 0xff; + b[i++] = tl >>> 16 & 0xff; + b[i++] = tl >>> 8 & 0xff; + b[i++] = tl & 0xff; // `time_mid` + + var tmh = msecs / 0x100000000 * 10000 & 0xfffffff; + b[i++] = tmh >>> 8 & 0xff; + b[i++] = tmh & 0xff; // `time_high_and_version` + + b[i++] = tmh >>> 24 & 0xf | 0x10; // include version + + b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) + + b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low` + + b[i++] = clockseq & 0xff; // `node` + + for (var n = 0; n < 6; ++n) { + b[i + n] = node[n]; + } + + return buf || (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(b); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v1); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v3.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v3.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _v35_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v35.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js"); +/* harmony import */ var _md5_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./md5.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/md5.js"); + + +var v3 = (0,_v35_js__WEBPACK_IMPORTED_MODULE_0__["default"])('v3', 0x30, _md5_js__WEBPACK_IMPORTED_MODULE_1__["default"]); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v3); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ DNS: () => (/* binding */ DNS), +/* harmony export */ URL: () => (/* binding */ URL), +/* harmony export */ "default": () => (/* export default binding */ __WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js"); +/* harmony import */ var _parse_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./parse.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js"); + + + +function stringToBytes(str) { + str = unescape(encodeURIComponent(str)); // UTF8 escape + + var bytes = []; + + for (var i = 0; i < str.length; ++i) { + bytes.push(str.charCodeAt(i)); + } + + return bytes; +} + +var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; +var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; +/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(name, version, hashfunc) { + function generateUUID(value, namespace, buf, offset) { + if (typeof value === 'string') { + value = stringToBytes(value); + } + + if (typeof namespace === 'string') { + namespace = (0,_parse_js__WEBPACK_IMPORTED_MODULE_0__["default"])(namespace); + } + + if (namespace.length !== 16) { + throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)'); + } // Compute hash of namespace and value, Per 4.3 + // Future: Use spread syntax when supported on all platforms, e.g. `bytes = + // hashfunc([...namespace, ... value])` + + + var bytes = new Uint8Array(16 + value.length); + bytes.set(namespace); + bytes.set(value, namespace.length); + bytes = hashfunc(bytes); + bytes[6] = bytes[6] & 0x0f | version; + bytes[8] = bytes[8] & 0x3f | 0x80; + + if (buf) { + offset = offset || 0; + + for (var i = 0; i < 16; ++i) { + buf[offset + i] = bytes[i]; + } + + return buf; + } + + return (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bytes); + } // Function#name is not settable on some platforms (#270) + + + try { + generateUUID.name = name; // eslint-disable-next-line no-empty + } catch (err) {} // For CommonJS default export support + + + generateUUID.DNS = DNS; + generateUUID.URL = URL; + return generateUUID; +} + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v4.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v4.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _rng_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rng.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js"); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js"); + + + +function v4(options, buf, offset) { + options = options || {}; + var rnds = options.random || (options.rng || _rng_js__WEBPACK_IMPORTED_MODULE_0__["default"])(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` + + rnds[6] = rnds[6] & 0x0f | 0x40; + rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided + + if (buf) { + offset = offset || 0; + + for (var i = 0; i < 16; ++i) { + buf[offset + i] = rnds[i]; + } + + return buf; + } + + return (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(rnds); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v4); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v5.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v5.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _v35_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v35.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js"); +/* harmony import */ var _sha1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sha1.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/sha1.js"); + + +var v5 = (0,_v35_js__WEBPACK_IMPORTED_MODULE_0__["default"])('v5', 0x50, _sha1_js__WEBPACK_IMPORTED_MODULE_1__["default"]); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v5); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js": +/*!***********************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js ***! + \***********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _regex_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./regex.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/regex.js"); + + +function validate(uuid) { + return typeof uuid === 'string' && _regex_js__WEBPACK_IMPORTED_MODULE_0__["default"].test(uuid); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (validate); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/version.js": +/*!**********************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/version.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js"); + + +function version(uuid) { + if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { + throw TypeError('Invalid UUID'); + } + + return parseInt(uuid.substr(14, 1), 16); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (version); + +/***/ }), + +/***/ "../api-internal-contract-js/lib/internal-contract-version.json": +/*!**********************************************************************!*\ + !*** ../api-internal-contract-js/lib/internal-contract-version.json ***! + \**********************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = /*#__PURE__*/JSON.parse('{"major":1,"minor":188,"fix":0}'); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be in strict mode. +(() => { +"use strict"; +var exports = __webpack_exports__; +/*!**********************************!*\ + !*** ./lib/src/ExtensionsApi.js ***! + \**********************************/ + +/** + * This is your main. This is where you re-export everything you want to be publicly available. + * + * The build enforces that the file has the same name as the global variable that is exported. + */ +Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +// Due to the way we configured webpack, we should be exporting things which will be under +// a global variable called "tableau". Export everything we want to be visible under tableau +// from this file. +const ExtensionsImpl_1 = __webpack_require__(/*! ./ExtensionsApi/Impl/ExtensionsImpl */ "./lib/src/ExtensionsApi/Impl/ExtensionsImpl.js"); +const Extensions_1 = __webpack_require__(/*! ./ExtensionsApi/Namespaces/Extensions */ "./lib/src/ExtensionsApi/Namespaces/Extensions.js"); +const isAlpha = true ? true : 0; +api_shared_js_1.ApiVersion.SetVersionNumber( true ? "1.15.0-pre.15" : 0, isAlpha); +const extensionImpl = new ExtensionsImpl_1.ExtensionsImpl(); +exports.extensions = new Extensions_1.Extensions(extensionImpl); +// Export Enums +// These show up under the tableau object. I.e. tableau.ExtensionContext.Server +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +exports.AnalyticsObjectType = api_external_contract_js_1.AnalyticsObjectType; +exports.AnnotationType = api_external_contract_js_1.AnnotationType; +exports.ClassNameKey = api_external_contract_js_1.ClassNameKey; +exports.ColumnType = api_external_contract_js_1.ColumnType; +exports.DashboardLayoutChange = api_external_contract_js_1.DashboardLayoutChange; +exports.DashboardObjectType = api_external_contract_js_1.DashboardObjectType; +exports.DashboardObjectVisibilityType = api_external_contract_js_1.DashboardObjectVisibilityType; +exports.DataType = api_external_contract_js_1.DataType; +exports.DateRangeType = api_external_contract_js_1.DateRangeType; +exports.DialogStyle = api_external_contract_js_1.DialogStyle; +exports.EncodingType = api_external_contract_js_1.EncodingType; +exports.ErrorCodes = api_external_contract_js_1.ErrorCodes; +exports.ExtensionContext = api_external_contract_js_1.ExtensionContext; +exports.ExtensionMode = api_external_contract_js_1.ExtensionMode; +exports.FieldAggregationType = api_external_contract_js_1.FieldAggregationType; +exports.FieldRoleType = api_external_contract_js_1.FieldRoleType; +exports.FilterDomainType = api_external_contract_js_1.FilterDomainType; +exports.FilterNullOption = api_external_contract_js_1.FilterNullOption; +exports.FilterType = api_external_contract_js_1.FilterType; +exports.FilterUpdateType = api_external_contract_js_1.FilterUpdateType; +exports.HierarchicalLevelSelectionState = api_external_contract_js_1.HierarchicalLevelSelectionState; +exports.IncludeDataValuesOption = api_external_contract_js_1.IncludeDataValuesOption; +exports.MarkType = api_external_contract_js_1.MarkType; +exports.ParameterValueType = api_external_contract_js_1.ParameterValueType; +exports.PeriodType = api_external_contract_js_1.PeriodType; +exports.QuickTableCalcType = api_external_contract_js_1.QuickTableCalcType; +exports.ReplaySpeedType = api_external_contract_js_1.ReplaySpeedType; +exports.SelectionUpdateType = api_external_contract_js_1.SelectionUpdateType; +exports.SelectOptions = api_external_contract_js_1.SelectOptions; +exports.SheetType = api_external_contract_js_1.SheetType; +exports.SortDirection = api_external_contract_js_1.SortDirection; +exports.TableauEventType = api_external_contract_js_1.TableauEventType; +exports.TrendLineModelType = api_external_contract_js_1.TrendLineModelType; +exports.VizImageEncodingType = api_external_contract_js_1.VizImageEncodingType; +exports.VizImagePaletteType = api_external_contract_js_1.VizImagePaletteType; +exports.VizImageSizeSettingAlignmentType = api_external_contract_js_1.VizImageSizeSettingAlignmentType; +exports.VizImageSizeSettingType = api_external_contract_js_1.VizImageSizeSettingType; +exports.VizImageSortDirectionType = api_external_contract_js_1.VizImageSortDirectionType; +exports.ZoneVisibilityType = api_external_contract_js_1.ZoneVisibilityType; + +})(); + +window.tableau = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGVhdS5leHRlbnNpb25zLjEuMTUuMC1wcmUuMTUuYmV0YS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBLHdDQUF3QyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsR0FBRzs7QUFFM0Y7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLEtBQUssS0FBNEI7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FDOURELHlJQUE4RDtBQUM5RCxtSEFBOEM7QUFFOUMsTUFBYSwyQkFBNEIsU0FBUSwyQkFBWTtJQUMzRCxZQUEwQiw2QkFBb0U7UUFDNUYsS0FBSyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRGhDLGtDQUE2QixHQUE3Qiw2QkFBNkIsQ0FBdUM7SUFFOUYsQ0FBQztJQUVELElBQVcsNEJBQTRCO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLDZCQUE2QixDQUFDO0lBQzVDLENBQUM7Q0FDRjtBQVJELGtFQVFDOzs7Ozs7Ozs7Ozs7OztBQ1ZELDJKQUFpRjtBQUNqRixtSEFBc0Q7QUFDdEQsOElBQWdFO0FBRWhFLE1BQWEsa0JBQW1CLFNBQVEsNkNBQXFCO0lBQzNELFlBQW1CLFNBQXNDLEVBQVUsVUFBa0IsRUFBVSxRQUFpQjtRQUM5RyxLQUFLLENBQUMsMkNBQWdCLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRGdC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QWU7QUFDZiwrRUFBK0U7QUFDL0UseUpBeUMyQztBQXhDekMsNEVBQW1CO0FBQ25CLGtFQUFjO0FBQ2QsOERBQVk7QUFDWiwwREFBVTtBQUNWLGdGQUFxQjtBQUNyQiw0RUFBbUI7QUFDbkIsZ0dBQTZCO0FBQzdCLHNEQUFRO0FBQ1IsZ0VBQWE7QUFDYiw0REFBVztBQUNYLDhEQUFZO0FBQ1osMERBQVU7QUFDVixzRUFBZ0I7QUFDaEIsZ0VBQWE7QUFDYiw4RUFBb0I7QUFDcEIsZ0VBQWE7QUFDYixzRUFBZ0I7QUFDaEIsc0VBQWdCO0FBQ2hCLDBEQUFVO0FBQ1Ysc0VBQWdCO0FBQ2hCLG9HQUErQjtBQUMvQixvRkFBdUI7QUFDdkIsc0RBQVE7QUFDUiwwRUFBa0I7QUFDbEIsMERBQVU7QUFDViwwRUFBa0I7QUFFbEIsb0VBQWU7QUFDZiw0RUFBbUI7QUFDbkIsZ0VBQWE7QUFDYix3REFBUztBQUNULGdFQUFhO0FBQ2Isc0VBQWdCO0FBQ2hCLDBFQUFrQjtBQUNsQiw4RUFBb0I7QUFDcEIsNEVBQW1CO0FBQ25CLHNHQUFnQztBQUNoQyxvRkFBdUI7QUFDdkIsd0ZBQXlCO0FBQ3pCLDBFQUFrQiIsInNvdXJjZXMiOlsid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2d1aWQvZ3VpZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL0Rhc2hib2FyZExheW91dENoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL0ZpbHRlckNoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL01hcmtzU2VsZWN0ZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1BhcmFtZXRlckNoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1N1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvVGFibGVhdUV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvVGFibGVhdVNoZWV0RXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9UYWJsZWF1V29ya3NoZWV0RXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL0JlbnRvblNhbnNGb250TmFtZUNvbnN0YW50cy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9Db25uZWN0ZWRTZXJ2ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvRXh0ZW5zaW9uV29ya2Jvb2tJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL0V4dGVuc2lvbnNJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL0xlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9TZXR0aW5nc0ltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvVGFibGVhdUJvb2tGb250TmFtZUNvbnN0YW50cy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9VSUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9EYXNoYm9hcmQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9EYXNoYm9hcmRPYmplY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9QYXJhbWV0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9TaGVldC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL1dvcmtib29rLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvV29ya3NoZWV0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvRW52aXJvbm1lbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvRXh0ZW5zaW9ucy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9TZXR0aW5ncy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9VSS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9Xb3JrYm9va0Zvcm1hdHRpbmdFbnZVdGlsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL1dvcmtzaGVldENvbnRlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL0ltcGwvSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvU2VydmljZXMvSW1wbC9TZXR0aW5nc1NlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9JbXBsL1VJU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL1JlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FbWJlZGRpbmdBcGlFeHRlcm5hbENvbnRyYWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlbnNpb25zQXBpRXh0ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvQXNrRGF0YUludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0VudW1zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9QdWxzZUludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1ZpekludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1dlYkNvbXBvbmVudEludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1RhYmxlYXUudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0VudW1zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL1NoYXJlZEFwaUV4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL0pzQXBpSW50ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvY29udHJhY3QvRGF0YVR5cGVDb252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L0VudW1zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9jb250cmFjdC9Ob3RpZmljYXRpb25zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9jb250cmFjdC9QYXJhbWV0ZXJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9jb250cmFjdC9WZXJicy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvaW50ZXJmYWNlL0Fza0RhdGFJbnRlcmZhY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2ludGVyZmFjZS9QdWxzZUludGVyZmFjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvaW50ZXJmYWNlL1ZxbEludGVyZmFjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvbWVzc2FnaW5nL0Nyb3NzRnJhbWVNZXNzZW5nZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9Dcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9tZXNzYWdpbmcvTWVzc2FnZVR5cGVDaGVja3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL0lkZW50aXR5VmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9TdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvVmVyc2lvbkNvbnZlcnRlckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvVmVyc2lvblRyYW5zbGF0aW9ucy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0FwaVZlcnNpb24udHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQ29ubmVjdGlvblN1bW1hcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQ3Jvc3NGcmFtZS9Dcm9zc0ZyYW1lQm9vdHN0cmFwLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0Nyb3NzRnJhbWUvQ3Jvc3NGcmFtZURpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRGF0YVNvdXJjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRXZlbnRMaXN0ZW5lck1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRmllbGQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9DdXN0b21WaWV3SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9EYXNoYm9hcmRPYmplY3RJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvRGF0YVNvdXJjZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9GaWVsZEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9QYXJhbWV0ZXJJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU2hlZXRJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU2hlZXRJbmZvSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1NpbmdsZUV2ZW50TWFuYWdlckltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TdG9yeUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TdG9yeVBvaW50SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbmZvSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1dvcmtib29rSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1dvcmtzaGVldEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTG9naWNhbFRhYmxlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL01vZGVscy9BY2Nlc3NpYmlsaXR5TW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL01vZGVscy9GaWx0ZXJNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0dldERhdGFNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0dldERhdGFUYWJsZVJlYWRlck1vZGVscy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Nb2RlbHMvU2VsZWN0aW9uTW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1BvaW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL0dldERhdGFTZXJ2aWNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL1JlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvQWNjZXNzaWJpbGl0eVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvQW5pbWF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Bbm5vdGF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9DbGllbnRJbmZvU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9EYXRhU291cmNlU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9FeHBvcnRTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0ZpbHRlclNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvR2V0RGF0YVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9QYXJhbWV0ZXJzU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9TZWxlY3Rpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlcnZpY2VJbXBsQmFzZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NpemVTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1N0b3J5QWN0aXZhdGlvblNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvVmlzdWFsTW9kZWxTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1ZpelNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvWm9uZVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1RhYmxlU3VtbWFyeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9UYWJsZWF1RXJyb3IudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvRGF0YVZhbHVlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9EZWZlcnJlZC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9FbnVtQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL0Vycm9ySGVscGVycy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9FeHBvcnRIZWxwZXJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL1BhcmFtLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL1NoZWV0VXRpbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvU2hvcnRMaXZlZERlZmVycmVkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1ZlcnNpb25OdW1iZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9WZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvbWQ1LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL25pbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9wYXJzZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9yZWdleC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9ybmcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc2hhMS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjEuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjM1LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y0LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y1LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3ZhbGlkYXRlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vdGFibGVhdS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gKCkge1xuICB2YXIgdmFsaWRhdG9yID0gbmV3IFJlZ0V4cChcIl5bYS16MC05XXs4fS1bYS16MC05XXs0fS1bYS16MC05XXs0fS1bYS16MC05XXs0fS1bYS16MC05XXsxMn0kXCIsIFwiaVwiKTtcblxuICBmdW5jdGlvbiBnZW4oY291bnQpIHtcbiAgICB2YXIgb3V0ID0gXCJcIjtcbiAgICBmb3IgKHZhciBpPTA7IGk8Y291bnQ7IGkrKykge1xuICAgICAgb3V0ICs9ICgoKDErTWF0aC5yYW5kb20oKSkqMHgxMDAwMCl8MCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIEd1aWQoZ3VpZCkge1xuICAgIGlmICghZ3VpZCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXJndW1lbnQ7IGB2YWx1ZWAgaGFzIG5vIHZhbHVlLlwiKTtcbiAgICAgIFxuICAgIHRoaXMudmFsdWUgPSBHdWlkLkVNUFRZO1xuICAgIFxuICAgIGlmIChndWlkICYmIGd1aWQgaW5zdGFuY2VvZiBHdWlkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gZ3VpZC50b1N0cmluZygpO1xuXG4gICAgfSBlbHNlIGlmIChndWlkICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChndWlkKSA9PT0gXCJbb2JqZWN0IFN0cmluZ11cIiAmJiBHdWlkLmlzR3VpZChndWlkKSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGd1aWQ7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZXF1YWxzID0gZnVuY3Rpb24ob3RoZXIpIHtcbiAgICAgIC8vIENvbXBhcmluZyBzdHJpbmcgYHZhbHVlYCBhZ2FpbnN0IHByb3ZpZGVkIGBndWlkYCB3aWxsIGF1dG8tY2FsbFxuICAgICAgLy8gdG9TdHJpbmcgb24gYGd1aWRgIGZvciBjb21wYXJpc29uXG4gICAgICByZXR1cm4gR3VpZC5pc0d1aWQob3RoZXIpICYmIHRoaXMudmFsdWUgPT0gb3RoZXI7XG4gICAgfTtcblxuICAgIHRoaXMuaXNFbXB0eSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IEd1aWQuRU1QVFk7XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICAgIFxuICAgIHRoaXMudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICB9O1xuXG4gIEd1aWQuRU1QVFkgPSBcIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiO1xuXG4gIEd1aWQuaXNHdWlkID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgKHZhbHVlIGluc3RhbmNlb2YgR3VpZCB8fCB2YWxpZGF0b3IudGVzdCh2YWx1ZS50b1N0cmluZygpKSk7XG4gIH07XG5cbiAgR3VpZC5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IEd1aWQoW2dlbigyKSwgZ2VuKDEpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDMpXS5qb2luKFwiLVwiKSk7XG4gIH07XG5cbiAgR3VpZC5yYXcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gW2dlbigyKSwgZ2VuKDEpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDMpXS5qb2luKFwiLVwiKTtcbiAgfTtcblxuICBpZih0eXBlb2YgbW9kdWxlICE9ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBHdWlkO1xuICB9XG4gIGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB3aW5kb3cuR3VpZCA9IEd1aWQ7XG4gIH1cbn0pKCk7XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBfZGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlsczogQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscykge1xuICAgIHN1cGVyKENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZExheW91dENoYW5nZURldGFpbHMoKTogQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZExheW91dENoYW5nZURldGFpbHM7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVGFibGVhdVdvcmtzaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1V29ya3NoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgRmlsdGVyQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdVdvcmtzaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRmlsdGVyQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0LCBwcml2YXRlIF9maWVsZE5hbWU6IHN0cmluZywgcHJpdmF0ZSBfZmllbGRJZD86IHN0cmluZykge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuRmlsdGVyQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZElkO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlckFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuRmlsdGVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldC5nZXRGaWx0ZXJzQXN5bmMoKS50aGVuPENvbnRyYWN0LkZpbHRlcj4oKGZpbHRlcnMpID0+IHtcbiAgICAgIC8vIFRPRE86IEZpbHRlcmluZyBvZiB0aGUgZmlsdGVycyBzaG91bGQgZXZlbnR1YWxseSBiZSBkb25lIHBsYXRmb3JtIHNpZGUuXG4gICAgICBjb25zdCBldmVudGVkRmlsdGVyID0gdGhpcy5maWVsZElkXG4gICAgICAgID8gZmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlci5maWVsZElkID09PSB0aGlzLmZpZWxkSWQsIHRoaXMpXG4gICAgICAgIDogZmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlci5maWVsZE5hbWUgPT09IHRoaXMuZmllbGROYW1lLCB0aGlzKTtcblxuICAgICAgaWYgKCFldmVudGVkRmlsdGVyKSB7XG4gICAgICAgIC8vIFdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGZpbHRlciB3YXMgcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXRcbiAgICAgICAgLy8gYWZ0ZXIgdGhlIGV2ZW50IHdhcyByYWlzZWQuXG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5NaXNzaW5nRmlsdGVyLCBgY2Fubm90IGZpbmQgZmlsdGVyOiAke3RoaXMuX2ZpZWxkTmFtZX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV2ZW50ZWRGaWx0ZXI7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVdvcmtzaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIE1hcmtzU2VsZWN0ZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0Lk1hcmtzU2VsZWN0ZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih3b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCkge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuTWFya1NlbGVjdGlvbkNoYW5nZWQsIHdvcmtzaGVldCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLndvcmtzaGVldC5nZXRTZWxlY3RlZE1hcmtzQXN5bmMoKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9yQ29kZXMsIFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBQYXJhbWV0ZXJzU2VydmljZSwgU2VydmljZU5hbWVzLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFBhcmFtZXRlciB9IGZyb20gJy4uL01vZGVscy9QYXJhbWV0ZXInO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcbmltcG9ydCB7IFRhYmxlYXVTaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1U2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1U2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlBhcmFtZXRlckNoYW5nZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9nbG9iYWxGaWVsZE5hbWU6IHN0cmluZywgc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0KSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5QYXJhbWV0ZXJDaGFuZ2VkLCBzaGVldCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UGFyYW1ldGVyQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5QYXJhbWV0ZXI+IHtcbiAgICAvLyBDYWxsIGRvd24gdG8gb3VyIHNlcnZpY2UgdG8gZ2V0IHRoZSBwYXJhbWV0ZXIgYmFjayB2aWEgaXRzIGZpZWxkIG5hbWVcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBzZXJ2aWNlLmZpbmRQYXJhbWV0ZXJCeUdsb2JhbEZpZWxkTmFtZUFzeW5jKHRoaXMuX2dsb2JhbEZpZWxkTmFtZSkudGhlbigocGFyYW1ldGVySW1wbCkgPT4ge1xuICAgICAgaWYgKHBhcmFtZXRlckltcGwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuTWlzc2luZ1BhcmFtZXRlciwgYENhbm5vdCBmaW5kIHBhcmFtZXRlcjogJHt0aGlzLl9nbG9iYWxGaWVsZE5hbWV9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVyKHBhcmFtZXRlckltcGwsIHRoaXMuc2hlZXQpO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVXb3Jrc2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlN1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0KSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5TdW1tYXJ5RGF0YUNoYW5nZWQsIHdvcmtzaGVldCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIFRhYmxlYXVFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlRhYmxlYXVFdmVudCB7XG4gIHByaXZhdGUgX3R5cGU6IFRhYmxlYXVFdmVudFR5cGU7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IFRhYmxlYXVFdmVudFR5cGUpIHtcbiAgICB0aGlzLl90eXBlID0gdHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBUYWJsZWF1RXZlbnRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVhdVNoZWV0RXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZWF1U2hlZXRFdmVudCB7XG4gIHByaXZhdGUgX3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldDtcblxuICBwdWJsaWMgZ2V0IHNoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0IHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXQ7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0KSB7XG4gICAgc3VwZXIodHlwZSk7XG5cbiAgICB0aGlzLl9zaGVldCA9IHNoZWV0O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1U2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVNoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVhdVdvcmtzaGVldEV2ZW50IGV4dGVuZHMgVGFibGVhdVNoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZWF1V29ya3NoZWV0RXZlbnQge1xuICBwdWJsaWMgZ2V0IHdvcmtzaGVldCgpOiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXQ7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgcHJvdGVjdGVkIF93b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCkge1xuICAgIHN1cGVyKHR5cGUsIF93b3Jrc2hlZXQpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Zvcm1hdHRpbmc6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZykge1xuICAgIHN1cGVyKENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvcm1hdHRpbmcoKTogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVdvcmtzaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0LCBwcml2YXRlIF9mb3JtYXR0aW5nOiBDb250cmFjdC5Xb3Jrc2hlZXRGb3JtYXR0aW5nKSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGluZygpOiBDb250cmFjdC5Xb3Jrc2hlZXRGb3JtYXR0aW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lID0gJ0JlbnRvbiBTYW5zJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUgPSAnQmVudG9uIFNhbnMgTG93LURQSSc7XG5cbmV4cG9ydCBjb25zdCBCZW50b25TYW5zQm9va0ZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBCb29rJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBCb29rIEl0YWxpYyc7XG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc1NlbWlEZW1pRm9udEZhY2VOYW1lID0gJ0JlbnRvbiBTYW5zIFNlbWlEZW1pJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgU2VtaURlbWkgSXRhbGljJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zTGlnaHRGb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgTGlnaHQnO1xuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNNZWRpdW1Gb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgTWVkaXVtJztcblxuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXM6IE1vZGVsW10gPSBbXG4gIEJlbnRvblNhbnNCb29rRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc1NlbWlEZW1pRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc01lZGl1bUZvbnRGYWNlTmFtZSxcbl07XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgQ29ubmVjdGVkU2VydmVyIGltcGxlbWVudHMgQ29udHJhY3QuQ29ubmVjdGVkU2VydmVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBfdXNlcklkPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfc2l0ZUlkPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfc2l0ZU5hbWVzcGFjZT86IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX3dvcmtib29rSWQ/OiBzdHJpbmcsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IHVzZXJJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91c2VySWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpdGVJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zaXRlSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpdGVOYW1lc3BhY2UoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2l0ZU5hbWVzcGFjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya2Jvb2tJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93b3JrYm9va0lkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNjaGVtYSwgRGF0YVNvdXJjZSBhcyBEYXRhU291cmNlSW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIERhdGFTb3VyY2UsIERhdGFTb3VyY2VJbXBsLCBEYXRhU291cmNlU2VydmljZSwgU2VydmljZU5hbWVzLCBXb3JrYm9va0ltcGwgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25Xb3JrYm9va0ltcGwgZXh0ZW5kcyBXb3JrYm9va0ltcGwge1xuICBwdWJsaWMgZ2V0QWxsRGF0YVNvdXJjZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRBbGxEYXRhU291cmNlc0FzeW5jKCkudGhlbjxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4oKHJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYTogRGF0YVNjaGVtYSA9IHJlc3VsdDtcbiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzOiBBcnJheTxDb250cmFjdC5EYXRhU291cmNlPiA9IFtdO1xuXG4gICAgICAvLyBMb29wIHRocm91Z2ggYWxsIGRhdGEgc291cmNlcyBhbmQgYWRkIHRoZW0uXG4gICAgICBPYmplY3QudmFsdWVzKGRhdGFTY2hlbWEuZGF0YVNvdXJjZXMpLmZvckVhY2goKGRzKSA9PiB7XG4gICAgICAgIGRhdGFTb3VyY2VzLnB1c2godGhpcy5jcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZHMpKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZGF0YVNvdXJjZXM7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU291cmNlSW5mbzogRGF0YVNvdXJjZUluZm8pOiBEYXRhU291cmNlIHtcbiAgICBjb25zdCBkYXRhU291cmNlSW1wbCA9IG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlSW5mbywgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZShkYXRhU291cmNlSW1wbCk7XG4gICAgZGF0YVNvdXJjZUltcGwuaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKGRhdGFTb3VyY2UpO1xuICAgIHJldHVybiBkYXRhU291cmNlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzLCBTaGVldFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29udGV4dE1lbnVFdmVudCxcbiAgRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvcixcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4dGVuc2lvbkRhc2hib2FyZEluZm8sXG4gIEV4dGVuc2lvbkxvY2F0b3IsXG4gIEV4dGVuc2lvblNldHRpbmdzSW5mbyxcbiAgRXh0ZW5zaW9uV29ya3NoZWV0SW5mbyxcbiAgRm9udE5hbWVBbmRJbmZvLFxuICBGb3JtYXR0aW5nU2hlZXQsXG4gIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sXG4gIEluaXRpYWxpemF0aW9uT3B0aW9ucyxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5LFxuICBNb2RlbCxcbiAgTm90aWZpY2F0aW9uSWQsXG4gIFBhcmFtZXRlcklkLFxuICBTaGVldFBhdGgsXG4gIFZlcmJJZCxcbiAgV29ya2Jvb2tGb3JtYXR0aW5nLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBBcGlWZXJzaW9uLFxuICBEYXNoYm9hcmRJbXBsLFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNoZWV0SW5mb0ltcGwsXG4gIFRhYmxlYXVFcnJvcixcbiAgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBWaXpTZXJ2aWNlLFxuICBXb3Jrc2hlZXRJbXBsLFxuICBkb0Nyb3NzRnJhbWVCb290c3RyYXAsXG4gIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkIH0gZnJvbSAnLi4vTW9kZWxzL0Rhc2hib2FyZCc7XG5pbXBvcnQgeyBXb3JrYm9vayB9IGZyb20gJy4uL01vZGVscy9Xb3JrYm9vayc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuLi9Nb2RlbHMvV29ya3NoZWV0JztcbmltcG9ydCB7IERhc2hib2FyZENvbnRlbnQgfSBmcm9tICcuLi9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuLi9OYW1lc3BhY2VzL0Vudmlyb25tZW50JztcbmltcG9ydCB7IFNldHRpbmdzIH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9TZXR0aW5ncyc7XG5pbXBvcnQgeyBVSSB9IGZyb20gJy4uL05hbWVzcGFjZXMvVUknO1xuaW1wb3J0IHsgV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCB9IGZyb20gJy4uL05hbWVzcGFjZXMvV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRDb250ZW50IH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9Xb3Jrc2hlZXRDb250ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0luaXRpYWxpemF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcywgcmVnaXN0ZXJJbml0aWFsaXphdGlvbkV4dGVuc2lvbnNTZXJ2aWNlcyB9IGZyb20gJy4uL1NlcnZpY2VzL1JlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9VSVNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQmVudG9uU2Fuc0Jvb2tGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zRm9udEZhbWlseU5hbWUsXG4gIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLFxuICBCZW50b25TYW5zTWVkaXVtRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgU3VwcG9ydGVkQmVudG9uU2Fuc0ZvbnRGYWNlcyxcbn0gZnJvbSAnLi9CZW50b25TYW5zRm9udE5hbWVDb25zdGFudHMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsIH0gZnJvbSAnLi9FeHRlbnNpb25Xb3JrYm9va0ltcGwnO1xuaW1wb3J0IHsgTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIH0gZnJvbSAnLi9MZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXInO1xuaW1wb3J0IHsgU2V0dGluZ3NJbXBsIH0gZnJvbSAnLi9TZXR0aW5nc0ltcGwnO1xuaW1wb3J0IHtcbiAgU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlcyxcbiAgVGFibGVhdUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVCb2xkRm9udEZhbWlseU5hbWUsXG4gIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVMaWdodEZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhbWlseU5hbWUsXG4gIFRhYmxlYXVSZWd1bGFyRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLFxufSBmcm9tICcuL1RhYmxlYXVCb29rRm9udE5hbWVDb25zdGFudHMnO1xuaW1wb3J0IHsgVUlJbXBsIH0gZnJvbSAnLi9VSUltcGwnO1xuXG5leHBvcnQgdHlwZSBDYWxsYmFja01hcCA9IHsgW2tleTogc3RyaW5nXTogKCkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbnNJbXBsIHtcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6YXRpb25Qcm9taXNlOiBQcm9taXNlPHN0cmluZz47XG4gIHByaXZhdGUgX3N0eWxlRWxlbWVudDogSFRNTFN0eWxlRWxlbWVudDtcbiAgcHVibGljIGRhc2hib2FyZENvbnRlbnQ/OiBEYXNoYm9hcmRDb250ZW50O1xuICBwdWJsaWMgd29ya3NoZWV0Q29udGVudD86IFdvcmtzaGVldENvbnRlbnQ7XG4gIHB1YmxpYyBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XG4gIHB1YmxpYyBzZXR0aW5nczogU2V0dGluZ3M7XG4gIHB1YmxpYyB1aTogVUk7XG4gIHB1YmxpYyB3b3JrYm9vazogV29ya2Jvb2s7XG4gIHB1YmxpYyBleHRlbnNpb25ab25lSWQ6IG51bWJlcjtcblxuICBwdWJsaWMgaW5pdGlhbGl6ZUFzeW5jKGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuLCBjb250ZXh0TWVudUNhbGxiYWNrcz86IENhbGxiYWNrTWFwKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZSkge1xuICAgICAgdGhpcy5faW5pdGlhbGl6YXRpb25Qcm9taXNlID0gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluaXRPcHRpb25zOiBJbml0aWFsaXphdGlvbk9wdGlvbnMgPSB7IGlzQWxwaGE6IEFwaVZlcnNpb24uSW5zdGFuY2UuaXNBbHBoYSB9O1xuICAgICAgICAvLyBGaXJzdCB0aGluZyB3ZSB3YW50IHRvIGRvIGlzIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIGRlc2t0b3AgZGlzcGF0Y2hlciBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHVzXG4gICAgICAgIGlmIChMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIuaGFzRGVza3RvcEFwaURpc3BhdGNoZXJQcm9taXNlKGluaXRPcHRpb25zKSkge1xuICAgICAgICAgIC8vIFJ1bm5pbmcgaW4gYSBwcmUtMjAxOS4zIGRlc2t0b3AsIHVzZSBvdXIgbGVnYWN5IGRpc3BhdGNoZXIgcHJvbWlzZVxuICAgICAgICAgIGNvbnN0IGRlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZSA9IExlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlci5nZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2UoaW5pdE9wdGlvbnMpO1xuICAgICAgICAgIGRlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZVxuICAgICAgICAgICAgPy50aGVuKChkaXNwYXRjaGVyRmFjdG9yeSkgPT4gdGhpcy5vbkRpc3BhdGNoZXJSZWNlaXZlZChkaXNwYXRjaGVyRmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKSlcbiAgICAgICAgICAgIC50aGVuKChvcGVuUGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKG9wZW5QYXlsb2FkKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXZSBtdXN0IGJlIHJ1bm5pbmcgaW4gc2VydmVyLCBzbyB3ZSBzaG91bGQgdHJ5IHRvIGtpY2sgb2YgdGhlIHNlcnZlciBkaXNwYXRjaGVyIGJvb3RzdHJhcHBpbmdcbiAgICAgICAgICBjb25zdCBvbkRpc3BhdGNoZXJSZWNlaXZlZENhbGxiYWNrID0gdGhpcy5vbkRpc3BhdGNoZXJSZWNlaXZlZC5iaW5kKHRoaXMpO1xuICAgICAgICAgIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcCh3aW5kb3csIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIGluaXRPcHRpb25zKVxuICAgICAgICAgICAgLnRoZW4oKGZhY3Rvcnk6IEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9uRGlzcGF0Y2hlclJlY2VpdmVkQ2FsbGJhY2soZmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigob3BlblBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShvcGVuUGF5bG9hZCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgdml6U2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Vml6U2VydmljZT4oU2VydmljZU5hbWVzLlZpeik7XG5cbiAgICByZXR1cm4gdml6U2VydmljZS5jcmVhdGVWaXpJbWFnZUFzeW5jKGlucHV0U3BlYyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVpU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VUlTZXJ2aWNlPihFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZSk7XG5cbiAgICByZXR1cm4gdWlTZXJ2aWNlLnNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQsIHRoaXMuZXh0ZW5zaW9uWm9uZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yKGxvY2F0b3I6IEV4dGVuc2lvbkxvY2F0b3IpOiBsb2NhdG9yIGlzIERhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3Ige1xuICAgIGNvbnN0IGRhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3IgPSBsb2NhdG9yIGFzIERhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3I7XG4gICAgaWYgKCFkYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yLmRhc2hib2FyZFBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgaW5pdGlhbGl6YXRpb24uJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRpc3BhdGNoZXJSZWNlaXZlZChcbiAgICBkaXNwYXRjaGVyRmFjdG9yeTogSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSxcbiAgICBpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbixcbiAgICBjb250ZXh0TWVudUZ1bmN0aW9ucz86IENhbGxiYWNrTWFwLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIgPSBkaXNwYXRjaGVyRmFjdG9yeShJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OKTtcblxuICAgIC8vIENhbGwgdG8gcmVnaXN0ZXIgYWxsIHRoZSBzZXJ2aWNlcyB3aGljaCB3aWxsIHVzZSB0aGUgbmV3bHkgaW5pdGlhbGl6ZWQgZGlzcGF0Y2hlclxuICAgIHJlZ2lzdGVySW5pdGlhbGl6YXRpb25FeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcik7XG5cbiAgICAvLyBHZXQgdGhlIGluaXRpYWxpemF0aW9uIHNlcnZpY2UgYW5kIGluaXRpYWxpemUgdGhpcyBleHRlbnNpb25cbiAgICBjb25zdCBpbml0aWFsaXphdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEluaXRpYWxpemF0aW9uU2VydmljZT4oXG4gICAgICBFeHRlbnNpb25zU2VydmljZU5hbWVzLkluaXRpYWxpemF0aW9uU2VydmljZSxcbiAgICApO1xuXG4gICAgY29uc3QgY2FsbGJhY2tNYXBLZXlzID0gY29udGV4dE1lbnVGdW5jdGlvbnMgPyBPYmplY3Qua2V5cyhjb250ZXh0TWVudUZ1bmN0aW9ucykgOiBbXTtcbiAgICByZXR1cm4gaW5pdGlhbGl6YXRpb25TZXJ2aWNlLmluaXRpYWxpemVEYXNoYm9hcmRFeHRlbnNpb25zQXN5bmMoaXNFeHRlbnNpb25EaWFsb2csIGNhbGxiYWNrTWFwS2V5cykudGhlbjxzdHJpbmc+KChyZXN1bHQpID0+IHtcbiAgICAgIC8vIElmIHdlIHJlY2VpdmUgYW4gaW52YWxpZCBwbGFmb3JtIHZlcnNpb24sIHRoaXMgbWVhbnMgdGhhdCBwbGF0Zm9ybSBpcyBydW5ubmluZyAxLjQgb3IgMi4xIGFuZFxuICAgICAgLy8gZG9lc24ndCBwYXNzIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIHRvIGV4dGVybmFsLiBJbiB0aGlzIGNhc2Ugd2UgYXNzdW1lIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIHRvIGJlIDEuOVxuICAgICAgY29uc3QgcGxhdGZvcm1WZXJzaW9uID0gcmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50LnBsYXRmb3JtVmVyc2lvblxuICAgICAgICA/IHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC5wbGF0Zm9ybVZlcnNpb25cbiAgICAgICAgOiB7IG1ham9yOiAxLCBtaW5vcjogOSwgZml4OiAwIH07XG5cbiAgICAgIC8vIFdyYXAgb3VyIGV4aXN0aW5nIGRpc3BhdGNoZXIgaW4gYSBkaXNwYXRjaGVyIHRoYXQgY2FuIGRvd25ncmFkZS91cGdyYWRlIGZvciBhbiBvbGRlciBwbGF0Zm9ybS5cbiAgICAgIGlmIChWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIubmVlZHNWZXJzaW9uQ29udmVydGVyKHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICAgICAgZGlzcGF0Y2hlciA9IG5ldyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIoZGlzcGF0Y2hlciwgcGxhdGZvcm1WZXJzaW9uKTtcbiAgICAgIH1cbiAgICAgIC8vIFJlZ2lzdHJhdGlvbiBvZiBzZXJ2aWNlcyBtdXN0IGhhcHBlbiBiZWZvcmUgaW5pdGlhbGl6aW5nIGNvbnRlbnQgYW5kIGVudmlyb25tZW50XG4gICAgICAvLyBFeHRlbnNpb25zIGRvZXNuJ3QgbmVlZCB0byBwYXNzIGluIGEgcmVnaXN0cnlJZC4gQnkgZGVmYXVsdCwgdGhlIHNlcnZpY2UgcmVnaXN0cnkgaW5zdGFuY2UgaXMgYXNzb2NpYXRlZCB3aXRoIHJlZ2lzdHJ5SWQ9MC5cbiAgICAgIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMoZGlzcGF0Y2hlciwgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpO1xuICAgICAgcmVnaXN0ZXJBbGxFeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcik7XG5cbiAgICAgIGlmIChyZXN1bHQuZXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyAmJiB0aGlzLmlzRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvcihyZXN1bHQuZXh0ZW5zaW9uSW5zdGFuY2UubG9jYXRvcikpIHtcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRDb250ZW50ID0gdGhpcy5pbml0aWFsaXplRGFzaGJvYXJkQ29udGVudChcbiAgICAgICAgICByZXN1bHQuZXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyxcbiAgICAgICAgICByZXN1bHQuZXh0ZW5zaW9uSW5zdGFuY2UubG9jYXRvci5kYXNoYm9hcmRQYXRoLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmV4dGVuc2lvblpvbmVJZCA9IHJlc3VsdC5leHRlbnNpb25EYXNoYm9hcmRJbmZvLmV4dGVuc2lvblpvbmVJZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC5leHRlbnNpb25Xb3Jrc2hlZXRJbmZvKSB7XG4gICAgICAgIHRoaXMud29ya3NoZWV0Q29udGVudCA9IHRoaXMuaW5pdGlhbGl6ZVdvcmtzaGVldENvbnRlbnQocmVzdWx0LmV4dGVuc2lvbldvcmtzaGVldEluZm8pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVudmlyb25tZW50ID0gbmV3IEVudmlyb25tZW50KHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudCk7XG4gICAgICB0aGlzLnNldHRpbmdzID0gdGhpcy5pbml0aWFsaXplU2V0dGluZ3MocmVzdWx0LmV4dGVuc2lvblNldHRpbmdzSW5mbyk7XG4gICAgICB0aGlzLnVpID0gbmV3IFVJKG5ldyBVSUltcGwoKSk7XG4gICAgICB0aGlzLndvcmtib29rID0gbmV3IFdvcmtib29rKG5ldyBFeHRlbnNpb25Xb3JrYm9va0ltcGwoKSk7XG5cbiAgICAgIGlmIChyZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tGb3JtYXR0aW5nKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRhYmxlYXVGb250cyhkaXNwYXRjaGVyLCByZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tGb3JtYXR0aW5nKTtcbiAgICAgICAgdGhpcy5hcHBseUFsbEZvcm1hdHRpbmcocmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50Lndvcmtib29rRm9ybWF0dGluZyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFmdGVyIGluaXRpYWxpemF0aW9uIGhhcyBjb21wbGV0ZWQsIHNldHVwIGxpc3RlbmVycyBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyB0aGF0XG4gICAgICAvLyBhcmUgbWVhbnQgdG8gYmUgdHJpZ2dlcmVkIHdoZW5ldmVyIGEgY29udGV4dCBtZW51IGl0ZW0gaXMgY2xpY2tlZC5cbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvbnRleHRNZW51Q2FsbGJhY2tzKGNvbnRleHRNZW51RnVuY3Rpb25zKTtcblxuICAgICAgLy8gQWxzbyBzZXQgdXAgbGlzdGVuZXJzIGZvciBFeHRlbnNpb25TdHlsZXNDaGFuZ2VkRXZlbnRcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudENhbGxiYWNrKGRpc3BhdGNoZXIpO1xuXG4gICAgICAvLyBJbiB0aGUgbm9ybWFsIGluaXRpYWxpemF0aW9uIGNhc2UsIHRoaXMgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuICBXaGVuIHJldHVybmluZyBmcm9tIGluaXRpYWxpemVBc3luYyB0byB0aGVcbiAgICAgIC8vIGRldmVsb3Blciwgd2UganVzdCBpbmdvcmUgdGhhdCBzdHJpbmcuICBJbiB0aGUgY2FzZSBvZiBpbml0aWFsaXppbmcgZnJvbSBhbiBleHRlbnNpb24gZGlhbG9nLCB0aGlzIHN0cmluZ1xuICAgICAgLy8gaXMgYW4gb3B0aW9uYWwgcGF5bG9hZCBzZW50IGZyb20gdGhlIHBhcmVudCBleHRlbnNpb24uXG4gICAgICByZXR1cm4gcmVzdWx0LmV4dGVuc2lvbkRpYWxvZ1BheWxvYWQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlBbGxGb3JtYXR0aW5nKGZvcm1hdHRpbmdNb2RlbDogV29ya2Jvb2tGb3JtYXR0aW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHlsZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX3N0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICB0aGlzLl9zdHlsZUVsZW1lbnQuaWQgPSAnVGFibGVhdS1FeHRlbnNpb24tRm9ybWF0dGluZyc7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRoaXMuX3N0eWxlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9zdHlsZUVsZW1lbnQuc2hlZXQgfHwgIWZvcm1hdHRpbmdNb2RlbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0eWxlc2hlZXQ6IENTU1N0eWxlU2hlZXQgPSB0aGlzLl9zdHlsZUVsZW1lbnQuc2hlZXQgYXMgQ1NTU3R5bGVTaGVldDtcbiAgICB3aGlsZSAoc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBzdHlsZXNoZWV0LmRlbGV0ZVJ1bGUoc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgZm9ybWF0dGluZ01vZGVsLmZvcm1hdHRpbmdTaGVldHMubWFwKChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0KSA9PiB7XG4gICAgICB0aGlzLmFwcGx5Rm9ybWF0dGluZ1NoZWV0VG9TdHlsZVNoZWV0KGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQsIHN0eWxlc2hlZXQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUZvcm1hdHRpbmdTaGVldFRvU3R5bGVTaGVldChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0OiBGb3JtYXR0aW5nU2hlZXQsIHN0eWxlc2hlZXQ6IENTU1N0eWxlU2hlZXQpOiB2b2lkIHtcbiAgICBsZXQgc3R5bGVJbmZvID0gJyc7XG5cbiAgICBjb25zdCBjc3NQcm9wZXJ0aWVzID0gY3VycmVudEZvcm1hdHRpbmdTaGVldC5jc3NQcm9wZXJ0aWVzO1xuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmZvbnRGYW1pbHkpIHtcbiAgICAgIHN0eWxlSW5mbyArPSAnZm9udC1mYW1pbHk6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRGYW1pbHkudG9TdHJpbmcoKSArICc7ICc7XG4gICAgfVxuXG4gICAgaWYgKGNzc1Byb3BlcnRpZXMuZm9udFNpemUpIHtcbiAgICAgIHN0eWxlSW5mbyArPSAnZm9udC1zaXplOiAnICsgY3NzUHJvcGVydGllcy5mb250U2l6ZS50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy5mb250V2VpZ2h0KSB7XG4gICAgICBzdHlsZUluZm8gKz0gJ2ZvbnQtd2VpZ2h0OiAnICsgY3NzUHJvcGVydGllcy5mb250V2VpZ2h0LnRvU3RyaW5nKCkgKyAnOyAnO1xuICAgIH1cblxuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmZvbnRTdHlsZSkge1xuICAgICAgc3R5bGVJbmZvICs9ICdmb250LXN0eWxlOiAnICsgY3NzUHJvcGVydGllcy5mb250U3R5bGUudG9TdHJpbmcoKSArICc7ICc7XG4gICAgfVxuXG4gICAgaWYgKGNzc1Byb3BlcnRpZXMudGV4dERlY29yYXRpb24pIHtcbiAgICAgIHN0eWxlSW5mbyArPSAndGV4dC1kZWNvcmF0aW9uOiAnICsgY3NzUHJvcGVydGllcy50ZXh0RGVjb3JhdGlvbi50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy5jb2xvcikge1xuICAgICAgc3R5bGVJbmZvICs9ICdjb2xvcjogJyArIGNzc1Byb3BlcnRpZXMuY29sb3IgKyAnOyAnO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdG9yOiBzdHJpbmcgPSAnLicgKyBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNsYXNzTmFtZUtleTtcbiAgICBjb25zdCBydWxlOiBzdHJpbmcgPSBzZWxlY3RvciArICcgeyAnICsgc3R5bGVJbmZvICsgJyB9JztcbiAgICBzdHlsZXNoZWV0Lmluc2VydFJ1bGUocnVsZSwgc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50Q2FsbGJhY2soZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyKTogdm9pZCB7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oXG4gICAgICBTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uLFxuICAgICk7XG4gICAgLy8gVW5yZWdpc3RlciBmdW5jdGlvbiBub3QgdXNlZCBzaW5jZSB0aGVzZSBub3RpZmljYXRpb25zIHNob3VsZCBiZVxuICAgIC8vIG9ic2VydmVkIGZvciB0aGUgZnVsbCBsaWZldGltZSBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCxcbiAgICAgICgpID0+IHRydWUsXG4gICAgICAoZXZlbnRGb3JtYXR0aW5nOiBXb3JrYm9va0Zvcm1hdHRpbmcpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50Rm9ybWF0dGluZykge1xuICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRhYmxlYXVGb250cyhkaXNwYXRjaGVyLCBldmVudEZvcm1hdHRpbmcpO1xuICAgICAgICAgIHRoaXMuYXBwbHlBbGxGb3JtYXR0aW5nKGV2ZW50Rm9ybWF0dGluZyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVRhYmxlYXVGb250cyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIHdvcmtib29rRm9ybWF0dGluZzogV29ya2Jvb2tGb3JtYXR0aW5nKTogdm9pZCB7XG4gICAgY29uc3QgZm9udE5hbWVzOiBNb2RlbFtdID0gWy4uLlN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXMsIC4uLlN1cHBvcnRlZFRhYmxlYXVGb250RmFjZXNdO1xuICAgIHdvcmtib29rRm9ybWF0dGluZy5mb3JtYXR0aW5nU2hlZXRzLmZvckVhY2goKGZvcm1hdHRpbmdTaGVldCkgPT4ge1xuICAgICAgaWYgKGZvcm1hdHRpbmdTaGVldC5jc3NQcm9wZXJ0aWVzLmZvbnRGYW1pbHkpIHtcbiAgICAgICAgZm9udE5hbWVzLnB1c2goZm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZm9udE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0geyBbUGFyYW1ldGVySWQuRm9udE5hbWVMaXN0SXRlbXNdOiBmb250TmFtZXMgfTtcbiAgICAgIGRpc3BhdGNoZXJcbiAgICAgICAgLmV4ZWN1dGUoVmVyYklkLkdldEZvbnRzLCBwYXJhbWV0ZXJzKVxuICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRGb250cyhyZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8Rm9udE5hbWVBbmRJbmZvPik7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZEZvbnRzKGZvbnRzOiBBcnJheTxGb250TmFtZUFuZEluZm8+KTogdm9pZCB7XG4gICAgZm9udHMuZm9yRWFjaCgoZm9udE5hbWVBbmRJbmZvKSA9PiB7XG4gICAgICBpZiAoU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlcy5pbmNsdWRlcyhmb250TmFtZUFuZEluZm8uZm9udE5hbWUpKSB7XG4gICAgICAgIHRoaXMubG9hZFRhYmxlYXVGb250cyhmb250TmFtZUFuZEluZm8pO1xuICAgICAgfSBlbHNlIGlmIChTdXBwb3J0ZWRCZW50b25TYW5zRm9udEZhY2VzLmluY2x1ZGVzKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSkpIHtcbiAgICAgICAgdGhpcy5sb2FkQmVudG9uU2Fuc0ZvbnRzKGZvbnROYW1lQW5kSW5mbyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVEYXNoYm9hcmRDb250ZW50KGluZm86IEV4dGVuc2lvbkRhc2hib2FyZEluZm8sIHNoZWV0UGF0aDogU2hlZXRQYXRoKTogRGFzaGJvYXJkQ29udGVudCB7XG4gICAgLy8gc2hlZXRzIGFyZSBhbHdheXMgYWN0aXZlIGZvciBFeHRlbnNpb25zXG4gICAgY29uc3Qgc2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKGluZm8ubmFtZSwgU2hlZXRUeXBlLkRhc2hib2FyZCwgeyB3aWR0aDogaW5mby5zaXplLncsIGhlaWdodDogaW5mby5zaXplLmggfSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICBjb25zdCBkYXNoYm9hcmRJbXBsID0gbmV3IERhc2hib2FyZEltcGwoc2hlZXRJbmZvSW1wbCwgaW5mby56b25lcywgc2hlZXRQYXRoLCBFeHRlbnNpb25zUmVnaXN0cnlJZCwgbnVsbCwgaW5mby5hY3RpdmVEYXNoYm9hcmRPYmplY3RJZCk7XG4gICAgY29uc3QgZGFzaGJvYXJkID0gbmV3IERhc2hib2FyZChkYXNoYm9hcmRJbXBsKTtcbiAgICByZXR1cm4gbmV3IERhc2hib2FyZENvbnRlbnQoZGFzaGJvYXJkKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVdvcmtzaGVldENvbnRlbnQoaW5mbzogRXh0ZW5zaW9uV29ya3NoZWV0SW5mbyk6IFdvcmtzaGVldENvbnRlbnQge1xuICAgIGNvbnN0IHNoZWV0SW5mb0ltcGwgPSBuZXcgU2hlZXRJbmZvSW1wbChcbiAgICAgIGluZm8udmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgU2hlZXRUeXBlLldvcmtzaGVldCxcbiAgICAgIHsgd2lkdGg6IGluZm8uc2l6ZS53LCBoZWlnaHQ6IGluZm8uc2l6ZS5oIH0sXG4gICAgICB1bmRlZmluZWQsIC8vIGluZGV4IHByb3BlcnR5IGlzIGVtYmVkZGluZyBzcGVjaWZpY1xuICAgICAgdHJ1ZSwgLy8gc2hlZXRzIGFyZSBhbHdheXMgYWN0aXZlIGZvciBFeHRlbnNpb25zXG4gICAgKTtcblxuICAgIGNvbnN0IHdvcmtzaGVldEltcGwgPSBuZXcgV29ya3NoZWV0SW1wbChcbiAgICAgIHNoZWV0SW5mb0ltcGwsXG4gICAgICBFeHRlbnNpb25zUmVnaXN0cnlJZCxcbiAgICAgIGluZm8udmlzdWFsSWQsXG4gICAgICBudWxsLCAvLyBwYXJlbnREYXNoYm9hcmQgaXMgYWx3YXlzIG51bGwgZm9yIHdvcmtzaGVldCBpbiBXb3Jrc2hlZXRDb250ZW50XG4gICAgICBudWxsLCAvLyBwYXJlbnRTdG9yeVBvaW50IGlzIG9ubHkgdXNlZCBmb3IgZW1iZWRkaW5nXG4gICAgICBpbmZvLmJhY2tncm91bmRDb2xvcixcbiAgICAgIFdvcmtib29rRm9ybWF0dGluZ0VudlV0aWwuY29udmVydFRvV29ya2Jvb2tGb3JtYXR0aW5nKGluZm8uZm9ybWF0dGluZyksXG4gICAgKTtcbiAgICBjb25zdCB3b3Jrc2hlZXQgPSBuZXcgV29ya3NoZWV0KHdvcmtzaGVldEltcGwpO1xuICAgIHJldHVybiBuZXcgV29ya3NoZWV0Q29udGVudCh3b3Jrc2hlZXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU2V0dGluZ3Moc2V0dGluZ3NJbmZvOiBFeHRlbnNpb25TZXR0aW5nc0luZm8pOiBTZXR0aW5ncyB7XG4gICAgY29uc3Qgc2V0dGluZ3NJbXBsID0gbmV3IFNldHRpbmdzSW1wbChzZXR0aW5nc0luZm8pO1xuICAgIHJldHVybiBuZXcgU2V0dGluZ3Moc2V0dGluZ3NJbXBsKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbnRleHRNZW51Q2FsbGJhY2tzKGNvbnRleHRNZW51RnVuY3Rpb25zPzogQ2FsbGJhY2tNYXApOiB2b2lkIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24sXG4gICAgKTtcblxuICAgIC8vIFVucmVnaXN0ZXIgZnVuY3Rpb24gbm90IHVzZWQgc2luY2UgdGhlc2Ugbm90aWZpY2F0aW9ucyBzaG91bGQgYmVcbiAgICAvLyBvYnNlcnZlZCBmb3IgdGhlIGZ1bGwgbGlmZXRpbWUgb2YgdGhlIGV4dGVuc2lvbi5cbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkNvbnRleHRNZW51Q2xpY2ssXG4gICAgICAoKSA9PiB7XG4gICAgICAgIC8vIExldCB0aHJvdWdoIGFueSBjb250ZXh0IG1lbnUgZXZlbnQsIHRoZXNlIGFyZSBhbHJlYWR5IGZpbHRlcmVkIG9uIGFwaS1jb3JlXG4gICAgICAgIC8vIGJhc2VkIG9uIHRoZSBleHRlbnNpb24gbG9jYXRvci5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgICAgKGV2ZW50OiBDb250ZXh0TWVudUV2ZW50KSA9PiB7XG4gICAgICAgIC8vIEV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQgbWVudSBJRFxuICAgICAgICBpZiAoY29udGV4dE1lbnVGdW5jdGlvbnMpIHtcbiAgICAgICAgICBpZiAoIWNvbnRleHRNZW51RnVuY3Rpb25zW2V2ZW50LmlkXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBSZWNlaXZlZCB1bmV4cGVjdGVkIGNvbnRleHQgbWVudSBJZCBmcm9tIGV2ZW50OiAke2V2ZW50LmlkfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHRNZW51RnVuY3Rpb25zW2V2ZW50LmlkXSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRUYWJsZWF1Rm9udHMoZm9udE5hbWVBbmRJbmZvOiBGb250TmFtZUFuZEluZm8pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSkge1xuICAgICAgY2FzZSBUYWJsZWF1Qm9va0ZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdUxpZ2h0Rm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVMaWdodEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdVJlZ3VsYXJGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoVGFibGVhdVJlZ3VsYXJGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdVNlbWlCb2xkRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVSZWd1bGFyRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdUJvbGRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUJvbGRGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUJvbGRGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVNZWRpdW1Gb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdU1lZGl1bUZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShUYWJsZWF1TWVkaXVtRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUxpZ2h0Rm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYCdhdHRlbXB0ZWQgdG8gbG9hZCB1bnN1cHBvcnRlZCBmb250OiAke2ZvbnROYW1lQW5kSW5mby5mb250TmFtZX0uJ2ApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZEJlbnRvblNhbnNGb250cyhmb250TmFtZUFuZEluZm86IEZvbnROYW1lQW5kSW5mbyk6IHZvaWQge1xuICAgIHN3aXRjaCAoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lKSB7XG4gICAgICBjYXNlIEJlbnRvblNhbnNCb29rRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKEJlbnRvblNhbnNGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnMTAwJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zTGlnaHRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnMTAwJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQmVudG9uU2Fuc01lZGl1bUZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyBzdHlsZTogJ2l0YWxpYycgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgc3R5bGU6ICdpdGFsaWMnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJ2F0dGVtcHRlZCB0byBsb2FkIHVuc3VwcG9ydGVkIGZvbnQ6ICR7Zm9udE5hbWVBbmRJbmZvLmZvbnROYW1lfS4nYCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBJbml0aWFsaXphdGlvbk9wdGlvbnMsIEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnksIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIGhhcyBiZWVuIG1vdmVkIChhbmQgcmVuYW1lZCkgZnJvbSBhcGktaW50ZXJuYWwtY29udHJhY3QuXG4gKiBJdCBzdXBwb3J0cyBydW5uaW5nIGEgbmV3ZXIgZXh0ZXJuYWwgbGlicmFyeSBhZ2FpbnN0IGEgcHJlIDIwMTkuMyBkZXNrdG9wLlxuICogU3RhcnRpbmcgaW4gMjAxOS4zLCB3ZSBoYXZlIGEgbWVyZ2VkIGJvb3RzdHJhcCBzdHlsZSBmb3IgYm90aCBkZXNrdG9wIGFuZCBzZXJ2ZXIuXG4gKiBJbiBhZGRpdGlvbiwgdGhlIGFscGhhIGNoZWNraW5nIHRoYXQgaXMgaGFwcGVuaW5nIGhlcmUgaXMgbm90IG5lY2Vzc2FyeSBpbiBleHRlcm5hbC1hcGktanNcbiAqICBhZnRlciAyMDE5LjMgYmVjYXVzZSB0aGF0IGNoZWNraW5nIGhhcHBlbnMgaW4gYXBpLXBsYXRmb3JtLWpzIChBcGlEaXNwYXRjaGVyVGVzdC50cylcbiAqIFRGU0lEOiAxMDkxNTYxIHRyYWNrcyBhbiBpbXByb3ZlbWVudCB0byB0aGlzIHN5c3RlbSB0byBtYWtlIGl0IGxlc3MgY29tcGxleCBhbmQgdGllIGl0IGRpcmVjdGx5IHRvXG4gKiAgdGFibGVhdSBiZXRhIHJlbGVhc2UgdmVyc2lvbnMuXG4gKiBAZGVwcmVjYXRlZFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZVxuZXhwb3J0IG5hbWVzcGFjZSBMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIge1xuICAvKipcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2Uob3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucyk6IFByb21pc2U8SW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeT4gfCB1bmRlZmluZWQge1xuICAgIGlmICgoIW9wdGlvbnMgfHwgdHlwZW9mIG9wdGlvbnMuaXNBbHBoYSA9PT0gJ3VuZGVmaW5lZCcpICYmICF3aW5kb3cuX193YXJuaW5nSXNzdWVkKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKCdUaGlzIGlzIGEgYmV0YSB2ZXJzaW9uIG9mIHRoZSBFeHRlbnNpb25zIEFQSS4gUGxlYXNlIHVwZ3JhZGUgdG8gYW4gb2ZmaWNpYWwgcmVsZWFzZS4nKTtcbiAgICAgIHdpbmRvdy5fX3dhcm5pbmdJc3N1ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uaXNBbHBoYSAmJiB3aW5kb3cuX19wbGF0Zm9ybUlzT2ZmaWNpYWxSZWxlYXNlKSB7XG4gICAgICB3aW5kb3cuX190YWJsZWF1RGVza3RvcERpc3BhdGNoZXJcbiAgICAgICAgLnRoZW4oKGRpc3BhdGNoZXJGYWN0b3J5KSA9PiB7XG4gICAgICAgICAgY29uc3QgZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXJGYWN0b3J5KElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04pO1xuICAgICAgICAgIGRpc3BhdGNoZXIuZXhlY3V0ZShWZXJiSWQuQmxvY2tFeHRlbnNpb24sIHt9KS5jYXRjaCgpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIHdpbGwgYmUgdW5kZWZpbmVkIGlmIHByb21pc2UgaXMgcmVqZWN0ZWQgb3IgdGhyb3dzXG4gICAgcmV0dXJuIHdpbmRvdy5fX3RhYmxlYXVEZXNrdG9wRGlzcGF0Y2hlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGhhc0Rlc2t0b3BBcGlEaXNwYXRjaGVyUHJvbWlzZShvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhZ2V0RGVza3RvcERpc3BhdGNoZXJQcm9taXNlKG9wdGlvbnMpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgX190YWJsZWF1RGVza3RvcERpc3BhdGNoZXI6IFByb21pc2U8SW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeT47XG4gICAgX19wbGF0Zm9ybUlzT2ZmaWNpYWxSZWxlYXNlOiBib29sZWFuO1xuICAgIF9fd2FybmluZ0lzc3VlZDogYm9vbGVhbjtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVuc2lvblNldHRpbmdzSW5mbywgTm90aWZpY2F0aW9uSWQsIFNldHRpbmdzRXZlbnQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBFcnJvckhlbHBlcnMsXG4gIE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gIFNlcnZpY2VOYW1lcyxcbiAgU2luZ2xlRXZlbnRNYW5hZ2VyLFxuICBTaW5nbGVFdmVudE1hbmFnZXJJbXBsLFxuICBUYWJsZWF1RXJyb3IsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL1RhYmxlYXVFdmVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuaW1wb3J0IHsgU2V0dGluZ3NDb2xsZWN0aW9uLCBTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXR0aW5nc1NlcnZpY2UnO1xuXG5jbGFzcyBTZXR0aW5nc0NoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlNldHRpbmdzQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX25ld1NldHRpbmdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5TZXR0aW5nc0NoYW5nZWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBuZXdTZXR0aW5ncygpOiBTZXR0aW5nc0NvbGxlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9uZXdTZXR0aW5ncztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NJbXBsIHtcbiAgcHJpdmF0ZSBzdGF0aWMgQVNZTkNfU0FWRV9JTl9QUk9HUkVTUyA9ICdBc3luYyBTYXZlIGlzIGluIHByb2dyZXNzLCB1cGRhdGluZyBzZXR0aW5ncyBpcyBub3QgYWxsb3dlZC4nO1xuICBwcml2YXRlIF9pc01vZGlmaWVkOiBib29sZWFuO1xuICBwcml2YXRlIF9jdXJyZW50U2V0dGluZ3M6IFNldHRpbmdzQ29sbGVjdGlvbjtcblxuICAvLyBTaW5jZSBwcm9taXNlcyBjYW4ndCBiZSBpbnRyb3NwZWN0ZWQgZm9yIHN0YXRlLCBrZWVwIGEgdmFyaWFibGUgdGhhdFxuICAvLyBpbmRpY2F0ZXMgYSBzYXZlIGlzIGluIHByb2dyZXNzLCBzbyB0aGF0IHNldC9lcmFzZSBjYW4ndCBiZSBjYWxsZWQgZHVyaW5nIGEgc2F2ZS5cbiAgcHJpdmF0ZSBfc2F2ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc2V0dGluZ3NJbmZvOiBFeHRlbnNpb25TZXR0aW5nc0luZm8pIHtcbiAgICB0aGlzLmluaXRpYWxpemVTZXR0aW5ncyhzZXR0aW5nc0luZm8pO1xuICB9XG5cbiAgcHVibGljIGVyYXNlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihrZXksICdrZXknKTtcblxuICAgIC8vIE9ubHkgbWFrZSBhIG1vZGlmaWNhdGlvbiBpZiB3ZSBoYXZlIHRoZSBrZXkgYWxyZWFkeVxuICAgIGlmICh0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XSkge1xuICAgICAgdGhpcy52ZXJpZnlTZXR0aW5nc0FyZVVubG9ja2VkKCk7XG5cbiAgICAgIGRlbGV0ZSB0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XTtcbiAgICAgIHRoaXMuX2lzTW9kaWZpZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoa2V5LCAna2V5Jyk7XG5cbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFNldHRpbmdzW2tleV07XG4gIH1cblxuICBwdWJsaWMgZ2V0QWxsKCk6IFNldHRpbmdzQ29sbGVjdGlvbiB7XG4gICAgLy8gUmV0dXJucyBhIG11dGFibGUgY29weSBvZiB0aGUgc2V0dGluZ3NcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fY3VycmVudFNldHRpbmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNNb2RpZmllZDtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlQXN5bmMoKTogUHJvbWlzZTxTZXR0aW5nc0NvbGxlY3Rpb24+IHtcbiAgICB0aGlzLnZlcmlmeVNldHRpbmdzQXJlVW5sb2NrZWQoKTtcblxuICAgIC8vIEp1c3QgcmVzb2x2ZSBpbW1lZGlhdGVseSBpZiBzZXR0aW5ncyBhcmUgdW5jaGFuZ2VkXG4gICAgaWYgKCF0aGlzLl9pc01vZGlmaWVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlPFNldHRpbmdzQ29sbGVjdGlvbj4odGhpcy5fY3VycmVudFNldHRpbmdzKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zYXZlSW5Qcm9ncmVzcyA9IHRydWU7XG5cbiAgICAvLyBVc2UgdGhlIHNldHRpbmdzIHNlcnZpY2UgdG8gc2F2ZSBzZXR0aW5ncyB0byB0d2JcbiAgICBjb25zdCBzZXR0aW5nc1NlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNldHRpbmdzU2VydmljZT4oXG4gICAgICBFeHRlbnNpb25zU2VydmljZU5hbWVzLlNldHRpbmdzU2VydmljZSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHNldHRpbmdzU2VydmljZS5zYXZlU2V0dGluZ3NBc3luYyh0aGlzLl9jdXJyZW50U2V0dGluZ3MpLnRoZW48U2V0dGluZ3NDb2xsZWN0aW9uPihcbiAgICAgIChuZXdTZXR0aW5ncykgPT4ge1xuICAgICAgICB0aGlzLl9zYXZlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc01vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50U2V0dGluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9IG5ld1NldHRpbmdzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fY3VycmVudFNldHRpbmdzLCBuZXdTZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld1NldHRpbmdzO1xuICAgICAgfSxcbiAgICAgIChyZWFzb24pID0+IHtcbiAgICAgICAgdGhpcy5fc2F2ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVN0cmluZ1BhcmFtZXRlcihrZXksICdrZXknKTsgLy8gS2V5IHNob3VsZG4ndCBiZSBhbiBlbXB0eSBzdHJpbmcuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcih2YWx1ZSwgJ3ZhbHVlJyk7IC8vIEVtcHR5IHN0cmluZyB2YWx1ZSBpcyBhbGxvd2VkLlxuICAgIHRoaXMudmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpO1xuXG4gICAgdGhpcy5fY3VycmVudFNldHRpbmdzW2tleV0gPSB2YWx1ZTtcbiAgICB0aGlzLl9pc01vZGlmaWVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhbGwgZXZlbnRzIHJlbGV2YW50IHRvIHNldHRpbmdzIG9iamVjdC4gIFRoaXMgaXMgb25seSBhIHNldHRpbmdzVXBkYXRlIGV2ZW50IGN1cnJlbnRseS5cbiAgICpcbiAgICogQHJldHVybnMge0FycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj59IENvbGxlY3Rpb24gb2YgZXZlbnQgbWFuYWdlcnMgdG8gcGFzcyB0byBhbiBFdmVudExpc3RlbmVyTWFuYWdlci5cbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuICAgIGxldCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBzZXJ2aWNlIHJlZ2lzdGVyZWQsIGp1c3QgcmV0dXJuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5nc0NoYW5nZWRFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPFNldHRpbmdzQ2hhbmdlZEV2ZW50PihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLlNldHRpbmdzQ2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5TZXR0aW5nc0NoYW5nZWQsXG4gICAgICAoKSA9PiB0cnVlLFxuICAgICAgKGV2ZW50OiBTZXR0aW5nc0V2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9IGV2ZW50Lm5ld1NldHRpbmdzO1xuICAgICAgICBzZXR0aW5nc0NoYW5nZWRFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IFNldHRpbmdzQ2hhbmdlZEV2ZW50KGV2ZW50Lm5ld1NldHRpbmdzKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2goc2V0dGluZ3NDaGFuZ2VkRXZlbnQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVTZXR0aW5ncyhzZXR0aW5nc0luZm86IEV4dGVuc2lvblNldHRpbmdzSW5mbyk6IHZvaWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoc2V0dGluZ3NJbmZvLCAnc2V0dGluZ3NJbmZvJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihzZXR0aW5nc0luZm8uc2V0dGluZ3NWYWx1ZXMsICdzZXR0aW5nc0luZm8uU2V0dGluZ3NWYWx1ZXMnKTtcblxuICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9IHNldHRpbmdzSW5mby5zZXR0aW5nc1ZhbHVlcztcblxuICAgIC8vIFJlc2V0IHRoZSBpc01vZGlmaWVkIGZsYWdcbiAgICB0aGlzLl9pc01vZGlmaWVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBoZWxwZXIgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgYW55IGxvY2FsIHVwZGF0ZSB0byB0aGlzLmN1cnJlbnRTZXR0aW5ncy5cbiAgICogQ2hlY2tzIGlmIGEgY3VycmVudCBzYXZlIGNhbGwgaXMgc3RpbGwgaW4gcHJvZ3Jlc3MgYW5kIHRocm93cyBhbiBlcnJvciBpZiBzby5cbiAgICovXG4gIHByaXZhdGUgdmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2F2ZUluUHJvZ3Jlc3MpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5TZXR0aW5nU2F2ZUluUHJvZ3Jlc3MsIFNldHRpbmdzSW1wbC5BU1lOQ19TQVZFX0lOX1BST0dSRVNTKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNvbnN0IFRhYmxlYXVCb29rRm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBCb29rJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1TGlnaHRGb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IExpZ2h0JztcbmV4cG9ydCBjb25zdCBUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgUmVndWxhcic7XG5leHBvcnQgY29uc3QgVGFibGVhdU1lZGl1bUZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgTWVkaXVtJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1U2VtaWJvbGRGb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IFNlbWlib2xkJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1Qm9sZEZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgQm9sZCc7XG5cbmV4cG9ydCBjb25zdCBUYWJsZWF1Qm9va0ZvbnRGYWNlTmFtZSA9ICdUYWJsZWF1IEJvb2snO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVCb2xkRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgQm9sZCc7XG5leHBvcnQgY29uc3QgVGFibGVhdUxpZ2h0Rm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgTGlnaHQnO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVNZWRpdW1Gb250RmFjZU5hbWUgPSAnVGFibGVhdSBNZWRpdW0nO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVSZWd1bGFyRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgUmVndWxhcic7XG5leHBvcnQgY29uc3QgVGFibGVhdVNlbWlCb2xkRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgU2VtaSBCb2xkJztcblxuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZFRhYmxlYXVGb250RmFjZXM6IE1vZGVsW10gPSBbXG4gIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1Qm9sZEZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdUxpZ2h0Rm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1UmVndWxhckZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdVNlbWlCb2xkRm9udEZhY2VOYW1lLFxuXTtcbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERpYWxvZ01lc3NhZ2VFdmVudCBhcyBEaWFsb2dNZXNzYWdlRXZlbnRDb250cmFjdCwgRGlhbG9nVXBkYXRlRXZlbnQsIE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG4gIFRhYmxlYXVFcnJvcixcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnQgfSBmcm9tICcuLi9FdmVudHMvVGFibGVhdUV2ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9VSVNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgRGlhbG9nTWVzc2FnZUV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRGlhbG9nTWVzc2FnZUV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLkRpYWxvZ01lc3NhZ2VSZWNlaXZlZCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVJSW1wbCB7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBwdWJsaWMgZGlzcGxheURpYWxvZ0FzeW5jKHVybDogc3RyaW5nLCBwYXlsb2FkPzogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdWlTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxVSVNlcnZpY2U+KEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlKTtcbiAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24sXG4gICAgKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB1aVNlcnZpY2VcbiAgICAgICAgLmRpc3BsYXlEaWFsb2dBc3luYyh1cmwsIHBheWxvYWQgfHwgJycsIG9wdGlvbnMpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICBjb25zdCB1bnJlZ2lzdGVyRm4gPSBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgICAgICAgIE5vdGlmaWNhdGlvbklkLkV4dGVuc2lvbkRpYWxvZ1VwZGF0ZSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gTGV0IHRocm91Z2ggYW55IGRpYWxvZyB1cGRhdGUgZXZlbnRcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGV2ZW50OiBEaWFsb2dVcGRhdGVFdmVudCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXZlbnQuaXNDbG9zZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmNsb3NlUGF5bG9hZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2Nsb3NlUGF5bG9hZCBpcyB1bmRlZmluZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShldmVudC5jbG9zZVBheWxvYWQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuRGlhbG9nQ2xvc2VkQnlVc2VyLCAnRXh0ZW5zaW9uIGRpYWxvZyBjbG9zZWQgYnkgdXNlci4nKSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB1bnJlZ2lzdGVyRm4oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNlbmREaWFsb2dNZXNzYWdlQXN5bmMobWVzc2FnZTogc3RyaW5nLCB0YXJnZXREaWFsb2dVcmw/OiBzdHJpbmcpIHtcbiAgICBjb25zdCB1aVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFVJU2VydmljZT4oRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5VSVNlcnZpY2UpO1xuXG4gICAgdWlTZXJ2aWNlLnNlbmREaWFsb2dNZXNzYWdlQXN5bmMobWVzc2FnZSwgdGFyZ2V0RGlhbG9nVXJsKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZURpYWxvZyhwYXlsb2FkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdWlTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxVSVNlcnZpY2U+KEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlKTtcblxuICAgIHVpU2VydmljZS5jbG9zZURpYWxvZyhwYXlsb2FkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhbGwgZXZlbnRzIHJlbGV2YW50IHRvIFVJIG9iamVjdC5cbiAgICpcbiAgICogQHJldHVybnMge0FycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj59IENvbGxlY3Rpb24gb2YgZXZlbnQgbWFuYWdlcnMgdG8gcGFzcyB0byBhbiBFdmVudExpc3RlbmVyTWFuYWdlci5cbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuICAgIGxldCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBzZXJ2aWNlIHJlZ2lzdGVyZWQsIGp1c3QgcmV0dXJuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBjb25zdCBkaWFsb2dNZXNzYWdlRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxDb250cmFjdC5EaWFsb2dNZXNzYWdlRXZlbnQ+KENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuRGlhbG9nTWVzc2FnZVJlY2VpdmVkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkV4dGVuc2lvbkRpYWxvZ01lc3NhZ2UsXG4gICAgICAoKSA9PiB0cnVlLFxuICAgICAgKGV2ZW50OiBEaWFsb2dNZXNzYWdlRXZlbnRDb250cmFjdCkgPT4ge1xuICAgICAgICBkaWFsb2dNZXNzYWdlRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBEaWFsb2dNZXNzYWdlRXZlbnQoZXZlbnQubWVzc2FnZSkpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmVzdWx0cy5wdXNoKGRpYWxvZ01lc3NhZ2VFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhc2hib2FyZExheW91dENoYW5nZURldGFpbHMsIFRhYmxlYXVFdmVudFR5cGUsIFdvcmtib29rRm9ybWF0dGluZyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRFdmVudCwgTm90aWZpY2F0aW9uSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBEYXNoYm9hcmRJbXBsLFxuICBEYXNoYm9hcmRPYmplY3RJbXBsLFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNpbmdsZUV2ZW50TWFuYWdlcixcbiAgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCxcbiAgV29ya3NoZWV0SW1wbCxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdCB9IGZyb20gJy4vRGFzaGJvYXJkT2JqZWN0JztcbmltcG9ydCB7IFNoZWV0IH0gZnJvbSAnLi9TaGVldCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuL1dvcmtzaGVldCc7XG5cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmQgZXh0ZW5kcyBTaGVldCBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXNoYm9hcmRJbXBsOiBEYXNoYm9hcmRJbXBsKSB7XG4gICAgc3VwZXIoX2Rhc2hib2FyZEltcGwpO1xuICAgIF9kYXNoYm9hcmRJbXBsLmluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcygpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50cygpLmZvckVhY2goKGUpID0+IHRoaXMuYWRkTmV3RXZlbnRUeXBlKGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0cygpOiBBcnJheTxDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC53b3Jrc2hlZXRzSW1wbC5tYXAoKHdvcmtzaGVldEltcGw6IFdvcmtzaGVldEltcGwpID0+IHtcbiAgICAgIHJldHVybiBuZXcgV29ya3NoZWV0KHdvcmtzaGVldEltcGwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBvYmplY3RzKCk6IEFycmF5PENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZE9iamVjdD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLm9iamVjdHMubWFwKChkYXNoYm9hcmRPYmplY3RJbXBsOiBEYXNoYm9hcmRPYmplY3RJbXBsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IERhc2hib2FyZE9iamVjdChkYXNoYm9hcmRPYmplY3RJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5hY3RpdmVEYXNoYm9hcmRPYmplY3RJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRGFzaGJvYXJkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLmFjdGl2ZURhc2hib2FyZE5hbWU7XG4gIH1cblxuICBwdWJsaWMgc2V0Wm9uZVZpc2liaWxpdHlBc3luYyh6b25lVmlzaWJpbGl0eU1hcDogQ29udHJhY3QuWm9uZVZpc2liaWxpdHlNYXApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5zZXREYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5QXN5bmMoem9uZVZpc2liaWxpdHlNYXApO1xuICB9XG5cbiAgcHVibGljIHNldERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlBc3luYyhkYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuc2V0RGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eUFzeW5jKGRhc2hib2FyZE9iamVjdFZpc2liaWxpdHlNYXApO1xuICB9XG5cbiAgcHVibGljIGdldERhc2hib2FyZE9iamVjdEJ5SWQoZGFzaGJvYXJkT2JqZWN0SWQ6IG51bWJlcik6IERhc2hib2FyZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgem9uZSA9IHRoaXMuX2Rhc2hib2FyZEltcGwuZ2V0RGFzaGJvYXJkT2JqZWN0QnlJZChkYXNoYm9hcmRPYmplY3RJZCk7XG4gICAgcmV0dXJuIHpvbmUgJiYgbmV3IERhc2hib2FyZE9iamVjdCh6b25lKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuXG4gICAgLy8gSW5pdGlhbGl6aW5nIGV2ZW50cyBhbmQgcmVnaXN0ZXJpbmcgbm90aWZpY2F0aW9uIHNlcnZpY2VcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVybiAoYWxsb3dzIHVuaXQgdGVzdGluZyB3aXRob3V0IE5vdGlmaWNhdGlvblNlcnZpY2UgbW9jaylcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIGNvbnN0IGRhc2hib2FyZExheW91dENoYW5nZWRFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPERhc2hib2FyZExheW91dENoYW5nZWRFdmVudD4oVGFibGVhdUV2ZW50VHlwZS5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkRhc2hib2FyZExheW91dENoYW5nZWQsXG4gICAgICAoKSA9PiB0cnVlLFxuICAgICAgKGV2ZW50OiBEYXNoYm9hcmRMYXlvdXRFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBkYXNoYm9hcmRPYmplY3RDaGFuZ2VzOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzID0gdGhpcy5fZGFzaGJvYXJkSW1wbC51cGRhdGVab25lcyhcbiAgICAgICAgICBldmVudC56b25lcyxcbiAgICAgICAgICBldmVudC5hY3RpdmVab25lSWQsXG4gICAgICAgICAgZXZlbnQuYWN0aXZlRGFzaGJvYXJkTmFtZSxcbiAgICAgICAgKTtcbiAgICAgICAgZGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50KGRhc2hib2FyZE9iamVjdENoYW5nZXMpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJlc3VsdHMucHVzaChkYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQpO1xuXG4gICAgY29uc3Qgd29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8V29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50PihcbiAgICAgIFRhYmxlYXVFdmVudFR5cGUuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCxcbiAgICApO1xuXG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkLFxuICAgICAgKCkgPT4gdHJ1ZSxcbiAgICAgIChldmVudEZvcm1hdHRpbmc6IFdvcmtib29rRm9ybWF0dGluZykgPT4ge1xuICAgICAgICB3b3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQoZXZlbnRGb3JtYXR0aW5nKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2god29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHVibGljIG1vdmVBbmRSZXNpemVEYXNoYm9hcmRPYmplY3RzQXN5bmMoXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5tb3ZlQW5kUmVzaXplRGFzaGJvYXJkT2JqZWN0c0FzeW5jKGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5KTtcbiAgfVxuXG4gIHB1YmxpYyByZXBsYXlBbmltYXRpb25Bc3luYyhyZXBsYXlTcGVlZDogQ29udHJhY3QuUmVwbGF5U3BlZWRUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwucmVwbGF5QW5pbWF0aW9uQXN5bmMocmVwbGF5U3BlZWQpO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5nZXRGaWx0ZXJzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuYXBwbHlGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RJbXBsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmQgfSBmcm9tICcuL0Rhc2hib2FyZCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuL1dvcmtzaGVldCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRhc2hib2FyZCBvYmplY3RzIC0gdGhlIHpvbmVzIGluIGEgZGFzaGJvYXJkLlxuICovXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkT2JqZWN0IGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkT2JqZWN0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Rhc2hib2FyZE9iamVjdEltcGw6IERhc2hib2FyZE9iamVjdEltcGwpIHt9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmQoKTogQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkIHtcbiAgICByZXR1cm4gbmV3IERhc2hib2FyZCh0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmRhc2hib2FyZEltcGwpO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLnR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvc2l0aW9uKCk6IENvbnRyYWN0LlBvaW50IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5wb3NpdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5zaXplO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXQoKTogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC53b3Jrc2hlZXRJbXBsKSB7XG4gICAgICByZXR1cm4gbmV3IFdvcmtzaGVldCh0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLndvcmtzaGVldEltcGwpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNGbG9hdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5pc0Zsb2F0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuaXNWaXNpYmxlO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuZmllbGRJZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgRXJyb3JIZWxwZXJzLFxuICBFdmVudExpc3RlbmVyTWFuYWdlcixcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgUGFyYW1ldGVySW1wbCxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVyQ2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL1BhcmFtZXRlckNoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBQYXJhbWV0ZXIgY29udHJhY3QuIENhbGxzIGRvd24gdG8gdGhlIGltcGxcbiAqIGNsYXNzIGZvciBhbG1vc3QgYWxsIG9mIHRoZSB3b3JrIGl0IGRvZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyTWFuYWdlciBpbXBsZW1lbnRzIENvbnRyYWN0LlBhcmFtZXRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhcmFtZXRlckltcGw6IFBhcmFtZXRlckltcGwsIHNoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBJbml0aWFsaXplIG91ciBldmVudCBoYW5kbGluZyBmb3IgdGhpcyBjbGFzc1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50cyhzaGVldCkuZm9yRWFjaCgoZSkgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXJyZW50VmFsdWUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJJbXBsLmN1cnJlbnRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogQ29udHJhY3QuRGF0YVR5cGUge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwuZGF0YVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsbG93YWJsZVZhbHVlcygpOiBDb250cmFjdC5QYXJhbWV0ZXJEb21haW5SZXN0cmljdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5hbGxvd2FibGVWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5pZDtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZSk6IFByb21pc2U8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5jaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHdoaWNoIGdvZXMgdGhyb3VnaCBhbmQgcmVnaXN0ZXJzIGVhY2ggZXZlbnQgdHlwZSB0aGlzIGltcGwga25vd3MgYWJvdXRcbiAgICogd2l0aCB0aGUgTm90aWZpY2F0aW9uU2VydmljZS4gSXQgcmV0dXJucyBhbiBhcnJheSBvZiBTaW5nbGVFdmVudE1hbmFnZXIgb2JqZWN0cyB3aGljaFxuICAgKiBjYW4gdGhlbiBiZSBwYXNzZWQgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXIgdG8gaGFuZGxlIHVzZXIgcmVnaXN0cmF0aW9uIC8gdW5yZWdpc3RyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBzaGVldCBUaGUgc2hlZXQgb2JqZWN0IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cyhzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5SW50ZXJuYWxWYWx1ZShzaGVldCwgJ3NoZWV0Jyk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGV2ZW50IG1hbmFnZXJzIHdlJ2xsIG5lZWQgKG9uZSBmb3IgZWFjaCBldmVudCB0eXBlKVxuICAgIGNvbnN0IHBhcmFtZXRlckV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8UGFyYW1ldGVyQ2hhbmdlZEV2ZW50PihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLlBhcmFtZXRlckNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuUGFyYW1ldGVyQ2hhbmdlZCxcbiAgICAgIChtb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSBtb2RlbCBhcyBzdHJpbmc7XG4gICAgICAgIHJldHVybiBmaWVsZE5hbWUgPT09IHRoaXMucGFyYW1ldGVySW1wbC5pZDtcbiAgICAgIH0sXG4gICAgICAoZmllbGROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcGFyYW1ldGVyRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQoZmllbGROYW1lLCBzaGVldCkpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmVzdWx0cy5wdXNoKHBhcmFtZXRlckV2ZW50KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXZlbnRMaXN0ZW5lck1hbmFnZXIsIFNoZWV0SW1wbCwgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXIgfSBmcm9tICcuL1BhcmFtZXRlcic7XG5cbmV4cG9ydCBjbGFzcyBTaGVldCBleHRlbmRzIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfc2hlZXRJbXBsOiBTaGVldEltcGwpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFR5cGUoKTogQ29udHJhY3QuU2hlZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLnNoZWV0VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkU2l6ZSh0aGlzLl9zaGVldEltcGwuc2l6ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaGVldEltcGwuc2l6ZTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgJ1NpemUgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWRTaXplKHNpemU6IGFueSk6IHNpemUgaXMgQ29udHJhY3QuU2l6ZSB7XG4gICAgY29uc3QgdGVzdFNpemUgPSBzaXplIGFzIENvbnRyYWN0LlNpemU7XG4gICAgaWYgKHRlc3RTaXplLndpZHRoICE9PSB1bmRlZmluZWQgJiYgdGVzdFNpemUuaGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQXN5bmMocGFyYW1ldGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb250cmFjdC5QYXJhbWV0ZXIgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLmZpbmRQYXJhbWV0ZXJBc3luYyhwYXJhbWV0ZXJOYW1lKS50aGVuKChwYXJhbWV0ZXJJbXBsKSA9PiB7XG4gICAgICBpZiAocGFyYW1ldGVySW1wbCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8Q29udHJhY3QuUGFyYW1ldGVyPigocmVzb2x2ZSkgPT4gcmVzb2x2ZShuZXcgUGFyYW1ldGVyKHBhcmFtZXRlckltcGwsIHRoaXMpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dW5kZWZpbmVkPigocmVzb2x2ZSkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5QYXJhbWV0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5nZXRQYXJhbWV0ZXJzQXN5bmMoKS50aGVuKChwYXJhbWV0ZXJzSW1wbCkgPT4ge1xuICAgICAgcmV0dXJuIHBhcmFtZXRlcnNJbXBsLm1hcCgocGFyYW1ldGVySW1wbCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlcihwYXJhbWV0ZXJJbXBsLCB0aGlzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsIH0gZnJvbSAnLi4vSW1wbC9FeHRlbnNpb25Xb3JrYm9va0ltcGwnO1xuXG5leHBvcnQgY2xhc3MgV29ya2Jvb2sgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25Xb3JrYm9vayB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF93b3JrYm9va0ltcGw6IEV4dGVuc2lvbldvcmtib29rSW1wbCkge31cblxuICBwdWJsaWMgZ2V0QWxsRGF0YVNvdXJjZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtib29rSW1wbC5nZXRBbGxEYXRhU291cmNlc0FzeW5jKCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDb2x1bW4sXG4gIEZpbHRlclVwZGF0ZVR5cGUsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gIFRhYmxlYXVFdmVudFR5cGUsXG4gIFRvb2x0aXBDb250ZXh0LFxuICBXb3Jrc2hlZXRGb3JtYXR0aW5nLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRmlsdGVyRXZlbnQsIE5vdGlmaWNhdGlvbklkLCBTdW1tYXJ5RGF0YUV2ZW50LCBWaXN1YWxJZCwgV29ya3NoZWV0Rm9ybWF0dGluZ0V2ZW50IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG4gIFRhYmxlYXVFcnJvcixcbiAgV29ya3NoZWV0SW1wbCxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBGaWx0ZXJDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvRmlsdGVyQ2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IE1hcmtzU2VsZWN0ZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9NYXJrc1NlbGVjdGVkRXZlbnQnO1xuaW1wb3J0IHsgU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBEYXNoYm9hcmQgfSBmcm9tICcuL0Rhc2hib2FyZCc7XG5pbXBvcnQgeyBTaGVldCB9IGZyb20gJy4vU2hlZXQnO1xuXG5leHBvcnQgY2xhc3MgV29ya3NoZWV0IGV4dGVuZHMgU2hlZXQgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIF93b3Jrc2hlZXRJbXBsOiBXb3Jrc2hlZXRJbXBsKSB7XG4gICAgc3VwZXIoX3dvcmtzaGVldEltcGwpO1xuXG4gICAgLy8gQ2FsbCB0byBpbml0aWFsaXplIGV2ZW50cyBhbmQgdGhlbiBjYWxsIGRvd24gdG8gdGhlIGV2ZW50IGxpc3RlbmVyIG1hbmFnZXIgdG8gaGFuZGxlIHRoaW5nc1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50cygpLmZvckVhY2goKGUpID0+IHRoaXMuYWRkTmV3RXZlbnRUeXBlKGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50RGFzaGJvYXJkKCk6IENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCB7XG4gICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGZvciBFeHRlbnNpb25zIGlmIHRoZSBEYXNoYm9hcmRJbXBscyBhcmUgY3JlYXRlZCBjb3JyZWN0bHlcbiAgICBpZiAodGhpcy5fd29ya3NoZWV0SW1wbC5wYXJlbnREYXNoYm9hcmQgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBQYXJlbnQgZGFzaGJvYXJkIG5vdCBpbXBsZW1lbnRlZGApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRGFzaGJvYXJkKHRoaXMuX3dvcmtzaGVldEltcGwucGFyZW50RGFzaGJvYXJkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYmFja2dyb3VuZENvbG9yKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuX3dvcmtzaGVldEltcGwuYmFja2dyb3VuZENvbG9yID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgV29ya3NoZWV0IGJhY2tncm91bmQgY29sb3IgaXMgbm90IGF2YWlsYWJsZWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmJhY2tncm91bmRDb2xvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGluZygpOiBXb3Jrc2hlZXRGb3JtYXR0aW5nIHtcbiAgICBpZiAodGhpcy5fd29ya3NoZWV0SW1wbC5mb3JtYXR0aW5nID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgV29ya3NoZWV0IGZvcm1hdHRpbmcgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmZvcm1hdHRpbmc7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB3aGljaCBnb2VzIHRocm91Z2ggYW5kIHJlZ2lzdGVycyBlYWNoIGV2ZW50IHR5cGUgdGhpcyBpbXBsIGtub3dzIGFib3V0XG4gICAqIHdpdGggdGhlIE5vdGlmaWNhdGlvblNlcnZpY2UuIEl0IHJldHVybnMgYW4gYXJyYXkgb2YgU2luZ2xlRXZlbnRNYW5hZ2VyIG9iamVjdHMgd2hpY2hcbiAgICogY2FuIHRoZW4gYmUgcGFzc2VkIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIHRvIGhhbmRsZSB1c2VyIHJlZ2lzdHJhdGlvbiAvIHVucmVnaXN0cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge1dvcmtzaGVldH0gd29ya3NoZWV0IFRoZSB3b3Jrc2hlZXQgb2JqZWN0IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cygpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGV2ZW50IG1hbmFnZXJzIHdlJ2xsIG5lZWQgKG9uZSBmb3IgZWFjaCBldmVudCB0eXBlKVxuICAgIGNvbnN0IG1hcmtzRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxNYXJrc1NlbGVjdGVkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuTWFya1NlbGVjdGlvbkNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuU2VsZWN0ZWRNYXJrc0NoYW5nZWQsXG4gICAgICAobW9kZWwpID0+IHtcbiAgICAgICAgY29uc3QgdmlzdWFsSWQgPSBtb2RlbCBhcyBWaXN1YWxJZDtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzdWFsSWRzQXJlRXF1YWwodmlzdWFsSWQsIHRoaXMuX3dvcmtzaGVldEltcGwudmlzdWFsSWQpO1xuICAgICAgfSxcbiAgICAgICgpID0+IG1hcmtzRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBNYXJrc1NlbGVjdGVkRXZlbnQodGhpcykpLFxuICAgICk7XG5cbiAgICBjb25zdCBmaWx0ZXJFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPEZpbHRlckNoYW5nZWRFdmVudD4oVGFibGVhdUV2ZW50VHlwZS5GaWx0ZXJDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkZpbHRlckNoYW5nZWQsXG4gICAgICAobW9kZWwpID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyRXZlbnRSZXNwb25zZSA9IG1vZGVsIGFzIEZpbHRlckV2ZW50O1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZC53b3Jrc2hlZXQgPT09IGZpbHRlckV2ZW50UmVzcG9uc2UudmlzdWFsSWQud29ya3NoZWV0O1xuICAgICAgfSxcbiAgICAgIChldmVudDogRmlsdGVyRXZlbnQpID0+IHtcbiAgICAgICAgZmlsdGVyRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBGaWx0ZXJDaGFuZ2VkRXZlbnQodGhpcywgZXZlbnQuZmllbGROYW1lLCBldmVudC5maWVsZElkKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBzdW1tYXJ5RGF0YUV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8U3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuU3VtbWFyeURhdGFDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLlN1bW1hcnlEYXRhQ2hhbmdlZCxcbiAgICAgIChtb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCBzdW1tYXJ5RGF0YUV2ZW50UmVzcG9uc2UgPSBtb2RlbCBhcyBTdW1tYXJ5RGF0YUV2ZW50O1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZC53b3Jrc2hlZXQgPT09IHN1bW1hcnlEYXRhRXZlbnRSZXNwb25zZS52aXN1YWxJZC53b3Jrc2hlZXQ7XG4gICAgICB9LFxuICAgICAgKGV2ZW50OiBTdW1tYXJ5RGF0YUV2ZW50KSA9PiB7XG4gICAgICAgIHN1bW1hcnlEYXRhRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCh0aGlzKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCB3b3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8V29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudD4oXG4gICAgICBUYWJsZWF1RXZlbnRUeXBlLldvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkLFxuICAgICk7XG5cbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLldvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkLFxuICAgICAgKG1vZGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IHdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgPSBtb2RlbCBhcyBXb3Jrc2hlZXRGb3JtYXR0aW5nRXZlbnQ7XG4gICAgICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnZpc3VhbElkLndvcmtzaGVldCA9PT0gd29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudC52aXN1YWxJZC53b3Jrc2hlZXQ7XG4gICAgICB9LFxuICAgICAgKGV2ZW50Rm9ybWF0dGluZzogV29ya3NoZWV0Rm9ybWF0dGluZykgPT4ge1xuICAgICAgICB3b3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudCh0aGlzLCBldmVudEZvcm1hdHRpbmcpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJlc3VsdHMucHVzaChtYXJrc0V2ZW50KTtcbiAgICByZXN1bHRzLnB1c2goZmlsdGVyRXZlbnQpO1xuICAgIHJlc3VsdHMucHVzaChzdW1tYXJ5RGF0YUV2ZW50KTtcbiAgICByZXN1bHRzLnB1c2god29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBGaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYXBwbHlGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmFwcGx5UmFuZ2VGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIGZpbHRlck9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgb3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hcHBseUhpZXJhcmNoaWNhbEZpbHRlckFzeW5jKGZpZWxkTmFtZSwgdmFsdWVzLCB1cGRhdGVUeXBlLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWUpO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldERhdGFTb3VyY2VzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0RmlsdGVyc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFBc3luYyhvcHRpb25zOiBDb250cmFjdC5HZXRTdW1tYXJ5RGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFN1bW1hcnlEYXRhQXN5bmMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhwYWdlUm93Q291bnQ6IG51bWJlciwgb3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jKHBhZ2VSb3dDb3VudCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb2x1bW4+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ1dvcmtzaGVldC5nZXRVbmRlcmx5aW5nRGF0YUFzeW5jIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgJyArXG4gICAgICAgICdXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jIGFuZCBXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jJyxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgb3B0aW9uczogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhsb2dpY2FsVGFibGVJZCwgcGFnZVJvd0NvdW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5WaXN1YWxTcGVjaWZpY2F0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgYWRkTWFya3NDYXJkRmllbGRzQXN5bmMoXG4gICAgbWFya3NDYXJkSW5kZXg6IG51bWJlcixcbiAgICBlbmNvZGluZ1R5cGU6IENvbnRyYWN0LkVuY29kaW5nVHlwZSxcbiAgICBjb2x1bW5zOiBBcnJheTxDb250cmFjdC5Db2x1bW4+LFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYWRkTWFya3NDYXJkRmllbGRzQXN5bmMobWFya3NDYXJkSW5kZXgsIGVuY29kaW5nVHlwZSwgY29sdW1ucywgc3RhcnRJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgbW92ZU1hcmtzQ2FyZEZpZWxkQXN5bmMobWFya3NDYXJkSW5kZXg6IG51bWJlciwgZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlciwgZmllbGRDb3VudCA9IDEpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5tb3ZlTWFya3NDYXJkRmllbGRBc3luYyhtYXJrc0NhcmRJbmRleCwgZnJvbUluZGV4LCB0b0luZGV4LCBmaWVsZENvdW50KTtcbiAgfVxuXG4gIHB1YmxpYyBzcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyhcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGVuY29kaW5nVHlwZTogQ29udHJhY3QuRW5jb2RpbmdUeXBlLFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgICBkZWxldGVDb3VudDogbnVtYmVyLFxuICAgIGNvbHVtbnM6IEFycmF5PENvbnRyYWN0LkNvbHVtbj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnNwbGljZU1hcmtzQ2FyZEZpZWxkc0FzeW5jKG1hcmtzQ2FyZEluZGV4LCBlbmNvZGluZ1R5cGUsIHN0YXJ0SW5kZXgsIGRlbGV0ZUNvdW50LCBjb2x1bW5zKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclNlbGVjdGVkTWFya3NBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5jbGVhclNlbGVjdGVkTWFya3NBc3luYygpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlJREFzeW5jKG1hcmtzSW5mbzogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+LCB1cGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0TWFya3NCeUlkQXN5bmMobWFya3NJbmZvLCB1cGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5VmFsdWVBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5TZWxlY3Rpb25Dcml0ZXJpYT4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zZWxlY3RNYXJrc0J5VmFsdWVBc3luYyhzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5SWRBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zZWxlY3RNYXJrc0J5SWRBc3luYyhzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBhbm5vdGF0ZU1hcmtBc3luYyhtYXJrOiBDb250cmFjdC5NYXJrSW5mbywgYW5ub3RhdGlvblRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmFubm90YXRlTWFya0FzeW5jKG1hcmssIGFubm90YXRpb25UZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbm5vdGF0aW9uc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRBbm5vdGF0aW9uc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQW5ub3RhdGlvbkFzeW5jKGFubm90YXRpb246IENvbnRyYWN0LkFubm90YXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5yZW1vdmVBbm5vdGF0aW9uQXN5bmMoYW5ub3RhdGlvbik7XG4gIH1cblxuICBwdWJsaWMgaG92ZXJUdXBsZUFzeW5jKGhvdmVyZWRUdXBsZT86IG51bWJlciwgdG9vbHRpcD86IFRvb2x0aXBDb250ZXh0IHwgbnVsbCwgYWxsb3dIb3ZlckFjdGlvbnMgPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuaG92ZXJUdXBsZUFzeW5jKGhvdmVyZWRUdXBsZSwgdG9vbHRpcCwgYWxsb3dIb3ZlckFjdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdFR1cGxlc0FzeW5jKHNlbGVjdGVkVHVwbGVzOiBBcnJheTxudW1iZXI+LCBzZWxlY3RPcHRpb246IENvbnRyYWN0LlNlbGVjdE9wdGlvbnMsIHRvb2x0aXA/OiBUb29sdGlwQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnNlbGVjdFR1cGxlc0FzeW5jKHNlbGVjdGVkVHVwbGVzLCBzZWxlY3RPcHRpb24sIHRvb2x0aXApO1xuICB9XG5cbiAgcHVibGljIGdldFRvb2x0aXBUZXh0QXN5bmModHVwbGVJZDogbnVtYmVyKTogUHJvbWlzZTxTdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRUb29sdGlwVGV4dEFzeW5jKHR1cGxlSWQpO1xuICB9XG5cbiAgcHVibGljIGxlYXZlTWFya05hdmlnYXRpb25Bc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5sZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBlZGl0QWxpYXNlc0RpYWxvZ0FzeW5jKGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZWRpdEFsaWFzZXNEaWFsb2dBc3luYyhmaWVsZE5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXN1YWxJZHNBcmVFcXVhbChhOiBWaXN1YWxJZCwgYjogVmlzdWFsSWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgYSAmJlxuICAgICAgYiAmJlxuICAgICAgYS53b3Jrc2hlZXQgPT09IGIud29ya3NoZWV0ICYmXG4gICAgICBhLmRhc2hib2FyZCA9PT0gYi5kYXNoYm9hcmQgJiZcbiAgICAgIGEuc3Rvcnlib2FyZCA9PT0gYi5zdG9yeWJvYXJkICYmXG4gICAgICBhLnN0b3J5UG9pbnRJRCA9PT0gYi5zdG9yeVBvaW50SURcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBEYXNoYm9hcmRDb250ZW50IG5hbWVzcGFjZS5cbiAqIFRoaXMgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgRGFzaGJvYXJkQ29udGVudCBpc1xuICogY3VycmVudGx5IGp1c3QgYSAoc2luZ2xlKSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRDb250ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRGFzaGJvYXJkQ29udGVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXNoYm9hcmQ6IENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCkge31cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZCgpOiBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25FbnZpcm9ubWVudCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlWZXJzaW9uLCBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRW51bU1hcHBpbmdzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBDb25uZWN0ZWRTZXJ2ZXIgfSBmcm9tICcuLi9JbXBsL0Nvbm5lY3RlZFNlcnZlcic7XG5pbXBvcnQgeyBXb3JrYm9va0Zvcm1hdHRpbmdFbnZVdGlsIH0gZnJvbSAnLi9Xb3JrYm9va0Zvcm1hdHRpbmdFbnZVdGlsJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgZW52aXJvbm1lbnQgbmFtZXNwYWNlLlxuICogRW52aXJvbm1lbnQgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgaXQgaXNcbiAqIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKiBGaXJzdCBjbGFzcyBleHRlbnNpb25zIGNhbiBnZXQgdG8gQ29ubmVjdGVkU2VydmVyIHdpdGg6IGVudmlyb25tZW50Wydjb25uZWN0ZWRTZXJ2ZXInXVxuICovXG5leHBvcnQgY2xhc3MgRW52aXJvbm1lbnQgaW1wbGVtZW50cyBDb250cmFjdC5FbnZpcm9ubWVudCB7XG4gIC8qKlRoZSBmb2xsb3dpbmcgaXMgYW4gaW5kZXggc2lnbmF0dXJlLiBJdCBhbGxvd3MgcHJvcGVydGllcyB0byBiZSBhY2Nlc3NlZCBieSBuYW1lLlxuICAgKiBUaGlzIGFsbG93cyB1cyB0byBhZGQgcHJvcGVydGllcyBkeW5hbWljYWxseSAoc2VlIHVzYWdlIG9mIHRoaXMuY29ubmVjdGVkU2VydmVyIGJlbG93KSB3aXRob3V0IFR5cGVzY3JpcHQgZXJyb3JzLlxuICAgKiBUaGUgcmVhc29uIHdlIGRvIHRoaXMgaXMgc28gdGhhdCAzcmQtcGFydHkgZXh0ZW5zaW9uIGRldmVsb3BlcnMgZG8gbm90IHNlZSB0aGUgY29ubmVjdGVkU2VydmVyIHByb3BlcnR5XG4gICAqIHRoYXQgaXMgb25seSBhdmFpbGFibGUgdG8gZmlyc3QgY2xhc3MgZXh0ZW5zaW9uIGRldmVsb3BlcnMuXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBpbmRleCBzaWdhdHVyZSBuZWVkcyB0byBiZSBhIHVuaW9uIG9mIGFsbCBwcm9wZXJ0aWVzIGluIHRoZSBvYmplY3QsIHNpbmNlIHdlIGNvdWxkXG4gICAqIGFjY2VzcyBhbnkgcHJvcGVydHkgdXNpbmcgdGhlIHByb3BlcnR5IGluZGV4IG1ldGhvZC5cbiAgICovXG4gIFt4OiBzdHJpbmddOiBDb25uZWN0ZWRTZXJ2ZXIgfCBzdHJpbmcgfCBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfYXBpVmVyc2lvbjogc3RyaW5nO1xuICBwcml2YXRlIF9jb250ZXh0OiBDb250cmFjdC5FeHRlbnNpb25Db250ZXh0O1xuICBwcml2YXRlIF9mb3JtYXR0aW5nPzogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nO1xuICBwcml2YXRlIF9sYW5ndWFnZTogc3RyaW5nO1xuICBwcml2YXRlIF9jb3VudHJ5Pzogc3RyaW5nO1xuICBwcml2YXRlIF9sb2NhbGU6IHN0cmluZztcbiAgcHJpdmF0ZSBfbW9kZTogQ29udHJhY3QuRXh0ZW5zaW9uTW9kZTtcbiAgcHJpdmF0ZSBfb3BlcmF0aW5nU3lzdGVtOiBzdHJpbmc7XG4gIHByaXZhdGUgX3RhYmxlYXVWZXJzaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgX3VuaXF1ZVVzZXJJZD86IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoZXh0ZW5zaW9uRW52aXJvbm1lbnQ6IEV4dGVuc2lvbkVudmlyb25tZW50KSB7XG4gICAgdGhpcy5fYXBpVmVyc2lvbiA9IEFwaVZlcnNpb24uSW5zdGFuY2UgJiYgQXBpVmVyc2lvbi5JbnN0YW5jZS5mb3JtYXR0ZWRWYWx1ZTsgLy8gbWFqLm1pbi5maXggKG5vIGJ1aWxkKVxuICAgIHRoaXMuX2NvbnRleHQgPSBFbnVtTWFwcGluZ3MuZXh0ZW5zaW9uQ29udGV4dC5jb252ZXJ0KGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkNvbnRleHQpO1xuICAgIHRoaXMuX2Zvcm1hdHRpbmcgPSBXb3JrYm9va0Zvcm1hdHRpbmdFbnZVdGlsLmNvbnZlcnRUb1dvcmtib29rRm9ybWF0dGluZyhleHRlbnNpb25FbnZpcm9ubWVudC53b3JrYm9va0Zvcm1hdHRpbmcpO1xuICAgIHRoaXMuX2xhbmd1YWdlID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uTGFuZ3VhZ2U7XG4gICAgdGhpcy5fY291bnRyeSA9IGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkNvdW50cnk7XG4gICAgdGhpcy5fbG9jYWxlID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uTG9jYWxlO1xuICAgIHRoaXMuX21vZGUgPSBFbnVtTWFwcGluZ3MuZXh0ZW5zaW9uTW9kZS5jb252ZXJ0KGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbk1vZGUpO1xuICAgIHRoaXMuX29wZXJhdGluZ1N5c3RlbSA9IGV4dGVuc2lvbkVudmlyb25tZW50Lm9wZXJhdGluZ1N5c3RlbTtcbiAgICB0aGlzLl90YWJsZWF1VmVyc2lvbiA9IGV4dGVuc2lvbkVudmlyb25tZW50LnRhYmxlYXVWZXJzaW9uO1xuICAgIHRoaXMuX3VuaXF1ZVVzZXJJZCA9IGV4dGVuc2lvbkVudmlyb25tZW50LnVuaXF1ZVVzZXJJZDtcblxuICAgIC8vIElmIHdlIGhhdmUgYSB1c2VySWQsIHRoZW4gd2UgYXJlIGEgZmlyc3QgY2xhc3MgZXh0ZW5zaW9uXG4gICAgaWYgKGV4dGVuc2lvbkVudmlyb25tZW50LnVzZXJJZCkge1xuICAgICAgdGhpcy5jb25uZWN0ZWRTZXJ2ZXIgPSBuZXcgQ29ubmVjdGVkU2VydmVyKFxuICAgICAgICBleHRlbnNpb25FbnZpcm9ubWVudC51c2VySWQsXG4gICAgICAgIGV4dGVuc2lvbkVudmlyb25tZW50LnNpdGVJZCxcbiAgICAgICAgZXh0ZW5zaW9uRW52aXJvbm1lbnQuc2l0ZU5hbWVzcGFjZSxcbiAgICAgICAgZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tJZCxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuZmVhdHVyZUZsYWdzID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQuZmVhdHVyZUZsYWdzO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpVmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hcGlWZXJzaW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBjb250ZXh0KCk6IENvbnRyYWN0LkV4dGVuc2lvbkNvbnRleHQge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0O1xuICB9XG5cbiAgcHVibGljIGdldCB3b3JrYm9va0Zvcm1hdHRpbmcoKTogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbGFuZ3VhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvdW50cnkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY291bnRyeTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbW9kZSgpOiBDb250cmFjdC5FeHRlbnNpb25Nb2RlIHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb3BlcmF0aW5nU3lzdGVtKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX29wZXJhdGluZ1N5c3RlbTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdGFibGVhdVZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVhdVZlcnNpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVuaXF1ZVVzZXJJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91bmlxdWVVc2VySWQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDYWxsYmFja01hcCwgRXh0ZW5zaW9uc0ltcGwgfSBmcm9tICcuLi9JbXBsL0V4dGVuc2lvbnNJbXBsJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgRXh0ZW5zaW9ucyBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25zIGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9ucyB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGV4dGVuc2lvbkltcGw6IEV4dGVuc2lvbnNJbXBsKSB7XG4gICAgdGhpcy5leHRlbnNpb25JbXBsID0gZXh0ZW5zaW9uSW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGFzaGJvYXJkQ29udGVudCgpOiBDb250cmFjdC5EYXNoYm9hcmRDb250ZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmRhc2hib2FyZENvbnRlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldENvbnRlbnQoKTogQ29udHJhY3QuV29ya3NoZWV0Q29udGVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC53b3Jrc2hlZXRDb250ZW50O1xuICB9XG5cbiAgcHVibGljIGdldCBlbnZpcm9ubWVudCgpOiBDb250cmFjdC5FbnZpcm9ubWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5lbnZpcm9ubWVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2V0dGluZ3MoKTogQ29udHJhY3QuU2V0dGluZ3Mge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuc2V0dGluZ3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVpKCk6IENvbnRyYWN0LlVJIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLnVpO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3JrYm9vaygpOiBDb250cmFjdC5FeHRlbnNpb25Xb3JrYm9vayB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC53b3JrYm9vaztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGFzaGJvYXJkT2JqZWN0SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmV4dGVuc2lvblpvbmVJZDtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplQXN5bmMoY29udGV4dE1lbnVDYWxsYmFja3M/OiBDYWxsYmFja01hcCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuaW5pdGlhbGl6ZUFzeW5jKGZhbHNlLCBjb250ZXh0TWVudUNhbGxiYWNrcykudGhlbjx2b2lkPigpO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVEaWFsb2dBc3luYygpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuaW5pdGlhbGl6ZUFzeW5jKHRydWUpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVZpekltYWdlQXN5bmMoaW5wdXRTcGVjOiBvYmplY3QpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWMpO1xuICB9XG5cbiAgcHVibGljIHNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLnNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTZXR0aW5ncyBhcyBTZXR0aW5nc0NvbnRyYWN0IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXJNYW5hZ2VyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBTZXR0aW5nc0ltcGwgfSBmcm9tICcuLi9JbXBsL1NldHRpbmdzSW1wbCc7XG5pbXBvcnQgeyBTZXR0aW5nc0NvbGxlY3Rpb24gfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXR0aW5nc1NlcnZpY2UnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBzZXR0aW5ncyBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXR0aW5ncyBleHRlbmRzIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIGltcGxlbWVudHMgU2V0dGluZ3NDb250cmFjdCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9zZXR0aW5nc0ltcGw6IFNldHRpbmdzSW1wbCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBJbml0aWFsaXplIG91ciBldmVudCBoYW5kbGluZyBmb3IgdGhpcyBjbGFzc1xuICAgIHRoaXMuX3NldHRpbmdzSW1wbC5pbml0aWFsaXplRXZlbnRzKCkuZm9yRWFjaCgoZSkgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGVyYXNlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0dGluZ3NJbXBsLmVyYXNlKGtleSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0KGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NJbXBsLmdldChrZXkpO1xuICB9XG5cbiAgcHVibGljIGdldEFsbCgpOiBTZXR0aW5nc0NvbGxlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ltcGwuZ2V0QWxsKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzTW9kaWZpZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzSW1wbC5pc01vZGlmaWVkO1xuICB9XG5cbiAgcHVibGljIHNhdmVBc3luYygpOiBQcm9taXNlPFNldHRpbmdzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ltcGwuc2F2ZUFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0dGluZ3NJbXBsLnNldChrZXksIHZhbHVlKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXJNYW5hZ2VyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBVSUltcGwgfSBmcm9tICcuLi9JbXBsL1VJSW1wbCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIFVJIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFVJIGV4dGVuZHMgRXZlbnRMaXN0ZW5lck1hbmFnZXIgaW1wbGVtZW50cyBDb250cmFjdC5VSSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9pbXBsOiBVSUltcGwpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBvdXIgZXZlbnQgaGFuZGxpbmcgZm9yIHRoaXMgY2xhc3NcbiAgICB0aGlzLl9pbXBsLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKChlKSA9PiB0aGlzLmFkZE5ld0V2ZW50VHlwZShlKSk7XG4gIH1cblxuICBwdWJsaWMgZGlzcGxheURpYWxvZ0FzeW5jKHVybDogc3RyaW5nLCBwYXlsb2FkPzogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ltcGwuZGlzcGxheURpYWxvZ0FzeW5jKHVybCwgcGF5bG9hZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgc2VuZERpYWxvZ01lc3NhZ2VBc3luYyhtZXNzYWdlOiBzdHJpbmcsIHRhcmdldERpYWxvZ1VybD86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9pbXBsLnNlbmREaWFsb2dNZXNzYWdlQXN5bmMobWVzc2FnZSwgdGFyZ2V0RGlhbG9nVXJsKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZURpYWxvZyhwYXlsb2FkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5faW1wbC5jbG9zZURpYWxvZyhwYXlsb2FkKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyBhcyBFbnVtTWFwcGluZ3MgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IENsYXNzTmFtZUtleSwgV29ya2Jvb2tGb3JtYXR0aW5nIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIFdvcmtib29rRm9ybWF0dGluZ0VudlV0aWwge1xuICBwdWJsaWMgc3RhdGljIGNvbnZlcnRUb1dvcmtib29rRm9ybWF0dGluZyh3b3JrYm9va0Zvcm1hdHRpbmdNb2RlbD86IFdvcmtib29rRm9ybWF0dGluZyk6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF3b3JrYm9va0Zvcm1hdHRpbmdNb2RlbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZm9ybWF0dGluZ01hcDogQXJyYXk8Q29udHJhY3QuRm9ybWF0dGluZ1NoZWV0PiA9IHdvcmtib29rRm9ybWF0dGluZ01vZGVsLmZvcm1hdHRpbmdTaGVldHMubWFwKChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0KSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRpbmdTaGVldDogQ29udHJhY3QuRm9ybWF0dGluZ1NoZWV0ID0ge1xuICAgICAgICAgIGNsYXNzTmFtZUtleTogRW51bU1hcHBpbmdzLmNsYXNzTmFtZUtleS5jb252ZXJ0KGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY2xhc3NOYW1lS2V5KSxcbiAgICAgICAgICBjc3NQcm9wZXJ0aWVzOiBnZXRDc3NQcm9wZXJ0aWVzKGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY2xhc3NOYW1lS2V5LCBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMpLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZm9ybWF0dGluZ1NoZWV0O1xuICAgICAgfSk7XG4gICAgICBjb25zdCByZXN1bHQ6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZyA9IHtcbiAgICAgICAgZm9ybWF0dGluZ1NoZWV0czogZm9ybWF0dGluZ01hcCxcbiAgICAgIH07XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRDc3NQcm9wZXJ0aWVzKGNsYXNzTmFtZUtleTogQ2xhc3NOYW1lS2V5LCBjc3NQcm9wZXJ0aWVzOiBSZWFjdC5DU1NQcm9wZXJ0aWVzKTogaW1wb3J0KCdyZWFjdCcpLkNTU1Byb3BlcnRpZXMge1xuICBpZiAoY2xhc3NOYW1lS2V5ID09PSBDbGFzc05hbWVLZXkuUm93RGl2aWRlcnMgfHwgY2xhc3NOYW1lS2V5ID09PSBDbGFzc05hbWVLZXkuQ29sdW1uRGl2aWRlcnMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYm9yZGVyQ29sb3I6IGNzc1Byb3BlcnRpZXMuYm9yZGVyQ29sb3IsXG4gICAgICBib3JkZXJTdHlsZTogY3NzUHJvcGVydGllcy5ib3JkZXJTdHlsZSxcbiAgICAgIGJvcmRlcldpZHRoOiBjc3NQcm9wZXJ0aWVzLmJvcmRlcldpZHRoLFxuICAgIH0gYXMgUmVhY3QuQ1NTUHJvcGVydGllcztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZm9udEZhbWlseTogY3NzUHJvcGVydGllcy5mb250RmFtaWx5LFxuICAgIGZvbnRTaXplOiBjc3NQcm9wZXJ0aWVzLmZvbnRTaXplLFxuICAgIGZvbnRXZWlnaHQ6IGNzc1Byb3BlcnRpZXMuZm9udFdlaWdodCxcbiAgICBmb250U3R5bGU6IGNzc1Byb3BlcnRpZXMuZm9udFN0eWxlLFxuICAgIHRleHREZWNvcmF0aW9uOiBjc3NQcm9wZXJ0aWVzLnRleHREZWNvcmF0aW9uLFxuICAgIGNvbG9yOiBjc3NQcm9wZXJ0aWVzLmNvbG9yLFxuICB9O1xufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgV29ya3NoZWV0Q29udGVudCBuYW1lc3BhY2UuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIFdvcmtzaGVldENvbnRlbnQgaXNcbiAqIGN1cnJlbnRseSBqdXN0IGEgKHNpbmdsZSkgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgV29ya3NoZWV0Q29udGVudCBpbXBsZW1lbnRzIENvbnRyYWN0LldvcmtzaGVldENvbnRlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfd29ya3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQpIHt9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXQoKTogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbywgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL0luaXRpYWxpemF0aW9uU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBJbml0aWFsaXphdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgSW5pdGlhbGl6YXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLkluaXRpYWxpemF0aW9uU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplRGFzaGJvYXJkRXh0ZW5zaW9uc0FzeW5jKGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuLCBjb250ZXh0TWVudUlkczogc3RyaW5nW10pOiBQcm9taXNlPEV4dGVuc2lvbkJvb3RzdHJhcEluZm8+IHtcbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdpbml0aWFsaXplRGFzaGJvYXJkRXh0ZW5zaW9uc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25Db250ZXh0TWVudUlkc106IGNvbnRleHRNZW51SWRzLFxuICAgICAgW1BhcmFtZXRlcklkLklzRXh0ZW5zaW9uRGlhbG9nXTogaXNFeHRlbnNpb25EaWFsb2csXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkluaXRpYWxpemVFeHRlbnNpb24sIHBhcmFtcykudGhlbjxFeHRlbnNpb25Cb290c3RyYXBJbmZvPigocmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIFRPRE8gLSBWYWxpZGF0ZSByZXR1cm4gdmFsdWVcblxuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkJvb3RzdHJhcEluZm87XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeHRlbnNpb25TZXR0aW5nc0luZm8sIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IFNldHRpbmdzQ29sbGVjdGlvbiwgU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vU2V0dGluZ3NTZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIFNldHRpbmdzU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBTZXR0aW5nc1NlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuU2V0dGluZ3NTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIHNhdmVTZXR0aW5nc0FzeW5jKHNldHRpbmdzOiBTZXR0aW5nc0NvbGxlY3Rpb24pOiBQcm9taXNlPFNldHRpbmdzQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzYXZlU2V0dGluZ3NBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU2V0dGluZ3NWYWx1ZXNdOiBzZXR0aW5ncyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2F2ZUV4dGVuc2lvblNldHRpbmdzLCBwYXJhbWV0ZXJzKS50aGVuPFNldHRpbmdzQ29sbGVjdGlvbj4oKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSB2YWx1ZS5yZXN1bHQgYXMgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvO1xuXG4gICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LnNldHRpbmdzVmFsdWVzKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnVW5leHBlY3RlZCBlcnJvciBzYXZpbmdzIHNldHRpbmdzLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0LnNldHRpbmdzVmFsdWVzO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEaWFsb2dPcHRpb25zLCBEaWFsb2dTdHlsZSwgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0LCBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9ySGVscGVycywgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLCBTZXJ2aWNlSW1wbEJhc2UsIFRhYmxlYXVFcnJvciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyB9IGZyb20gJy4uL0V4dGVuc2lvbnNTZXJ2aWNlTmFtZXMnO1xuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnLi4vVUlTZXJ2aWNlJztcblxuY29uc3QgREVGQVVMVF9ESUFMT0dfSEVJR0hUID0gNDAwOyAvLyBpbiBwaXhlbHNcbmNvbnN0IERFRkFVTFRfRElBTE9HX1dJRFRIID0gNjAwOyAvLyBpbiBwaXhlbHNcbmNvbnN0IERFRkFVTFRfRElBTE9HX1NUWUxFOiBEaWFsb2dTdHlsZSA9IERpYWxvZ1N0eWxlLldpbmRvdztcblxuZXhwb3J0IGNsYXNzIFVJU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBVSVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIGRpc3BsYXlEaWFsb2dBc3luYyh1cmw6IHN0cmluZywgcGF5bG9hZDogc3RyaW5nLCBvcHRpb25zPzogRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdkaXNwbGF5RGlhbG9nQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1VybF06IHVybCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dQYXlsb2FkXTogcGF5bG9hZCxcbiAgICB9O1xuXG4gICAgY29uc3QgaDogbnVtYmVyID0gb3B0aW9ucyAmJiBvcHRpb25zLmhlaWdodCA/IG9wdGlvbnMuaGVpZ2h0IDogREVGQVVMVF9ESUFMT0dfSEVJR0hUO1xuICAgIGNvbnN0IHc6IG51bWJlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy53aWR0aCA/IG9wdGlvbnMud2lkdGggOiBERUZBVUxUX0RJQUxPR19XSURUSDtcbiAgICBjb25zdCBkaWFsb2dTdHlsZTogRGlhbG9nU3R5bGUgPSBvcHRpb25zICYmIG9wdGlvbnMuZGlhbG9nU3R5bGUgPyBvcHRpb25zLmRpYWxvZ1N0eWxlIDogREVGQVVMVF9ESUFMT0dfU1RZTEU7XG5cbiAgICAvLyBPbiB0aGUgcGxhdGZvcm0gc2lkZSwgd2UgZG8gc29tZXRoaW5nIHJlYXNvbmFibGUgcmVnYXJkZXNzIG9mIHdoZXRoZXIgdGhlIHBhc3NlZFxuICAgIC8vIGhlaWdodCBhbmQgd2lkdGggYXJlIHRvbyBsYXJnZSBvciB0b28gc21hbGwuICBCdXQgdGhpcyBsaWtlbHkgaW5kaWNhdGVzIGEgZGV2ZWxvcGVyIGVycm9yLFxuICAgIC8vIHNvIHdlIHRocm93IGFuIGVycm9yIGhlcmUgdG8gaGVscCB3aXRoIGRlYnVnZ2luZy5cbiAgICBpZiAoaCA8PSAwIHx8IHcgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdTaXplIHBhcmFtZXRlcnMgZm9yIGRpc3BsYXlEaWFsb2dBc3luYyBtdXN0IGJlIHBvc2l0aXZlJyk7XG4gICAgfVxuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dIXSA9IGg7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dXXSA9IHc7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxEaWFsb2dTdHlsZT4oZGlhbG9nU3R5bGUsIERpYWxvZ1N0eWxlLCAnRGlhbG9nU3R5bGUnKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1N0eWxlXSA9IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5kaWFsb2dTdHlsZXMuY29udmVydChkaWFsb2dTdHlsZSk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5EaXNwbGF5RGlhbG9nLCBwYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGlhbG9nUmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdDtcbiAgICAgIHN3aXRjaCAoZGlhbG9nUmVzdWx0KSB7XG4gICAgICAgIGNhc2UgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0LkRpYWxvZ0FscmVhZHlPcGVuOlxuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5EaWFsb2dBbHJlYWR5T3BlbiwgJ1RoZXJlIGFscmVhZHkgZXhpc3RzIGFuIG9wZW4gZGlhbG9nIGZvciB0aGlzIGV4dGVuc2lvbi4nKTtcbiAgICAgICAgY2FzZSBFeHRlbnNpb25EaWFsb2dSZXN1bHQuSW52YWxpZERvbWFpbjpcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICAgICAgRXJyb3JDb2Rlcy5JbnZhbGlkRG9tYWluRGlhbG9nLFxuICAgICAgICAgICAgJ1RoZSB1cmwgb2YgYW4gZXh0ZW5zaW9uIGRpYWxvZyBtdXN0IG1hdGNoIHRoZSBkb21haW4gb2YgdGhlIHBhcmVudCBleHRlbnNpb24uJyxcbiAgICAgICAgICApO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIFN1Y2Nlc3MgY2FzZVxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZURpYWxvZyhwYXlsb2FkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2Nsb3NlRGlhbG9nJyxcbiAgICB9O1xuXG4gICAgaWYgKHBheWxvYWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nUGF5bG9hZF0gPSBwYXlsb2FkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNsb3NlRGlhbG9nLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHNlbmREaWFsb2dNZXNzYWdlQXN5bmMobWVzc2FnZTogc3RyaW5nLCB0YXJnZXREaWFsb2dVcmw/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2VuZERpYWxvZ01lc3NhZ2UnLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ01lc3NhZ2VdOiBtZXNzYWdlLFxuICAgIH07XG5cbiAgICBpZiAodGFyZ2V0RGlhbG9nVXJsKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1VybF0gPSB0YXJnZXREaWFsb2dVcmw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2VuZERpYWxvZ01lc3NhZ2UsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQ6IGJvb2xlYW4sIGV4dGVuc2lvblpvbmVJZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlclR5cGUoY2xpY2tUaHJvdWdoRW5hYmxlZCwgJ2Jvb2xlYW4nLCAnY2xpY2tUaHJvdWdoRW5hYmxlZCcpO1xuXG4gICAgaWYgKGV4dGVuc2lvblpvbmVJZCA9PT0gdW5kZWZpbmVkIHx8IGV4dGVuc2lvblpvbmVJZCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ0V4dGVuc2lvbiBJZCBpcyBpbnZhbGlkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvblpvbmVJZF06IGV4dGVuc2lvblpvbmVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DbGlja1Rocm91Z2hFbmFibGVkXTogY2xpY2tUaHJvdWdoRW5hYmxlZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2V0Q2xpY2tUaHJvdWdoLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vSW1wbC9Jbml0aWFsaXphdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFNldHRpbmdzU2VydmljZUltcGwgfSBmcm9tICcuL0ltcGwvU2V0dGluZ3NTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9JbXBsL1VJU2VydmljZUltcGwnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBbGxFeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyKTogdm9pZCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgU2V0dGluZ3NTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCBFeHRlbnNpb25zUmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFVJU2VydmljZUltcGwoZGlzcGF0Y2hlciwgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVySW5pdGlhbGl6YXRpb25FeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyKTogdm9pZCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCBFeHRlbnNpb25zUmVnaXN0cnlJZCkpO1xufVxuIiwiZXhwb3J0IGNvbnN0IEV4dGVuc2lvbnNSZWdpc3RyeUlkID0gMDtcbiIsIi8vIFRoaXMgZmlsZSByZS1leHBvcnRzIGV2ZXJ5dGhpbmcgd2hpY2ggaXMgcGFydCBvZiB0aGUgZXh0ZW5zaW9ucyBhcGkgcHVibGljIGludGVyZmFjZVxuXG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0Fza0RhdGFJbnRlcmZhY2VzJztcbmV4cG9ydCB7XG4gIEFwaU1lbnVUeXBlLFxuICBDcm9zc3RhYkZpbGVGb3JtYXQsXG4gIERldmljZVR5cGUsXG4gIEVtYmVkZGluZ0Vycm9yQ29kZXMsXG4gIFRhYmxlYXVFdmVudFR5cGUgYXMgRW1iZWRkaW5nVGFibGVhdUV2ZW50VHlwZSxcbiAgRmlsZUZvcm1hdHMsXG4gIFByaW50T3JpZW50YXRpb24sXG4gIFByaW50UGFnZVNpemUsXG4gIFByaW50U2NhbGluZyxcbiAgUHVsc2VFcnJvck1lc3NhZ2VWaXNpYmlsaXR5LFxuICBQdWxzZUxheW91dCxcbiAgUHVsc2VUaW1lRGltZW5zaW9uLFxuICBTaGVldFNpemVCZWhhdmlvcixcbiAgVGFibGVhdURpYWxvZ1R5cGUsXG4gIFRvb2xiYXIsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvRW51bXMnO1xuZXhwb3J0IHtcbiAgQ3VzdG9tVmlld0V2ZW50LFxuICBDdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudCBhcyBFbWJlZGRpbmdDdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudCxcbiAgRmlsdGVyQ2hhbmdlZEV2ZW50IGFzIEVtYmVkZGluZ0ZpbHRlckNoYW5nZWRFdmVudCxcbiAgTWFya3NTZWxlY3RlZEV2ZW50IGFzIEVtYmVkZGluZ01hcmtTZWxlY3RlZEV2ZW50LFxuICBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQgYXMgRW1iZWRkaW5nUGFyYW1ldGVyQ2hhbmdlZEV2ZW50LFxuICBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCBhcyBFbWJlZGRpbmdTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCxcbiAgVGFibGVhdVNoZWV0RXZlbnQgYXMgRW1iZWRkaW5nVGFibGVhdVNoZWV0RXZlbnQsXG4gIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBhcyBFbWJlZGRpbmdUYWJsZWF1V29ya3NoZWV0RXZlbnQsXG4gIFRvb2xiYXJTdGF0ZUNoYW5nZWRFdmVudCBhcyBFbWJlZGRpbmdUb29sYmFyU3RhdGVDaGFuZ2VkRXZlbnQsXG4gIEZpcnN0UHVsc2VNZXRyaWNTaXplS25vd25FdmVudCxcbiAgRmlyc3RWaXpTaXplS25vd25FdmVudCxcbiAgUHVsc2VFcnJvckV2ZW50LFxuICBQdWxzZUZpbHRlcnNDaGFuZ2VkRXZlbnQsXG4gIFB1bHNlTWV0cmljU2l6ZUNoYW5nZWRFdmVudCxcbiAgUHVsc2VJbnNpZ2h0RGlzY292ZXJlZEV2ZW50LFxuICBQdWxzZVRpbWVEaW1lbnNpb25DaGFuZ2VkRXZlbnQsXG4gIFB1bHNlVXJsQ2hhbmdlZEV2ZW50LFxuICBTdG9yeVBvaW50U3dpdGNoZWRFdmVudCxcbiAgVGFiU3dpdGNoZWRFdmVudCxcbiAgVXJsQWN0aW9uRXZlbnQsXG4gIFZpekxvYWRFcnJvckV2ZW50LFxuICBXb3JrYm9va1B1Ymxpc2hlZEFzRXZlbnQsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvRXZlbnRJbnRlcmZhY2VzJztcbmV4cG9ydCB7IFBhcmFtZXRlciBhcyBFbWJlZGRpbmdQYXJhbWV0ZXIgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1BhcmFtZXRlckludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9QdWxzZUludGVyZmFjZXMnO1xuZXhwb3J0IHtcbiAgQ29udGV4dE1lbnVPcHRpb25zLFxuICBFbWJlZGRpbmdBYnN0cmFjdFF1ZXJ5LFxuICBBdXRob3JpbmdXb3Jrc2hlZXQgYXMgRW1iZWRkaW5nQXV0aG9yaW5nV29ya3NoZWV0LFxuICBEYXNoYm9hcmQgYXMgRW1iZWRkaW5nRGFzaGJvYXJkLFxuICBEYXNoYm9hcmRPYmplY3QgYXMgRW1iZWRkaW5nRGFzaGJvYXJkT2JqZWN0LFxuICBTaGVldCBhcyBFbWJlZGRpbmdTaGVldCxcbiAgRW1iZWRkaW5nVml6U3RhdGVXaXRoRGF0YU1vZGVsLFxuICBXb3Jrc2hlZXQgYXMgRW1iZWRkaW5nV29ya3NoZWV0LFxuICBIaWVyYXJjaGljYWxMZXZlbHMsXG4gIFNoZWV0SW5mbyxcbiAgU2hlZXRTaXplLFxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1NoZWV0SW50ZXJmYWNlcyc7XG5leHBvcnQgeyBTdG9yeSwgU3RvcnlQb2ludCwgU3RvcnlQb2ludEluZm8gfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1N0b3J5SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1RhYmxlYXVFcnJvcic7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1ZpekludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9XZWJDb21wb25lbnRJbnRlcmZhY2VzJztcbmV4cG9ydCB7XG4gIEN1c3RvbVZpZXcsXG4gIEF1dGhvcmluZ1dvcmtib29rIGFzIEVtYmVkZGluZ0F1dGhvcmluZ1dvcmtib29rLFxuICBXb3JrYm9vayBhcyBFbWJlZGRpbmdXb3JrYm9vayxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9Xb3JrYm9va0ludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL1NoYXJlZEFwaUV4dGVybmFsQ29udHJhY3QnO1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBleHRlbnNpb25zIGFwaSBwdWJsaWMgaW50ZXJmYWNlXG5cbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL0V2ZW50SW50ZXJmYWNlJztcbmV4cG9ydCB7IERhc2hib2FyZENvbnRlbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQnO1xuZXhwb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0Vudmlyb25tZW50JztcbmV4cG9ydCB7IEV4dGVuc2lvbnMgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0V4dGVuc2lvbnMnO1xuZXhwb3J0IHsgU2V0dGluZ3MgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1NldHRpbmdzJztcbmV4cG9ydCB7XG4gIEVycm9yQ29kZXMsXG4gIEV4dGVuc2lvbkNvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUsXG4gIFRhYmxlYXVFdmVudFR5cGUsXG4gIFZpekltYWdlRW5jb2RpbmdUeXBlLFxuICBWaXpJbWFnZVBhbGV0dGVUeXBlLFxuICBWaXpJbWFnZVNpemVTZXR0aW5nQWxpZ25tZW50VHlwZSxcbiAgVml6SW1hZ2VTaXplU2V0dGluZ1R5cGUsXG4gIFZpekltYWdlU29ydERpcmVjdGlvblR5cGUsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvVGFibGVhdSc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1VJJztcbmV4cG9ydCB7IFdvcmtzaGVldENvbnRlbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1dvcmtzaGVldENvbnRlbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvUGFyYW1ldGVySW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUsXG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwLFxuICBEYXNoYm9hcmQgYXMgRXh0ZW5zaW9uRGFzaGJvYXJkLFxuICBEYXNoYm9hcmRPYmplY3QgYXMgRXh0ZW5zaW9uRGFzaGJvYXJkT2JqZWN0LFxuICBTaGVldCBhcyBFeHRlbnNpb25TaGVldCxcbiAgV29ya3NoZWV0IGFzIEV4dGVuc2lvbldvcmtzaGVldCxcbiAgUG9pbnQsXG4gIFpvbmVWaXNpYmlsaXR5TWFwLFxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9TaGVldEludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvVGFibGVhdUVycm9yJztcbmV4cG9ydCB7IFdvcmtib29rIGFzIEV4dGVuc2lvbldvcmtib29rIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvV29ya2Jvb2tJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vU2hhcmVkQXBpRXh0ZXJuYWxDb250cmFjdCc7XG4iLCIvKipcbiAqIFRoaXMgaXMgeW91ciBtYWluLiBUaGlzIGlzIHdoZXJlIHlvdSByZS1leHBvcnQgZXZlcnl0aGluZyB5b3Ugd2FudCB0byBiZSBwdWJsaWNseSBhdmFpbGFibGUuXG4gKlxuICogVGhlIGJ1aWxkIGVuZm9yY2VzIHRoYXQgdGhlIGZpbGUgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGdsb2JhbCB2YXJpYWJsZSB0aGF0IGlzIGV4cG9ydGVkLlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vRW1iZWRkaW5nQXBpRXh0ZXJuYWxDb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVuc2lvbnNBcGlFeHRlcm5hbENvbnRyYWN0JztcbiIsImltcG9ydCB7IFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MsIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIH0gZnJvbSAnLi9XZWJDb21wb25lbnRJbnRlcmZhY2VzJztcblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgPHRhYmxlYXUtYXNrLWRhdGE+IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgZW51bSBBc2tEYXRhQXR0cmlidXRlcyB7XG4gIE9yaWdpbiA9ICdvcmlnaW4nLFxuICBTaG93RW1iZWQgPSAnc2hvdy1lbWJlZCcsXG4gIFNob3dQaW4gPSAnc2hvdy1waW4nLFxuICBTaG93U2F2ZSA9ICdzaG93LXNhdmUnLFxuICBTaG93U2hhcmUgPSAnc2hvdy1zaGFyZScsXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc2tEYXRhU2V0dGluZ3MgZXh0ZW5kcyBXZWJDb21wb25lbnRTZXR0aW5nc1NoYXJlZCwgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW1iZWQgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHNob3ctZW1iZWQ+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd0VtYmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHBpbiBidXR0b24gaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgc2hvdy1waW4+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd1Bpbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzYXZlIGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBzaG93LXNhdmU+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd1NhdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc2hhcmUgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHNob3ctc2hhcmU+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd1NoYXJlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogIFVzZWQgZm9yIHRlbGVtZXRyeVxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIG9yaWdpbj1cImVtYmVkZGluZ1NpdGVcIj5cbiAgICogYGBgXG4gICAqL1xuICBvcmlnaW4/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGludGVyZmFjZSBmb3IgdGhlIHRvcCBsZXZlbCBBc2tEYXRhIG9iamVjdC5cbiAqIEBkZXByZWNhdGVkXG4gKiovXG5leHBvcnQgaW50ZXJmYWNlIEFza0RhdGEgZXh0ZW5kcyBBc2tEYXRhU2V0dGluZ3Mge31cbiIsIi8vIEFsbCBlbnVtIHZhbHVlcyBtYWRlIGF2YWlsYWJsZSB0byBFbWJlZGRpbmcgZGV2ZWxvcGVycy5cbi8vIEVudW1zIHNob3VsZCBiZSBrZXB0IGluIGFscGhhYmV0aWNhbCBvcmRlci5cbi8vIE1vc3Qgb2YgdGhlbSBzaG91bGQgbWF0Y2ggYW4gZW51bSBvbiB0aGUgc2VydmVyIGRlZmluZWQgYXRcbi8vIHdvcmtncm91cC92cWx3ZWIvc2NyaXB0c2hhcnAvc3JjL0FwaVNoYXJlZC9QdWJsaWNFbnVtcy5jcyNMMzk4OjE3XG5cbi8qKlxuICogQ3Jvc3N0YWIgZmlsZSBmb3JtYXRzIGF2YWlsYWJsZSB0byB1c2Ugd2l0aCB7QGxpbmsgVml6LmV4cG9ydENyb3NzdGFiQXN5bmN9XG4gKi9cbmV4cG9ydCBlbnVtIENyb3NzdGFiRmlsZUZvcm1hdCB7XG4gIENTViA9ICdjc3YnLFxuICBFeGNlbCA9ICd4bHN4Jyxcbn1cblxuLyoqXG4gKiBEZXZpY2UgdHlwZXMgYXZhaWxhYmxlIHRvIHVzZSB3aXRoIHtAbGluayBWaXouZGV2aWNlfVxuICovXG5leHBvcnQgZW51bSBEZXZpY2VUeXBlIHtcbiAgRGVmYXVsdCA9ICdkZWZhdWx0JyxcbiAgRGVza3RvcCA9ICdkZXNrdG9wJyxcbiAgVGFibGV0ID0gJ3RhYmxldCcsXG4gIFBob25lID0gJ3Bob25lJyxcbn1cblxuLyoqXG4gKiBBbGwgZXJyb3IgY29kZXMgdXNlZCBieSB0aGUgRW1iZWRkaW5nIEFQSS5cbiAqL1xuZXhwb3J0IGVudW0gRW1iZWRkaW5nRXJyb3JDb2RlcyB7XG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBhIHJlcXVlc3QgdG8gdGhlIGF1dGggZW5kcG9pbnQgZmFpbHMuXG4gICAqL1xuICBBdXRoRmFpbGVkID0gJ2F1dGgtZmFpbGVkJyxcbiAgLyoqXG4gICAqIFRoZSBicm93c2VyIGlzIG5vdCBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgdGhlIFRhYmxlYXUgRW1iZWRkaW5nIEFQSVxuICAgKi9cbiAgQnJvd3Nlck5vdENhcGFibGUgPSAnYnJvd3Nlci1ub3QtY2FwYWJsZScsXG4gIC8qKlxuICAgKiBUaGUgcGVybWlzc2lvbnMgb24gYSB3b3JrYm9vayBvciBhIHZpZXcgZG8gbm90IGFsbG93IGRvd25sb2FkaW5nIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIERvd25sb2FkV29ya2Jvb2tOb3RBbGxvd2VkID0gJ2Rvd25sb2FkLXdvcmtib29rLW5vdC1hbGxvd2VkJyxcbiAgLyoqXG4gICAqIFRocm93biB3aGVuIGFuIGVycm9yIG9jY3VycyB3aGlsZSBhdHRlbXB0aW5nIHRvIHBlcmZvcm0gYSBmaWx0ZXIgb3BlcmF0aW9uLlxuICAgKi9cbiAgRmlsdGVyQ2Fubm90QmVQZXJmb3JtZWQgPSAnZmlsdGVyLWNhbm5vdC1iZS1wZXJmb3JtZWQnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBzd2l0Y2ggdG8gYSBzaGVldCBieSBpbmRleCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIEluZGV4T3V0T2ZSYW5nZSA9ICdpbmRleC1vdXQtb2YtcmFuZ2UnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJzIHdpdGhpbiB0aGUgVGFibGVhdSBFbWJlZGRpbmcgQVBJLiBDb250YWN0IFRhYmxlYXUgU3VwcG9ydC5cbiAgICovXG4gIEludGVybmFsRXJyb3IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBjdXN0b20gdmlldyB0aGF0IGRvZXMgbm90IGV4aXN0LlxuICAgKi9cbiAgSW52YWxpZEN1c3RvbVZpZXdOYW1lID0gJ2ludmFsaWQtY3VzdG9tLXZpZXctbmFtZScsXG4gIC8qKlxuICAgKiBBbiBpbnZhbGlkIGRhdGUgd2FzIHNwZWNpZmllZCBpbiBhIG1ldGhvZCB0aGF0IHJlcXVpcmVkIGEgZGF0ZSBwYXJhbWV0ZXIuXG4gICAqL1xuICBJbnZhbGlkRGF0ZVBhcmFtZXRlciA9ICdpbnZhbGlkLWRhdGUtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEVpdGhlciBhIGZpbHRlciBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGZpZWxkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGEgc291cmNlLCBvciB0aGUgdmFsdWUgc3VwcGxpZWRcbiAgICogaW4gdGhlIGZpbHRlciBvcGVyYXRpb24gaXMgdGhlIHdyb25nIGRhdGEgdHlwZSBvciBmb3JtYXQuXG4gICAqL1xuICBpbnZhbGlkRmlsdGVyRmllbGROYW1lT3JWYWx1ZSA9ICdpbnZhbGlkLWZpbHRlci1maWVsZC1uYW1lJyxcbiAgLyoqXG4gICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZVxuICAgKiBmaWVsZC5cbiAgICovXG4gIEludmFsaWRQYXJhbWV0ZXIgPSAnaW52YWxpZC1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogVGhlIGN1cnJlbnRseSBhcHBsaWVkIHRpbWUgZGltZW5zaW9uIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIG9yIGlzIGludmFsaWQuXG4gICAqL1xuICBJbnZhbGlkVGltZURpbWVuc2lvbiA9ICdpbnZhbGlkLXRpbWUtZGltZW5zaW9uJyxcbiAgLyoqXG4gICAqIEEgbmVnYXRpdmUgc2l6ZSB3YXMgc3BlY2lmaWVkIG9yIHRoZSBtYXhTaXplIHZhbHVlIGlzIGxlc3MgdGhhbiBtaW5TaXplIGluIFNoZWV0LmNoYW5nZVNpemVBc3luYygpLlxuICAgKi9cbiAgSW52YWxpZFNpemUgPSAnaW52YWxpZC1zaXplJyxcbiAgLyoqXG4gICAqIEF0dGVtcHRlZCB0byBnZXQgYW4gYXV0aG9yaW5nIHdvcmtzaGVldCB3aGVuIHRoZSBjdXJyZW50IHNoZWV0IGlzIG5vdCBhIHdvcmtzaGVldC5cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgSW52YWxpZFNoZWV0VHlwZSA9ICdpbnZhbGlkLXNoZWV0LXR5cGUnLFxuICAvKipcbiAgICogQSBiZWhhdmlvciB2YWx1ZSB3YXMgZm91bmQgdGhhdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIFNoZWV0U2l6ZUJlaGF2aW9yIGVudW0uXG4gICAqL1xuICBJbnZhbGlkU2l6ZUJlaGF2aW9yID0gJ2ludmFsaWQtc2l6ZS1iZWhhdmlvcicsXG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIG90aGVyIHRoYW4gU2hlZXRTaXplQmVoYXZpb3IuQXV0b21hdGljIHdhcyBzcGVjaWZpZWQgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkgd2hlbiB0aGUgc2hlZXQgaXMgYVxuICAgKiBXb3Jrc2hlZXQgaW5zdGFuY2UuXG4gICAqL1xuICBJbnZhbGlkU2l6ZUJlaGF2aW9yT25Xb3Jrc2hlZXQgPSAnaW52YWxpZC1zaXplLWJlaGF2aW9yLW9uLXdvcmtzaGVldCcsXG4gIC8qKlxuICAgKiBUaGUgVVJMIHNwZWNpZmllZCBpbiB0aGUgVml6IGNsYXNzIGNvbnN0cnVjdG9yIGlzIG5vdCB2YWxpZC5cbiAgICovXG4gIEludmFsaWRVcmwgPSAnaW52YWxpZC11cmwnLFxuICAvKipcbiAgICogVGhlIG1heFNpemUgZmllbGQgaXMgbWlzc2luZyBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKSB3aGVuIHNwZWNpZnlpbmcgU2hlZXRTaXplQmVoYXZpb3IuQXRNb3N0LlxuICAgKi9cbiAgTWlzc2luZ01heFNpemUgPSAnbWlzc2luZy1tYXgtc2l6ZScsXG4gIC8qKlxuICAgKiBUaGUgbWluU2l6ZSBmaWVsZCBpcyBtaXNzaW5nIGluIFNoZWV0LmNoYW5nZVNpemVBc3luYygpIHdoZW4gc3BlY2lmeWluZyBTaGVldFNpemVCZWhhdmlvci5BdExlYXN0LlxuICAgKi9cbiAgTWlzc2luZ01pblNpemUgPSAnbWlzc2luZy1taW4tc2l6ZScsXG4gIC8qKlxuICAgKiBUaGUgbWluU2l6ZSBvciBtYXhTaXplIGZpZWxkIGlzIG1pc3NpbmcgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkgd2hlbiBzcGVjaWZ5aW5nIFNoZWV0U2l6ZUJlaGF2aW9yLlJhbmdlLlxuICAgKi9cbiAgTWlzc2luZ01pbk1heFNpemUgPSAnbWlzc2luZy1taW4tbWF4LXNpemUnLFxuICAvKipcbiAgICogQ2FuIG9jY3VyIGlmIHRoZSBlbWJlZGRpbmcgYXBwIGludGVyYWN0cyB3aXRoIGEgcGFyYW1ldGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAqL1xuICBNaXNzaW5nUGFyYW1ldGVyID0gJ21pc3NpbmctcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIFRoZSByYW5nZU4gZmllbGQgaXMgbWlzc2luZyBmb3IgYSByZWxhdGl2ZSBkYXRlIGZpbHRlciBvZiB0eXBlIExBU1ROIG9yIE5FWFROLlxuICAgKi9cbiAgTWlzc2luZ1JhbmdlTkZvclJlbGF0aXZlRGF0ZUZpbHRlcnMgPSAnbWlzc2luZy1yYW5nZS1uLWZvci1yZWxhdGl2ZS1kYXRlLWZpbHRlcnMnLFxuICAvKipcbiAgICogQW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBhY2Nlc3MgU2hlZXQuZ2V0VXJsKCkgb24gYSBoaWRkZW4gc2hlZXQuIEhpZGRlbiBzaGVldHMgZG8gbm90IGhhdmUgVVJMcy5cbiAgICovXG4gIE5vVXJsRm9ySGlkZGVuV29ya3NoZWV0ID0gJ25vLXVybC1mb3ItaGlkZGVuLXdvcmtzaGVldCcsXG4gIC8qKlxuICAgKiBPbmUgb3IgYm90aCBvZiB0aGUgcGFyZW50RWxlbWVudCBvciB0aGUgVVJMIHBhcmFtZXRlcnMgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgVml6IGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgTm9VcmxPclBhcmVudEVsZW1lbnROb3RGb3VuZCA9ICduby11cmwtb3ItcGFyZW50LWVsZW1lbnQtbm90LWZvdW5kJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgc2hlZXQgdGhhdCBpcyBub3QgYWN0aXZlIG9yIGVtYmVkZGVkIHdpdGhpbiB0aGUgYWN0aXZlIGRhc2hib2FyZC5cbiAgICovXG4gIE5vdEFjdGl2ZVNoZWV0ID0gJ25vdC1hY3RpdmUtc2hlZXQnLFxuICAvKipcbiAgICogQSByZXF1aXJlZCBwYXJhbWV0ZXIgd2FzIG5vdCBzcGVjaWZpZWQsIG51bGwsIG9yIGFuIGVtcHR5IHN0cmluZy9hcnJheS5cbiAgICovXG4gIE51bGxPckVtcHR5UGFyYW1ldGVyID0gJ251bGwtb3ItZW1wdHktcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgc2hlZXQgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgd29ya2Jvb2suXG4gICAqL1xuICBTaGVldE5vdEluV29ya2Jvb2sgPSAnc2hlZXQtbm90LWluLXdvcmtib29rJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgb24gYSBDdXN0b21WaWV3IG9iamVjdCB0aGF0IGlzIG5vIGxvbmdlciB2YWxpZCAoaXQgaGFzIGJlZW4gcmVtb3ZlZCkuXG4gICAqL1xuICBTdGFsZURhdGFSZWZlcmVuY2UgPSAnc3RhbGUtZGF0YS1yZWZlcmVuY2UnLFxuICAvKipcbiAgICogVW5rbm93biBlcnJvciB0cmlnZ2VyZWQgZHVyaW5nIHRoZSBhdXRoIGZsb3cuXG4gICAqL1xuICBVbmtub3duQXV0aEVycm9yID0gJ3Vua25vd24tYXV0aC1lcnJvcicsXG4gIC8qKlxuICAgKiBBbiB1bmtub3duIGV2ZW50IG5hbWUgd2FzIHNwZWNpZmllZCBpbiB0aGUgY2FsbCB0byBWaXouYWRkRXZlbnRMaXN0ZW5lciBvciBWaXoucmVtb3ZlRXZlbnRMaXN0ZW5lci5cbiAgICovXG4gIFVuc3VwcG9ydGVkRXZlbnROYW1lID0gJ3Vuc3VwcG9ydGVkLWV2ZW50LW5hbWUnLFxuICAvKipcbiAgICogQSBWaXogb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCBhcyBhIGNoaWxkIG9mIHRoZSBwYXJlbnRFbGVtZW50IHNwZWNpZmllZCBpbiB0aGUgVml6IGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgVml6QWxyZWFkeUluTWFuYWdlciA9ICd2aXotYWxyZWFkeS1pbi1tYW5hZ2VyJyxcbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGVtYmVkZGluZyBhcGkuXG4gICAqL1xuICBJbXBsZW1lbnRhdGlvbkVycm9yID0gJ3dyb25nLWltcGxlbWVudGF0aW9uJyxcbiAgLyoqXG4gICAqIEBOb3RJbXBsZW1lbnRlZFxuICAgKi9cbiAgTm90SW1wbGVtZW50ZWQgPSAnbm90LWltcGxlbWVudGVkJyxcbiAgLyoqXG4gICAqIFVua25vd24gZXJyb3IgZHVyaW5nIGV2ZW50IGluaXRpYWxpemF0aW9uXG4gICAqL1xuICBFdmVudEluaXRpYWxpemF0aW9uRXJyb3IgPSAnZXZlbnQtaW5pdGlhbGl6YXRpb24tZXJyb3InLFxuICAvKipcbiAgICogVmVyc2lvbiBvZiB0aGUgZW1iZWRkaW5nIGFwaSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB2ZXJzaW9uIG9mIHRhYmxlYXVcbiAgICovXG4gIEluY29tcGF0aWJsZVZlcnNpb25FcnJvciA9ICdpbmNvbXBhdGlibGUtdmVyc2lvbi1lcnJvcicsXG5cbiAgLyoqXG4gICAqIFVua25vd24ge0BsaW5rIFRhYmxlYXVEaWFsb2dUeXBlfSBwYXNzZWQgaW4gdG8gVml6LmRpc3BsYXlEaWFsb2dBc3luYy5cbiAgICovXG4gIFVua25vd25EaWFsb2dUeXBlID0gJ3Vua25vd24tZGlhbG9nLXR5cGUnLFxuXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgaWYgdGhlIEFQSSBpbnRlcmFjdHMgd2l0aCBhIGZpbHRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgKiBDYW4gYWxzbyBvY2N1cnMgaWYgYSB7QGxpbmsgRmlsdGVyVHlwZX0gaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkLlxuICAgKi9cbiAgRmlsdGVyTWlzc2luZ09yTm90SW1wbGVtZW50ZWQgPSAnZmlsdGVyLW1pc3Npbmctbm90LWltcGxlbWVudGVkJyxcblxuICAvKipcbiAgICogQ2FuIG9jY3VyIGlmIHN0b3J5IHBvaW50IGlkcyBubyBsb25nZXIgbWF0Y2guXG4gICAqL1xuICBTdG9yeVBvaW50SWRNaXNtYXRjaCA9ICdzdG9yeXBvaW50LWlkLW1pc21hdGNoJyxcbn1cblxuLyoqXG4gKiBGb3JtYXRzIGF2YWlsYWJsZSB0byB1c2Ugd2l0aCBkaXNwbGF5U3RhdGljSW1hZ2UgaW4gQFZpekludGVyZmFjZXNcbiAqL1xuZXhwb3J0IGVudW0gRmlsZUZvcm1hdHMge1xuICBQREYgPSAncGRmJyxcbiAgUE5HID0gJ3BuZycsXG59XG5cbmV4cG9ydCBlbnVtIFByaW50T3JpZW50YXRpb24ge1xuICBQb3J0cmFpdCA9ICdwb3J0cmFpdCcsXG4gIExhbmRzY2FwZSA9ICdsYW5kc2NhcGUnLFxufVxuXG5leHBvcnQgZW51bSBQcmludFBhZ2VTaXplIHtcbiAgTGV0dGVyID0gJ2xldHRlcicsXG4gIExlZ2FsID0gJ2xlZ2FsJyxcbiAgTm90ZSA9ICdub3RlJyxcbiAgRm9saW8gPSAnZm9saW8nLFxuICBUYWJsb2lkID0gJ3RhYmxvaWQnLFxuICBMZWRnZXIgPSAnbGVkZ2VyJyxcbiAgU3RhdGVtZW50ID0gJ3N0YXRlbWVudCcsXG4gIEV4ZWN1dGl2ZSA9ICdleGVjdXRpdmUnLFxuICBBMyA9ICdBMycsXG4gIEE0ID0gJ0E0JyxcbiAgQTUgPSAnQTUnLFxuICBCNCA9ICdCNCcsXG4gIEI1ID0gJ0I1JyxcbiAgUXVhcnRvID0gJ3F1YXJ0bycsXG4gIFVuc3BlY2lmaWVkID0gJ3Vuc3BlY2lmaWVkJyxcbn1cblxuZXhwb3J0IGVudW0gUHJpbnRTY2FsaW5nIHtcbiAgQXV0b21hdGljID0gJ2F1dG9tYXRpYycsXG4gIFBlcmMyNSA9ICcyNSUnLFxuICBQZXJjNTAgPSAnNTAlJyxcbiAgUGVyYzYwID0gJzYwJScsXG4gIFBlcmM3NSA9ICc3NSUnLFxuICBQZXJjODAgPSAnODAlJyxcbiAgUGVyYzkwID0gJzkwJScsXG4gIFBlcmMxMDAgPSAnMTAwJScsXG4gIFBlcmMyMDAgPSAnMjAwJScsXG4gIFBlcmM0MDAgPSAnNDAwJScsXG4gIEF0TW9zdDFQYWdlSGlnaCA9ICdhdC1tb3N0LTEtcGFnZS1oaWdoJyxcbiAgQXRNb3N0MlBhZ2VzSGlnaCA9ICdhdC1tb3N0LTItcGFnZXMtaGlnaCcsXG4gIEF0TW9zdDFQYWdlV2lkZSA9ICdhdC1tb3N0LTEtcGFnZS13aWRlJyxcbiAgQXRNb3N0MlBhZ2VzV2lkZSA9ICdhdC1tb3N0LTItcGFnZXMtd2lkZScsXG59XG5cbmV4cG9ydCBlbnVtIFJldmVydFZpelNlbGVjdGlvbiB7XG4gIEFsbCA9ICdhbGwnLFxuICBBeGVzID0gJ2F4ZXMnLFxuICBGaWx0ZXJzID0gJ2ZpbHRlcnMnLFxuICBTb3J0cyA9ICdzb3J0cycsXG4gIFNoZWx2ZXMgPSAnc2hlbHZlcycsXG59XG5cbmV4cG9ydCBlbnVtIFRvb2xiYXJCdXR0b25zIHtcbiAgQWxlcnRzID0gJ2FsZXJ0cycsXG4gIEFza0RhdGEgPSAnYXNrRGF0YScsXG4gIEN1c3RvbVZpZXdzID0gJ2N1c3RvbVZpZXdzJyxcbiAgRGF0YURldGFpbHMgPSAnZGF0YURldGFpbHMnLFxuICBTaGFyZSA9ICdzaGFyZScsXG4gIFN1YnNjcmliZSA9ICdzdWJzY3JpYmUnLFxufVxuXG5leHBvcnQgZW51bSBUb29sYmFyIHtcbiAgVG9wID0gJ3RvcCcsXG4gIEJvdHRvbSA9ICdib3R0b20nLFxuICBIaWRkZW4gPSAnaGlkZGVuJyxcbn1cblxuZXhwb3J0IGVudW0gU2hlZXRTaXplQmVoYXZpb3Ige1xuICBBdXRvbWF0aWMgPSAnYXV0b21hdGljJyxcbiAgRXhhY3RseSA9ICdleGFjdGx5JyxcbiAgUmFuZ2UgPSAncmFuZ2UnLFxuICBBdExlYXN0ID0gJ2F0bGVhc3QnLFxuICBBdE1vc3QgPSAnYXRtb3N0Jyxcbn1cblxuZXhwb3J0IGVudW0gUHVsc2VMYXlvdXQge1xuICBEZWZhdWx0ID0gJ2RlZmF1bHQnLFxuICBDYXJkID0gJ2NhcmQnLFxuICBCYW4gPSAnYmFuJyxcbn1cblxuZXhwb3J0IGVudW0gUHVsc2VUaW1lRGltZW5zaW9uIHtcbiAgVG9kYXkgPSAnVG9kYXknLFxuICBZZXN0ZXJkYXkgPSAnWWVzdGVyZGF5JyxcbiAgV2Vla1RvRGF0ZSA9ICdXZWVrVG9EYXRlJyxcbiAgTGFzdFdlZWsgPSAnTGFzdFdlZWsnLFxuICBNb250aFRvRGF0ZSA9ICdNb250aFRvRGF0ZScsXG4gIExhc3RNb250aCA9ICdMYXN0TW9udGgnLFxuICBRdWFydGVyVG9EYXRlID0gJ1F1YXJ0ZXJUb0RhdGUnLFxuICBMYXN0UXVhcnRlciA9ICdMYXN0UXVhcnRlcicsXG4gIFllYXJUb0RhdGUgPSAnWWVhclRvRGF0ZScsXG4gIExhc3RZZWFyID0gJ0xhc3RZZWFyJyxcbn1cblxuZXhwb3J0IGVudW0gUHVsc2VFcnJvck1lc3NhZ2VWaXNpYmlsaXR5IHtcbiAgVmlzaWJsZSA9ICd2aXNpYmxlJyxcbiAgSGlkZGVuID0gJ2hpZGRlbicsXG4gIFN1cHByZXNzZWQgPSAnc3VwcHJlc3NlZCcsXG59XG5cbi8qKlxuICogQmUgY2FyZWZ1bCB3aGVuIGFkZGluZyBuZXcgZXZlbnQgdHlwZXMuIEV4dGVuc2lvbnMgYW5kIGVtYmVkZGluZyBmb2xsb3cgdHdvIGRpZmZlcmVudCBwYXR0ZXJucyBvbiBob3cgZXZlbnRzIGFyZSBuYW1lZC5cbiAqIEV2ZW50cyBzaG91bGQgYmUgYWxsIGxvd2VyIGNhc2UgYW5kIHdpdGhvdXQgaHlwaGVucyBvciB1bmRlcnNjb3Jlcy5cbiAqL1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHR5cGUgb2YgdGFibGVhdSBlbWJlZGRpbmcgZXZlbnQgdGhhdCBjYW4gYmUgbGlzdGVuZWQgZm9yLlxuICovXG5leHBvcnQgZW51bSBUYWJsZWF1RXZlbnRUeXBlIHtcbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGZpbmlzaGVkIGxvYWRpbmcuIFRoaXMgZXZlbnQgaXMgcmFpc2VkIGFmdGVyIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBmb3Ige0BsaW5rIEZpcnN0SW50ZXJhY3RpdmV9IChpZiBhbnkpIGhhcyBiZWVuIGNhbGxlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbVZpZXdMb2FkZWQgPSAnY3VzdG9tdmlld2xvYWRlZCcsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gcmVtb3ZlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbVZpZXdSZW1vdmVkID0gJ2N1c3RvbXZpZXdyZW1vdmVkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgYmVlbiBzYXZlZCAobmV3bHkgY3JlYXRlZCBvciB1cGRhdGVkKS5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbVZpZXdTYXZlZCA9ICdjdXN0b212aWV3c2F2ZWQnLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNldCBhcyB0aGUgZGVmYXVsdCB2aWV3IGZvciBhIHdvcmtib29rLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgQ3VzdG9tVmlld1NldERlZmF1bHQgPSAnY3VzdG9tdmlld3NldGRlZmF1bHQnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIEVkaXQgQnV0dG9uLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgRWRpdEJ1dHRvbkNsaWNrZWQgPSAnZWRpdGJ1dHRvbmNsaWNrZWQnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIEVkaXQgSW4gRGVza3RvcCBCdXR0b24uXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmcsIFZpZXdpbmdcbiAgICovXG4gIEVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkID0gJ2VkaXRpbmRlc2t0b3BidXR0b25jbGlja2VkJyxcblxuICAvKiogUmFpc2VkIHdoZW4gYW55IGZpbHRlciBoYXMgY2hhbmdlZCBzdGF0ZS4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgRmlsdGVyQ2hhbmdlZCA9ICdmaWx0ZXJjaGFuZ2VkJyxcblxuICAvKiogRmlyZWQgd2hlbiB2aXogc2l6ZSBpcyBrbm93blxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nLCBWaWV3aW5nXG4gICAqL1xuICBGaXJzdFZpelNpemVLbm93biA9ICdmaXJzdHZpenNpemVrbm93bicsXG5cbiAgLyoqIEZpcmVkIHdoZW4gYSB2aXogZmlyc3QgYmVjb21lcyBpbnRlcmFjdGl2ZVxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nLCBWaWV3aW5nLCBQdWxzZVxuICAgKi9cbiAgRmlyc3RJbnRlcmFjdGl2ZSA9ICdmaXJzdGludGVyYWN0aXZlJyxcblxuICAvKiogUmFpc2VkIHdoZW4gYSBjdXN0b20gbWFyayBjb250ZXh0IG1lbnUgaXMgY2xpY2tlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50ID0gJ2N1c3RvbW1hcmtjb250ZXh0bWVudScsXG5cbiAgLyoqIFRoZSBzZWxlY3RlZCBtYXJrcyBvbiBhIHZpc3VhbGl6YXRpb24gaGF2ZSBjaGFuZ2VkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBNYXJrU2VsZWN0aW9uQ2hhbmdlZCA9ICdtYXJrc2VsZWN0aW9uY2hhbmdlZCcsXG5cbiAgLyoqIEEgcGFyYW1ldGVyIGhhcyBoYWQgaXRzIHZhbHVlIG1vZGlmaWVkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBbW1BhcmFtZXRlcl1dIG9iamVjdHMuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlcmNoYW5nZWQnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiBhIHRvb2xiYXIgYnV0dG9uIG9yIGNvbnRyb2wgYmVjb21lcyBhdmFpbGFibGUgb3IgYmVjb21lcyB1bmF2YWlsYWJsZS5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFRvb2xiYXJTdGF0ZUNoYW5nZWQgPSAndG9vbGJhcnN0YXRlY2hhbmdlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vayBpcyByZWFkeSB0byBjbG9zZS4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZ1xuICAgKi9cbiAgV29ya2Jvb2tSZWFkeVRvQ2xvc2UgPSAnd29ya2Jvb2tyZWFkeXRvY2xvc2UnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiB0aGUgd29ya2Jvb2sgaGFzIGJlZW4gcHVibGlzaGVkLiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW4gdXNpbmcgZW1iZWRkZWQgd2ViIGF1dGhvcmluZyBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nXG4gICAqL1xuICBXb3JrYm9va1B1Ymxpc2hlZCA9ICd3b3JrYm9va3B1Ymxpc2hlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIFwicHVibGlzaCBhc1wiIGlzIHN1Y2Nlc3NmdWwuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmdcbiAgICovXG4gIFdvcmtib29rUHVibGlzaGVkQXMgPSAnd29ya2Jvb2twdWJsaXNoZWRhcycsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgVVJMIGFjdGlvbiBvY2N1cnMuIFNlZSB0aGUge0BsaW5rIFVybEFjdGlvbkV2ZW50fSBjbGFzcy5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFVybEFjdGlvbiA9ICd1cmxhY3Rpb24nLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgYWZ0ZXIgYSB0YWIgc3dpdGNoIG9jY3VycyAodGhlIGFjdGl2ZSBzaGVldCBoYXMgY2hhbmdlZCkuIEd1YXJhbnRlZXMgdGhlIHZpeiBvYmplY3Qgd2lsbCBiZSBpbnRlcmFjdGl2ZSBhZnRlciB0aGlzLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgVGFiU3dpdGNoZWQgPSAndGFic3dpdGNoZWQnLFxuICAvKipcbiAgICpcbiAgICogUmFpc2VkIGFmdGVyIGEgbmV3IHN0b3J5IHBvaW50IGJlY29tZXMgYWN0aXZlLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgU3RvcnlQb2ludFN3aXRjaGVkID0gJ3N0b3J5cG9pbnRzd2l0Y2hlZCcsXG4gIC8qKlxuICAgKlxuICAgKiBSYWlzZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgbG9hZGluZyB0aGUgY29udGVudHMgb2YgdGhlIHdlYmNvbXBvbmVudC5cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZywgQXNrRGF0YVxuICAgKi9cbiAgVml6TG9hZEVycm9yID0gJ3ZpemxvYWRlcnJvcicsXG4gIC8qKlxuICAgKiBSYWlzZWQgYWZ0ZXIgdGhlIGlmcmFtZSBzcmMgYXR0cmlidXRlIGhhcyBiZWVuIHVwZGF0ZWRcbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZywgQXNrRGF0YVxuICAgKi9cbiAgSWZyYW1lU3JjVXBkYXRlZCA9ICdpZnJhbWVzcmN1cGRhdGVkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gY2hhbmdlcyBhcmUgbWFkZSB0byBzdW1tYXJ5IGRhdGEuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBTdW1tYXJ5RGF0YUNoYW5nZWQgPSAnc3VtbWFyeWRhdGFjaGFuZ2VkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gdGFibGVhdSAodml6LWNsaWVudCkgaXMgcmVhZHkgdG8gcmVjZWl2ZSBhbiBhdXRoIHRva2VuLlxuICAgKiBVc2VkIGZvciBhdXRoZW50aWNhdGlvbiBpbiBzYWxlc2ZvcmNlIG5hdGl2ZSBtb2RlLlxuICAgKlxuICAgKiBAaGlkZGVuXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmcsIFZpZXdpbmcsXG4gICAqL1xuICBSZWFkeVRvUmVjZWl2ZUF1dGhUb2tlbiA9ICdyZWFkeXRvcmVjZWl2ZWF1dGh0b2tlbicsXG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gdGhlIFB1bHNlIG1ldHJpYyBzaXplIGlzIGtub3duXG4gICAqXG4gICAqIEBjYXRlZ29yeSBQdWxzZVxuICAgKi9cbiAgRmlyc3RQdWxzZU1ldHJpY1NpemVLbm93biA9ICdmaXJzdHB1bHNlbWV0cmljc2l6ZWtub3duJyxcblxuICAvKipcbiAgICogRmlyZWQgd2hlbiBhbiBpbnRlcm5hbCBQdWxzZSBlcnJvciBpcyBlbmNvdW50ZXJlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IFB1bHNlXG4gICAqL1xuICBQdWxzZUVycm9yID0gJ3B1bHNlZXJyb3InLFxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSBQdWxzZSBmaWx0ZXJzIGNoYW5nZVxuICAgKlxuICAgKiBAY2F0ZWdvcnkgUHVsc2VcbiAgICovXG4gIFB1bHNlRmlsdGVyc0NoYW5nZWQgPSAncHVsc2VmaWx0ZXJzY2hhbmdlZCcsXG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gYSBQdWxzZSBpbnNpZ2h0IGlzIGRpc2NvdmVyZWRcbiAgICpcbiAgICogQGNhdGVnb3J5IFB1bHNlXG4gICAqL1xuICBQdWxzZUluc2lnaHREaXNjb3ZlcmVkID0gJ3B1bHNlaW5zaWdodGRpc2NvdmVyZWQnLFxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSBQdWxzZSBtZXRyaWMgc2l6ZSBjaGFuZ2VzXG4gICAqXG4gICAqIEBjYXRlZ29yeSBQdWxzZVxuICAgKi9cbiAgUHVsc2VNZXRyaWNTaXplQ2hhbmdlZCA9ICdwdWxzZW1ldHJpY3NpemVjaGFuZ2VkJyxcblxuICAvKipcbiAgICogRmlyZWQgd2hlbiB0aGUgUHVsc2UgbWV0cmljIHRpbWUgZGltZW5zaW9uIGNoYW5nZXNcbiAgICpcbiAgICogQGNhdGVnb3J5IFB1bHNlXG4gICAqL1xuICBQdWxzZVRpbWVEaW1lbnNpb25DaGFuZ2VkID0gJ3B1bHNldGltZWRpbWVuc2lvbmNoYW5nZWQnLFxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSBQdWxzZSBVUkwgY2hhbmdlc1xuICAgKlxuICAgKiBAY2F0ZWdvcnkgUHVsc2VcbiAgICovXG4gIFB1bHNlVXJsQ2hhbmdlZCA9ICdwdWxzZXVybGNoYW5nZWQnLFxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGxvY2F0aW9uIG9mIGEgY29udGV4dCBtZW51IHdoZXJlIHVzZXJzIGNhbiBhZGQgZXh0ZXJuYWwgbWVudSBpdGVtcy5cbiAqL1xuZXhwb3J0IGVudW0gQXBpTWVudVR5cGUge1xuICAvKiogRXh0ZXJuYWwgbWVudSBpdGVtIHdpbGwgYmUgaW5qZWN0ZWQgaW4gdWJlcnRpcCBkaWFsb2cgKi9cbiAgVWJlcnRpcCA9ICd1YmVydGlwJyxcbn1cblxuLyoqIFlvdSBjYW4gdXNlIHRoaXMgdHlwZSB3aXRoIGEge0BsaW5rIFZpen0gb2JqZWN0LiAqL1xuZXhwb3J0IGVudW0gVGFibGVhdURpYWxvZ1R5cGUge1xuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBkb3dubG9hZCBQREYgZGlhbG9nLlxuICAgKi9cbiAgRXhwb3J0UERGID0gJ2V4cG9ydC1wZGYnLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBkb3dubG9hZCBQb3dlclBvaW50IGRpYWxvZy5cbiAgICovXG4gIEV4cG9ydFBvd2VyUG9pbnQgPSAnZXhwb3J0LXBvd2VycG9pbnQnLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBkb3dubG9hZCBEYXRhIGRpYWxvZy5cbiAgICovXG4gIEV4cG9ydERhdGEgPSAnZXhwb3J0LWRhdGEnLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBkb3dubG9hZCBDcm9zc1RhYiBkaWFsb2cuXG4gICAqL1xuICBFeHBvcnRDcm9zc1RhYiA9ICdleHBvcnQtY3Jvc3MtdGFiJyxcbiAgLyoqXG4gICAqIFVzZWQgdG8gZGlzcGxheSB0aGUgZG93bmxvYWQgV29ya2Jvb2sgZGlhbG9nLlxuICAgKi9cbiAgRXhwb3J0V29ya2Jvb2sgPSAnZXhwb3J0LXdvcmtib29rJyxcbiAgLyoqXG4gICAqIFVzZWQgdG8gZGlzcGxheSB0aGUgU2hhcmUgZGlhbG9nLlxuICAgKi9cbiAgU2hhcmUgPSAnc2hhcmUnLFxufVxuIiwiaW1wb3J0IHsgRmlsdGVyT3B0aW9ucyB9IGZyb20gJy4uL1NoYXJlZC9GaWx0ZXJJbnRlcmZhY2VzJztcbmltcG9ydCB7IEZpbHRlckRvbWFpblR5cGUsIEZpbHRlclR5cGUsIEZpbHRlclVwZGF0ZVR5cGUgfSBmcm9tICcuLi9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1JztcbmltcG9ydCB7IFB1bHNlTGF5b3V0LCBQdWxzZVRpbWVEaW1lbnNpb24gfSBmcm9tICcuL0VudW1zJztcbmltcG9ydCB7IFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MgfSBmcm9tICcuL1dlYkNvbXBvbmVudEludGVyZmFjZXMnO1xuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSA8dGFibGVhdS1wdWxzZT4gd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGVudW0gUHVsc2VBdHRyaWJ1dGVzIHtcbiAgRGlzYWJsZUV4cGxvcmVGaWx0ZXIgPSAnZGlzYWJsZS1leHBsb3JlLWZpbHRlcicsXG4gIExheW91dCA9ICdsYXlvdXQnLFxuICBPbkZpcnN0SW50ZXJhY3RpdmUgPSAnb25GaXJzdEludGVyYWN0aXZlJyxcbiAgT25GaXJzdFB1bHNlTWV0cmljU2l6ZUtub3duID0gJ29uRmlyc3RQdWxzZU1ldHJpY1NpemVLbm93bicsXG4gIE9uUHVsc2VVcmxFcnJvciA9ICdvblB1bHNlRXJyb3InLFxuICBPblB1bHNlRmlsdGVyc0NoYW5nZWQgPSAnb25QdWxzZUZpbHRlcnNDaGFuZ2VkJyxcbiAgT25QdWxzZUluc2lnaHREaXNjb3ZlcmVkID0gJ29uUHVsc2VJbnNpZ2h0RGlzY292ZXJlZCcsXG4gIE9uUHVsc2VNZXRyaWNTaXplQ2hhbmdlZCA9ICdvblB1bHNlTWV0cmljU2l6ZUNoYW5nZWQnLFxuICBPblB1bHNlVGltZURpbWVuc2lvbkNoYW5nZWQgPSAnb25QdWxzZVRpbWVEaW1lbnNpb25DaGFuZ2VkJyxcbiAgT25QdWxzZVVybENoYW5nZWQgPSAnb25QdWxzZVVybENoYW5nZWQnLFxuICBUaW1lRGltZW5zaW9uID0gJ3RpbWUtZGltZW5zaW9uJyxcbiAgVG9rZW5PcHRpb25hbCA9ICd0b2tlbi1vcHRpb25hbCcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VTZXR0aW5ncyBleHRlbmRzIFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3Mge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGV4cGxvcmUgZmlsdGVyIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBkaXNhYmxlLWV4cGxvcmUtZmlsdGVyPlxuICAgKiBgYGBcbiAgICovXG4gIGRpc2FibGVFeHBsb3JlRmlsdGVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBkZXNpcmVkIGN1c3RvbSBsYXlvdXQgb2YgdGhlIFB1bHNlIG1ldHJpYy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgbGF5b3V0PVwiY2FyZFwiPlxuICAgKiBgYGBcbiAgICovXG4gIGxheW91dD86IFB1bHNlTGF5b3V0O1xuXG4gIC8qKlxuICAgKiBUaGUgdG9rZW4gdXNlZCBmb3IgYXV0aG9yaXphdGlvblxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgdG9rZW49XCJzb21lLXRva2VuLWNvbnRhaW5pbmctY2xpZW50SWRcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIHRva2VuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlICdsb2FkaW5nJyBhdHRyaWJ1dGUgb2YgdGhlIGVtYmVkZGVkIGlmcmFtZS5cbiAgICogU2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaWZyYW1lI2xvYWRpbmdcbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1sb2FkaW5nPVwibGF6eVwiIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItbG9hZGluZz1cImxhenlcIiAvPlxuICAgKiA8dGFibGVhdS1wdWxzZSBpZD1cInRhYmxlYXVQdWxzZVwiIGlmcmFtZS1hdHRyLWxvYWRpbmc9XCJsYXp5XCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBpZnJhbWVBdHRyaWJ1dGVMb2FkaW5nPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlICdzdHlsZScgYXR0cmlidXRlIG9mIHRoZSBlbWJlZGRlZCBpZnJhbWUuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCByZWRcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdHRyLXN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgcmVkXCIgLz5cbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBpZnJhbWUtYXR0ci1zdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkIHJlZFwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlU3R5bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgJ2NsYXNzJyBhdHRyaWJ1dGUgb2YgdGhlIGVtYmVkZGVkIGlmcmFtZSBwcm92aWRpbmcgYWNjZXNzIHRvIGFueVxuICAgKiBjdXN0b20gc2VsZWN0b3JzIGRlZmluZWQgaW4gdGhlIGA8aWZyYW1lLXN0eWxlPmAgY2hpbGQgdGFnLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItY2xhc3M9XCJyZWQtYm9yZGVyXCI+XG4gICAqICAgPGlmcmFtZS1zdHlsZT5cbiAgICogICAgIC5yZWQtYm9yZGVyIHtcbiAgICogICAgICAgYm9yZGVyOiAxcHggc29saWQgcmVkO1xuICAgKiAgICAgfVxuICAgKiAgIDwvaWZyYW1lLXN0eWxlPlxuICAgKiA8L3RhYmxlYXUtcHVsc2U+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlQ2xhc3M/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBCYXNlNjQtZW5jb2RlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFB1bHNlIHRoZW1lIG9iamVjdC5cbiAgICpcbiAgICovXG4gIHRoZW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGRlc2lyZWQgdGltZSBkaW1lbnNpb24gdG8gYXBwbHkgdG8gdGhlIFB1bHNlIG1ldHJpYyBieSBkZWZhdWx0LlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiB0aW1lLWRpbWVuc2lvbj1cIk1vbnRoVG9EYXRlXCI+XG4gICAqIGBgYFxuICAgKi9cbiAgdGltZURpbWVuc2lvbj86IFB1bHNlVGltZURpbWVuc2lvbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRva2VuIGlzIG9wdGlvbmFsLlxuICAgKiBXaGVuIHRydWUsIHRoZSBtZXRyaWMgd2lsbCBhdHRlbXB0IHRvIGxvYWQgZXZlbiB3aXRob3V0IHNwZWNpZnlpbmcgYSB0b2tlbi5cbiAgICogVGhpcyB3YXMgYWRkZWQgc3BlY2lmaWNhbGx5IGZvciB0aGUgTW9iaWxlIHRlYW0gd2hvIHVzZXMgUEtDRSBmbG93IHRvIGluaXRpYXRlIHRoZSBzZXNzaW9uXG4gICAqIGFuZCBzaG91bGQgbm90IGJlIGFkdmVydGlzZWQgdG8gM3JkIHBhcnRpZXMuXG4gICAqXG4gICAqIEBpZ25vcmVcbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgdG9rZW4tb3B0aW9uYWw+XG4gICAqIGBgYFxuICAgKi9cbiAgaXNUb2tlbk9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgY2hpbGQgdGFncyBmb3IgVGFibGVhdVB1bHNlIGN1c3RvbSBlbGVtZW50LlxuICovXG5leHBvcnQgZW51bSBQdWxzZUNoaWxkRWxlbWVudHMge1xuICAvKipcbiAgICogQ3VzdG9tIHN0eWxlcyBhcHBsaWNhYmxlIHRvIHRoZSBlbWJlZGRlZCBpZnJhbWUgZWxlbWVudCBpdHNlbGYgKG5vdCBpbnNpZGUgaXQpLlxuICAgKi9cbiAgSWZyYW1lU3R5bGUgPSAnaWZyYW1lLXN0eWxlJyxcblxuICAvKipcbiAgICogQSBwYXJhbWV0ZXIgdG8gYmUgdXNlZCBpbiB0aGUgUHVsc2UgdGhlbWUuXG4gICAqL1xuICBUaGVtZVBhcmFtZXRlciA9ICd0aGVtZS1wYXJhbWV0ZXInLFxuXG4gIC8qKlxuICAgKiBDb250YWlucyBhIGxpc3Qgb2YgZmlsdGVyIHBhcmFtZXRlcnMuXG4gICAqL1xuICBQdWxzZUZpbHRlciA9ICdwdWxzZS1maWx0ZXInLFxufVxuXG4vKipcbiAqIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSA8dGhlbWUtcGFyYW1ldGVyPiBjaGlsZCBlbGVtZW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxzZVRoZW1lUHJvcGVydHkge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgdGhlbWUgcGFyYW1ldGVyIHRvIGJlIHNldC5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVmFsdWUgZm9yIHRoZSB0aGVtZSBwYXJhbWV0ZXIgYmVpbmcgc2V0LlxuICAgKi9cbiAgdmFsdWU6IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgdHlwZSBvZiB0aGVtZSBwYXJhbWV0ZXIgYmVpbmcgc2V0LlxuICAgKi9cbiAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBUaGUgYXR0cmlidXRlcyBvZiB0aGUgY2hpbGQgZWxlbWVudHMgb2YgPHRhYmxlYXUtcHVsc2U+LlxuICovXG5leHBvcnQgZW51bSBQdWxzZUNoaWxkRWxlbWVudEF0dHJpYnV0ZXMge1xuICBOYW1lID0gJ25hbWUnLFxuICBGaWVsZCA9ICdmaWVsZCcsXG4gIFZhbHVlID0gJ3ZhbHVlJyxcbiAgVHlwZSA9ICd0eXBlJyxcbn1cblxuLyoqXG4gKiBUaGUgUHVsc2UgdGhlbWUgZGF0YSBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCB0eXBlIFB1bHNlVGhlbWUgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcblxuLyoqXG4gKiBBY3Rpb25zIHJlbGF0ZWQgdG8gZXZlbnRzIGFuZCBzdGF0ZSBvZiB0aGUgUHVsc2UgbWV0cmljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VBY3Rpb25zIHtcbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIGxpc3Qgb2YgcHJvdmlkZWQgY2F0ZWdvcmljYWwgZmlsdGVyIHZhbHVlcyB0byB0aGUgUHVsc2UgbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0gZmllbGROYW1lICAgICAgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGZpbHRlciBvbi5cbiAgICogQHBhcmFtIHZhbHVlcyAgICAgICAgIFRoZSBsaXN0IG9mIHZhbHVlcyB0byBmaWx0ZXIgb24uXG4gICAqIEBwYXJhbSB1cGRhdGVUeXBlICAgICBUaGUgdXBkYXRlIHR5cGUgb2YgdGhpcyBmaWx0ZXIgKGFkZCwgYWxsLCByZW1vdmUsIHJlcGxhY2UpLlxuICAgKiBAcGFyYW0gZmlsdGVyT3B0aW9ucyAgQWR2YW5jZWQgZmlsdGVyIG9wdGlvbnMgKGlzRXhjbHVkZU1vZGUpLlxuICAgKiBAcmV0dXJucyBUaGUgZmllbGQgbmFtZSB0aGF0IHRoZSBmaWx0ZXIgaXMgYXBwbGllZCBvbi5cbiAgICovXG4gIGFwcGx5RmlsdGVyQXN5bmMoZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXksIHVwZGF0ZVR5cGU6IEZpbHRlclVwZGF0ZVR5cGUsIG9wdGlvbnM6IEZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYXQgbGVhc3Qgb25lIGNhdGVnb3JpY2FsIGZpbHRlciB2YWx1ZSB0byB0aGUgUHVsc2UgbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5PHtcbiAgICogICAgICAgZmllbGROYW1lOiBzdHJpbmc7XG4gICAqICAgICAgIHZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXk7XG4gICAqICAgICAgIHVwZGF0ZVR5cGU6IEZpbHRlclVwZGF0ZVR5cGU7XG4gICAqICAgICAgIG9wdGlvbnM6IEZpbHRlck9wdGlvbnM7XG4gICAqICAgICB9Pn0gZmlsdGVycyBUaGUgc2V0IG9mIGZpbHRlcnMgdG8gYXBwbHkuXG4gICAqIEByZXR1cm5zIFRoZSBmaWVsZCBuYW1lcyB0aGF0IHRoZSBmaWx0ZXIgd2FzIGFwcGxpZWQgb24uXG4gICAqL1xuICBhcHBseUZpbHRlcnNBc3luYyhcbiAgICBmaWx0ZXJzOiBBcnJheTx7XG4gICAgICBmaWVsZE5hbWU6IHN0cmluZztcbiAgICAgIHZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXk7XG4gICAgICB1cGRhdGVUeXBlOiBGaWx0ZXJVcGRhdGVUeXBlO1xuICAgICAgb3B0aW9uczogRmlsdGVyT3B0aW9ucztcbiAgICB9PixcbiAgKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCB0aW1lIGRpbWVuc2lvbiBhcHBsaWVkIHRvIHRoZSBQdWxzZSBtZXRyaWMuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHRpbWUgZGltZW5zaW9uLlxuICAgKi9cbiAgZ2V0VGltZURpbWVuc2lvbkFzeW5jKCk6IFByb21pc2U8UHVsc2VUaW1lRGltZW5zaW9uPjtcblxuICAvKipcbiAgICogQXBwbGllcyB0aGUgdGltZSBkaW1lbnNpb24gdG8gdGhlIFB1bHNlIG1ldHJpYy5cbiAgICpcbiAgICogQHBhcmFtIHtQdWxzZVRpbWVEaW1lbnNpb259IHRpbWVEaW1lbnNpb24gVGhlIHRpbWUgZGltZW5zaW9uIHRvIGFwcGx5XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXBwbHlUaW1lRGltZW5zaW9uQXN5bmModGltZURpbWVuc2lvbjogUHVsc2VUaW1lRGltZW5zaW9uKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogR2V0cyBhIGxpc3Qgb2YgZmlsdGVycyBmb3IgdGhlIFB1bHNlIG1ldHJpYy5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8UHVsc2VGaWx0ZXI+Pn0gVGhlIGxpc3Qgb2YgZmlsdGVycy5cbiAgICovXG4gIGdldEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PFB1bHNlRmlsdGVyPj47XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgZXhpc3RpbmcgZmlsdGVyIGZvciB0aGUgZ2l2ZW4gZmllbGQgb24gdGhlIFB1bHNlIG1ldHJpYy5cbiAgICpcbiAgICogQHBhcmFtIGZpZWxkTmFtZSAgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGNsZWFyIGZpbHRlciBvbi5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGZpZWxkIHRvIGNsZWFyIGZpbHRlciBvbi5cbiAgICovXG4gIGNsZWFyRmlsdGVyQXN5bmMoZmllbGROYW1lczogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGV4aXN0aW5nIGZpbHRlciBmb3IgdGhlIGdpdmVuIGZpZWxkcyBvbiB0aGUgUHVsc2UgbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGZpZWxkTmFtZXMgVGhlIG5hbWUgb2YgdGhlIGZpZWxkcyB0byBjbGVhciBmaWx0ZXIgb24uXG4gICAqIEByZXR1cm5zIFRoZSBmaWVsZHMgdG8gY2xlYXIgZmlsdGVyIG9uLlxuICAgKi9cbiAgY2xlYXJGaWx0ZXJzQXN5bmMoZmllbGROYW1lczogQXJyYXk8c3RyaW5nPik6IFByb21pc2U8QXJyYXk8c3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIFJlc2V0cyBhbGwgdGhlIGV4aXN0aW5nIGZpbHRlcnMgb24gdGhlIFB1bHNlIG1ldHJpYy5cbiAgICovXG4gIGNsZWFyQWxsRmlsdGVyc0FzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBmaWx0ZXIgdGhlIFB1bHNlIG1ldHJpYyBiZWZvcmUgaW5pdGlhbGl6YXRpb24uIElmIHVzZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIGl0IHdpbGwgcmUtcmVuZGVyIHRoZSBtZXRyaWMuXG4gICAqIEZvciBmaWx0ZXJpbmcgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIHVzZSB0aGUgb3RoZXIgZmlsdGVyaW5nIG1ldGhvZHMsIHN1Y2ggYXMgYGFwcGx5RmlsdGVyQXN5bmNgLlxuICAgKlxuICAgKiBJZiB5b3UgYWRkIHRoZSBzYW1lIGZpbHRlciBmaWVsZHMgdXNpbmcgdGhlIGBhZGRGaWx0ZXIoKWAgbWV0aG9kIGFuZCBieSB1c2luZyB0aGUgYDxwdWxzZS1maWx0ZXI+YCBlbGVtZW50IGluIHRoZSBgPHRhYmxlYXUtcHVsc2U+YCB3ZWIgY29tcG9uZW50LFxuICAgKiB5b3UgbWlnaHQgZXhwZXJpZW5jZSB1bmV4cGVjdGVkIGJlaGF2aW9yLlxuICAgKlxuICAgKiBAcGFyYW0gZmllbGROYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBmaWx0ZXIgb24uXG4gICAqIEBwYXJhbSB2YWx1ZSBTaW5nbGUgdmFsdWUgb3IgYSBsaXN0IG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMgdG8gZmlsdGVyIG9uLlxuICAgKlxuICAgKiBgYGBcbiAgICogcHVsc2UuYWRkRmlsdGVyKCdSZWdpb24nLCAnQ2VudHJhbCxXZXN0Jyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRmlsdGVyKGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgICogVXNlIHRoaXMgbWV0aG9kIHRvIHJlYWRqdXN0IHRoZSBkaW1lbnNpb25zIG9mIHRoZSBlbWJlZGRlZCBQdWxzZSBtZXRyaWMgaW4gcmVzcG9uc2UgdG8gdGhpbmdzIGxpa2UgYSB3aW5kb3cgcmVzaXplLCBkZXZpY2Ugb3JpZW50YXRpb24gY2hhbmdlLCBvclxuICAgKiBwYXJlbnQgY29udGFpbmVyIHJlc2l6ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiBwdWxzZS5yZXNpemUoKSk7XG4gICAqXG4gICAqIG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiBwdWxzZS5yZXNpemUoKSkub2JzZXJ2ZShwdWxzZS5wYXJlbnRFbGVtZW50KTtcbiAgICogYGBgXG4gICAqL1xuICByZXNpemUoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdG9wLWxldmVsIFB1bHNlIG9iamVjdC5cbiAqKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2UgZXh0ZW5kcyBQdWxzZVNldHRpbmdzLCBQdWxzZUFjdGlvbnMge31cblxuLyoqXG4gKiBBIFB1bHNlRmllbGRWYWx1ZUFycmF5IGlzIGFuIGFycmF5IHRoYXQgY2FuIGNvbnRhaW4gc3RyaW5ncywgYm9vbGVhbnMsIG9yIG51bGxzLCBidXQgd2lsbCBuZXZlciBjb250YWluIGJvdGggc3RyaW5ncyBhbmQgYm9vbGVhbnMgYXQgdGhlIHNhbWUgdGltZS5cbiAqL1xuZXhwb3J0IHR5cGUgUHVsc2VGaWVsZFZhbHVlQXJyYXkgPSBBcnJheTxib29sZWFuIHwgbnVsbD4gfCBBcnJheTxzdHJpbmcgfCBudWxsPjtcblxuLyoqXG4gKlxuICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIG9mIHRoZSBQdWxzZSBmaWx0ZXIgdHlwZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VGaWx0ZXIge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIGZpbHRlcmVkLiAgTm90ZSB0aGF0IHRoaXMgaXMgdGhlIGNhcHRpb25cbiAgICogYXMgc2hvd24gaW4gdGhlIFVJLCBhbmQgbm90IHRoZSBhY3R1YWwgZGF0YWJhc2UgZmllbGQgbmFtZS5cbiAgICovXG4gIGZpZWxkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgZmlsdGVyLlxuICAgKi9cbiAgZmlsdGVyVHlwZTogRmlsdGVyVHlwZTtcblxuICAvKipcbiAgICogVGhlIFB1bHNlIG1ldHJpYyBJRC5cbiAgICovXG4gIG1ldHJpY0lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBQdWxzZSBDYXRlZ29yaWNhbCBGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yaWNhbFB1bHNlRmlsdGVyIGV4dGVuZHMgUHVsc2VGaWx0ZXIge1xuICAvKipcbiAgICogQSBsaXN0IG9mIHZhbHVlcyBhcHBsaWVkIHRvIHRoaXMgY2F0ZWdvcmljYWwgZmlsdGVyLiBOb3RpY2UgdGhhdCBpZiB0aGUgUHVsc2UgbWV0cmljXG4gICAqIGhhcyBhIGRlZmluaXRpb24gZmlsdGVyLCB0aGUgY3VycmVudCByZWxldmFudCB2YWx1ZXMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZ1xuICAgKiBgZ2V0RG9tYWluQXN5bmMoRmlsdGVyRG9tYWluVHlwZS5SZWxldmFudClgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwbGllZFZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXk7XG5cbiAgLyoqXG4gICAqIFRydWUgaWYgdGhpcyBmaWx0ZXIgaXMgYW4gZXhjbHVkZSBmaWx0ZXIsIGZhbHNlIGlmIGFuIGluY2x1ZGUgZmlsdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFeGNsdWRlTW9kZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVHJ1ZSBpZiBhbGwgdGhlIHZhbHVlcyBhcmUgc2VsZWN0ZWQgZm9yIHRoaXMgZmlsdGVyLiBXaGVuICdBbGwnIGlzIHNlbGVjdGVkLFxuICAgKiBhcHBsaWVkVmFsdWVzIHJldHVybnMgYW4gZW1wdHkgbGlzdC5cbiAgICovXG4gIHJlYWRvbmx5IGlzQWxsU2VsZWN0ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBkb21haW4gb2YgYSBjYXRlZ29yaWNhbCBmaWx0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IHVuZGVmaW5lZCl9IHNlYXJjaFRlcm0gVGhlIHRlcm0gdG8gc2VhcmNoIGZvciBpbiB0aGUgZG9tYWluLlxuICAgKiBAcGFyYW0geyhudW1iZXIgfCB1bmRlZmluZWQpfSBwYWdlU2l6ZSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdmFsdWVzIHRvIHJldHVybi4gSWdub3JlZCB3aGVuIG5leHRQYWdlVG9rZW4gaXMgbm90IHByb3ZpZGVkLlxuICAgKiBAcGFyYW0geyhzdHJpbmcgfCB1bmRlZmluZWQpfSBuZXh0UGFnZVRva2VuIFRoZSBuZXh0IHBhZ2UgdG9rZW4gcmV0dXJuZWQgYnkgUHVsc2Ugd2hlbiBhZGRpdGlvbmFsIHZhbHVlcyBhcmUgYXZhaWxhYmxlLlxuICAgKiBAcGFyYW0geyhGaWx0ZXJEb21haW5UeXBlIHwgdW5kZWZpbmVkKX0gZG9tYWluVHlwZSBUaGUgZG9tYWluIHR5cGUgb2YgdGhlIGZpbHRlci5cbiAgICogQHJldHVybnMge1Byb21pc2U8UHVsc2VDYXRlZ29yaWNhbERvbWFpbj59IEEgcHJvbWlzZSBjb250YWluaW5nIHRoZSBjYXRlZ29yaWNhbCBkb21haW4gZm9yIHRoZSBmaWx0ZXIuXG4gICAqL1xuICBnZXREb21haW5Bc3luYzogKFxuICAgIHNlYXJjaFRlcm0/OiBzdHJpbmcsXG4gICAgcGFnZVNpemU/OiBudW1iZXIsXG4gICAgbmV4dFBhZ2VUb2tlbj86IHN0cmluZyxcbiAgICBkb21haW5UeXBlPzogRmlsdGVyRG9tYWluVHlwZSxcbiAgKSA9PiBQcm9taXNlPFB1bHNlQ2F0ZWdvcmljYWxEb21haW4+O1xufVxuXG4vKipcbiAqIFRoZSBkb21haW4gb2YgYSBQdWxzZSBjYXRlZ29yaWNhbCBmaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxzZUNhdGVnb3JpY2FsRG9tYWluIHtcbiAgLyoqXG4gICAqIFRoZSBkb21haW4gdHlwZSAocmVsZXZhbnQsIGRhdGFiYXNlKVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogRmlsdGVyRG9tYWluVHlwZTtcbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHZhbHVlcyBpbiB0aGUgZG9tYWluIG9mIHRoZSBmaWx0ZXJcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXk7XG4gIC8qKlxuICAgKiBUaGUgdG90YWwgYXZhaWxhYmxlIG51bWJlciBvZiB2YWx1ZXMgaW4gdGhlIGRvbWFpbiBvZiB0aGUgZmlsdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgdG90YWxBdmFpbGFibGU6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBuZXh0IHBhZ2UgdG9rZW4gcmV0dXJuZWQgYnkgUHVsc2Ugd2hlbiBhZGRpdGlvbmFsIHZhbHVlcyBhcmUgYXZhaWxhYmxlLlxuICAgKiBQcm92aWRlIHRoaXMgdG9rZW4gdG8gZ2V0RG9tYWluQXN5bmMgdG8gZ2V0IHRoZSBuZXh0IHBhZ2Ugb2YgdmFsdWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV4dFBhZ2VUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHtcbiAgQ3Jvc3N0YWJGaWxlRm9ybWF0LFxuICBEZXZpY2VUeXBlLFxuICBQcmludE9yaWVudGF0aW9uLFxuICBQcmludFBhZ2VTaXplLFxuICBQcmludFNjYWxpbmcsXG4gIFRhYmxlYXVEaWFsb2dUeXBlLFxuICBUYWJsZWF1RXZlbnRUeXBlLFxuICBUb29sYmFyLFxufSBmcm9tICcuL0VudW1zJztcbmltcG9ydCB7IFNoZWV0U2l6ZSB9IGZyb20gJy4vU2hlZXRJbnRlcmZhY2VzJztcbmltcG9ydCB7IFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MsIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIH0gZnJvbSAnLi9XZWJDb21wb25lbnRJbnRlcmZhY2VzJztcbmltcG9ydCB7IFdvcmtib29rIH0gZnJvbSAnLi9Xb3JrYm9va0ludGVyZmFjZSc7XG5cbi8qKlxuICogVGhlIHNoYXJlZCBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIEhUTUwgYXR0cmlidXRlcyBmb3IgdGhlIDx0YWJsZWF1LXZpej4gYW5kIDx0YWJsZWF1LWF1dGhvcmluZy12aXo+IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFZpelNoYXJlZEF0dHJpYnV0ZXMge1xuICBUb3VjaE9wdGltaXplID0gJ3RvdWNoLW9wdGltaXplJyxcbiAgSGlkZUVkaXRJbkRlc2t0b3BCdXR0b24gPSAnaGlkZS1lZGl0LWluLWRlc2t0b3AtYnV0dG9uJyxcbiAgU3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yID0gJ3N1cHByZXNzLWRlZmF1bHQtZWRpdC1iZWhhdmlvcicsXG4gIERpc2FibGVWZXJzaW9uQ2hlY2sgPSAnZGlzYWJsZS12ZXJzaW9uLWNoZWNrJyxcbiAgT25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZCA9ICdvbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkJyxcbiAgT25GaXJzdFZpelNpemVLbm93biA9ICdvbkZpcnN0Vml6U2l6ZUtub3duJyxcbiAgT25GaXJzdEludGVyYWN0aXZlID0gJ29uRmlyc3RJbnRlcmFjdGl2ZScsXG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIEhUTUwgYXR0cmlidXRlcyBmb3IgdGhlIDx0YWJsZWF1LXZpej4gd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGVudW0gVml6QXR0cmlidXRlcyB7XG4gIERpc2FibGVVcmxBY3Rpb25zUG9wdXBzID0gJ2Rpc2FibGUtdXJsLWFjdGlvbnMnLFxuICBIaWRlVGFicyA9ICdoaWRlLXRhYnMnLFxuICBUb29sYmFyID0gJ3Rvb2xiYXInLFxuICBJbnN0YW5jZUlkVG9DbG9uZSA9ICdpbnN0YW5jZS1pZC10by1jbG9uZScsXG4gIERldmljZSA9ICdkZXZpY2UnLFxuICBIaWRlRWRpdEJ1dHRvbiA9ICdoaWRlLWVkaXQtYnV0dG9uJyxcbiAgT25FZGl0QnV0dG9uQ2xpY2tlZCA9ICdvbkVkaXRCdXR0b25DbGlja2VkJyxcbiAgT25GaWx0ZXJDaGFuZ2VkID0gJ29uRmlsdGVyQ2hhbmdlZCcsXG4gIE9uQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQgPSAnb25DdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudCcsXG4gIE9uTWFya1NlbGVjdGlvbkNoYW5nZWQgPSAnb25NYXJrU2VsZWN0aW9uQ2hhbmdlZCcsXG4gIE9uUGFyYW1ldGVyQ2hhbmdlZCA9ICdvblBhcmFtZXRlckNoYW5nZWQnLFxuICBPblRvb2xiYXJTdGF0ZUNoYW5nZWQgPSAnb25Ub29sYmFyU3RhdGVDaGFuZ2VkJyxcbiAgT25VcmxBY3Rpb24gPSAnb25VcmxBY3Rpb24nLFxuICBPblRhYlN3aXRjaGVkID0gJ29uVGFiU3dpdGNoZWQnLFxuICBPbkN1c3RvbVZpZXdMb2FkZWQgPSAnb25DdXN0b21WaWV3TG9hZGVkJyxcbiAgT25DdXN0b21WaWV3UmVtb3ZlZCA9ICdvbkN1c3RvbVZpZXdSZW1vdmVkJyxcbiAgT25DdXN0b21WaWV3U2F2ZWQgPSAnb25DdXN0b21WaWV3U2F2ZWQnLFxuICBPbkN1c3RvbVZpZXdTZXREZWZhdWx0ID0gJ29uQ3VzdG9tVmlld1NldERlZmF1bHQnLFxuICBPblN0b3J5UG9pbnRTd2l0Y2hlZCA9ICdvblN0b3J5UG9pbnRTd2l0Y2hlZCcsXG4gIE9uU3VtbWFyeURhdGFDaGFuZ2VkID0gJ29uU3VtbWFyeURhdGFDaGFuZ2VkJyxcbiAgT25SZWFkeVRvUmVjZWl2ZUF1dGhUb2tlbiA9ICdvblJlYWR5VG9SZWNlaXZlQXV0aFRva2VuJyxcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgPHRhYmxlYXUtYXV0aG9yaW5nLXZpej4gd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGVudW0gVml6QXV0aG9yaW5nQXR0cmlidXRlcyB7XG4gIE9uV29ya2Jvb2tQdWJsaXNoZWQgPSAnb25Xb3JrYm9va1B1Ymxpc2hlZCcsXG4gIE9uV29ya2Jvb2tQdWJsaXNoZWRBcyA9ICdvbldvcmtib29rUHVibGlzaGVkQXMnLFxuICBPbldvcmtib29rUmVhZHlUb0Nsb3NlID0gJ29uV29ya2Jvb2tSZWFkeVRvQ2xvc2UnLFxuICBIaWRlQ2xvc2VCdXR0b24gPSAnaGlkZS1jbG9zZS1idXR0b24nLFxufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBjaGlsZCB0YWdzIGZvciBUYWJsZWF1Vml6IGFuZCBUYWJsZWF1QXV0aG9yaW5nVml6IGN1c3RvbSBlbGVtZW50cy5cbiAqL1xuZXhwb3J0IGVudW0gVml6Q2hpbGRFbGVtZW50cyB7XG4gIC8qKlxuICAgKiBDb250YWlucyBhIGxpc3Qgb2YgZmlsdGVyIHBhcmFtZXRlcnMuIEF2YWlsYWJsZSBvbmx5IGluIHZpZXdpbmcgbW9kZS5cbiAgICovXG4gIFZpekZpbHRlciA9ICd2aXotZmlsdGVyJyxcblxuICAvKipcbiAgICogQ29udGFpbnMgYSBuYW1lIGFuZCB2YWx1ZSBmb3IgYSBwYXJhbWV0ZXIuIEF2YWlsYWJsZSBvbmx5IGluIHZpZXdpbmcgbW9kZS5cbiAgICovXG4gIFZpelBhcmFtZXRlciA9ICd2aXotcGFyYW1ldGVyJyxcblxuICAvKipcbiAgICogQ29udGFpbnMgYSBsaXN0IG9mIGN1c3RvbSBwYXJhbWV0ZXJzLiAgQXZhaWxhYmxlIGluIGJvdGggdmlld2luZyBhbmQgYXV0aG9yaW5nIG1vZGVzLlxuICAgKi9cbiAgQ3VzdG9tUGFyYW1ldGVyID0gJ2N1c3RvbS1wYXJhbWV0ZXInLFxuXG4gIC8qKlxuICAgKiBDdXN0b20gc3R5bGVzIGFwcGxpY2FibGUgdG8gdGhlIGVtYmVkZGVkIGlmcmFtZSBlbGVtZW50IGl0c2VsZiAobm90IGluc2lkZSBpdCkuIEF2YWlsYWJsZSBpbiBib3RoIHZpZXdpbmcgYW5kIGF1dGhvcmluZyBtb2Rlcy5cbiAgICovXG4gIElmcmFtZVN0eWxlID0gJ2lmcmFtZS1zdHlsZScsXG59XG5cbmV4cG9ydCBlbnVtIFZpekNoaWxkRWxlbWVudEF0dHJpYnV0ZXMge1xuICBGaWVsZCA9ICdmaWVsZCcsXG4gIFZhbHVlID0gJ3ZhbHVlJyxcbiAgTmFtZSA9ICduYW1lJyxcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdG9wIGxldmVsIFZpeiBvYmplY3QuXG4gKiovXG5leHBvcnQgaW50ZXJmYWNlIFZpeiBleHRlbmRzIFZpelNldHRpbmdzLCBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzLCBWaXpBY3Rpb25zIHtcbiAgLyoqXG4gICAqIE9uZSBXb3JrYm9vayBpcyBzdXBwb3J0ZWQgcGVyIHZpc3VhbGl6YXRpb24uXG4gICAqL1xuICByZWFkb25seSB3b3JrYm9vaz86IFdvcmtib29rO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlIGFuIGF1dGggdG9rZW4gZm9yIHNhbGVzZm9yY2UgbmF0aXZlIG1vZGVcbiAgICogQHBhcmFtIHRva2VuXG4gICAqL1xuICBzZXRBdXRoVG9rZW4odG9rZW46IHN0cmluZyk6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhlIGludGVyZmFjZSBmb3IgdGhlIHRvcCBsZXZlbCBBdXRob3JpbmcgVml6IG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRob3JpbmdWaXogZXh0ZW5kcyBWaXpBdXRob3JpbmdTZXR0aW5ncywgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2aXN1YWxpemF0aW9uJ3MgY3VycmVudCBVUkwuXG4gICAqL1xuICBnZXRDdXJyZW50U3JjQXN5bmMoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBQcm92aWRlIGFuIGF1dGggdG9rZW4gZm9yIHNhbGVzZm9yY2UgbmF0aXZlIG1vZGVcbiAgICogQHBhcmFtIHRva2VuXG4gICAqL1xuICBzZXRBdXRoVG9rZW4odG9rZW46IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byByZWFkanVzdCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZW1iZWRkZWQgdml6IGluIHJlc3BvbnNlIHRvIHRoaW5ncyBsaWtlIGEgd2luZG93IHJlc2l6ZSwgZGV2aWNlIG9yaWVudGF0aW9uIGNoYW5nZSwgb3JcbiAgICogcGFyZW50IGNvbnRhaW5lciByZXNpemUuXG4gICAqXG4gICAqIGBgYFxuICAgKiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdml6LnJlc2l6ZSgpKTtcbiAgICpcbiAgICogbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHZpei5yZXNpemUoKSkub2JzZXJ2ZSh2aXoucGFyZW50RWxlbWVudCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVzaXplKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBsYXVuY2ggdGhlIEFuYWx5dGljcyBBc3Npc3RhbnQgc2lkZSBwYW5lLlxuICAgKiBZb3UgY2FuIHVzZSB0aGUgYGlzQW5hbHl0aWNzQXNzaXN0YW50QXZhaWxhYmxlQXN5bmMoKWAgbWV0aG9kIHRvIGNoZWNrIGlmIHRoZSBBbmFseXRpY3MgQXNzaXN0YW50IGlzIGF2YWlsYWJsZSBmb3IgdXNlLlxuICAgKlxuICAgKiBgYGBcbiAgICogY29uc3QgaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUgPSBhd2FpdCB2aXouaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGVBc3luYygpO1xuICAgKiBpZiAoaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUpIHtcbiAgICogICBhd2FpdCB2aXoubGF1bmNoQW5hbHl0aWNzQXNzaXN0YW50QXN5bmMoKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGxhdW5jaEFuYWx5dGljc0Fzc2lzdGFudEFzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBBbmFseXRpY3MgQXNzaXN0YW50IHNpZGUgcGFuZSBpcyBhdmFpbGFibGUuXG4gICAqL1xuICBpc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZUFzeW5jKCk6IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbi8qKlxuICogUGFydGlhbGx5IGltcGxlbWVudGVkIC0gQWN0aW9ucyByZWxhdGVkIHRvIGV2ZW50cyBhbmQgc3RhdGUgb2YgdGhlIHZpelxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpekFjdGlvbnMge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgYXV0b21hdGljIHVwZGF0ZXMgYXJlIGN1cnJlbnRseSBwYXVzZWQuXG4gICAqL1xuICByZWFkb25seSBhdXRvbWF0aWNVcGRhdGVzQXJlUGF1c2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQYXVzZSBsYXlvdXQgdXBkYXRlcy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGFyZSByZXNpemluZyB0aGUgdmlzdWFsaXphdGlvbiBvciBwZXJmb3JtaW5nIG11bHRpcGxlIGNhbGxzIHRoYXQgY291bGQgYWZmZWN0IHRoZSBsYXlvdXQuXG4gICAqL1xuICBwYXVzZUF1dG9tYXRpY1VwZGF0ZXNBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBSZXN1bWUgbGF5b3V0IHVwZGF0ZXMuXG4gICAqL1xuICByZXN1bWVBdXRvbWF0aWNVcGRhdGVzQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVG9nZ2xlIGxheW91dCB1cGRhdGVzLlxuICAgKi9cbiAgdG9nZ2xlQXV0b21hdGljVXBkYXRlc0FzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gY2xpY2tpbmcgb24gdGhlIFJldmVydCBBbGwgdG9vbGJhciBidXR0b24sIHdoaWNoIHJlc3RvcmVzIHRoZSB3b3JrYm9vayB0byBpdHMgc3RhcnRpbmcgc3RhdGUuXG4gICAqL1xuICByZXZlcnRBbGxBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFcXVpdmFsZW50IHRvIGNsaWNraW5nIG9uIHRoZSBSZWZyZXNoIERhdGEgdG9vbGJhciBidXR0b24uXG4gICAqL1xuICByZWZyZXNoRGF0YUFzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gY2xpY2tpbmcgb24gRG93bmxvYWQgPiBJbWFnZSBmcm9tIHRoZSB0b29sYmFyLCB3aGljaCBjcmVhdGVzIGEgUE5HIGZpbGUgb2YgdGhlIGN1cnJlbnQgdmlzdWFsaXphdGlvbi5cbiAgICovXG4gIGV4cG9ydEltYWdlQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRXhwb3J0cyB0aGUgY3Jvc3N0YWIgb2YgYW55IGdpdmVuIHdvcmtzaGVldCB3aXRoaW4gdGhlIGN1cnJlbnQgdmlldyB0byBhXG4gICAqIHNwZWNpZmllZCBmb3JtYXQgKENyb3NzdGFiRmlsZUZvcm1hdC5FeGNlbCwgQ3Jvc3N0YWJGaWxlRm9ybWF0LkNTVikuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgc2hlZXQgbmFtZSBkb2VzIG5vdCBtYXRjaCBhbnkgd29ya3NoZWV0cyB3aXRoaW4gdGhlIGFjdGl2ZSBzaGVldC5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBjcm9zc3RhYiBmaWxlIGZhaWxlZCB0byBiZSBjcmVhdGVkLlxuICAgKiBOb3RlOiBleHBvcnRDcm9zc3RhYkFzeW5jIHJlc29sdmVzIHdoZW4gYSBkb3dubG9hZCBpcyBpbml0aWF0ZWQuIEl0IGRvZXMgbm90IGluZGljYXRlIHRoYXQgYSBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bCBvciBpZiB0aGUgZG93bmxvYWQgd2FzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIHZpei5leHBvcnRDcm9zc3RhYkFzeW5jKCdTYWxlcyBieSBTZWdtZW50JywgQ3Jvc3N0YWJGaWxlRm9ybWF0LkNTVik7XG4gICAqIGBgYFxuICAgKi9cbiAgZXhwb3J0Q3Jvc3N0YWJBc3luYyhzaGVldE5hbWU6IHN0cmluZywgZm9ybWF0OiBDcm9zc3RhYkZpbGVGb3JtYXQpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBzdW1tYXJ5IGRhdGEgc2hvd24gaW4gdGhlIFZpZXcgRGF0YSB3aW5kb3dcbiAgICogKHNob3duIHdoZW4geW91IGNsaWNrIERvd25sb2FkID4gRGF0YSBmcm9tIHRoZSB0b29sYmFyIGZvciBhbnkgZ2l2ZW4gd29ya3NoZWV0IHdpdGhpbiB0aGUgY3VycmVudCB2aWV3KS5cbiAgICogVGhlIGN1cnJlbnQgZmlsZSBmb3JtYXQgaXMgQ1NWLiBUaGVyZSBpcyBubyBsaW1pdGF0aW9uIG9uIHRoZSBhbW91bnQgb2Ygc3VtbWFyeSBkYXRhIHlvdSBjYW4gZXhwb3J0LlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHNoZWV0IG5hbWUgZG9lcyBub3QgbWF0Y2ggYW55IHdvcmtzaGVldHMgd2l0aGluIHRoZSBhY3RpdmUgc2hlZXQuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgQ1NWIGZpbGUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQuXG4gICAqIE5vdGU6IGV4cG9ydERhdGFBc3luYyByZXNvbHZlcyB3aGVuIGEgZG93bmxvYWQgaXMgaW5pdGlhdGVkLiBJdCBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IGEgZG93bmxvYWQgd2FzIHN1Y2Nlc3NmdWwgb3IgaWYgdGhlIGRvd25sb2FkIHdhcyBjb21wbGV0ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIGxldCB2aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVhdVZpeicpO1xuICAgKiBjb25zdCBhY3RpdmVTaGVldCA9IHZpei53b3JrYm9vay5hY3RpdmVTaGVldDtcbiAgICogaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLldvcmtzaGVldCkge1xuICAgKiAgIGNvbnN0IGNvbHVtbnMgPSBhd2FpdCBhY3RpdmVTaGVldC5nZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYygpO1xuICAgKiAgIC8vIEdldHRpbmcgZmllbGRJZCdzIGZvciBMYXRpdHVkZSBhbmQgTG9uZ2l0dWRlIGNvbHVtbnNcbiAgICogICBjb25zdCBjb2x1bW5zVG9JbmNsdWRlQnlJZCA9IGNvbHVtbnMubWFwKChjb2x1bW4pID0+IHtcbiAgICogICAgIGlmIChjb2x1bW4uZmllbGROYW1lID09PSAnTGF0aXR1ZGUnIHx8IGNvbHVtbi5maWVsZE5hbWUgPT09ICdMb25naXR1ZGUnKSB7XG4gICAqICAgICAgIHJldHVybiBjb2x1bW4uZmllbGRJZDtcbiAgICogICAgIH1cbiAgICogICB9KTtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0RGF0YUFzeW5jKGFjdGl2ZVNoZWV0Lm5hbWUsIHsgY29sdW1uc1RvSW5jbHVkZUJ5SWQgfSk7XG4gICAqIH1cbiAgICogZWxzZSBpZiAoYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuRGFzaGJvYXJkKSB7XG4gICAqICAgLy8gRXhwb3J0aW5nIHRoZSBzdW1tYXJ5IGRhdGEgZm9yIGVhY2ggd29ya3NoZWV0IGluIHRoZSBkYXNoYm9hcmQgd2hpbGUgYWxzbyBpZ25vcmluZyBhbGlhc2VzXG4gICAqICAgZm9yIChjb25zdCB3b3Jrc2hlZXQgb2YgYWN0aXZlU2hlZXQud29ya3NoZWV0cykge1xuICAgKiAgICAgYXdhaXQgdml6LmV4cG9ydERhdGFBc3luYyh3b3Jrc2hlZXQubmFtZSwgeyBpZ25vcmVBbGlhc2VzOiB0cnVlIH0pO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBlbHNlXG4gICAqIHtcbiAgICogICAvLyBhY3RpdmVTaGVldCBpcyBhIFN0b3J5IGFuZCB3ZSB3YW50IHRvIGV4cG9ydCB3b3Jrc2hlZXRzIHdpdGhpbiB0aGUgY3VycmVudCB2aWV3XG4gICAqICAgY29uc3QgY29udGFpbmVkU2hlZXQgPSBhY3RpdmVTaGVldC5hY3RpdmVTdG9yeVBvaW50LmNvbnRhaW5lZFNoZWV0O1xuICAgKiAgIGlmIChjb250YWluZWRTaGVldCAhPT0gdW5kZWZpbmVkICYmIGNvbnRhaW5lZFNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLldvcmtzaGVldCkge1xuICAgKiAgICAgLy8gRXhwb3J0aW5nIHN1bW1hcnkgZGF0YSBvZiBhIHdvcmtzaGVldCB3aXRoaW4gdGhlIGFjdGl2ZSBzdG9yeSBwb2ludFxuICAgKiAgICAgYXdhaXQgdml6LmV4cG9ydERhdGFBc3luYyhjb250YWluZWRTaGVldC5uYW1lKTtcbiAgICogICB9IGVsc2UgaWYgKGNvbnRhaW5lZFNoZWV0ICE9PSB1bmRlZmluZWQgJiYgY29udGFpbmVkU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuRGFzaGJvYXJkKSB7XG4gICAqICAgICAvLyBFeHBvcnRpbmcgdGhlIHN1bW1hcnkgZGF0YSBmb3IgZWFjaCB3b3Jrc2hlZXQgd2l0aGluIHRoZSBhY3RpdmUgc3RvcnkgcG9pbnRcbiAgICogICAgIGZvciAoY29uc3Qgd29ya3NoZWV0IG9mIGNvbnRhaW5lZFNoZWV0LndvcmtzaGVldHMpIHtcbiAgICogICAgICAgYXdhaXQgdml6LmV4cG9ydERhdGFBc3luYyh3b3Jrc2hlZXQubmFtZSk7XG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZXhwb3J0RGF0YUFzeW5jKHNoZWV0TmFtZTogc3RyaW5nLCBvcHRpb25zPzogRXhwb3J0RGF0YU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBsaXN0IG9mIHNoZWV0cyB0byBhIFBvd2VyUG9pbnQgZmlsZS4gSWYgbm8gc2hlZXRzIGFyZSBzcGVjaWZpZWQsIHRoZSBjdXJyZW50IHNoZWV0IGlzIGV4cG9ydGVkLlxuICAgKiBUaGUgb3JkZXIgdGhlIHNoZWV0cyBhcHBlYXIgaW4gdGhlIGxpc3QgaXMgdGhlIG9yZGVyIHRoZSBzaGVldHMgYXBwZWFyIGluIHRoZSBQb3dlclBvaW50IGZpbGUuXG4gICAqIFRoZSBsaXN0IG9mIHNoZWV0cyBjYW4gZWl0aGVyIGV4Y2x1c2l2ZWx5IGluY2x1ZGUgdGhlIHdvcmtzaGVldHMgd2l0aGluIGEgZGFzaGJvYXJkIG9yIGV4Y2x1c2l2ZWx5IGluY2x1ZGUgdGhlIHB1Ymxpc2hlZCBzaGVldHMgZnJvbSB0aGUgd29ya2Jvb2suXG4gICAqXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgbGlzdCBvZiBzaGVldHMgY29udGFpbnMgYm90aCB3b3Jrc2hlZXRzIHdpdGhpbiBhIGRhc2hib2FyZCBhbmQgcHVibGlzaGVkIHNoZWV0cyBmcm9tIHRoZSB3b3JrYm9vay5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBQb3dlclBvaW50IGZpbGUgZmFpbHMgdG8gYmUgY3JlYXRlZC5cbiAgICpcbiAgICogTm90ZTogZXhwb3J0UG93ZXJQb2ludEFzeW5jIHJlc29sdmVzIHdoZW4gYSBkb3dubG9hZCBpcyBpbml0aWF0ZWQuIEl0IGRvZXMgbm90IGluZGljYXRlIHRoYXQgYSBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bCBvciBpZiB0aGUgZG93bmxvYWQgd2FzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIGNvbnN0IHdvcmtib29rID0gdml6Lndvcmtib29rO1xuICAgKiBjb25zdCBhY3RpdmVTaGVldCA9IHdvcmtib29rLmFjdGl2ZVNoZWV0O1xuICAgKiBpZiAoYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuV29ya3NoZWV0IHx8IGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLlN0b3J5KSB7XG4gICAqICAgYXdhaXQgdml6LmV4cG9ydFBvd2VyUG9pbnRBc3luYygpO1xuICAgKiB9IGVsc2UgaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gIFNoZWV0VHlwZS5EYXNoYm9hcmQpIHtcbiAgICogICBjb25zdCB3b3Jrc2hlZXROYW1lcyA9IGFjdGl2ZVNoZWV0LndvcmtzaGVldHMubWFwKCh3b3Jrc2hlZXQpID0+IHdvcmtzaGVldC5uYW1lKTtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKHdvcmtzaGVldE5hbWVzKTtcbiAgICogfVxuICAgKiAvLyBleHBvcnRpbmcgYWxsIHNoZWV0cyB3aXRoaW4gdGhlIHdvcmtib29rIHRvIFBvd2VyUG9pbnRcbiAgICogY29uc3QgcHVibGlzaGVkU2hlZXROYW1lcyA9IHdvcmtib29rLnB1Ymxpc2hlZFNoZWV0c0luZm8ubWFwKChwdWJsaXNoZWRTaGVldEluZm8pID0+IHB1Ymxpc2hlZFNoZWV0SW5mby5uYW1lKTtcbiAgICogYXdhaXQgdml6LmV4cG9ydFBvd2VyUG9pbnRBc3luYyhwdWJsaXNoZWRTaGVldE5hbWVzKTtcbiAgICogYGBgXG4gICAqL1xuICBleHBvcnRQb3dlclBvaW50QXN5bmMoc2hlZXROYW1lcz86IEFycmF5PHN0cmluZz4pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBsaXN0IG9mIHNoZWV0cyB3aXRoIHRoZSBnaXZlbiB7QGxpbmsgRXhwb3J0UERGT3B0aW9uc30gb3B0aW9ucy4gSWYgbm8gc2hlZXRzIGFyZSBzcGVjaWZpZWQsIHRoZSBjdXJyZW50IHNoZWV0IGlzIGV4cG9ydGVkLlxuICAgKiBUaGUgbGlzdCBvZiBzaGVldHMgY2FuIGVpdGhlciBleGNsdXNpdmVseSBpbmNsdWRlIHRoZSB3b3Jrc2hlZXRzIHdpdGhpbiBhIGRhc2hib2FyZCBvciBleGNsdXNpdmVseSBpbmNsdWRlIHRoZSBwdWJsaXNoZWQgc2hlZXRzIGZyb20gdGhlIHdvcmtib29rLlxuICAgKiBJZiBubyBFeHBvcnRQREZPcHRpb25zIGFyZSBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHNldHRpbmdzIGFyZTogU2NhbGluZyA9IEF1dG9tYXRpYywgUGFnZVNpemUgPSBMZXR0ZXIsIGFuZCBPcmllbnRhdGlvbiA9IFBvcnRyYWl0LlxuICAgKlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGxpc3Qgb2Ygc2hlZXRzIGNvbnRhaW5zIGJvdGggd29ya3NoZWV0cyB3aXRoaW4gYSBkYXNoYm9hcmQgYW5kIHB1Ymxpc2hlZCBzaGVldHMgZnJvbSB0aGUgd29ya2Jvb2suXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgUERGIGZpbGUgZmFpbHMgdG8gYmUgY3JlYXRlZC5cbiAgICpcbiAgICogTm90ZTogZXhwb3J0UERGQXN5bmMgcmVzb2x2ZXMgd2hlbiBhIGRvd25sb2FkIGlzIGluaXRpYXRlZC4gSXQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCBhIGRvd25sb2FkIHdhcyBzdWNjZXNzZnVsIG9yIGlmIHRoZSBkb3dubG9hZCB3YXMgY29tcGxldGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiBsZXQgdml6ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlYXVWaXonKTtcbiAgICogY29uc3Qgd29ya2Jvb2sgPSB2aXoud29ya2Jvb2s7XG4gICAqIGNvbnN0IGFjdGl2ZVNoZWV0ID0gd29ya2Jvb2suYWN0aXZlU2hlZXQ7XG4gICAqIGlmIChhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5Xb3Jrc2hlZXQgfHwgYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuU3RvcnkpIHtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UERGQXN5bmMoKTtcbiAgICogfSBlbHNlIGlmIChhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09ICBTaGVldFR5cGUuRGFzaGJvYXJkKSB7XG4gICAqICAgY29uc3Qgd29ya3NoZWV0TmFtZXMgPSBhY3RpdmVTaGVldC53b3Jrc2hlZXRzLm1hcCgod29ya3NoZWV0KSA9PiB3b3Jrc2hlZXQubmFtZSk7XG4gICAqICAgYXdhaXQgdml6LmV4cG9ydFBERkFzeW5jKHdvcmtzaGVldE5hbWVzKTtcbiAgICogfVxuICAgKiAvLyBleHBvcnRpbmcgYWxsIHNoZWV0cyB3aXRoaW4gdGhlIHdvcmtib29rIHRvIFBERlxuICAgKiBjb25zdCBwdWJsaXNoZWRTaGVldE5hbWVzID0gd29ya2Jvb2sucHVibGlzaGVkU2hlZXRzSW5mby5tYXAoKHB1Ymxpc2hlZFNoZWV0SW5mbykgPT4gcHVibGlzaGVkU2hlZXRJbmZvLm5hbWUpO1xuICAgKiBhd2FpdCB2aXouZXhwb3J0UERGQXN5bmMocHVibGlzaGVkU2hlZXROYW1lcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgZXhwb3J0UERGQXN5bmMoc2hlZXROYW1lcz86IEFycmF5PHN0cmluZz4sIG9wdGlvbnM/OiBFeHBvcnRQREZPcHRpb25zKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRGlzcGxheSBvbmUgb2YgdGhlIGV4cG9ydCBkaWFsb2dzIGJhc2VkIG9uIHRoZSBkaWFsb2dUeXBlIHBhcmFtZXRlclxuICAgKlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgZGlhbG9nVHlwZSBpcyBpbnZhbGlkXG4gICAqL1xuICBkaXNwbGF5RGlhbG9nQXN5bmMoZGlhbG9nVHlwZTogVGFibGVhdURpYWxvZ1R5cGUpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2aXN1YWxpemF0aW9uJ3MgY3VycmVudCBVUkwuXG4gICAqL1xuICBnZXRDdXJyZW50U3JjQXN5bmMoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBSZWRvZXMgdGhlIGxhc3QgYWN0aW9uIHBlcmZvcm1lZCBvbiBhIHNoZWV0LlxuICAgKi9cbiAgcmVkb0FzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFVuZG9lcyB0aGUgbGFzdCBhY3Rpb24gcGVyZm9ybWVkIG9uIGEgc2hlZXQuXG4gICAqL1xuICB1bmRvQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgKlxuICAgKiBgYGBcbiAgICogYXN5bmMgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRNYXJrcyhldmVudCkge1xuICAgKiAgICAgY29uc3QgbWFya3NTZWxlY3RlZCA9IGF3YWl0IGV2ZW50LmRldGFpbC5nZXRNYXJrc0FzeW5jKCk7XG4gICAqICAgICBjb25zdCBudW1NYXJrcyA9IG1hcmtzU2VsZWN0ZWQuZGF0YVswXS5kYXRhLmxlbmd0aDtcbiAgICogICAgIGNvbnNvbGUubG9nKGAke251bU1hcmtzfSBtYXJrcyBTZWxlY3RlZGApO1xuICAgKiB9XG4gICAqXG4gICAqIGxldCB2aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVhdVZpeicpO1xuICAgKiB2aXouYWRkRXZlbnRMaXN0ZW5lcihcIm1hcmtzZWxlY3Rpb25jaGFuZ2VkXCIsIGdldFNlbGVjdGVkTWFya3MpO1xuICAgKiBgYGBcbiAgICovXG4gIGFkZEV2ZW50TGlzdGVuZXIodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgbGlzdGVuZXI6IEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3QsIG9wdGlvbnM/OiBib29sZWFuIHwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIHNwZWNpZmllZCBldmVudC5cbiAgICpcbiAgICogYGBgXG4gICAqIGxldCB2aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVhdVZpeicpO1xuICAgKiB2aXoucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1hcmtzZWxlY3Rpb25jaGFuZ2VkXCIsIGdldFNlbGVjdGVkTWFya3MpO1xuICAgKiBgYGBcbiAgICovXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgbGlzdGVuZXI6IEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3QsIG9wdGlvbnM/OiBib29sZWFuIHwgRXZlbnRMaXN0ZW5lck9wdGlvbnMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gZmlsdGVyIHRoZSB2aXogYmVmb3JlIGluaXRpYWxpemF0aW9uLiBJZiB1c2VkIGFmdGVyIGluaXRpYWxpemF0aW9uLCBpdCB3aWxsIHJlLXJlbmRlciB0aGUgdml6LlxuICAgKiBGb3IgZmlsdGVyaW5nIGFmdGVyIGluaXRpYWxpemF0aW9uLCB1c2UgdGhlIG90aGVyIGZpbHRlcmluZyBtZXRob2RzLCBzdWNoIGFzIGBhcHBseUZpbHRlckFzeW5jYC5cbiAgICpcbiAgICogSWYgeW91IGFkZCB0aGUgc2FtZSBmaWx0ZXIgZmllbGRzIHVzaW5nIHRoZSBgYWRkRmlsdGVyKClgIG1ldGhvZCBhbmQgYnkgdXNpbmcgdGhlIGA8dml6LWZpbHRlcj5gIGVsZW1lbnQgaW4gdGhlIGA8dGFibGVhdS12aXo+YCB3ZWIgY29tcG9uZW50LFxuICAgKiB5b3UgbWlnaHQgZXhwZXJpZW5jZSB1bmV4cGVjdGVkIGJlaGF2aW9yLlxuICAgKlxuICAgKiBAcGFyYW0gZmllbGROYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBmaWx0ZXIgb24uXG4gICAqIEBwYXJhbSB2YWx1ZSBTaW5nbGUgdmFsdWUgb3IgYSBsaXN0IG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMgdG8gZmlsdGVyIG9uLlxuICAgKlxuICAgKiBgYGBcbiAgICogdml6LmFkZEZpbHRlcignUmVnaW9uJywgJ0NlbnRyYWwsV2VzdCcpO1xuICAgKiBgYGBcbiAgICovXG4gIGFkZEZpbHRlcihmaWVsZE5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byByZWFkanVzdCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZW1iZWRkZWQgdml6IGluIHJlc3BvbnNlIHRvIHRoaW5ncyBsaWtlIGEgd2luZG93IHJlc2l6ZSwgZGV2aWNlIG9yaWVudGF0aW9uIGNoYW5nZSwgb3JcbiAgICogcGFyZW50IGNvbnRhaW5lciByZXNpemUuXG4gICAqXG4gICAqIGBgYFxuICAgKiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdml6LnJlc2l6ZSgpKTtcbiAgICpcbiAgICogbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHZpei5yZXNpemUoKSkub2JzZXJ2ZSh2aXoucGFyZW50RWxlbWVudCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVzaXplKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBsYXVuY2ggdGhlIEFuYWx5dGljcyBBc3Npc3RhbnQgc2lkZSBwYW5lLlxuICAgKiBZb3UgY2FuIHVzZSB0aGUgYGlzQW5hbHl0aWNzQXNzaXN0YW50QXZhaWxhYmxlQXN5bmMoKWAgbWV0aG9kIHRvIGNoZWNrIGlmIHRoZSBBbmFseXRpY3MgQXNzaXN0YW50IGlzIGF2YWlsYWJsZSBmb3IgdXNlLlxuICAgKlxuICAgKiBgYGBcbiAgICogY29uc3QgaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUgPSBhd2FpdCB2aXouaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGVBc3luYygpO1xuICAgKiBpZiAoaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUpIHtcbiAgICogICBhd2FpdCB2aXoubGF1bmNoQW5hbHl0aWNzQXNzaXN0YW50QXN5bmMoKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGxhdW5jaEFuYWx5dGljc0Fzc2lzdGFudEFzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBBbmFseXRpY3MgQXNzaXN0YW50IHNpZGUgcGFuZSBpcyBhdmFpbGFibGUuXG4gICAqL1xuICBpc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZUFzeW5jKCk6IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVml6U2l6ZSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaGVldFNpemUgcmVjb3JkIGZvciB0aGUgY3VycmVudCBzaGVldFxuICAgKi9cbiAgcmVhZG9ubHkgc2hlZXRTaXplOiBTaGVldFNpemU7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGhlaWdodCBvZiB0aGUgVGFibGVhdSBVSSBlbGVtZW50cyAodGhlIGNocm9tZSkgc3Vycm91bmRpbmcgdGhlIHZpZXcuXG4gICAqL1xuICByZWFkb25seSBjaHJvbWVIZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGFsbCBvZiB0aGUgb3B0aW9ucyBmb3IgY29uZmlndXJpbmcgYSB2aXogdGhhdCBhcmUgY29tbW9uIGJldHdlZW5cbiAqIHZpZXdpbmcgYW5kIGF1dGhvcmluZyBtb2RlLlxuICovXG5pbnRlcmZhY2UgVml6U2V0dGluZ3NTaGFyZWQgZXh0ZW5kcyBXZWJDb21wb25lbnRTZXR0aW5nc1NoYXJlZCB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byB0b3VjaCBvcHRpbWl6ZSB2aXogY29udHJvbHMuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgdG91Y2gtb3B0aW1pemUgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b3VjaC1vcHRpbWl6ZSAvPlxuICAgKiBgYGBcbiAgICovXG4gIHRvdWNoT3B0aW1pemU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgRWRpdCBpbiBEZXNrdG9wIGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gZmFsc2UsIG1lYW5pbmcgdGhhdCB0aGUgRWRpdCBpbiBEZXNrdG9wIGJ1dHRvbiBpcyB2aXNpYmxlLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGhpZGUtZWRpdC1pbi1kZXNrdG9wLWJ1dHRvbj5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBoaWRlLWVkaXQtaW4tZGVza3RvcC1idXR0b24+XG4gICAqIGBgYFxuICAgKi9cbiAgaGlkZUVkaXRJbkRlc2t0b3BCdXR0b24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGVmYXVsdCBlZGl0IGJlaGF2aW9yIGlzIHN1cHByZXNzZWQuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIGZhbHNlLCBtZWFuaW5nIHRoYXQgdGhlIGRlZmF1bHQgZWRpdCBiZWhhdmlvciBpcyBub3Qgc3VwcHJlc3NlZC5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBzdXBwcmVzcy1kZWZhdWx0LWVkaXQtYmVoYXZpb3I+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgc3VwcHJlc3MtZGVmYXVsdC1lZGl0LWJlaGF2aW9yPlxuICAgKiBgYGBcbiAgICovXG4gIHN1cHByZXNzRGVmYXVsdEVkaXRCZWhhdmlvcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgRWRpdCBJbiBEZXNrdG9wIEJ1dHRvbi4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQ9XCJvbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkSGFuZGxlclwiIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZD1cIm9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgc2l6ZSBvZiB0aGUgdml6IGlzIGtub3duLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHRvIHBlcmZvcm0gdGFza3Mgc3VjaCBhcyByZXNpemluZ1xuICAgKiB0aGUgZWxlbWVudHMgc3Vycm91bmRpbmcgdGhlIFZpeiBvYmplY3Qgb25jZSB0aGUgb2JqZWN0J3Mgc2l6ZSBoYXMgYmVlbiBlc3RhYmxpc2hlZC5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBcIm9uRmlyc3RWaXpTaXplS25vd25cIj1cIm9uRmlyc3RWaXpTaXplS25vd25IYW5kbGVyXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkZpcnN0Vml6U2l6ZUtub3duPVwib25GaXJzdFZpelNpemVLbm93bkhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRmlyc3RWaXpTaXplS25vd24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSBWaXogb2JqZWN0IGZpcnN0IGJlY29tZXMgaW50ZXJhY3RpdmUuIFRoaXMgaXMgb25seSByYWlzZWQgb25jZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBcIm9uRmlyc3RJbnRlcmFjdGl2ZVwiPVwib25GaXJzdEludGVyYWN0aXZlSGFuZGxlclwiIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25GaXJzdEludGVyYWN0aXZlPVwib25GaXJzdEludGVyYWN0aXZlSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25GaXJzdEludGVyYWN0aXZlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHZpeiBpbiB2aWV3IG1vZGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6U2V0dGluZ3MgZXh0ZW5kcyBWaXpTZXR0aW5nc1NoYXJlZCB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byBzdXBwcmVzcyB0aGUgZXhlY3V0aW9uIG9mIFVSTCBhY3Rpb25zLiBUaGlzIG9wdGlvbiBkb2VzIG5vdCBwcmV2ZW50IHRoZSBVUkwgYWN0aW9uXG4gICAqIGV2ZW50IGZyb20gYmVpbmcgcmFpc2VkLiBZb3UgY2FuIHVzZSB0aGlzIG9wdGlvbiB0byBjaGFuZ2Ugd2hhdCBoYXBwZW5zIHdoZW4gYSBVUkwgYWN0aW9uIG9jY3Vycy4gSWYgc2V0XG4gICAqIHRvIHRydWUgYW5kIHlvdSBjcmVhdGUgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHRoZSBVUkxfQUNUSU9OIGV2ZW50LCB5b3UgY2FuIHVzZSBhbiBldmVudCBsaXN0ZW5lclxuICAgKiBoYW5kbGVyIHRvIGN1c3RvbWl6ZSB0aGUgYWN0aW9ucy5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBkaXNhYmxlLXVybC1hY3Rpb25zIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgZGlzYWJsZVVybEFjdGlvbnNQb3B1cHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0YWJzIGFyZSBoaWRkZW4gb3Igc2hvd24uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgIGhpZGUtdGFicyAvPlxuICAgKiBgYGBcbiAgICovXG4gIGhpZGVUYWJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9vbGJhciwgaWYgaXQgaXMgc2hvd24uIFRoZSB2YWx1ZXMgY2FuIGJlIFRvb2xiYXIuVG9wLFxuICAgKiBUb29sYmFyLkJvdHRvbSBvciBUb29sYmFyLkhpZGRlbi5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gVG9vbGJhci5Cb3R0b20uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgIHRvb2xiYXI9XCJoaWRkZW5cIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIHRvb2xiYXI/OiBUb29sYmFyO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSBkZXZpY2UgbGF5b3V0IGZvciBhIGRhc2hib2FyZCwgaWYgaXQgZXhpc3RzLlxuICAgKiBWYWx1ZXMgY2FuIGJlIGRlZmF1bHQsIGRlc2t0b3AsIHRhYmxldCwgb3IgcGhvbmUuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIGxvYWRpbmcgYSBsYXlvdXQgYmFzZWQgb24gdGhlXG4gICAqIHNtYWxsZXN0IGRpbWVuc2lvbiBvZiB0aGUgaG9zdGluZyBpZnJhbWUgZWxlbWVudC5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiAgZGV2aWNlPVwiZGVza3RvcFwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgZGV2aWNlPzogRGV2aWNlVHlwZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBJRCBvZiBhbiBleGlzdGluZyBpbnN0YW5jZSB0byBtYWtlIGEgY29weSAoY2xvbmUpIG9mLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgdXNlciB3YW50cyB0byBjb250aW51ZSBhbmFseXNpcyBvZiBhbiBleGlzdGluZyB2aXN1YWxpemF0aW9uXG4gICAqIHdpdGhvdXQgbG9zaW5nIHRoZSBzdGF0ZSBvZiB0aGUgb3JpZ2luYWwuIElmIHRoZSBJRCBkb2VzIG5vdCByZWZlciB0byBhbiBleGlzdGluZyB2aXN1YWxpemF0aW9uLFxuICAgKiB0aGUgY2xvbmVkIHZlcnNpb24gaXMgZGVyaXZlZCBmcm9tIHRoZSBvcmlnaW5hbCB2aXN1YWxpemF0aW9uLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiICBpbnN0YW5jZS1pZC10by1jbG9uZT1cImlkMVwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaW5zdGFuY2VJZFRvQ2xvbmU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBFZGl0IGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogSWYgbm90IHNldCwgZGVmYXVsdHMgdG8gZmFsc2UsIG1lYW5pbmcgdGhhdCB0aGUgRWRpdCBidXR0b24gaXMgdmlzaWJsZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBoaWRlLWVkaXQtYnV0dG9uPlxuICAgKiBgYGBcbiAgICovXG4gIGhpZGVFZGl0QnV0dG9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBFZGl0IEJ1dHRvbi5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkVkaXRCdXR0b25DbGlja2VkPVwib25FZGl0QnV0dG9uQ2xpY2tlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRWRpdEJ1dHRvbkNsaWNrZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFRhYmxlYXVWaXogb2JqZWN0cy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkZpbHRlckNoYW5nZWQ9XCJvbkZpbHRlckNoYW5nZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkZpbHRlckNoYW5nZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIG1hcmsgY29udGV4dCBtZW51IGlzIGNsaWNrZWQuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25DdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudD1cIm9uQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgc2VsZWN0ZWQgbWFya3Mgb24gYSB2aXN1YWxpemF0aW9uIGhhdmUgY2hhbmdlZC4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uTWFya1NlbGVjdGlvbkNoYW5nZWQ9XCJvbk1hcmtTZWxlY3Rpb25DaGFuZ2VkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25NYXJrU2VsZWN0aW9uQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbUGFyYW1ldGVyXV0gb2JqZWN0cy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvblBhcmFtZXRlckNoYW5nZWQ9XCJvblBhcmFtZXRlckNoYW5nZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvblBhcmFtZXRlckNoYW5nZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgdG9vbGJhciBidXR0b24gb3IgY29udHJvbCBiZWNvbWVzIGF2YWlsYWJsZSBvciBiZWNvbWVzIHVuYXZhaWxhYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uVG9vbGJhclN0YXRlQ2hhbmdlZD1cIm9uVG9vbGJhclN0YXRlQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uVG9vbGJhclN0YXRlQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBVUkwgYWN0aW9uIG9jY3Vycy4gU2VlIHRoZSB7QGxpbmsgVXJsQWN0aW9uRXZlbnR9IGNsYXNzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uVXJsQWN0aW9uPVwib25VcmxBY3Rpb25IYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvblVybEFjdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIGFmdGVyIGEgdGFiIHN3aXRjaCBvY2N1cnMgKHRoZSBhY3RpdmUgc2hlZXQgaGFzIGNoYW5nZWQpLiBHdWFyYW50ZWVzIHRoZSB2aXogb2JqZWN0IHdpbGwgYmUgaW50ZXJhY3RpdmUgYWZ0ZXIgdGhpcy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvblRhYlN3aXRjaGVkPVwib25UYWJTd2l0Y2hlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uVGFiU3dpdGNoZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGZpbmlzaGVkIGxvYWRpbmcuIFRoaXMgZXZlbnQgaXMgcmFpc2VkIGFmdGVyIHRoZSBjYWxsYmFja1xuICAgKiBmdW5jdGlvbiBmb3Ige0BsaW5rIEZpcnN0SW50ZXJhY3RpdmV9IChpZiBhbnkpIGhhcyBiZWVuIGNhbGxlZC5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbVZpZXdMb2FkZWQ9XCJvbkN1c3RvbVZpZXdMb2FkZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkN1c3RvbVZpZXdMb2FkZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gcmVtb3ZlZC5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbVZpZXdSZW1vdmVkPVwib25DdXN0b21WaWV3UmVtb3ZlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tVmlld1JlbW92ZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2F2ZWQgKG5ld2x5IGNyZWF0ZWQgb3IgdXBkYXRlZCkuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25DdXN0b21WaWV3U2F2ZWQ9XCJvbkN1c3RvbVZpZXdTYXZlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tVmlld1NhdmVkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNldCBhcyB0aGUgZGVmYXVsdCB2aWV3IGZvciBhIHdvcmtib29rLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uQ3VzdG9tVmlld1NldERlZmF1bHQ9XCJvbkN1c3RvbVZpZXdTZXREZWZhdWx0SGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25DdXN0b21WaWV3U2V0RGVmYXVsdD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIGFmdGVyIGEgbmV3IHN0b3J5IHBvaW50IGJlY29tZXMgYWN0aXZlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uU3RvcnlQb2ludFN3aXRjaGVkPVwib25TdG9yeVBvaW50U3dpdGNoZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvblN0b3J5UG9pbnRTd2l0Y2hlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHN1bW1hcnkgZGF0YSBvbiBhIHZpc3VhbGl6YXRpb24gaGF2ZSBjaGFuZ2VkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25TdW1tYXJ5RGF0YUNoYW5nZWQ9XCJvblN1bW1hcnlEYXRhQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uU3VtbWFyeURhdGFDaGFuZ2VkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIChCZXRhKSBSZXByZXNlbnRzIHRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHZpeiBpbiBhdXRob3JpbmcgbW9kZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXpBdXRob3JpbmdTZXR0aW5ncyBleHRlbmRzIFZpelNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBDbG9zZSBidXR0b24gaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIElmIG5vdCBzZXQsIGRlZmF1bHRzIHRvIGZhbHNlLCBtZWFuaW5nIHRoYXQgdGhlIENsb3NlIGJ1dHRvbiBpcyB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBoaWRlLWNsb3NlLWJ1dHRvbiAvPlxuICAgKiBgYGBcbiAgICovXG4gIGhpZGVDbG9zZUJ1dHRvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vayBoYXMgYmVlbiBwdWJsaXNoZWQuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIG9uV29ya2Jvb2tQdWJsaXNoZWQ9XCJvbldvcmtib29rUHVibGlzaGVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25Xb3JrYm9va1B1Ymxpc2hlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gXCJwdWJsaXNoIGFzXCIgaXMgc3VjY2Vzc2Z1bC4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25Xb3JrYm9va1B1Ymxpc2hlZEFzPVwib25Xb3JrYm9va1B1Ymxpc2hlZEFzSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25Xb3JrYm9va1B1Ymxpc2hlZEFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgd29ya2Jvb2sgaXMgcmVhZHkgdG8gY2xvc2UuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIG9uV29ya2Jvb2tSZWFkeVRvQ2xvc2U9XCJvbldvcmtib29rUmVhZHlUb0Nsb3NlSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25Xb3JrYm9va1JlYWR5VG9DbG9zZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJQYXJhbWV0ZXJzIHtcbiAgZmllbGQ6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBWaXpQYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIHNldCBQYXJhbWV0ZXIgdmFsdWVzIG9uIHRoZSB2aXouXG4gKlxuICogKiBgYGBcbiAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIj5cbiAqICA8dml6LXBhcmFtZXRlciBuYW1lPVwicGFyYW1ldGVyLW5hbWVcIiB2YWx1ZT1cInBhcmFtZXRlci12YWx1ZVwiPjwvdml6LXBhcmFtZXRlcj5cbiAqIDwvdGFibGVhdS12aXo+XG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6UGFyYW1ldGVyIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHBhcmFtZXRlciB0byBiZSBzZXQuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZhbGlkIHZhbHVlIGZvciB0aGUgcGFyYW1ldGVyIGJlaW5nIHNldC5cbiAgICovXG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ3VzdG9tUGFyYW1ldGVycyBhcmUgdXNlZCB0byBwYXNzIGFsb25nIHNldHRpbmdzLCBpbmZvcm1hdGlvbiwgZXRjLiwgdGhhdCBhcmVuJ3QgZXhwb3NlZCBvbiB0aGVcbiAqIHRhYmxlYXUtdml6IGVsZW1lbnQuIEN1c3RvbVBhcmFtZXRlcnMgd2lsbCBvdmVycmlkZSBhdHRyaWJ1dGVzLCBvciBmaWx0ZXJzLCBzZXQgb24gdGhlIHRhYmxlYXUtdml6IGVsZW1lbnQuXG4gKlxuICogKiBgYGBcbiAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIj5cbiAqICA8Y3VzdG9tLXBhcmFtZXRlciBuYW1lPVwicGFyYW1ldGVyLW5hbWVcIiB2YWx1ZT1cInBhcmFtZXRlci12YWx1ZVwiPjwvY3VzdG9tLXBhcmFtZXRlcj5cbiAqIDwvdGFibGVhdS12aXo+XG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tUGFyYW1ldGVyIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHBhcmFtZXRlciB0byBiZSBzZXQuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZhbGlkIHZhbHVlIGZvciB0aGUgcGFyYW1ldGVyIGJlaW5nIHNldC5cbiAgICovXG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGV4cG9ydGluZyBkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydERhdGFPcHRpb25zIHtcbiAgLyoqXG4gICAqIERvIG5vdCB1c2UgYWxpYXNlcyBzcGVjaWZpZWQgaW4gdGhlIGRhdGEgc291cmNlIGluIFRhYmxlYXUuIERlZmF1bHQgaXMgZmFsc2UuXG4gICAqL1xuICBpZ25vcmVBbGlhc2VzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBjb2x1bW5zIHRvIGluY2x1ZGUgc3BlY2lmaWVkIGJ5IGZpZWxkIGlkLCBpbmNsdWRlcyBhbGwgYnkgZGVmYXVsdC5cbiAgICogVGhlIG9yZGVyIG9mIHRoZSBjb2x1bW4gaWRzIGluIHRoZSBhcnJheSBkZXRlcm1pbmVzIHRoZSBjb2x1bW4gb3JkZXIgc2hvd24gaW4gdGhlIHN1bW1hcnkgZGF0YSB0YWJsZS5cbiAgICovXG4gIGNvbHVtbnNUb0luY2x1ZGVCeUlkPzogQXJyYXk8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRQREZPcHRpb25zIHtcbiAgc2NhbGluZzogUHJpbnRTY2FsaW5nO1xuICBwYWdlU2l6ZTogUHJpbnRQYWdlU2l6ZTtcbiAgb3JpZW50YXRpb246IFByaW50T3JpZW50YXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCB7XG4gIGN1cnJlbnRTaGVldE5hbWU6IHN0cmluZztcbiAgZXhwb3J0YWJsZVNoZWV0TmFtZXNGcm9tRGFzaGJvYXJkOiBBcnJheTxzdHJpbmc+O1xuICBleHBvcnRhYmxlU2hlZXROYW1lc0Zyb21Xb3JrYm9vazogQXJyYXk8c3RyaW5nPjtcbn1cbiIsIi8qKlxuICogVXNlciBzdXBwbGllZCBvcHRpb25zIHRoYXQgZG8gbm90IGdldCBwYXNzZWQgYXMgcmVxdWVzdCBwYXJhbWV0ZXJzIHRvIGxvYWQgYSBUYWJsZWF1IHZpeiwgVGFibGVhdSBhc2tkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBUaGUgdml6IHNyY1xuICAgKi9cbiAgc3JjPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogUmVwcmVzZW50cyB3aWR0aCBpbiBwaXhlbHNcbiAgICogQ2FuIGJlIGFueSB2YWxpZCBDU1Mgc2l6ZSBzcGVjaWZpZXIuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIHRoZSBwdWJsaXNoZWQgd2lkdGggb2YgdGhlIHZpZXcuXG4gICAqL1xuICB3aWR0aD86IHN0cmluZyB8IG51bWJlcjtcblxuICAvKipcbiAgICogUmVwcmVzZW50cyBoZWlnaHQgaW4gcGl4ZWxzXG4gICAqIENhbiBiZSBhbnkgdmFsaWQgQ1NTIHNpemUgc3BlY2lmaWVyLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byB0aGUgcHVibGlzaGVkIGhlaWdodCBvZiB0aGUgdmlldy5cbiAgICovXG4gIGhlaWdodD86IHN0cmluZyB8IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGFsbCBvZiB0aGUgb3B0aW9ucyBmb3IgY29uZmlndXJpbmcgYSB3ZWJjb21wb25lbnQgdGhhdCBhcmUgY29tbW9uIGJldHdlZW5cbiAqIHZpeiBhbmQgYXNrZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJDb21wb25lbnRTZXR0aW5nc1NoYXJlZCB7XG4gIC8qKlxuICAgKiBUaGUgdG9rZW4gdXNlZCBmb3IgYXV0aG9yaXphdGlvblxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgdG9rZW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBub24tbWluaWZpZWQgdmVyc2lvbiBvZiBKYXZhU2NyaXB0IGlzIGxvYWRlZC4gSWYgc3BlY2lmaWVkIChvciBzZXQgdG8gdHJ1ZSksIHRoZVxuICAgKiBub24tbWluaWZpZWQgdmVyc2lvbiBpcyB1c2VkIGZvciBib3RoIHRoZSBsb2NhbCBjb21wb25lbnQgYW5kIHRoZSBUYWJsZWF1IFNlcnZlciB2aXN1YWxpemF0aW9uIChpZiBlbmFibGVkKS5cbiAgICogSWYgbm90IHNwZWNpZmllZCAob3Igc2V0IHRvIGZhbHNlKSwgdGhlIG1pbmlmaWVkIHZlcnNpb24gb2YgdGhlIEphdmFTY3JpcHQgZmlsZXMgYXJlIGxvYWRlZC5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBkZWJ1ZyAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGRlYnVnIC8+XG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBkZWJ1ZyAvPlxuICAgKiBgYGBcbiAgICovXG4gIGRlYnVnPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gdXNlIHRoZSBvbGQgYXV0aCBtZWNoYW5pc20gZm9yIGF1dGhlbnRpY2F0aW9uIHdoaWNoIGhhcHBlbnMgaW5zaWRlIHRoZSBpZnJhbWUuIElmIHNwZWNpZmllZCwgVml6TG9hZEVycm9yRXZlbnRzXG4gICAqIHRyaWdnZXJlZCBkdWUgdG8gYXV0aCBmYWlsdXJlcyB3aWxsIG5vdCBiZSB0aHJvd24uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF1dGggLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXV0aCAvPlxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgaWZyYW1lLWF1dGggLz5cbiAgICogYGBgXG4gICAqL1xuICBpZnJhbWVBdXRoPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSAnbG9hZGluZycgYXR0cmlidXRlIG9mIHRoZSBlbWJlZGRlZCBpZnJhbWUuXG4gICAqIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2lmcmFtZSNsb2FkaW5nXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItbG9hZGluZz1cImxhenlcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdHRyLWxvYWRpbmc9XCJsYXp5XCIgLz5cbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBpZnJhbWUtYXR0ci1sb2FkaW5nPVwibGF6eVwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlTG9hZGluZz86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSAnc3R5bGUnIGF0dHJpYnV0ZSBvZiB0aGUgZW1iZWRkZWQgaWZyYW1lLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdHRyLXN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgcmVkXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1zdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkIHJlZFwiIC8+XG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgaWZyYW1lLWF0dHItc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCByZWRcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIGlmcmFtZUF0dHJpYnV0ZVN0eWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlICdjbGFzcycgYXR0cmlidXRlIG9mIHRoZSBlbWJlZGRlZCBpZnJhbWUgcHJvdmlkaW5nIGFjY2VzcyB0byBhbnlcbiAgICogY3VzdG9tIHNlbGVjdG9ycyBkZWZpbmVkIGluIHRoZSBgPGlmcmFtZS1zdHlsZT5gIGNoaWxkIHRhZy5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1jbGFzcz1cInJlZC1ib3JkZXJcIj5cbiAgICogICA8aWZyYW1lLXN0eWxlPlxuICAgKiAgICAgLnJlZC1ib3JkZXIge1xuICAgKiAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZWQ7XG4gICAqICAgICB9XG4gICAqICAgPC9pZnJhbWUtc3R5bGU+XG4gICAqIDwvdGFibGVhdS12aXo+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlQ2xhc3M/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBjb21tb24gc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSB0YWJsZWF1IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFdlYkNvbXBvbmVudEF0dHJpYnV0ZXMge1xuICBTcmMgPSAnc3JjJyxcbiAgV2lkdGggPSAnd2lkdGgnLFxuICBIZWlnaHQgPSAnaGVpZ2h0JyxcbiAgVG9rZW4gPSAndG9rZW4nLFxuICBEZWJ1ZyA9ICdkZWJ1ZycsXG4gIElmcmFtZUF1dGggPSAnaWZyYW1lLWF1dGgnLFxuICBPblZpekxvYWRFcnJvciA9ICdvbnZpemxvYWRlcnJvcicsXG4gIEZvcmNlVG9rZW5TeW5jID0gJ2ZvcmNlLXRva2VuLXN5bmMnLFxufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgZW1iZWRkZWQgaWZyYW1lIGF0dHJpYnV0ZXMgd2hvc2UgdmFsdWVzIGNhbiBiZSBjb250cm9sbGVkLlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBFbWJlZGRlZElmcmFtZUF0dHJpYnV0ZXMge1xuICBMb2FkaW5nID0gJ2lmcmFtZS1hdHRyLWxvYWRpbmcnLFxuICBTdHlsZSA9ICdpZnJhbWUtYXR0ci1zdHlsZScsXG4gIENsYXNzID0gJ2lmcmFtZS1hdHRyLWNsYXNzJyxcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgY2hpbGQgdGFncyBmb3IgVGFibGVhdVZpeiwgVGFibGVhdUF1dGhvcmluZ1ZpeiBhbmQgVGFibGVhdUFza0RhdGEgY3VzdG9tIGVsZW1lbnRzLlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBXZWJDb21wb25lbnRDaGlsZEVsZW1lbnRzIHtcbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbGlzdCBvZiBjdXN0b20gcGFyYW1ldGVycy4gIEF2YWlsYWJsZSBpbiB2aXogdmlld2luZywgdml6IGF1dGhvcmluZyBhbmQgYXNrZGF0YS5cbiAgICovXG4gIEN1c3RvbVBhcmFtZXRlciA9ICdjdXN0b20tcGFyYW1ldGVyJyxcblxuICAvKipcbiAgICogQ3VzdG9tIHN0eWxlcyBhcHBsaWNhYmxlIHRvIHRoZSBlbWJlZGRlZCBpZnJhbWUgZWxlbWVudCBpdHNlbGYgKG5vdCBpbnNpZGUgaXQpLlxuICAgKi9cbiAgSWZyYW1lU3R5bGUgPSAnaWZyYW1lLXN0eWxlJyxcbn1cblxuZXhwb3J0IGVudW0gV2ViQ29tcG9uZW50Q2hpbGRFbGVtZW50QXR0cmlidXRlcyB7XG4gIEZpZWxkID0gJ2ZpZWxkJyxcbiAgVmFsdWUgPSAndmFsdWUnLFxuICBOYW1lID0gJ25hbWUnLFxufVxuIiwiLy8gQWxsIGVudW0gdmFsdWVzIG1hZGUgYXZhaWxhYmxlIHRvIEV4dGVuc2lvbnMgZGV2ZWxvcGVycy5cbi8vIEVudW1zIHNob3VsZCBiZSBrZXB0IGluIGFscGhhYmV0aWNhbCBvcmRlci5cblxuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4vRXh0ZW5zaW9ucyc7XG5cbm5hbWVzcGFjZSBUYWJsZWF1IHtcbiAgZXhwb3J0IGxldCBleHRlbnNpb25zOiBFeHRlbnNpb25zO1xuICAvKipcbiAgICogQWxsIGVycm9yIGNvZGVzIHVzZWQgYnkgdGhlIEV4dGVuc2lvbnMgQVBJLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRXJyb3JDb2RlcyB7XG4gICAgLyoqXG4gICAgICogVGhyb3duIHdoZW4gY2FsbGVyIGF0dGVtcHRzIHRvIGV4ZWN1dGUgY29tbWFuZCBiZWZvcmUgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBBUElOb3RJbml0aWFsaXplZCA9ICdhcGktbm90LWluaXRpYWxpemVkJyxcbiAgICAvKipcbiAgICAgKiBUaHJvd24gd2hlbiBjYWxsZXIgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBjb21tYW5kIHdoaWxlIGV4dGVuc2lvbiBpcyBub3QgdmlzaWJsZS5cbiAgICAgKi9cbiAgICBWaXNpYmlsaXR5RXJyb3IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gICAgLyoqXG4gICAgICogT25seSBvbmUgZGlhbG9nIGNhbiBiZSBvcGVuZWQgYXQgdGltZSB3aXRoIHRoZSBVSSBuYW1lc3BhY2UgZnVuY3Rpb25hbGl0eS5cbiAgICAgKi9cbiAgICBEaWFsb2dBbHJlYWR5T3BlbiA9ICdkaWFsb2ctYWxyZWFkeS1vcGVuJyxcbiAgICAvKipcbiAgICAgKiBUaGUgb3BlbiBkaWFsb2cgd2FzIGNsb3NlZCBieSB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBEaWFsb2dDbG9zZWRCeVVzZXIgPSAnZGlhbG9nLWNsb3NlZC1ieS11c2VyJyxcbiAgICAvKipcbiAgICAgKiBBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIFRhYmxlYXUgRXh0ZW5zaW9ucyBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgICAqL1xuICAgIEludGVybmFsRXJyb3IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICAgIC8qKlxuICAgICAqIEEgZGlhbG9nIG11c3Qgc3RhcnQgb24gdGhlIHNhbWUgZG9tYWluIGFzIHRoZSBwYXJlbnQgZXh0ZW5pb24uXG4gICAgICovXG4gICAgSW52YWxpZERvbWFpbkRpYWxvZyA9ICdpbnZhbGlkLWRpYWxvZy1kb21haW4nLFxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZSBmaWVsZC5cbiAgICAgKi9cbiAgICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgICAvKipcbiAgICAgKiBDYW4gb2NjdXIgaWYgdGhlIGV4dGVuc2lvbiBpbnRlcmFjdHMgd2l0aCBhIGZpbHRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgICAqL1xuICAgIE1pc3NpbmdGaWx0ZXIgPSAnbWlzc2luZy1maWx0ZXInLFxuICAgIC8qKlxuICAgICAqIENhbiBvY2N1ciBpZiB0aGUgZXh0ZW5zaW9uIGludGVyYWN0cyB3aXRoIGEgcGFyYW1ldGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAgICovXG4gICAgTWlzc2luZ1BhcmFtZXRlciA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgU2VydmVyIEVycm9yXG4gICAgICovXG4gICAgU2VydmVyRXJyb3IgPSAnc2VydmVyLWVycm9yJyxcbiAgICAvKipcbiAgICAgKiBEZXZlbG9wZXIgY2Fubm90IHNhdmUgc2V0dGluZ3Mgd2hpbGUgYW5vdGhlciBzYXZlIGlzIHN0aWxsIGluIHByb2dyZXNzLlxuICAgICAqL1xuICAgIFNldHRpbmdTYXZlSW5Qcm9ncmVzcyA9ICdzZXR0aW5nLXNhdmUtaW4tcHJvZ3Jlc3MnLFxuICAgIC8qKlxuICAgICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIGBhZGRFdmVudExpc3RlbmVyYCBvciBgcmVtb3ZlRXZlbnRMaXN0ZW5lcmAuXG4gICAgICovXG4gICAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gICAgLyoqXG4gICAgICogQSBtZXRob2Qgd2FzIHVzZWQgZm9yIGEgdHlwZSBvZiBkYXRhIHNvdXJjZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGF0IG1ldGhvZCAoc2VlIGdldEFjdGl2ZVRhYmxlc0FzeW5jIGZvciBhbiBleGFtcGxlKVxuICAgICAqL1xuICAgIFVuc3VwcG9ydGVkTWV0aG9kRm9yRGF0YVNvdXJjZVR5cGUgPSAndW5zdXBwb3J0ZWQtbWV0aG9kLWZvci1kYXRhLXNvdXJjZS10eXBlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgRXh0ZW5zaW9ucyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4dGVuc2lvbkNvbnRleHQge1xuICAgIERlc2t0b3AgPSAnZGVza3RvcCcsXG4gICAgU2VydmVyID0gJ3NlcnZlcicsXG4gICAgQ2xvdWQgPSAnY2xvdWQnLFxuICAgIFB1YmxpY1dlYiA9ICdwdWJsaWMtd2ViJyxcbiAgICBQdWJsaWNEZXNrdG9wID0gJ3B1YmxpYy1kZXNrdG9wJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGUgRXh0ZW5zaW9ucyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4dGVuc2lvbk1vZGUge1xuICAgIEF1dGhvcmluZyA9ICdhdXRob3JpbmcnLFxuICAgIFZpZXdpbmcgPSAndmlld2luZycsXG4gIH1cblxuICAvKipcbiAgICogUmVwcmVzZW50cyB0aGUgdHlwZSBvZiBldmVudCB0aGF0IGNhbiBiZSBsaXN0ZW5lZCBmb3IuXG4gICAqL1xuICBleHBvcnQgZW51bSBUYWJsZWF1RXZlbnRUeXBlIHtcbiAgICAvKipcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICogUmFpc2VkIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkIHRoYXQgd2FzIHNlbnQgYnkgYSBkaWFsb2cgb3IgZXh0ZW5zaW9uIHZpYSBgc2VuZERpYWxvZ01lc3NhZ2VBc3luY2AuKi9cbiAgICBEaWFsb2dNZXNzYWdlUmVjZWl2ZWQgPSAnZGlhbG9nLW1lc3NhZ2UtcmVjZWl2ZWQnLFxuXG4gICAgLyoqIFJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuKi9cbiAgICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgc2VsZWN0ZWQgbWFya3Mgb24gYSB2aXN1YWxpemF0aW9uIGhhcyBjaGFuZ2VkLlxuICAgICAqIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuICovXG4gICAgTWFya1NlbGVjdGlvbkNoYW5nZWQgPSAnbWFyay1zZWxlY3Rpb24tY2hhbmdlZCcsXG5cbiAgICAvKiogVGhlIHN1bW1hcnkgZGF0YSBiYWNraW5nIGEgd29ya3NoZWV0IGhhcyBjaGFuZ2VkXG4gICAgICogWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1dvcmtzaGVldF0oLi4vaW50ZXJmYWNlcy93b3Jrc2hlZXQuaHRtbCkgb2JqZWN0cy4qL1xuICAgIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5LWRhdGEtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbUGFyYW1ldGVyXV0gb2JqZWN0cy4gKi9cbiAgICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBTZXR0aW5ncyBoYXZlIGJlZW4gY2hhbmdlZCBmb3IgdGhpcyBleHRlbnNpb24uIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbU2V0dGluZ3NdXSBvYmplY3RzLiAqL1xuICAgIFNldHRpbmdzQ2hhbmdlZCA9ICdzZXR0aW5ncy1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgZGFzaGJvYXJkIGxheW91dCBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIERhc2hib2FyZExheW91dENoYW5nZWQgPSAnZGFzaGJvYXJkLWxheW91dC1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgd29ya2Jvb2sgZm9ybWF0dGluZyBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWQgPSAnd29ya2Jvb2stZm9ybWF0dGluZy1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgd29ya3NoZWV0IGZvcm1hdHRpbmcgaGFzIGNoYW5nZWRcbiAgICAgKiBAY2F0ZWdvcnkgVml6IEV4dGVuc2lvbnNcbiAgICAgKi9cbiAgICBXb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZCA9ICd3b3Jrc2hlZXQtZm9ybWF0dGluZy1jaGFuZ2VkJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgZGF0YSB0eXBlIG9mIGVuY29kaW5ncyBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuNi4wXG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZUVuY29kaW5nVHlwZSB7XG4gICAgRGlzY3JldGUgPSAnZGlzY3JldGUnLFxuICAgIENvbnRpbnVvdXMgPSAnY29udGludW91cycsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHNvcnQgZGlyZWN0aW9uIGZvciBjcmVhdGVWaXpJbWFnZUFzeW5jLlxuICAgKiBAc2luY2UgMS44LjAgYW5kIFRhYmxlYXUgMjAyMS40XG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZVNvcnREaXJlY3Rpb25UeXBlIHtcbiAgICBBc2NlbmRpbmcgPSAnYXNjZW5kaW5nJyxcbiAgICBEZXNjZW5kaW5nID0gJ2Rlc2NlbmRpbmcnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBwYWxldHRlIHR5cGUgZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlUGFsZXR0ZVR5cGUge1xuICAgIEN1c3RvbURpdmVyZ2luZyA9ICdjdXN0b20tZGl2ZXJnaW5nJyxcbiAgICBDdXN0b21TZXF1ZW50aWFsID0gJ2N1c3RvbS1zZXF1ZW50aWFsJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgU2l6ZSBTZXR0aW5nIHR5cGUgZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlU2l6ZVNldHRpbmdUeXBlIHtcbiAgICBGaXhlZCA9ICdmaXhlZCcsXG4gICAgTWFudWFsID0gJ21hbnVhbCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIFNpemUgU2V0dGluZyBhbGlnbm1lbnQgdHlwZSBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuOC4wIGFuZCBUYWJsZWF1IDIwMjEuNFxuICAgKi9cbiAgZXhwb3J0IGVudW0gVml6SW1hZ2VTaXplU2V0dGluZ0FsaWdubWVudFR5cGUge1xuICAgIFJpZ2h0ID0gJ3JpZ2h0JyxcbiAgICBMZWZ0ID0gJ2xlZnQnLFxuICAgIENlbnRlciA9ICdjZW50ZXInLFxuICB9XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiZXhwb3J0IGVudW0gU2hhcmVkRXJyb3JDb2RlcyB7XG4gIC8qKlxuICAgKiBBIENTViBvciBFeGNlbCBmaWxlIGZhaWxlZCB0byBiZSBjcmVhdGVkIGluIFZpei5leHBvcnRDcm9zc3RhYkFzeW5jKCkuXG4gICAqL1xuICBDcm9zc3RhYkNyZWF0aW9uRXJyb3IgPSAnY3Jvc3N0YWItY3JlYXRpb24tZXJyb3InLFxuICAvKipcbiAgICogQSBDU1YgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0RGF0YUFzeW5jKCkuXG4gICAqL1xuICBEYXRhQ3JlYXRpb25FcnJvciA9ICdkYXRhLWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgYWdncmVnYXRpb24gd2FzIHNwZWNpZmllZCBmb3IgdGhlIGZpbHRlciwgc3VjaCBhcyBzZXR0aW5nIGEgcmFuZ2UgZmlsdGVyIHRvIFwiU1VNKFNhbGVzKVwiIGluc3RlYWQgb2ZcbiAgICogXCJTYWxlc1wiLlxuICAgKi9cbiAgSW52YWxpZEFnZ3JlZ2F0aW9uRmllbGROYW1lID0gJ2ludmFsaWQtYWdncmVnYXRpb24tZmllbGQtbmFtZScsXG4gIC8qKlxuICAgKiBBIGZpbHRlciBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGZpZWxkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGEgc291cmNlLlxuICAgKi9cbiAgSW52YWxpZEZpbHRlckZpZWxkTmFtZSA9ICdpbnZhbGlkLWZpbHRlci1uYW1lJyxcbiAgLyoqXG4gICAqIEEgZmlsdGVyIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIHVzaW5nIGEgdmFsdWUgdGhhdCBpcyB0aGUgd3JvbmcgZGF0YSB0eXBlIG9yIGZvcm1hdC5cbiAgICovXG4gIEludmFsaWRGaWx0ZXJGaWVsZFZhbHVlID0gJ2ludmFsaWQtZmlsdGVyLWZpZWxkVmFsdWUnLFxuICAvKipcbiAgICogQW4gaW52YWxpZCBkYXRlIHZhbHVlIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCBmb3IgYSBkYXRlIGZpZWxkLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvbkRhdGUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZGF0ZScsXG4gIC8qKlxuICAgKiBBIGZpZWxkIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYXRhIHNvdXJjZS5cbiAgICovXG4gIEludmFsaWRTZWxlY3Rpb25GaWVsZE5hbWUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZmllbGROYW1lJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBpbiBhIFNoZWV0LnNlbGVjdE1hcmtzQXN5bmMoKSBjYWxsLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblZhbHVlID0gJ2ludmFsaWQtc2VsZWN0aW9uLXZhbHVlJyxcbiAgLyoqXG4gICAqIEEgcGFyYW1ldGVyIGRpZCBub3QgaW5jbHVkZSBhIHZhbGlkIHNoZWV0IHNlbGVjdGlvbiBmb3IgZXhwb3J0aW5nLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblNoZWV0ID0gJ2ludmFsaWQtc2VsZWN0aW9uLXNoZWV0JyxcbiAgLyoqXG4gICAqIEFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgVGFibGVhdSBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgKi9cbiAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIC8qKlxuICAgKiBBIHBhcmFtZXRlciBpcyBub3QgdGhlIGNvcnJlY3QgZGF0YSB0eXBlIG9yIGZvcm1hdC4gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgaW4gdGhlIEVycm9yLm1lc3NhZ2UgZmllbGQuXG4gICAqL1xuICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEEgUERGIGZpbGUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQgaW4gVml6LmV4cG9ydFBERkFzeW5jKCkuXG4gICAqL1xuICBQREZDcmVhdGlvbkVycm9yID0gJ3BkZi1jcmVhdGlvbi1lcnJvcicsXG4gIC8qKlxuICAgKiBBIFBvd2VyUG9pbnQgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKCkuXG4gICAqL1xuICBQb3dlclBvaW50Q3JlYXRpb25FcnJvciA9ICdwb3dlcnBvaW50LWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgc2hlZXQgdGhhdCBpcyBub3QgYWN0aXZlIG9yIGVtYmVkZGVkIHdpdGhpbiB0aGUgYWN0aXZlIGRhc2hib2FyZC5cbiAgICovXG4gIE5vdEFjdGl2ZVNoZWV0ID0gJ25vdC1hY3RpdmUtc2hlZXQnLFxuICAvKipcbiAgICogUHJvcGVydHkgb3IgRnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoaW4gdGhlIFRhYmxlYXUgQVBJLlxuICAgKi9cbiAgSW1wbGVtZW50YXRpb25FcnJvciA9ICd3cm9uZy1pbXBsZW1lbnRhdGlvbicsXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgd2hlbiB0d28gaW5jb21wYXRpYmxlIGNhbGxzIGFyZSB0cmlnZ2VyZWQgdG9nZXRoZXIuXG4gICAqL1xuICBBcGlFeGVjdXRpb25FcnJvciA9ICdhcGktZXhlY3V0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEEgZ2VuZXJhbC1wdXJwb3NlIHNlcnZlciBlcnJvciBvY2N1cnJlZC4gRGV0YWlscyBhcmUgY29udGFpbmVkIGluIHRoZSBFcnJvciBvYmplY3QuXG4gICAqL1xuICBTZXJ2ZXJFcnJvciA9ICdzZXJ2ZXItZXJyb3InLFxuICAvKipcbiAgICogQ2FuIG9jY3VyIHdoZW4gYW4gYXBpIGNhbGwgdGltZXMgb3V0LlxuICAgKi9cbiAgVGltZW91dCA9ICd0aW1lb3V0Jyxcbn1cbiIsIi8qKlxuICogVGhlIHRhYmxlYXUgbmFtZXNwYWNlIGV4aXN0cyBmb3Igb3JnYW5pemF0aW9uIGFuZCB0byBhdm9pZCBwb2xsdXRpbmdcbiAqIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBJdCBjb250YWlucyBubyBjb25zdHJ1Y3RzIG90aGVyIHRoYW4gc3ViLW5hbWVzcGFjZXMgYW5kIHRoZSBUYWJsZWF1IGVudW1lcmF0aW9ucy5cbiAqL1xubmFtZXNwYWNlIFRhYmxlYXUge1xuICBleHBvcnQgZW51bSBBbmFseXRpY3NPYmplY3RUeXBlIHtcbiAgICBDbHVzdGVyID0gJ2NsdXN0ZXInLFxuICAgIEZvcmVjYXN0ID0gJ2ZvcmVjYXN0JyxcbiAgICBUcmVuZExpbmUgPSAndHJlbmQtbGluZScsXG4gIH1cblxuICBleHBvcnQgZW51bSBBbm5vdGF0aW9uVHlwZSB7XG4gICAgTWFyayA9ICdtYXJrJyxcbiAgICBQb2ludCA9ICdwb2ludCcsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIENvbHVtblR5cGUge1xuICAgIERpc2NyZXRlID0gJ2Rpc2NyZXRlJyxcbiAgICBDb250aW51b3VzID0gJ2NvbnRpbnVvdXMnLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gIH1cblxuICBleHBvcnQgZW51bSBDbGFzc05hbWVLZXkge1xuICAgIFdvcmtzaGVldFRpdGxlID0gJ3RhYmxlYXUtd29ya3NoZWV0LXRpdGxlJyxcbiAgICBXb3Jrc2hlZXQgPSAndGFibGVhdS13b3Jrc2hlZXQnLFxuICAgIFRvb2x0aXAgPSAndGFibGVhdS10b29sdGlwJyxcbiAgICBTdG9yeVRpdGxlID0gJ3RhYmxlYXUtc3RvcnktdGl0bGUnLFxuICAgIERhc2hib2FyZFRpdGxlID0gJ3RhYmxlYXUtZGFzaGJvYXJkLXRpdGxlJyxcbiAgICBQYW5lID0gJ3RhYmxlYXUtcGFuZScsXG4gICAgUm93RGl2aWRlcnMgPSAndGFibGVhdS1yb3ctZGl2aWRlcnMnLFxuICAgIENvbHVtbkRpdmlkZXJzID0gJ3RhYmxlYXUtY29sdW1uLWRpdmlkZXJzJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHRoZSBvYmplY3QgcmVwcmVzZW50cyBpbiBhIGRhc2hib2FyZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIERhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIEJsYW5rID0gJ2JsYW5rJyxcbiAgICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0JyxcbiAgICBRdWlja0ZpbHRlciA9ICdxdWljay1maWx0ZXInLFxuICAgIFBhcmFtZXRlckNvbnRyb2wgPSAncGFyYW1ldGVyLWNvbnRyb2wnLFxuICAgIFBhZ2VGaWx0ZXIgPSAncGFnZS1maWx0ZXInLFxuICAgIExlZ2VuZCA9ICdsZWdlbmQnLFxuICAgIFRpdGxlID0gJ3RpdGxlJyxcbiAgICBUZXh0ID0gJ3RleHQnLFxuICAgIEltYWdlID0gJ2ltYWdlJyxcbiAgICBXZWJQYWdlID0gJ3dlYi1wYWdlJyxcbiAgICBFeHRlbnNpb24gPSAnZXh0ZW5zaW9uJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgdmlzaWJpbGl0eSBzdGF0ZSBvZiBhIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBzaW5jZSAxLjcuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUge1xuICAgIC8qKiBVc2VkIGZvciB0dXJuaW5nIG9uIHRoZSB2aXNpYmlsaXR5IG9mIGEgZGFzaGJvYXJkIG9iamVjdC4qL1xuICAgIFNob3cgPSAnc2hvdycsXG5cbiAgICAvKiogVXNlZCBmb3IgdHVybmluZyBvZmYgdGhlIHZpc2liaWxpdHkgb2YgYSBkYXNoYm9hcmQgb2JqZWN0LiovXG4gICAgSGlkZSA9ICdoaWRlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlmZmVyZW50IHR5cGVzIG9mIGRhdGEgYSB2YWx1ZSBjYW4gaGF2ZVxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGF0YVR5cGUge1xuICAgIFN0cmluZyA9ICdzdHJpbmcnLFxuICAgIEludCA9ICdpbnQnLFxuICAgIEZsb2F0ID0gJ2Zsb2F0JyxcbiAgICBCb29sID0gJ2Jvb2wnLFxuICAgIERhdGUgPSAnZGF0ZScsXG4gICAgRGF0ZVRpbWUgPSAnZGF0ZS10aW1lJyxcbiAgICBTcGF0aWFsID0gJ3NwYXRpYWwnLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIGNoYW5nZXMgdGhhdCBvY2N1ciB0byBhIGRhc2hib2FyZCBvYmplY3QuXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXNoYm9hcmRMYXlvdXRDaGFuZ2Uge1xuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3Qgd2FzIGFkZGVkICovXG4gICAgQWRkZWQgPSAnYWRkZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCB3YXMgcmVtb3ZlZCAqL1xuICAgIFJlbW92ZWQgPSAncmVtb3ZlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0J3MgZmxvYXRpbmcgc3RhdGUgY2hhbmdlZCAqL1xuICAgIElzRmxvYXRpbmdDaGFuZ2VkID0gJ2lzLWZsb2F0aW5nLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHZpc2liaWxpdHkgY2hhbmdlZCAqL1xuICAgIElzVmlzaWJsZUNoYW5nZWQgPSAnaXMtdmlzaWJsZS1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QncyBwb3NpdGlvbiBjaGFuZ2VkICovXG4gICAgUG9zaXRpb25DaGFuZ2VkID0gJ3Bvc2l0aW9uLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHNpemUgY2hhbmdlZCAqL1xuICAgIFNpemVDaGFuZ2VkID0gJ3NpemUtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IHdhcyByZW5hbWVkICovXG4gICAgTmFtZUNoYW5nZWQgPSAnbmFtZS1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QgaXMgc2VsZWN0ZWQgKi9cbiAgICBTZWxlY3RlZCA9ICdzZWxlY3RlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IGlzIGRlc2VsZWN0ZWQgKi9cbiAgICBEZXNlbGVjdGVkID0gJ2Rlc2VsZWN0ZWQnLFxuXG4gICAgLyoqIE5hdmlnYXRlIHRvIGFub3RoZXIgZGFzaGJvYXJkICovXG4gICAgRGFzaGJvYXJkQ2hhbmdlZCA9ICdkYXNoYm9hcmQtY2hhbmdlZCcsXG4gIH1cblxuICAvKipcbiAgICogVmFsaWQgZGF0ZSByYW5nZXMgZm9yIGEgcmVsYXRpdmUgZGF0ZSBmaWx0ZXIuXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXRlUmFuZ2VUeXBlIHtcbiAgICBMYXN0ID0gJ2xhc3QnLFxuICAgIExhc3ROID0gJ2xhc3QtbicsXG4gICAgTmV4dCA9ICduZXh0JyxcbiAgICBOZXh0TiA9ICduZXh0LW4nLFxuICAgIEN1cnJlbnQgPSAnY3VycmVudCcsXG4gICAgVG9EYXRlID0gJ3RvLWRhdGUnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSB0eXBlcyBvZiBkaWFsb2cgcG9wdXAgc3R5bGVzLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGlhbG9nU3R5bGUge1xuICAgIFdpbmRvdyA9ICd3aW5kb3cnLFxuICAgIE1vZGFsID0gJ21vZGFsJyxcbiAgICBNb2RlbGVzcyA9ICdtb2RlbGVzcycsXG4gIH1cblxuICBleHBvcnQgZW51bSBFbmNvZGluZ1R5cGUge1xuICAgIENvbHVtbiA9ICdjb2x1bW4nLFxuICAgIFJvdyA9ICdyb3cnLFxuICAgIFBhZ2UgPSAncGFnZScsXG4gICAgRmlsdGVyID0gJ2ZpbHRlcicsXG4gICAgTWFya3NUeXBlID0gJ21hcmtzLXR5cGUnLFxuICAgIE1lYXN1cmVWYWx1ZXMgPSAnbWVhc3VyZS12YWx1ZXMnLFxuICAgIENvbG9yID0gJ2NvbG9yJyxcbiAgICBTaXplID0gJ3NpemUnLFxuICAgIExhYmVsID0gJ2xhYmVsJyxcbiAgICBEZXRhaWwgPSAnZGV0YWlsJyxcbiAgICBUb29sdGlwID0gJ3Rvb2x0aXAnLFxuICAgIFNoYXBlID0gJ3NoYXBlJyxcbiAgICBQYXRoID0gJ3BhdGgnLFxuICAgIEFuZ2xlID0gJ2FuZ2xlJyxcbiAgICBHZW9tZXRyeSA9ICdnZW9tZXRyeScsXG4gICAgQ3VzdG9tID0gJ2N1c3RvbScsXG4gIH1cblxuICAvKipcbiAgICogIFR5cGUgb2YgYWdncmVnYXRpb24gb24gYSBmaWVsZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICBTdW0gPSAnc3VtJyxcbiAgICBBdmcgPSAnYXZnJyxcbiAgICBNaW4gPSAnbWluJyxcbiAgICBNYXggPSAnbWF4JyxcbiAgICBTdGRldiA9ICdzdGRldicsXG4gICAgU3RkZXZwID0gJ3N0ZGV2cCcsXG4gICAgVmFyID0gJ3ZhcicsXG4gICAgVmFycCA9ICd2YXJwJyxcbiAgICBDb2xsZWN0ID0gJ2NvbGxlY3QnLFxuICAgIENvdW50ID0gJ2NvdW50JyxcbiAgICBDb3VudGQgPSAnY291bnRkJyxcbiAgICBNZWRpYW4gPSAnbWVkaWFuJyxcbiAgICBBdHRyID0gJ2F0dHInLFxuICAgIE5vbmUgPSAnbm9uZScsXG4gICAgWWVhciA9ICd5ZWFyJyxcbiAgICBRdHIgPSAncXRyJyxcbiAgICBNb250aCA9ICdtb250aCcsXG4gICAgRGF5ID0gJ2RheScsXG4gICAgSG91ciA9ICdob3VyJyxcbiAgICBNaW51dGUgPSAnbWludXRlJyxcbiAgICBTZWNvbmQgPSAnc2Vjb25kJyxcbiAgICBXZWVrID0gJ3dlZWsnLFxuICAgIFdlZWtkYXkgPSAnd2Vla2RheScsXG4gICAgTW9udGhZZWFyID0gJ21vbnRoLXllYXInLFxuICAgIE1keSA9ICdtZHknLFxuICAgIEVuZCA9ICdlbmQnLFxuICAgIFRydW5jWWVhciA9ICd0cnVuYy15ZWFyJyxcbiAgICBUcnVuY1F0ciA9ICd0cnVuYy1xdHInLFxuICAgIFRydW5jTW9udGggPSAndHJ1bmMtbW9udGgnLFxuICAgIFRydW5jV2VlayA9ICd0cnVuYy13ZWVrJyxcbiAgICBUcnVuY0RheSA9ICd0cnVuYy1kYXknLFxuICAgIFRydW5jSG91ciA9ICd0cnVuYy1ob3VyJyxcbiAgICBUcnVuY01pbnV0ZSA9ICd0cnVuYy1taW51dGUnLFxuICAgIFRydW5jU2Vjb25kID0gJ3RydW5jLXNlY29uZCcsXG4gICAgUXVhcnQxID0gJ3F1YXJ0MScsXG4gICAgUXVhcnQzID0gJ3F1YXJ0MycsXG4gICAgU2tld25lc3MgPSAnc2tld25lc3MnLFxuICAgIEt1cnRvc2lzID0gJ2t1cnRvc2lzJyxcbiAgICBJbk91dCA9ICdpbi1vdXQnLFxuICAgIFVzZXIgPSAndXNlcicsXG4gIH1cblxuICAvKipcbiAgICogUm9sZSBvZiBhIGZpZWxkLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmllbGRSb2xlVHlwZSB7XG4gICAgRGltZW5zaW9uID0gJ2RpbWVuc2lvbicsXG4gICAgTWVhc3VyZSA9ICdtZWFzdXJlJyxcbiAgICBVbmtub3duID0gJ3Vua25vd24nLFxuICB9XG5cbiAgLyoqXG4gICAqIEFuIGVudW1lcmF0aW9uIG9mIHRoZSB2YWxpZCB0eXBlcyBvZiBmaWx0ZXJzIHRoYXQgY2FuIGJlIGFwcGxpZWQuXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJUeXBlIHtcbiAgICBDYXRlZ29yaWNhbCA9ICdjYXRlZ29yaWNhbCcsXG4gICAgUmFuZ2UgPSAncmFuZ2UnLFxuICAgIEhpZXJhcmNoaWNhbCA9ICdoaWVyYXJjaGljYWwnLFxuICAgIFJlbGF0aXZlRGF0ZSA9ICdyZWxhdGl2ZS1kYXRlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlmZmVyZW50IHVwZGF0ZSB0eXBlcyBmb3IgYXBwbHlpbmcgZmlsdGVyXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJVcGRhdGVUeXBlIHtcbiAgICBBZGQgPSAnYWRkJyxcbiAgICBBbGwgPSAnYWxsJyxcbiAgICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxuICAgIFJlbW92ZSA9ICdyZW1vdmUnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkb21haW4gdHlwZSBmb3IgYSBmaWx0ZXJcbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpbHRlckRvbWFpblR5cGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBkb21haW4gdmFsdWVzIHRoYXQgYXJlIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgZmlsdGVyXG4gICAgICogaS5lLiB0aGUgZG9tYWluIGlzIHJlc3RyaWN0ZWQgYnkgYSBwcmV2aW91cyBmaWx0ZXJcbiAgICAgKi9cbiAgICBSZWxldmFudCA9ICdyZWxldmFudCcsXG4gICAgLyoqXG4gICAgICogbGlzdCBvZiBhbGwgcG9zc2libGUgZG9tYWluIHZhbHVlcyBmcm9tIGRhdGFiYXNlXG4gICAgICovXG4gICAgRGF0YWJhc2UgPSAnZGF0YWJhc2UnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvcHRpb24gZm9yIHNwZWNpZnlpbmcgd2hpY2ggdmFsdWVzIHRvIGluY2x1ZGUgZm9yIGZpbHRlcmluZ1xuICAgKiBJbmRpY2F0ZXMgd2hhdCB0byBkbyB3aXRoIG51bGwgdmFsdWVzIGZvciBhIGdpdmVuIGZpbHRlciBvciBtYXJrIHNlbGVjdGlvbiBjYWxsLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmlsdGVyTnVsbE9wdGlvbiB7XG4gICAgTnVsbFZhbHVlcyA9ICdudWxsLXZhbHVlcycsXG4gICAgTm9uTnVsbFZhbHVlcyA9ICdub24tbnVsbC12YWx1ZXMnLFxuICAgIEFsbFZhbHVlcyA9ICdhbGwtdmFsdWVzJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgc2VydmVzIGFzIGEgZmlsdGVyIG9uIHRoZSBEYXRhVmFsdWVzIHJldHVybmVkIGZyb20gYGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmNgLFxuICAgKiBgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jYCBhbmQgYGdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luY2AuXG4gICAqIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIG9mIHJldHVybmVkIGRhdGEgdmFsdWVzIG9ubHkuIFRhYmxlYXUgdmVyc2lvbnMgcHJpb3IgdG8gMjAyMS4yXG4gICAqIHdpbGwgcGFzcyB0aGUgZGF0YSBhY3Jvc3MgYW5kIHBvcHVsYXRlIHRoZSBEYXRhVmFsdWUgcHJvcGVydGllcy5cbiAgICogUGxlYXNlIG5vdGUgdGhhdCBhbGwgcHJvcGVydGllcyBub3QgcmVxdWVzdGVkIHdpbGwgYmUgYHVuZGVmaW5lZGAgaW4gdGhlIERhdGFWYWx1ZSByZXN1bHRzLlxuICAgKiBAc2luY2UgMS41LjBcbiAgICovXG4gIGV4cG9ydCBlbnVtIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHtcbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIGluY2x1ZGUgYWxsIHByb3BlcnRpZXMuKi9cbiAgICBBbGxWYWx1ZXMgPSAnYWxsLXZhbHVlcycsXG5cbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIG9ubHkgaW5jbHVkZSB2YWx1ZSBhbmQgbmF0aXZlVmFsdWUgcHJvcGVydGllcy4qL1xuICAgIE9ubHlOYXRpdmVWYWx1ZXMgPSAnb25seS1uYXRpdmUtdmFsdWVzJyxcblxuICAgIC8qKiBEYXRhVmFsdWVzIHdpbGwgb25seSBpbmNsdWRlIGZvcm1hdHRlZFZhbHVlIHByb3BlcnRpZXMuICovXG4gICAgT25seUZvcm1hdHRlZFZhbHVlcyA9ICdvbmx5LWZvcm1hdHRlZC12YWx1ZXMnLFxuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgb2YgbWFyayBmb3IgYSBnaXZlbiBtYXJrcyBjYXJkIGluIGEgdml6LlxuICAgKi9cbiAgZXhwb3J0IGVudW0gTWFya1R5cGUge1xuICAgIEJhciA9ICdiYXInLFxuICAgIExpbmUgPSAnbGluZScsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgICBTcXVhcmUgPSAnc3F1YXJlJyxcbiAgICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgICBTaGFwZSA9ICdzaGFwZScsXG4gICAgVGV4dCA9ICd0ZXh0JyxcbiAgICBNYXAgPSAnbWFwJyxcbiAgICBQaWUgPSAncGllJyxcbiAgICBHYW50dEJhciA9ICdnYW50dC1iYXInLFxuICAgIFBvbHlnb24gPSAncG9seWdvbicsXG4gICAgSGVhdG1hcCA9ICdoZWF0bWFwJyxcbiAgICBWaXpFeHRlbnNpb24gPSAndml6LWV4dGVuc2lvbicsXG4gIH1cblxuICAvKipcbiAgICogQW4gZW51bWVyYXRpb24gZGVzY3JpYmluZyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGFsbG93YWJsZSB2YWx1ZXMuXG4gICAqIFRoaXMgaXMgdXNlZCBmb3IgcmVzdHJpY3RpbmcgdGhlIGRvbWFpbiBvZiBhIHBhcmFtZXRlclxuICAgKi9cbiAgZXhwb3J0IGVudW0gUGFyYW1ldGVyVmFsdWVUeXBlIHtcbiAgICBBbGwgPSAnYWxsJyxcbiAgICBMaXN0ID0gJ2xpc3QnLFxuICAgIFJhbmdlID0gJ3JhbmdlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRlIHBlcmlvZCB1c2VkIGluIGZpbHRlcnMgYW5kIGluIHBhcmFtZXRlcnMuXG4gICAqL1xuICBleHBvcnQgZW51bSBQZXJpb2RUeXBlIHtcbiAgICBZZWFycyA9ICd5ZWFycycsXG4gICAgUXVhcnRlcnMgPSAncXVhcnRlcnMnLFxuICAgIE1vbnRocyA9ICdtb250aHMnLFxuICAgIFdlZWtzID0gJ3dlZWtzJyxcbiAgICBEYXlzID0gJ2RheXMnLFxuICAgIEhvdXJzID0gJ2hvdXJzJyxcbiAgICBNaW51dGVzID0gJ21pbnV0ZXMnLFxuICAgIFNlY29uZHMgPSAnc2Vjb25kcycsXG4gIH1cblxuICBleHBvcnQgZW51bSBRdWlja1RhYmxlQ2FsY1R5cGUge1xuICAgIFJ1bm5pbmdUb3RhbCA9ICdydW5uaW5nLXRvdGFsJyxcbiAgICBEaWZmZXJlbmNlID0gJ2RpZmZlcmVuY2UnLFxuICAgIFBlcmNlbnREaWZmZXJlbmNlID0gJ3BlcmNlbnQtZGlmZmVyZW5jZScsXG4gICAgUGVyY2VudE9mVG90YWwgPSAncGVyY2VudC1vZi10b3RhbCcsXG4gICAgUmFuayA9ICdyYW5rJyxcbiAgICBQZXJjZW50aWxlID0gJ3BlcmNlbnRpbGUnLFxuICAgIE1vdmluZ0F2ZXJhZ2UgPSAnbW92aW5nLWF2ZXJhZ2UnLFxuICAgIFlURFRvdGFsID0gJ3l0ZC10b3RhbCcsXG4gICAgQ29tcG91bmRHcm93dGhSYXRlID0gJ2NvbXBvdW5kLWdyb3d0aC1yYXRlJyxcbiAgICBZZWFyT3ZlclllYXJHcm93dGggPSAneWVhci1vdmVyLXllYXItZ3Jvd3RoJyxcbiAgICBZVERHcm93dGggPSAneXRkLWdyb3d0aCcsXG4gICAgVW5kZWZpbmVkID0gJ3VuZGVmaW5lZCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSBmb3Igc3BlY2lmeWluZyB0aGUgc2VsZWN0aW9uIHR5cGUgZm9yIHNlbGVjdCBtYXJrcyBhcGkuXG4gICAqL1xuICBleHBvcnQgZW51bSBTZWxlY3Rpb25VcGRhdGVUeXBlIHtcbiAgICBSZXBsYWNlID0gJ3NlbGVjdC1yZXBsYWNlJyxcbiAgICBBZGQgPSAnc2VsZWN0LWFkZCcsXG4gICAgUmVtb3ZlID0gJ3NlbGVjdC1yZW1vdmUnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIHNlbGVjdCBvcHRpb24gZm9yIHRoZSBgZXh0ZW5zaW9ucy5Xb3Jrc2hlZXQuc2VsZWN0VHVwbGVzQXN5bmNgIG1ldGhvZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIFNlbGVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENsZWFycyBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHNlbGVjdGluZyB0aGUgdHVwbGVzIHNwZWNpZmllZFxuICAgICAqL1xuICAgIFNpbXBsZSA9ICdzZWxlY3Qtb3B0aW9ucy1zaW1wbGUnLFxuICAgIC8qKlxuICAgICAqIEFkZHMgc3BlY2lmaWVkIHR1cGxlcyB0byB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uXG4gICAgICovXG4gICAgVG9nZ2xlID0gJ3NlbGVjdC1vcHRpb25zLXRvZ2dsZScsXG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygc2hlZXQgYSBbW1NoZWV0XV0gb2JqZWN0IHJlcHJlc2VudHNcbiAgICovXG4gIGV4cG9ydCBlbnVtIFNoZWV0VHlwZSB7XG4gICAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gICAgU3RvcnkgPSAnc3RvcnknLFxuICAgIFdvcmtzaGVldCA9ICd3b3Jrc2hlZXQnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gU29ydERpcmVjdGlvbiB7XG4gICAgSW5jcmVhc2luZyA9ICdpbmNyZWFzaW5nJyxcbiAgICBEZWNyZWFzaW5nID0gJ2RlY3JlYXNpbmcnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gVHJlbmRMaW5lTW9kZWxUeXBlIHtcbiAgICBMaW5lYXIgPSAnbGluZWFyJyxcbiAgICBMb2dhcml0aG1pYyA9ICdsb2dhcml0aG1pYycsXG4gICAgRXhwb25lbnRpYWwgPSAnZXhwb25lbnRpYWwnLFxuICAgIFBvbHlub21pYWwgPSAncG9seW5vbWlhbCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlcGxheSBzcGVlZCBvZiBhbiBhbmltYXRpb24uXG4gICAqIEBzaW5jZSAxLjcuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gUmVwbGF5U3BlZWRUeXBlIHtcbiAgICAvKiogVXNlZCBmb3Igc2V0dGluZyB0aGUgcmVwbGF5IHNwZWVkIG9mIGFuIGFuaW1hdGlvbiB0byAwLjV4LiovXG4gICAgU2xvdyA9ICdzbG93JyxcblxuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDEuMHguKi9cbiAgICBOb3JtYWwgPSAnbm9ybWFsJyxcblxuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDIuMHguKi9cbiAgICBGYXN0ID0gJ2Zhc3QnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgYSBsZXZlbCBpbiBhIGhpZXJhcmNoaWNhbCBmaWx0ZXJcbiAgICogQHNpbmNlIEV4dGVuc2lvbnMgMS4xMC4wXG4gICAqL1xuICBleHBvcnQgZW51bSBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlIHtcbiAgICBBbGxTZWxlY3RlZCA9ICdhbGwtc2VsZWN0ZWQnLFxuICAgIE5vbmVTZWxlY3RlZCA9ICdub25lLXNlbGVjdGVkJyxcbiAgICBTb21lU2VsZWN0ZWQgPSAnc29tZS1zZWxlY3RlZCcsXG4gICAgVW5rbm93blNlbGVjdGVkID0gJ3Vua25vd24tc2VsZWN0ZWQnLFxuICB9XG5cbiAgLyoqXG4gICAqIFpvbmVWaXNpYmlsaXR5VHlwZVxuICAgKiBAZGVwcmVjYXRlZCB1c2UgRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGVcbiAgICovXG4gIGV4cG9ydCBkZWNsYXJlIHR5cGUgWm9uZVZpc2liaWxpdHlUeXBlID0gRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGU7XG4gIGV4cG9ydCBjb25zdCBab25lVmlzaWJpbGl0eVR5cGUgPSB7IC4uLkRhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlIH07XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBzaGFyZWQgYXBpIHB1YmxpYyBpbnRlcmZhY2VcblxuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9Bbm5vdGF0aW9uSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0RhdGFTb3VyY2VJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRGF0YVRhYmxlSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRW52aXJvbm1lbnRJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRmlsdGVySW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBBbmFseXRpY3NPYmplY3RUeXBlLFxuICBBbm5vdGF0aW9uVHlwZSxcbiAgQ2xhc3NOYW1lS2V5LFxuICBDb2x1bW5UeXBlLFxuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UsXG4gIERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlLFxuICBEYXRhVHlwZSxcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRGlhbG9nU3R5bGUsXG4gIEVuY29kaW5nVHlwZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlckRvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24sXG4gIEZpbHRlclR5cGUsXG4gIEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICBNYXJrVHlwZSxcbiAgUGFyYW1ldGVyVmFsdWVUeXBlLFxuICBQZXJpb2RUeXBlLFxuICBRdWlja1RhYmxlQ2FsY1R5cGUsXG4gIFJlcGxheVNwZWVkVHlwZSxcbiAgU2VsZWN0T3B0aW9ucyxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgU2hlZXRUeXBlLFxuICBTb3J0RGlyZWN0aW9uLFxuICBUcmVuZExpbmVNb2RlbFR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9TZWxlY3Rpb25JbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvU2hlZXRJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvVmlzdWFsTW9kZWxJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9Xb3JrYm9va0Zvcm1hdHRpbmdJbnRlcmZhY2VzJztcbiIsIi8qKlxuICogVGhpcyBpcyB5b3VyIG1haW4uIFRoaXMgaXMgd2hlcmUgeW91IHJlLWV4cG9ydCBldmVyeXRoaW5nIHlvdSB3YW50IHRvIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAqXG4gKiBUaGUgYnVpbGQgZW5mb3JjZXMgdGhhdCB0aGUgZmlsZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgaXMgZXhwb3J0ZWQuXG4gKi9cblxuLy8gRXhwb3J0IHRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB0byBiZSBhdmFpbGFibGUgYXQgcnVudGltZVxuLy8gIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgeWFybiBwdWJsaXNoOmJ1bXAgdmlhIHNjcmlwdHMvcHVibGlzaC1jaGVjay50c1xuLy8gIHVwZGF0ZUludGVybmFsQ29udHJhY3RSdW50aW1lVmVyc2lvbiBpbiB0aGUgbW9ub3JlcG8gcm9vdC5cbmltcG9ydCAqIGFzIGludGVybmFsQ29udHJhY3RWZXJzaW9uIGZyb20gJy4uL2ludGVybmFsLWNvbnRyYWN0LXZlcnNpb24uanNvbic7XG5leHBvcnQgY29uc3QgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiA9IGludGVybmFsQ29udHJhY3RWZXJzaW9uO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L0RhdGFUeXBlQ29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvRW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9Nb2RlbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9Ob3RpZmljYXRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvUGFyYW1ldGVycyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L1ZlcmJzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL0Fza0RhdGFJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvSW5pdGlhbGl6YXRpb25PcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL0ludGVybmFsQXBpRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9QdWxzZUludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9WZXJzaW9uTnVtYmVyJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL1ZxbEludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9Dcm9zc0ZyYW1lTWVzc2VuZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzYWdlRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZUxpc3RlbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3Nlbmdlcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvUHJlcGFyZWRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsVmVyc2lvbkNvbnZlcnRlckZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL0ludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9WZXJzaW9uQ29udmVydGVyRmFjdG9yeSc7XG5cbi8vIEV4cG9ydCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgbWVzc2FnaW5nIGZvciBjb25zdW1lcnMgdG8gdXNlLlxuLy8gQmUgdmVyeSBjYXJlZnVsIG1ha2luZyBhbnkgdXBkYXRlcyB0byB0aGlzIGNvbnRyYWN0IHdoaWNoIGJyZWFrIHZlcnNpb24gY29tcGF0aWJpbGl0eS5cbmV4cG9ydCBjb25zdCBNRVNTQUdJTkdfVkVSU0lPTiA9IHtcbiAgbWFqb3I6IDEsXG4gIG1pbm9yOiAwLFxuICBmaXg6IDAsXG59O1xuIiwiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuL0VudW1zJztcblxuZXhwb3J0IGNsYXNzIERhdGFUeXBlQ29udmVydGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaXNTcGVjaWFsKHZhbHVlQXNTdHJpbmc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIFByaW9yIHRvIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHNwZWNpYWwgdmFsdWVzIGNvbWUgdG8gdXMgYXNcbiAgICAvLyAnJW51bGwlJywgJyVhbGwlJywgJyV3aWxkY2FyZCUnLCAnJW1pc3NpbmclJy4uLlxuICAgIC8vIFdoaWxlIHRoaXMgZnVuY3Rpb24gd2lsbCBuZXZlciByZXR1cm4gdHJ1ZSBmb3IgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCBjb252ZXJzaW9uLFxuICAgIC8vIGl0IGlzIGFzIGNoZWFwIGFzIHBhc3NpbmcgYXJvdW5kIGEgdmVyc2lvbiBhbmQgY2hlY2tpbmcgdGhhdC5cbiAgICAvLyAoU2VlIERhdGFWYWx1ZUZvcm1hdHRlci5jcHApXG5cbiAgICBpZiAodmFsdWVBc1N0cmluZy5sZW5ndGggPiAyICYmIHZhbHVlQXNTdHJpbmdbMF0gPT09ICclJyAmJiB2YWx1ZUFzU3RyaW5nW3ZhbHVlQXNTdHJpbmcubGVuZ3RoIC0gMV0gPT09ICclJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHNwZWNpYWxWYWx1ZUluZGljYXRvciA9ICclbnVsbCUnO1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VCb29sZWFuKGJvb2xlYW5TdHJpbmc6IHN0cmluZyk6IGJvb2xlYW4gfCBzdHJpbmcge1xuICAgIC8vIGJvb2xlYW4gdmFsdWVzIGNvbWUgdG8gdXMgYXMgJ3RydWUnfCdmYWxzZSdcbiAgICBjb25zdCBub3JtYWxpemVkQm9vbGVhbjogc3RyaW5nID0gYm9vbGVhblN0cmluZy50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBub3JtYWxpemVkQm9vbGVhbiAhPT0gJ3RydWUnICYmIG5vcm1hbGl6ZWRCb29sZWFuICE9PSAnZmFsc2UnID8gdGhpcy5zcGVjaWFsVmFsdWVJbmRpY2F0b3IgOiBub3JtYWxpemVkQm9vbGVhbiA9PT0gJ3RydWUnO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBwcml2YXRlIHN0YXRpYyBwYXJzZU51bWJlcih2YWx1ZUFzU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIgfCBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gTnVtYmVyKHZhbHVlQXNTdHJpbmcpO1xuICAgIHJldHVybiBpc05hTih2YWx1ZSkgPyB0aGlzLnNwZWNpYWxWYWx1ZUluZGljYXRvciA6IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VEYXRlKGRhdGVBc1N0cmluZzogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgIC8vIE5vdGUgdGhhdCB3aXRob3V0IGEgdGltZSwgdGhlIGRhdGUgaXMgYXNzdW1lZCB0byBiZSBVVENcbiAgICAvLyBJbnB1dCBvZiAyMDIwLTAzLTI1IGlzIHByaW50ZWQgYXM6IE1hciAyNCAyMDIwIDE3OjAwOjAwIEdNVC0wNzAwXG4gICAgLy8gVGhpcyBtYXRjaGVzIHN0eWxlIHVzZWQgaW4gZXhpc3RpbmcgY29udmVydEZpbHRlclZhbHVlUHJlc01vZGVsXG4gICAgY29uc3QgdmFsdWUgPSBuZXcgRGF0ZShkYXRlQXNTdHJpbmcpO1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSA/IG51bGwgOiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlRGF0ZVRpbWUoZGF0ZUFzU3RyaW5nOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XG4gICAgLy8gV2l0aCBhIHRpbWUsIHRoZSBkYXRlIGlzIGFzc3VtZWQgdG8gYmUgVVRDLlxuICAgIC8vIE91ciBkYXRlIGZvcm1hdCBpcyBhbHdheXM6IHl5eXktbW0tZGQgaGg6bW06c3NcbiAgICAvLyBVbmZvcnR1bmF0ZWx5LCBJRTExIGNhbid0IHBhcnNlIHRoYXQgZm9ybWF0IHNvIHdlIGFkZCBhIFQgYmV0d2VlbiB0aGUgZGF5IGFuZCB0aW1lLlxuICAgIC8vIFdlIGFsc28gYWRkIGEgWiBzbyB0aGF0IGl0IGlzIFVUQy4gKFdpdGhvdXQgdGhlIFosIHNvbWUgYnJvd3NlcnMgYXNzdW1lIGxvY2FsLCBhbmQgb3RoZXJzIFVUQylcbiAgICAvLyBFdmVuIHRob3VnaCB3ZSd2ZSBkcm9wcGVkIHN1cHBvcnQgZm9yIElFMTEsIGl0J3Mgcmlza2llci9jb3N0bGllciB0byBtYWtlIHVwZGF0ZXMgaGVyZS5cbiAgICBjb25zdCBmb3JtYXR0ZWREYXRlU3RyaW5nOiBzdHJpbmcgPSBkYXRlQXNTdHJpbmcucmVwbGFjZSgnICcsICdUJykuY29uY2F0KCdaJyk7XG4gICAgY29uc3QgdmFsdWUgPSBuZXcgRGF0ZShmb3JtYXR0ZWREYXRlU3RyaW5nKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlLmdldFRpbWUoKSkgPyBudWxsIDogdmFsdWU7XG4gIH1cblxuICAvLyBJdCB3b3VsZCBiZSBuaWNlIHRvIG1lcmdlIHRoaXMgYW5kIHRoZSBtZXRob2QgRmlsdGVyQ29udmVydGVyOjpjb252ZXJ0RmlsdGVyVmFsdWVQcmVzTW9kZWwgaW4gYXBpLXBsYXRmb3JtLWpzXG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFZhbHVlQXNTdHJpbmdUb1ZhbHVlKHZhbHVlQXNTdHJpbmc6IHN0cmluZywgdHlwZTogRGF0YVR5cGUpOiBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBUaGlzIGlzIGJvdGggRGF0YURpY3Rpb25hcnkgYW5kIFNob3dEYXRhVGFibGVQcmVzTW9kZWwgY29tcGF0aWJsZS5cbiAgICAvLyBJbiB0aGUgRGF0YURpY3Rpb25hcnksIHZhbHVlQXNTdHJpbmcgY2FuIGJlICclbnVsbCUnIG9yICclbWlzc2luZyUnLCB3aGlsZSBpblxuICAgIC8vIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHdlIGNhbiBnZXQgJ251bGwnIG9yICdtaXNzaW5nJywgb3IgJyVudWxsJScgZm9yIHN0cmluZyBzcGVjaWFsIHZhbHVlcy5cbiAgICAvLyBGb3IgZWl0aGVyIG9mIHRoZXNlIGNhc2VzLCB3ZSByZXR1cm4gc3BlY2lhbFZhbHVlSW5kaWNhdG9yIChvciB0aGUgb3JpZ2luYWwgc3BlY2lhbCBzdHJpbmcpLlxuICAgIC8vIFRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsdHksIHRoaXMgY29udmVydGVyOlxuICAgIC8vIDEuIHJldHVybnMgYSBzdHJpbmcgZm9yIGFueSBzcGVjaWFsIHZhbHVlc1xuICAgIC8vIDIuIHJldHVybnMgYSBzdHJpbmcgZm9yIGFueSBkYXRlXG5cbiAgICAvLyBQYXJhbWV0ZXIgbWluL21heCB2YWx1ZXMgY2FuIGJlIHVuZGVmaW5lZCwgc28gcmVzdWx0IGlzIGFsc28gdW5kZWZpbmVkXG4gICAgaWYgKHZhbHVlQXNTdHJpbmcgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZUFzU3RyaW5nID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzU3BlY2lhbCh2YWx1ZUFzU3RyaW5nKSkge1xuICAgICAgcmV0dXJuIHZhbHVlQXNTdHJpbmc7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIERhdGFUeXBlLkJvb2w6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQm9vbGVhbih2YWx1ZUFzU3RyaW5nKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5JbnQ6XG4gICAgICBjYXNlIERhdGFUeXBlLkZsb2F0OlxuICAgICAgICAvLyBSZXR1cm4gc3BlY2lhbCB2YWx1ZSAnJW51bGwlJyBmb3IgYW55IGZhaWx1cmUgaW4gcGFyc2luZy5cbiAgICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGF0IGJlY2F1c2UgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCB3aWxsIGdpdmUgdXMgc3RyaW5ncyBsaWtlICdudWxsJ1xuICAgICAgICAvLyBmb3Igc3BlY2lhbCB2YWx1ZXMuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlTnVtYmVyKHZhbHVlQXNTdHJpbmcpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGU6XG4gICAgICAgIC8vIEZvciBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCBzcGVjaWFsIHZhbHVlcyB3aWxsIGJlIFwibnVsbFwiIHdoaWNoIHdpbGwgZmFpbCB0byBwYXJzZS5cbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSByZXR1cm4gJyVudWxsJScuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGF0ZSh2YWx1ZUFzU3RyaW5nKSA9PT0gbnVsbCA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yIDogdmFsdWVBc1N0cmluZztcblxuICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlVGltZTpcbiAgICAgICAgLy8gRm9yIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHNwZWNpYWwgdmFsdWVzIHdpbGwgYmUgXCJudWxsXCIgd2hpY2ggd2lsbCBmYWlsIHRvIHBhcnNlLlxuICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIHJldHVybiAnJW51bGwlJ1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGVUaW1lKHZhbHVlQXNTdHJpbmcpID09PSBudWxsID8gdGhpcy5zcGVjaWFsVmFsdWVJbmRpY2F0b3IgOiB2YWx1ZUFzU3RyaW5nO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLlNwYXRpYWw6XG4gICAgICBjYXNlIERhdGFUeXBlLlN0cmluZzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZUFzU3RyaW5nO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlKHZhbHVlOiBhbnksIHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB8IG51bWJlciB8IERhdGUgfCBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBUaGlzIGNvbnZlcnRzIGZyb20gb3VyIDEuMiBBUEkgdGhhdCByZXR1cm5zIHN0cmluZ3MgZm9yIHNwZWNpYWxzLCBhbmQgZGF0ZXMgYXMgc3RyaW5ncy5cbiAgICAvLyBJdCB0YWtlcyB0aGUgc3BlY2lhbCBjYXNlIG9mICclbnVsbCUnIGFuZCByZXR1cm5zIGEgbnVsbC5cbiAgICAvLyBGb3IgZGF0ZXMsIGl0IHJldHVybnMgYSBEYXRlIG9iamVjdCByYXRoZXIgdGhhbiBhIHN0cmluZy5cbiAgICAvLyBjb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlIHNob3VsZCBiZSB1c2VkIHRvIGJ1aWxkIGEgRGF0YVZhbHVlLm5hdGl2ZVZhbHVlIGZpZWxkLlxuXG4gICAgLy8gUGFyYW1ldGVyIG1pbi9tYXggY2FuIGJlIHVuZGVmaW5lZC4gSWYgdGhhdCBpcyB0aGUgY2FzZSwgbmF0aXZlVmFsdWUgaXMgdHJlYXRlZCBsaWtlIGEgc3BlY2lhbFxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgRGF0YVR5cGUuQm9vbDpcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuSW50OlxuICAgICAgY2FzZSBEYXRhVHlwZS5GbG9hdDpcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZTpcbiAgICAgICAgLy8gQ29udmVydCB0aGUgc3RyaW5nIHRvIERhdGUgb2JqZWN0IChvciBudWxsIGlmIHBhcnNpbmcgZmFpbHMgLi4uIHdlIGFzc3VtZSBzcGVjaWFsKVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGUodmFsdWUpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGVUaW1lOlxuICAgICAgICAvLyBDb252ZXJ0IHRoZSBzdHJpbmcgdG8gRGF0ZSBvYmplY3QgKG9yIG51bGwgaWYgcGFyc2luZyBmYWlscyAuLi4gd2UgYXNzdW1lIHNwZWNpYWwpXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGF0ZVRpbWUodmFsdWUpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLlN0cmluZzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTcGVjaWFsKHZhbHVlKSA/IG51bGwgOiB2YWx1ZTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5TcGF0aWFsOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0U3RyaW5nVmFsdWVUb05hdGl2ZVZhbHVlKHZhbHVlOiBzdHJpbmcsIHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB8IG51bWJlciB8IERhdGUgfCBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIGNvbnZlcnNpb24gZnJvbSBzdHJpbmcgZGlyZWN0bHkgdG8gbmF0aXZlIHZhbHVlIGZvciBhbGwgdHlwZXNcbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlKHRoaXMuY29udmVydFZhbHVlQXNTdHJpbmdUb1ZhbHVlKHZhbHVlLCB0eXBlKSwgdHlwZSk7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIEV4dGVuc2lvbkNvbnRleHQge1xuICBEZXNrdG9wID0gJ2Rlc2t0b3AnLFxuICBTZXJ2ZXIgPSAnc2VydmVyJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbiAgQ2xvdWQgPSAnY2xvdWQnLFxuICBQdWJsaWNXZWIgPSAncHVibGljLXdlYicsXG4gIFB1YmxpY0Rlc2t0b3AgPSAncHVibGljLWRlc2t0b3AnLFxufVxuXG5leHBvcnQgZW51bSBFeHRlbnNpb25Nb2RlIHtcbiAgQXV0aG9yaW5nID0gJ2F1dGhvcmluZycsXG4gIFZpZXdpbmcgPSAndmlld2luZycsXG4gIFVua25vd24gPSAndW5rbm93bicsXG59XG5cbmV4cG9ydCBlbnVtIEFubm90YXRlRW51bSB7XG4gIE1hcmsgPSAnbWFyaycsXG4gIFBvaW50ID0gJ3BvaW50JyxcbiAgQXJlYSA9ICdhcmVhJyxcbn1cblxuZXhwb3J0IGVudW0gQ29sdW1uVHlwZSB7XG4gIERpc2NyZXRlID0gJ2Rpc2NyZXRlJyxcbiAgQ29udGludW91cyA9ICdjb250aW51b3VzJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbn1cblxuZXhwb3J0IGVudW0gRGFzaGJvYXJkT2JqZWN0VHlwZSB7XG4gIEJsYW5rID0gJ2JsYW5rJyxcbiAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCcsXG4gIFF1aWNrRmlsdGVyID0gJ3F1aWNrLWZpbHRlcicsXG4gIFBhcmFtZXRlckNvbnRyb2wgPSAncGFyYW1ldGVyLWNvbnRyb2wnLFxuICBQYWdlRmlsdGVyID0gJ3BhZ2UtZmlsdGVyJyxcbiAgTGVnZW5kID0gJ2xlZ2VuZCcsXG4gIFRpdGxlID0gJ3RpdGxlJyxcbiAgVGV4dCA9ICd0ZXh0JyxcbiAgSW1hZ2UgPSAnaW1hZ2UnLFxuICBXZWJQYWdlID0gJ3dlYi1wYWdlJyxcbiAgRXh0ZW5zaW9uID0gJ2V4dGVuc2lvbicsXG59XG5cbmV4cG9ydCBlbnVtIERhdGFUeXBlIHtcbiAgU3RyaW5nID0gJ3N0cmluZycsXG4gIEludCA9ICdpbnQnLFxuICBGbG9hdCA9ICdmbG9hdCcsXG4gIEJvb2wgPSAnYm9vbCcsXG4gIERhdGUgPSAnZGF0ZScsXG4gIERhdGVUaW1lID0gJ2RhdGUtdGltZScsXG4gIFNwYXRpYWwgPSAnc3BhdGlhbCcsXG4gIFVua25vd24gPSAndW5rbm93bicsXG59XG5cbmV4cG9ydCBlbnVtIERpYWxvZ1N0eWxlIHtcbiAgV2luZG93ID0gJ3dpbmRvdycsXG4gIE1vZGFsID0gJ21vZGFsJyxcbiAgTW9kZWxlc3MgPSAnbW9kZWxlc3MnLFxufVxuXG5leHBvcnQgZW51bSBFbmNvZGVkRGF0YVR5cGUge1xuICBOdW1iZXIgPSAnbnVtYmVyJyxcbiAgU3RyaW5nID0gJ3N0cmluZycsXG4gIERhdGUgPSAnZGF0ZScsXG4gIEJvb2xlYW4gPSAnYm9vbGVhbicsXG59XG5cbmV4cG9ydCBlbnVtIEVycm9yQ29kZXMge1xuICBJTklUSUFMSVpBVElPTl9FUlJPUiA9ICdpbml0aWFsaXphdGlvbi1lcnJvcicsXG4gIElOVEVSTkFMX0VSUk9SID0gJ2ludGVybmFsLWVycm9yJyxcbiAgTUlTU0lOR19FTlVNX01BUFBJTkcgPSAnbWlzc2luZy1lbnVtLW1hcHBpbmcnLFxuICBNSVNTSU5HX1BBUkFNRVRFUiA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gIFBFUk1JU1NJT05fREVOSUVEID0gJ3Blcm1pc3Npb24tZGVuaWVkJyxcbiAgUFJFU19NT0RFTF9QQVJTSU5HX0VSUk9SID0gJ3ByZXMtbW9kZWwtcGFyc2luZy1lcnJvcicsXG4gIFZFUlNJT05fTk9UX0NPTkZJR1VSRUQgPSAndmVyc2lvbi1ub3QtY29uZmlndXJlZCcsXG4gIFZJU0lCSUxJVFlfRVJST1IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gIFVOS05PV05fVkVSQl9JRCA9ICd1bmtub3duLXZlcmItaWQnLFxufVxuXG5leHBvcnQgZW51bSBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSB7XG4gIFN1bSA9ICdzdW0nLFxuICBBdmcgPSAnYXZnJyxcbiAgTWluID0gJ21pbicsXG4gIE1heCA9ICdtYXgnLFxuICBTdGRldiA9ICdzdGRldicsXG4gIFN0ZGV2cCA9ICdzdGRldnAnLFxuICBWYXIgPSAndmFyJyxcbiAgVmFycCA9ICd2YXJwJyxcbiAgQ29sbGVjdCA9ICdjb2xsZWN0JyxcbiAgQ291bnQgPSAnY291bnQnLFxuICBDb3VudGQgPSAnY291bnRkJyxcbiAgTWVkaWFuID0gJ21lZGlhbicsXG4gIEF0dHIgPSAnYXR0cicsXG4gIE5vbmUgPSAnbm9uZScsXG4gIFllYXIgPSAneWVhcicsXG4gIFF0ciA9ICdxdHInLFxuICBNb250aCA9ICdtb250aCcsXG4gIERheSA9ICdkYXknLFxuICBIb3VyID0gJ2hvdXInLFxuICBNaW51dGUgPSAnbWludXRlJyxcbiAgU2Vjb25kID0gJ3NlY29uZCcsXG4gIFdlZWsgPSAnd2VlaycsXG4gIFdlZWtkYXkgPSAnd2Vla2RheScsXG4gIE1vbnRoWWVhciA9ICdtb250aC15ZWFyJyxcbiAgTWR5ID0gJ21keScsXG4gIEVuZCA9ICdlbmQnLFxuICBUcnVuY1llYXIgPSAndHJ1bmMteWVhcicsXG4gIFRydW5jUXRyID0gJ3RydW5jLXF0cicsXG4gIFRydW5jTW9udGggPSAndHJ1bmMtbW9udGgnLFxuICBUcnVuY1dlZWsgPSAndHJ1bmMtd2VlaycsXG4gIFRydW5jRGF5ID0gJ3RydW5jLWRheScsXG4gIFRydW5jSG91ciA9ICd0cnVuYy1ob3VyJyxcbiAgVHJ1bmNNaW51dGUgPSAndHJ1bmMtbWludXRlJyxcbiAgVHJ1bmNTZWNvbmQgPSAndHJ1bmMtc2Vjb25kJyxcbiAgUXVhcnQxID0gJ3F1YXJ0MScsXG4gIFF1YXJ0MyA9ICdxdWFydDMnLFxuICBTa2V3bmVzcyA9ICdza2V3bmVzcycsXG4gIEt1cnRvc2lzID0gJ2t1cnRvc2lzJyxcbiAgSW5PdXQgPSAnaW4tb3V0JyxcbiAgVXNlciA9ICd1c2VyJyxcbn1cblxuZXhwb3J0IGVudW0gRmllbGRSb2xlVHlwZSB7XG4gIERpbWVuc2lvbiA9ICdkaW1lbnNpb24nLFxuICBNZWFzdXJlID0gJ21lYXN1cmUnLFxuICBVbmtub3duID0gJ3Vua25vd24nLFxufVxuXG4vKipcbiAqICBUaGUgZGlmZmVyZW50IHVwZGF0ZSB0eXBlcyBmb3IgYXBwbHlpbmcgZmlsdGVyLlxuICovXG5leHBvcnQgZW51bSBGaWx0ZXJVcGRhdGVUeXBlIHtcbiAgQWRkID0gJ2FkZCcsXG4gIEFsbCA9ICdhbGwnLFxuICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxuICBSZW1vdmUgPSAncmVtb3ZlJyxcbn1cblxuZXhwb3J0IGVudW0gU2hlZXRUeXBlIHtcbiAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gIFN0b3J5ID0gJ3N0b3J5JyxcbiAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCcsXG59XG5cbmV4cG9ydCBlbnVtIERvbWFpblJlc3RyaWN0aW9uVHlwZSB7XG4gIEFsbCA9ICdhbGwnLFxuICBMaXN0ID0gJ2xpc3QnLFxuICBSYW5nZSA9ICdyYW5nZScsXG59XG5cbmV4cG9ydCBlbnVtIERhdGVTdGVwUGVyaW9kIHtcbiAgWWVhcnMgPSAneWVhcnMnLFxuICBRdWFydGVycyA9ICdxdWFydGVycycsXG4gIE1vbnRocyA9ICdtb250aHMnLFxuICBXZWVrcyA9ICd3ZWVrcycsXG4gIERheXMgPSAnZGF5cycsXG4gIEhvdXJzID0gJ2hvdXJzJyxcbiAgTWludXRlcyA9ICdtaW51dGVzJyxcbiAgU2Vjb25kcyA9ICdzZWNvbmRzJyxcbn1cblxuLyoqXG4gKiBUaGUgb3B0aW9uIGZvciBzcGVjaWZ5aW5nIHdoaWNoIHZhbHVlcyB0byBpbmNsdWRlIGZvciBmaWx0ZXJpbmcuXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlck51bGxPcHRpb24ge1xuICBOdWxsVmFsdWVzID0gJ251bGx2YWx1ZXMnLFxuICBOb25OdWxsVmFsdWVzID0gJ25vbm51bGx2YWx1ZXMnLFxuICBBbGxWYWx1ZXMgPSAnYWxsdmFsdWVzJyxcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBmaWx0ZXIgZG9tYWluXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlckRvbWFpblR5cGUge1xuICBSZWxldmFudCA9ICdyZWxldmFudCcsXG4gIERhdGFiYXNlID0gJ2RhdGFiYXNlJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Rpb24gdHlwZSBmb3Igc2VsZWN0IG1hcmtzIGFwaS5cbiAqL1xuZXhwb3J0IGVudW0gU2VsZWN0aW9uVXBkYXRlVHlwZSB7XG4gIFJlcGxhY2UgPSAnc2VsZWN0LXJlcGxhY2UnLFxuICBBZGQgPSAnc2VsZWN0LWFkZCcsXG4gIFJlbW92ZSA9ICdzZWxlY3QtcmVtb3ZlJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Qgb3B0aW9uIGZvciB0aGUgc2VsZWN0IHR1cGxlcyBhcGkuXG4gKi9cbmV4cG9ydCBlbnVtIFNlbGVjdE9wdGlvbnMge1xuICBTaW1wbGUgPSAnc2VsZWN0LW9wdGlvbnMtc2ltcGxlJyxcbiAgVG9nZ2xlID0gJ3NlbGVjdC1vcHRpb25zLXRvZ2dsZScsXG4gIE1lbnUgPSAnc2VsZWN0LW9wdGlvbnMtbWVudScsIC8vIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgZXh0ZXJuYWwgY29udHJhY3RcbiAgUmFuZ2UgPSAnc2VsZWN0LW9wdGlvbnMtcmFuZ2UnLCAvLyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGV4dGVybmFsIGNvbnRyYWN0XG4gIFNlYXJjaCA9ICdzZWxlY3Qtb3B0aW9ucy1zZWFyY2gnLCAvLyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGV4dGVybmFsIGNvbnRyYWN0XG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgaW5jbHVkZWQgdmFsdWVzIHR5cGUgZm9yIHJhbmdlIHNlbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGVudW0gUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMge1xuICBJbmNsdWRlTnVsbCA9ICdpbmNsdWRlLW51bGwnLFxuICBJbmNsdWRlTm9uTnVsbCA9ICdpbmNsdWRlLW5vbi1udWxsJyxcbiAgSW5jbHVkZUFsbCA9ICdpbmNsdWRlLWFsbCcsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyBhIGhpZXJhcmNoaWNhbCBsZXZlbCBzZWxlY3Rpb24gc3RhdGUuXG4gKi9cbmV4cG9ydCBlbnVtIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUge1xuICBBbGxTZWxlY3RlZCA9ICdhbGwtc2VsZWN0ZWQnLFxuICBOb25lU2VsZWN0ZWQgPSAnbm9uZS1zZWxlY3RlZCcsXG4gIFNvbWVTZWxlY3RlZCA9ICdzb21lLXNlbGVjdGVkJyxcbiAgVW5rbm93blNlbGVjdGVkID0gJ3Vua25vd24tc2VsZWN0ZWQnLFxufVxuXG4vKipcbiAqIFR5cGUgb2YgbWFyayBmb3IgYSBnaXZlbiBtYXJrcyBjYXJkIGluIGEgdml6LlxuICovXG5leHBvcnQgZW51bSBNYXJrVHlwZSB7XG4gIEJhciA9ICdiYXInLFxuICBMaW5lID0gJ2xpbmUnLFxuICBBcmVhID0gJ2FyZWEnLFxuICBTcXVhcmUgPSAnc3F1YXJlJyxcbiAgQ2lyY2xlID0gJ2NpcmNsZScsXG4gIFNoYXBlID0gJ3NoYXBlJyxcbiAgVGV4dCA9ICd0ZXh0JyxcbiAgTWFwID0gJ21hcCcsXG4gIFBpZSA9ICdwaWUnLFxuICBHYW50dEJhciA9ICdnYW50dC1iYXInLFxuICBQb2x5Z29uID0gJ3BvbHlnb24nLFxuICBIZWF0bWFwID0gJ2hlYXRtYXAnLFxuICBWaXpFeHRlbnNpb24gPSAndml6LWV4dGVuc2lvbicsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgdHlwZSBvZiBmaWx0ZXJcbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyVHlwZSB7XG4gIENhdGVnb3JpY2FsID0gJ2NhdGVnb3JpY2FsJyxcbiAgUmFuZ2UgPSAncmFuZ2UnLFxuICBSZWxhdGl2ZURhdGUgPSAncmVsYXRpdmVEYXRlJyxcbiAgSGllcmFyY2hpY2FsID0gJ2hpZXJhcmNoaWNhbCcsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgRGF0ZVJhbmdlVHlwZSBvZiBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyXG4gKi9cbmV4cG9ydCBlbnVtIERhdGVSYW5nZVR5cGUge1xuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBsYXN0IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTGFzdCA9ICdsYXN0JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byB0aGUgbGFzdCBOIGRheXMsIHdlZWtzLCBtb250aHMsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTGFzdE4gPSAnbGFzdE4nLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBuZXh0IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTmV4dCA9ICduZXh0JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byB0aGUgbmV4dCBOIGRheXMsIHdlZWtzLCBtb250aHMsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTmV4dE4gPSAnbmV4dE4nLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBjdXJyZW50IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgQ3VycmVudCA9ICdjdXJyZW50JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byBldmVyeXRoaW5nIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBUb0RhdGUgPSAndG9EYXRlJyxcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGRldGVybWluZSBpZiB0aGUgbGF1bmNoaW5nIG9mIGFuIGV4dGVuc2lvbiBkaWFsb2cgc3VjY2VlZGVkIG9yIGZhaWxlZC5cbiAqL1xuZXhwb3J0IGVudW0gRXh0ZW5zaW9uRGlhbG9nUmVzdWx0IHtcbiAgRGlhbG9nQWxyZWFkeU9wZW4gPSAnZGlhbG9nLWFscmVhZHktb3BlbicsXG4gIEludmFsaWREb21haW4gPSAnaW52YWxpZC1kb21haW4nLFxuICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gb3B0aW1pemUgdGhlIGdldFN1bW1hcnlEYXRhL2dldFVuZGVybHlpbmdUYWJsZURhdGEgcmVzdWx0c1xuICogTWFwcGVkIGZyb20gZXh0ZXJuYWwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb25cbiAqL1xuZXhwb3J0IGVudW0gQXBpU2hvd0RhdGFUYWJsZUZvcm1hdCB7XG4gIE5hdGl2ZVZhbHVlc09ubHkgPSAnbmF0aXZlLXZhbHVlcy1vbmx5JyxcbiAgRm9ybWF0dGVkVmFsdWVzT25seSA9ICdmb3JtYXR0ZWQtdmFsdWVzLW9ubHknLFxuICBOYXRpdmVBbmRGb3JtYXR0ZWRWYWx1ZXMgPSAnbmF0aXZlLWFuZC1mb3JtYXR0ZWQtdmFsdWVzJyxcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGRlbm90ZSB0aGUgc2VjdGlvbnMgb2YgZm9ybWF0dGluZyB3aXRoaW4gdGFibGVhdVxuICovXG5leHBvcnQgY29uc3QgZW51bSBDbGFzc05hbWVLZXkge1xuICBXb3Jrc2hlZXRUaXRsZSA9ICd0YWJsZWF1LXdvcmtzaGVldC10aXRsZScsXG4gIFdvcmtzaGVldCA9ICd0YWJsZWF1LXdvcmtzaGVldCcsXG4gIFRvb2x0aXAgPSAndGFibGVhdS10b29sdGlwJyxcbiAgU3RvcnlUaXRsZSA9ICd0YWJsZWF1LXN0b3J5LXRpdGxlJyxcbiAgRGFzaGJvYXJkVGl0bGUgPSAndGFibGVhdS1kYXNoYm9hcmQtdGl0bGUnLFxuICBQYW5lID0gJ3RhYmxlYXUtcGFuZScsXG4gIFJvd0RpdmlkZXJzID0gJ3RhYmxlYXUtcm93LWRpdmlkZXJzJyxcbiAgQ29sdW1uRGl2aWRlcnMgPSAndGFibGVhdS1jb2x1bW4tZGl2aWRlcnMnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gc2V0IHBhZ2Ugc2l6ZSBmb3IgZXhwb3J0IGxheW91dCBvcHRpb25zLlxuICovXG5leHBvcnQgZW51bSBQYWdlU2l6ZU9wdGlvbiB7XG4gIExldHRlciA9ICdsZXR0ZXInLFxuICBMZWdhbCA9ICdsZWdhbCcsXG4gIE5vdGUgPSAnbm90ZScsXG4gIEZvbGlvID0gJ2ZvbGlvJyxcbiAgVGFibG9pZCA9ICd0YWJsb2lkJyxcbiAgTGVkZ2VyID0gJ2xlZGdlcicsXG4gIFN0YXRlbWVudCA9ICdzdGF0ZW1lbnQnLFxuICBFeGVjdXRpdmUgPSAnZXhlY3V0aXZlJyxcbiAgQTMgPSAnYTMnLFxuICBBNCA9ICdhNCcsXG4gIEE1ID0gJ2E1JyxcbiAgQjQgPSAnYjQnLFxuICBCNSA9ICdiNScsXG4gIFF1YXJ0byA9ICdxdWFydG8nLFxuICBVbnNwZWNpZmllZCA9ICd1bnNwZWNpZmllZCcsXG59XG5cbi8qKlxuICogVXNlZCB0byBzZXQgdGhlIHBhZ2Ugb3JpZW50YXRpb24gbW9kZSBmb3IgZXhwb3J0IGxheW91dCBvcHRpb25zLlxuICovXG5leHBvcnQgZW51bSBQYWdlT3JpZW50YXRpb24ge1xuICBQcmludGVyID0gJ3ByaW50ZXInLFxuICBQb3J0cmFpdCA9ICdwb3J0cmFpdCcsXG4gIExhbmRzY2FwZSA9ICdsYW5kc2NhcGUnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gc2V0IHNjYWxlIG1vZGUgZm9yIGV4cG9ydCBsYXlvdXQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gU2NhbGVNb2RlIHtcbiAgU2NhbGVBdXRvID0gJ2F1dG8nLFxuICBTY2FsZVBlcmNlbnRhZ2UgPSAncGVyY2VudCcsXG4gIFNjYWxlRml0UGFnZXMgPSAnZml0LXBhZ2VzJyxcbn1cblxuLyoqXG4gKiBVc2VkIGJ5IHNldEZpdEFuZFNjYWxlVmFsdWVzIHRvIHNjYWxlIHBlcmNlbnQgdmFsdWVzXG4gKi9cbmV4cG9ydCBlbnVtIFBhZ2VTY2FsaW5nT3B0aW9uIHtcbiAgU2NhbGVQY3RBdXRvID0gJ2F1dG8nLFxuICBTY2FsZVBjdDQwMCA9ICdwY3Q0MDAnLFxuICBTY2FsZVBjdDIwMCA9ICdwY3QyMDAnLFxuICBTY2FsZVBjdDEwMCA9ICdwY3QxMDAnLFxuICBTY2FsZVBjdDkwID0gJ3BjdDkwJyxcbiAgU2NhbGVQY3Q4MCA9ICdwY3Q4MCcsXG4gIFNjYWxlUGN0NzUgPSAncGN0NzUnLFxuICBTY2FsZVBjdDYwID0gJ3BjdDYwJyxcbiAgU2NhbGVQY3Q1MCA9ICdwY3Q1MCcsXG4gIFNjYWxlUGN0MjUgPSAncGN0MjUnLFxufVxuXG4vKipcbiAqIFVzZWQgYnkgc2V0Rml0QW5kU2NhbGVWYWx1ZXMgdG8gc2NhbGUgZml0IHBhZ2UgdmFsdWVzXG4gKi9cbmV4cG9ydCBlbnVtIEZpdFBhZ2VzIHtcbiAgRml0T25lSGlnaCA9ICdmaXQweDEnLFxuICBGaXRUd29IaWdoID0gJ2ZpdDB4MicsXG4gIEZpdE9uZVdpZGUgPSAnZml0MXgwJyxcbiAgRml0VHdvV2lkZSA9ICdmaXQyeDAnLFxufVxuXG4vKipcbiAqIFVzZWQgYnkgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jXG4gKi9cbmV4cG9ydCBlbnVtIEVuY29kaW5nVHlwZSB7XG4gIENvbG9yID0gJ2NvbG9yJyxcbiAgU2l6ZSA9ICdzaXplJyxcbiAgTGFiZWwgPSAnbGFiZWwnLFxuICBEZXRhaWwgPSAnZGV0YWlsJyxcbiAgVG9vbHRpcCA9ICd0b29sdGlwJyxcbiAgU2hhcGUgPSAnc2hhcGUnLFxuICBQYXRoID0gJ3BhdGgnLFxuICBBbmdsZSA9ICdhbmdsZScsXG4gIEdlb21ldHJ5ID0gJ2dlb21ldHJ5JyxcbiAgQ3VzdG9tID0gJ2N1c3RvbScsXG59XG5cbmV4cG9ydCBlbnVtIFB1bHNlVGltZURpbWVuc2lvbiB7XG4gIFRvZGF5ID0gJ1RvZGF5JyxcbiAgWWVzdGVyZGF5ID0gJ1llc3RlcmRheScsXG4gIFdlZWtUb0RhdGUgPSAnV2Vla1RvRGF0ZScsXG4gIExhc3RXZWVrID0gJ0xhc3RXZWVrJyxcbiAgTW9udGhUb0RhdGUgPSAnTW9udGhUb0RhdGUnLFxuICBMYXN0TW9udGggPSAnTGFzdE1vbnRoJyxcbiAgUXVhcnRlclRvRGF0ZSA9ICdRdWFydGVyVG9EYXRlJyxcbiAgTGFzdFF1YXJ0ZXIgPSAnTGFzdFF1YXJ0ZXInLFxuICBZZWFyVG9EYXRlID0gJ1llYXJUb0RhdGUnLFxuICBMYXN0WWVhciA9ICdMYXN0WWVhcicsXG59XG5cbmV4cG9ydCBlbnVtIFB1bHNlRXJyb3JNZXNzYWdlVmlzaWJpbGl0eSB7XG4gIFZpc2libGUgPSAndmlzaWJsZScsXG4gIEhpZGRlbiA9ICdoaWRkZW4nLFxuICBTdXBwcmVzc2VkID0gJ3N1cHByZXNzZWQnLFxufVxuIiwiZXhwb3J0IGVudW0gTm90aWZpY2F0aW9uSWQge1xuICBDdXN0b21NYXJrQ29udGV4dE1lbnVDbGlja2VkID0gJ2N1c3RvbS1tYXJrLWNvbnRleHQtbWVudS1jbGlja2VkJyxcbiAgQ29udGV4dE1lbnVDbGljayA9ICdjb250ZXh0LW1lbnUtY2xpY2snLFxuICBDdXN0b21WaWV3UmVtb3ZlZCA9ICdjdXN0b20tdmlldy1yZW1vdmVkJyxcbiAgQ3VzdG9tVmlld1NhdmVkID0gJ2N1c3RvbS12aWV3LXNhdmVkJyxcbiAgQ3VzdG9tVmlld1NldERlZmF1bHQgPSAnY3VzdG9tLXZpZXctc2V0LWRlZmF1bHQnLFxuICBDdXN0b21WaWV3c0xvYWRlZCA9ICdjdXN0b20tdmlld3MtbG9hZGVkJyxcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCA9ICdkYXNoYm9hcmQtbGF5b3V0LWNoYW5nZWQnLFxuICBFZGl0QnV0dG9uQ2xpY2tlZCA9ICdlZGl0LWJ1dHRvbi1jbGlja2VkJyxcbiAgRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQgPSAnZWRpdC1pbi1kZXNrdG9wLWJ1dHRvbi1jbGlja2VkJyxcbiAgRXh0ZW5zaW9uRGlhbG9nVXBkYXRlID0gJ2V4dGVuc2lvbi1kaWFsb2ctdXBkYXRlJyxcbiAgRXh0ZW5zaW9uRGlhbG9nTWVzc2FnZSA9ICdleHRlbnNpb24tZGlhbG9nLW1lc3NhZ2UnLFxuICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlci1jaGFuZ2VkJyxcbiAgRmlyc3RWaXpTaXplS25vd24gPSAnZmlyc3Qtdml6LXNpemUta25vd24nLFxuICBGaXJzdFB1bHNlTWV0cmljU2l6ZUtub3duID0gJ2ZpcnN0LXB1bHNlLW1ldHJpYy1zaXplLWtub3duJyxcbiAgUGFyYW1ldGVyQ2hhbmdlZCA9ICdwYXJhbWV0ZXItY2hhbmdlZCcsXG4gIFB1bHNlRXJyb3IgPSAncHVsc2UtZXJyb3InLFxuICBQdWxzZUZpbHRlcnNDaGFuZ2VkID0gJ3B1bHNlLWZpbHRlcnMtY2hhbmdlZCcsXG4gIFB1bHNlTWV0cmljU2l6ZUNoYW5nZWQgPSAncHVsc2UtbWV0cmljLXNpemUtY2hhbmdlZCcsXG4gIFB1bHNlSW5zaWdodERpc2NvdmVyZWQgPSAncHVsc2UtaW5zaWdodC1kaXNjb3ZlcmVkJyxcbiAgUHVsc2VJbnRlcmFjdGl2ZSA9ICdwdWxzZS1pbnRlcmFjdGl2ZScsXG4gIFB1bHNlVGltZURpbWVuc2lvbkNoYW5nZWQgPSAncHVsc2UtdGltZS1kaW1lbnNpb24tY2hhbmdlZCcsXG4gIFB1bHNlVXJsQ2hhbmdlZCA9ICdwdWxzZS11cmwtY2hhbmdlZCcsXG4gIFNlbGVjdGVkTWFya3NDaGFuZ2VkID0gJ3NlbGVjdGVkLW1hcmtzLWNoYW5nZWQnLFxuICBTZXR0aW5nc0NoYW5nZWQgPSAnc2V0dGluZ3MtY2hhbmdlZCcsXG4gIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5LWRhdGEtY2hhbmdlZCcsXG4gIFRlc3RDb252ZXJzaW9uTm90aWZpY2F0aW9uID0gJ3Rlc3QtY29udmVyc2lvbi1ub3RpZmljYXRpb24nLFxuICBUb29sYmFyU3RhdGVDaGFuZ2VkID0gJ3Rvb2xiYXItc3RhdGUtY2hhbmdlZCcsXG4gIFZpekludGVyYWN0aXZlID0gJ3Zpei1pbnRlcmFjdGl2ZScsXG4gIEFza0RhdGFJbnRlcmFjdGl2ZSA9ICdhc2stZGF0YS1pbnRlcmFjdGl2ZScsXG4gIFdvcmtib29rUmVhZHlUb0Nsb3NlID0gJ3dvcmtib29rLXJlYWR5LXRvLWNsb3NlJyxcbiAgV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCA9ICd3b3JrYm9vay1mb3JtYXR0aW5nLWNoYW5nZWQnLFxuICBXb3JrYm9va1B1Ymxpc2hlZCA9ICd3b3JrYm9vay1wdWJsaXNoZWQnLFxuICBXb3JrYm9va1B1Ymxpc2hlZEFzID0gJ3dvcmtib29rLXB1Ymxpc2hlZC1hcycsXG4gIFdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkID0gJ3dvcmtzaGVldC1mb3JtYXR0aW5nLWNoYW5nZWQnLFxuICBVcmxBY3Rpb24gPSAndXJsLWFjdGlvbicsXG4gIFRhYlN3aXRjaGVkID0gJ3RhYi1zd2l0Y2hlZCcsXG4gIFN0b3J5UG9pbnRTd2l0Y2hlZCA9ICdzdG9yeS1wb2ludC1zd2l0Y2hlZCcsXG4gIFJlYWR5VG9SZWNlaXZlQXV0aFRva2VuID0gJ3JlYWR5LXRvLXJlY2VpdmUtYXV0aC10b2tlbicsXG59XG4iLCIvLyBQTEVBU0UgS0VFUCBJTiBBTFBIQUJFVElDQUwgT1JERVIuIFRoaXMgaGVscHMgd2l0aCB2aXN1YWxseSBmaW5kaW5nIGVudHJpZXMsIGtub3dpbmcgd2hlcmUgdG8gcHV0XG4vLyBuZXcgb25lcywgYW5kIG1lcmdlIGNvbmZsaWN0cy5cbmV4cG9ydCBlbnVtIFBhcmFtZXRlcklkIHtcbiAgQWN0aXZlVGFibGVzSW5mbyA9ICdhY3RpdmUtdGFibGVzLWluZm8nLFxuICBBbmNob3JEYXRlID0gJ2FuY2hvci1kYXRlJyxcbiAgQW5ub3RhdGVFbnVtID0gJ2Fubm90YXRlLWVudW0nLFxuICBBbm5vdGF0aW9uTGlzdCA9ICdhbm5vdGF0aW9uLWxpc3QnLFxuICBBcHBseVdvcmtzaGVldEZvcm1hdHRpbmcgPSAnYXBwbHktd29ya3NoZWV0LWZvcm1hdHRpbmcnLFxuXG4gIENhdGVnb3JpY2FsRG9tYWluID0gJ2NhdGVnb3JpY2FsLWRvbWFpbicsXG4gIENsaWNrVGhyb3VnaEVuYWJsZWQgPSAnY2xpY2stdGhyb3VnaC1lbmFibGVkJyxcbiAgQ29sdW1ucyA9ICdjb2x1bW5zJyxcbiAgQ29sdW1uc1RvSW5jbHVkZSA9ICdjb2x1bW5zLXRvLWluY2x1ZGUnLFxuICBDb2x1bW5zVG9JbmNsdWRlQnlJZCA9ICdjb2x1bW5zLXRvLWluY2x1ZGUtYnktaWQnLFxuICBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJpZXMgPSAnY29ubmVjdGlvbi1kZXNjcmlwdGlvbi1zdW1tYXJpZXMnLFxuICBDdXJyZW50U2hlZXRUeXBlID0gJ2N1cnJlbnQtc2hlZXQtdHlwZScsXG4gIEN1c3RvbVZpZXcgPSAnY3VzdG9tLXZpZXcnLFxuICBDdXN0b21WaWV3SXNEZWZhdWx0ID0gJ2N1c3RvbS12aWV3LWlzLWRlZmF1bHQnLFxuICBDdXN0b21WaWV3SXNQdWJsaWMgPSAnY3VzdG9tLXZpZXctaXMtcHVibGljJyxcbiAgQ3VzdG9tVmlld0x1aWQgPSAnY3VzdG9tLXZpZXctbHVpZCcsXG4gIEN1c3RvbVZpZXdOYW1lID0gJ2N1c3RvbS12aWV3LW5hbWUnLFxuICBDdXN0b21WaWV3cyA9ICdjdXN0b20tdmlld3MnLFxuXG4gIERhc2hib2FyZCA9ICdkYXNoYm9hcmQnLFxuICBEYXNoYm9hcmRGaWx0ZXJzID0gJ2Rhc2hib2FyZC1maWx0ZXJzJyxcbiAgRGFzaGJvYXJkTmFtZSA9ICdkYXNoYm9hcmQnLFxuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgPSAnZGFzaGJvYXJkLW9iamVjdC1wb3NpdGlvbi1hbmQtc2l6ZS11cGRhdGUnLFxuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVMaXN0ID0gJ2Rhc2hib2FyZC1vYmplY3QtcG9zaXRpb24tYW5kLXNpemUtdXBkYXRlLWxpc3QnLFxuICBEYXRhUm93SW5kZXggPSAnZGF0YS1yb3ctaW5kZXgnLFxuICBEYXRhU2NoZW1hID0gJ2RhdGEtc2NoZW1hJyxcbiAgRGF0YVNvdXJjZSA9ICdkYXRhLXNvdXJjZScsXG4gIERhdGFTb3VyY2VEYXRhVGFibGUgPSAnZGF0YS1zb3VyY2UtZGF0YS10YWJsZScsXG4gIERhdGFTb3VyY2VJZCA9ICdkYXRhLXNvdXJjZS1pZCcsXG4gIERhdGFTb3VyY2VOYW1lID0gJ2RhdGEtc291cmNlLW5hbWUnLFxuICBEYXRhVGFibGUgPSAnZGF0YS10YWJsZScsXG4gIERhdGFUYWJsZVJlYWRlciA9ICdkYXRhLXRhYmxlLXJlYWRlcicsXG4gIERhdGVSYW5nZVR5cGUgPSAnZGF0ZS1yYW5nZS10eXBlJyxcbiAgRGVsZXRlQ291bnQgPSAnZGVsZXRlLWNvdW50JyxcbiAgRGVsdGFUaW1lTXMgPSAnZGVsdGEtdGltZS1tcycsXG4gIERpbVZhbFNlbGVjdGlvbk1vZGVscyA9ICdkaW1lbnNpb25WYWx1ZVNlbGVjdGlvbk1vZGVscycsXG4gIERvbWFpblR5cGUgPSAnZG9tYWluLXR5cGUnLFxuXG4gIEVtYmVkZGluZ0Fic3RyYWN0UXVlcnkgPSAnZW1iZWRkaW5nLWFic3RyYWN0LXF1ZXJ5JyxcbiAgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbyA9ICdlbWJlZGRpbmctYm9vdHN0cmFwLWluZm8nLFxuICBFbmNvZGluZ1R5cGUgPSAnZW5jb2RpbmctdHlwZScsXG4gIEV4cG9ydENyb3NzdGFiU2hlZXRNYXAgPSAnZXhwb3J0LWNyb3NzdGFiLXNoZWV0LW1hcCcsXG4gIEV4cG9ydEZpbGUgPSAnZXhwb3J0LWZpbGUnLFxuICBFeHBvcnRPcmlnaW5VcmwgPSAnZXhwb3J0LW9yaWdpbi11cmwnLFxuICBFeHBvcnRQZGZPcHRpb25zID0gJ2V4cG9ydC1wZGYtb3B0aW9ucycsXG4gIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8gPSAnZXh0ZW5zaW9uLWJvb3RzdHJhcC1pbmZvJyxcbiAgRXh0ZW5zaW9uQ29udGV4dE1lbnVJZHMgPSAnZXh0ZW5zaW9uLWNvbnRleHQtbWVudS1pZHMnLFxuICBFeHRlbnNpb25EaWFsb2dIID0gJ2V4dGVuc2lvbi1kaWFsb2ctaGVpZ2h0JyxcbiAgRXh0ZW5zaW9uRGlhbG9nTWVzc2FnZSA9ICdleHRlbnNpb24tZGlhbG9nLW1lc3NhZ2UnLFxuICBFeHRlbnNpb25EaWFsb2dQYXlsb2FkID0gJ2V4dGVuc2lvbi1kaWFsb2ctcGF5bG9hZCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdCA9ICdleHRlbnNpb24tZGlhbG9nLXJlc3VsdCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1N0eWxlID0gJ2V4dGVuc2lvbi1kaWFsb2ctc3R5bGUnLFxuICBFeHRlbnNpb25EaWFsb2dVcmwgPSAnZXh0ZW5zaW9uLWRpYWxvZy11cmwnLFxuICBFeHRlbnNpb25EaWFsb2dXID0gJ2V4dGVuc2lvbi1kaWFsb2ctd2lkdGgnLFxuICBFeHRlbnNpb25Mb2NhdG9yID0gJ2V4dGVuc2lvbi1sb2NhdG9yJyxcbiAgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvID0gJ2V4dGVuc2lvbi1zZXR0aW5ncy1pbmZvJyxcbiAgRXh0ZW5zaW9uWm9uZUlkID0gJ2V4dGVuc2lvbi16b25lLWlkJyxcbiAgRXh0ZXJuYWxNZW51RGVzY3JpcHRpb24gPSAnZXh0ZXJuYWwtbWVudS1kZXNjcmlwdGlvbicsXG4gIEV4dGVybmFsTWVudUhlYWRlciA9ICdleHRlcm5hbC1tZW51LWhlYWRlcicsXG4gIEV4dGVybmFsTWVudUl0ZW1EaXNwbGF5TmFtZSA9ICdleHRlcm5hbC1tZW51LWl0ZW0tZGlzcGxheS1uYW1lJyxcbiAgRXh0ZXJuYWxNZW51SXRlbUlkID0gJ2V4dGVybmFsLW1lbnUtaXRlbS1pZCcsXG5cbiAgRmllbGQgPSAnZmllbGQnLFxuICBGaWVsZENvdW50ID0gJ2ZpZWxkLWNvdW50JyxcbiAgRmllbGRJZCA9ICdmaWVsZC1pZCcsXG4gIEZpZWxkTmFtZSA9ICdmaWVsZC1uYW1lJyxcbiAgRmlsdGVyTGV2ZWxzID0gJ2ZpbHRlci1sZXZlbHMnLFxuICBGaWx0ZXJSYW5nZU1heCA9ICdmaWx0ZXItcmFuZ2UtbWF4JyxcbiAgRmlsdGVyUmFuZ2VNaW4gPSAnZmlsdGVyLXJhbmdlLW1pbicsXG4gIEZpbHRlclJhbmdlTnVsbE9wdGlvbiA9ICdmaWx0ZXItcmFuZ2UtbnVsbC1vcHRpb24nLFxuICBGaWx0ZXJVcGRhdGVUeXBlID0gJ2ZpbHRlci11cGRhdGUtdHlwZScsXG4gIEZpbHRlclZhbHVlcyA9ICdmaWx0ZXItdmFsdWVzJyxcbiAgRm9udE5hbWVMaXN0SXRlbXMgPSAnZm9udC1uYW1lLWxpc3QtaXRlbXMnLFxuICBGb3JtYXR0ZWRUZXh0ID0gJ2Zvcm1hdHRlZC10ZXh0JyxcbiAgRnVuY3Rpb25OYW1lID0gJ2Z1bmN0aW9uLW5hbWUnLFxuICBGcm9tSW5kZXggPSAnZnJvbS1pbmRleCcsXG5cbiAgSGllclZhbFNlbGVjdGlvbk1vZGVscyA9ICdoaWVyYXJjaGljYWxWYWx1ZVNlbGVjdGlvbk1vZGVscycsXG4gIEhpZ2hsaWdodGVkRGF0YSA9ICdoaWdobGlnaHRlZC1kYXRhJyxcbiAgSG92ZXJUdXBsZUludGVyYWN0aW9uID0gJ2hvdmVyLXR1cGxlLWludGVyYWN0aW9uJyxcblxuICBJZ25vcmVBbGlhc2VzID0gJ2lnbm9yZS1hbGlhc2VzJyxcbiAgSWdub3JlU2VsZWN0aW9uID0gJ2lnbm9yZS1zZWxlY3Rpb24nLFxuICBJbmNsdWRlQWxsQ29sdW1ucyA9ICdpbmNsdWRlLWFsbC1jb2x1bW5zJyxcbiAgSW52YWxpZEFnZ0ZpZWxkTmFtZSA9ICdpbnZhbGlkLWFnZy1maWVsZC1uYW1lJyxcbiAgSW52YWxpZERhdGVzID0gJ2ludmFsaWQtZGF0ZXMnLFxuICBJbnZhbGlkRmllbGRDYXB0aW9uID0gJ2ludmFsaWQtZmllbGQtY2FwdGlvbicsXG4gIEludmFsaWRGaWVsZHMgPSAnaW52YWxpZC1maWVsZHMnLFxuICBJbnZhbGlkVmFsdWVzID0gJ2ludmFsaWQtdmFsdWVzJyxcbiAgSXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUgPSAnaXMtYW5hbHl0aWNzLWFzc2lzdGFudC1hdmFpbGFibGUnLFxuICBJc0V4Y2x1ZGVNb2RlID0gJ2lzLWV4Y2x1ZGUnLFxuICBJc0V4dGVuc2lvbkRpYWxvZyA9ICdpcy1leHRlbnNpb24tZGlhbG9nJyxcbiAgSXNGcm9tQ2FsY0RpYWxvZyA9ICdpcy1mcm9tLWNhbGMtZGlhbG9nJyxcblxuICBKb2luRGVzY3JpcHRpb24gPSAnam9pbi1kZXNjcmlwdGlvbicsXG5cbiAgTG9naWNhbFRhYmxlSWQgPSAnbG9naWNhbC10YWJsZS1pZCcsXG4gIExvZ2ljYWxUYWJsZUluZm9MaXN0ID0gJ2xvZ2ljYWwtdGFibGUtaW5mby1saXN0JyxcblxuICBNYXJrc0NhcmRJbmRleCA9ICdtYXJrcy1jYXJkLWluZGV4JyxcbiAgTWF4SGVpZ2h0ID0gJ21heC1oZWlnaHQnLFxuICBNYXhSb3dzID0gJ21heC1yb3dzJyxcbiAgTWF4V2lkdGggPSAnbWF4LXdpZHRoJyxcbiAgTWluSGVpZ2h0ID0gJ21pbi1oZWlnaHQnLFxuICBNaW5XaWR0aCA9ICdtaW4td2lkdGgnLFxuXG4gIFBhZ2VSb3dDb3VudCA9ICdwYWdlLXJvdy1jb3VudCcsXG4gIFBhcmFtZXRlckNhcHRpb24gPSAncGFyZW1ldGVyLWNhcHRpb24nLFxuICBQYXJhbWV0ZXJFcnJvciA9ICdwYXJhbWV0ZXItZXJyb3InLFxuICBQYXJhbWV0ZXJGaWVsZE5hbWUgPSAncGFyYW1ldGVyLWZpZWxkLW5hbWUnLFxuICBQYXJhbWV0ZXJJbmZvID0gJ3BhcmFtZXRlci1pbmZvJyxcbiAgUGFyYW1ldGVySW5mb3MgPSAncGFyYW1ldGVyLWluZm9zJyxcbiAgUGFyYW1ldGVyVmFsdWUgPSAncGFyYW1ldGVyLXZhbHVlJyxcbiAgUGVyaW9kVHlwZSA9ICdwZXJpb2QtdHlwZScsXG4gIFB1bHNlRmllbGROYW1lID0gJ2ZpZWxkTmFtZScsXG4gIFB1bHNlRmllbGROYW1lcyA9ICdmaWVsZE5hbWVzJyxcbiAgUHVsc2VGaWx0ZXJEb21haW5UeXBlID0gJ2RvbWFpblR5cGUnLFxuICBQdWxzZUZpbHRlckRvbWFpblNlYXJjaFRlcm0gPSAnc2VhcmNoVGVybScsXG4gIFB1bHNlUGFnZVNpemUgPSAncGFnZVNpemUnLFxuICBQdWxzZU5leHRQYWdlVG9rZW4gPSAnbmV4dFBhZ2VUb2tlbicsXG4gIFB1bHNlRmlsdGVycyA9ICdmaWx0ZXJzJyxcbiAgUHVsc2VUaW1lRGltZW5zaW9uID0gJ3RpbWVEaW1lbnNpb24nLFxuXG4gIFF1YW50aXRhdGl2ZURvbWFpbiA9ICdxdWFudGl0YXRpdmUtZG1haW4nLFxuICBRdWFudFJhbmdlU2VsZWN0aW9uTW9kZWxzID0gJ3F1YW50YXRpdmVSYW5nZVNlbGVjdGlvbk1vZGVscycsXG5cbiAgUmFuZ2VOID0gJ3JhbmdlLW4nLFxuICBSZXBsYXlTcGVlZCA9ICdyZXBsYXktc3BlZWQnLFxuXG4gIFNlbGVjdGVkRGF0YSA9ICdzZWxlY3RlZC1kYXRhJyxcbiAgU2VsZWN0ZWRTaGVldE5hbWVzID0gJ3NlbGVjdGVkLXNoZWV0LW5hbWVzJyxcbiAgU2VsZWN0aW9uID0gJ3NlbGVjdGlvbicsXG4gIFNlbGVjdGlvbkxpc3QgPSAnc2VsZWN0aW9uLWxpc3QnLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlID0gJ3NlbGVjdGlvblVwZGF0ZVR5cGUnLFxuICBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbiA9ICdzZWxlY3QtdHVwbGVzLWludGVyYWN0aW9uJyxcbiAgU2VuZE5vdGlmaWNhdGlvbnMgPSAnc2VuZC1ub3RpZmljYXRpb25zJyxcbiAgU2V0dGluZ3NWYWx1ZXMgPSAnc2V0dGluZ3MtdmFsdWVzJyxcbiAgU2hhcmVkRmlsdGVyU2hlZXRzID0gJ3NoYXJlZC1maWx0ZXItc2hlZXRzJyxcbiAgU2hhcmVkRmlsdGVyc0luZm8gPSAnc2hhcmVkLWZpbHRlcnMtaW5mbycsXG4gIFNoZWV0SWRlbnRpZmllciA9ICdzaGVldC1pZGVudGlmaWVyJyxcbiAgU2hlZXROYW1lID0gJ3NoZWV0LW5hbWUnLFxuICBTaGVldFBhdGggPSAnc2hlZXQtcGF0aCcsXG4gIFNob3VsZFJlZnJlc2hEUyA9ICdzaG91bGQtcmVmcmVzaC1kcycsXG4gIFNob3dEYXRhVGFibGVGb3JtYXQgPSAnc2hvdy1kYXRhLXRhYmxlLWZvcm1hdCcsXG4gIFN0YXJ0SW5kZXggPSAnc3RhcnQtaW5kZXgnLFxuICBTdGF0ZSA9ICdzdGF0ZScsXG4gIFN0b3J5UG9pbnRJbmRleCA9ICdzdG9yeS1wb2ludC1pbmRleCcsXG4gIFN0b3J5UG9pbnRJbmZvID0gJ3N0b3J5LXBvaW50LWluZm8nLFxuICBTd2l0Y2hUb1NoZWV0TmFtZSA9ICdzd2l0Y2gtdG8tc2hlZXQtbmFtZScsXG5cbiAgVGFyZ2V0UG9pbnQgPSAndGFyZ2V0LXBvaW50JyxcbiAgVGVzdENvbnZlcnNpb25QYXJhbWV0ZXIgPSAndGVzdC1jb252ZXJzaW9uLXBhcmFtZXRlcicsXG4gIFRleHQgPSAnZm9ybWF0dGVkLXRleHQnLFxuICBUb0luZGV4ID0gJ3RvLWluZGV4JyxcbiAgVG9vbHRpcENvbnRleHQgPSAndG9vbHRpcC1jb250ZXh0JyxcbiAgVG9vbHRpcFRleHRSZXF1ZXN0ID0gJ3Rvb2x0aXAtdGV4dC1yZXF1ZXN0JyxcbiAgVG9vbHRpcFRleHQgPSAndG9vbHRpcC10ZXh0JyxcblxuICBVbmRlcmx5aW5nRGF0YVRhYmxlID0gJ3VuZGVybHlpbmctZGF0YS10YWJsZScsXG4gIFVuZGVybHlpbmdTdW1tYXJ5RGF0YVRhYmxlID0gJ3VuZGVybHlpbmctc3VtbWFyeS1kYXRhLXRhYmxlJyxcbiAgVXJsID0gJ3VybCcsXG4gIFVzZVRhYkRlbGltaXRlcnMgPSAndXNlLXRhYi1kZWxpbWl0ZXJzJyxcblxuICBWaWV3RGF0YVRhYmxlQ2FjaGVJZCA9ICd2aWV3LWRhdGEtdGFibGUtY2FjaGUtaWQnLFxuICBWaWV3RGF0YVRhYmxlSWQgPSAndmlldy1kYXRhLXRhYmxlLWlkJyxcbiAgVmlzdWFsSWQgPSAndmlzdWFsLWlkJyxcbiAgVmlzdWFsU3BlY2lmaWNhdGlvbiA9ICd2aXN1YWwtc3BlY2lmaWNhdGlvbicsXG4gIFZpekFQSUlucHV0SnNvbiA9ICd2aXphcGktaW5wdXQtanNvbicsXG4gIFZpekFQSVN0YXRlV2l0aERhdGFNb2RlbCA9ICd2aXphcGktc3RhdGUtd2l0aC1kYXRhLW1vZGVsJyxcbiAgVml6QVBJU3RhdGVXYXJuaW5nTXNnID0gJ3ZpemFwaS1zdGF0ZS13YXJuaW5nLW1zZycsXG4gIFZpekFQSVNWRyA9ICd2aXphcGktc3ZnJyxcblxuICBXb3Jrc2hlZXROYW1lID0gJ3dvcmtzaGVldC1uYW1lJyxcbiAgV29ya3NoZWV0RmlsdGVycyA9ICd3b3Jrc2hlZXQtZmlsdGVycycsXG5cbiAgWm9uZUlkc1Zpc2liaWxpdHlNYXAgPSAnem9uZS1pZHMtdmlzaWJpbGl0eS1tYXAnLFxufVxuIiwiLy8gRGVjbGFyZSB0aGlzIGtleSB0eXBlIGFuZCBleHBvcnQgdGhlIE5vdGlmaWNhdGlvbklkIHRvIG1ha2UgdGhpcyBiZWhhdmUgbGlrZSBhIHN0cmluZyBlbnVtLlxuLy9cbi8vIFBMRUFTRSBLRUVQIElOIEFMUEhBQkVUSUNBTCBPUkRFUi4gVGhpcyBoZWxwcyB3aXRoIHZpc3VhbGx5IGZpbmRpbmcgZW50cmllcywga25vd2luZyB3aGVyZSB0byBwdXRcbi8vIG5ldyBvbmVzLCBhbmQgbWVyZ2UgY29uZmxpY3RzLlxuZXhwb3J0IGVudW0gVmVyYklkIHtcbiAgQWN0aXZhdGVOZXh0U3RvcnlQb2ludCA9ICdhY3RpdmF0ZS1uZXh0LXN0b3J5LXBvaW50JyxcbiAgQWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnQgPSAnYWN0aXZhdGUtcHJldmlvdXMtc3RvcnktcG9pbnQnLFxuICBBY3RpdmF0ZVNoZWV0ID0gJ2FjdGl2YXRlU2hlZXQnLFxuICBBY3RpdmF0ZVN0b3J5UG9pbnQgPSAnYWN0aXZhdGUtc3RvcnktcG9pbnQnLFxuICBBZGRNYXJrc0NhcmRGaWVsZHMgPSAnYWRkLW1hcmtzLWNhcmQtZmllbGRzJyxcbiAgQXBwZW5kRXh0ZXJuYWxNZW51SXRlbSA9ICdhcHBlbmQtZXh0ZXJuYWwtbWVudS1pdGVtJyxcbiAgQXBwbHlDYXRlZ29yaWNhbEZpbHRlciA9ICdjYXRlZ29yaWNhbC1maWx0ZXInLFxuICBBcHBseVB1bHNlRmlsdGVycyA9ICdhcHBseS1wdWxzZS1maWx0ZXJzJyxcbiAgQXBwbHlQdWxzZVRpbWVEaW1lbnNpb24gPSAnYXBwbHktcHVsc2UtdGltZS1kaW1lbnNpb24nLFxuICBBcHBseVJhbmdlRmlsdGVyID0gJ3JhbmdlLWZpbHRlcicsXG4gIEFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyID0gJ2FwcGx5LXJlbGF0aXZlLWRhdGUtRmlsdGVyJyxcbiAgQXV0aGVudGljYXRlID0gJ2F1dGhlbnRpY2F0ZScsXG5cbiAgQmxvY2tFeHRlbnNpb24gPSAnYmxvY2stZXh0ZW5zaW9uJyxcblxuICBDaGFuZ2VQYXJhbWV0ZXJWYWx1ZSA9ICdjaGFuZ2UtcGFyYW1ldGVyLXZhbHVlJyxcbiAgQ2hhbmdlU2hhcmVkRmlsdGVyID0gJ2NoYW5nZS1zaGFyZWQtZmlsdGVyJyxcbiAgQ2xlYXJBbGxQdWxzZUZpbHRlcnMgPSAnY2xlYXItYWxsLXB1bHNlLWZpbHRlcnMnLFxuICBDbGVhckZpbHRlciA9ICdjbGVhci1maWx0ZXInLFxuICBDbGVhclB1bHNlRmlsdGVycyA9ICdjbGVhci1wdWxzZS1maWx0ZXJzJyxcbiAgQ2xlYXJTZWxlY3RlZE1hcmtzID0gJ2NsZWFyLXNlbGVjdGVkLW1hcmtzJyxcbiAgQ2xvc2VEaWFsb2cgPSAnY2xvc2UtZGlhbG9nJyxcbiAgQ3JlYXRlQW5ub3RhdGlvbiA9ICdjcmVhdGUtYW5ub3RhdGlvbicsXG5cbiAgRGFzaGJvYXJkQ2F0ZWdvcmljYWxGaWx0ZXIgPSAnZGFzaGJvYXJkLWNhdGVnb3JpY2FsLWZpbHRlcicsXG4gIERpc3BsYXlEaWFsb2cgPSAnZGlzcGxheS1kaWFsb2cnLFxuICBEb3dubG9hZFdvcmtib29rID0gJ2Rvd25sb2FkLXdvcmtib29rJyxcblxuICBFZGl0QWxpYXNlc0RpYWxvZyA9ICdlZGl0LWFsaWFzZXMtZGlhbG9nJyxcbiAgRXhlY3V0ZUV4dGVybmFsTWVudUl0ZW0gPSAnZXhlY3V0ZS1leHRlcm5hbC1tZW51LWl0ZW0nLFxuICBFeHBvcnRDcm9zc3RhYiA9ICdleHBvcnQtY3Jvc3N0YWInLFxuICBFeHBvcnRDcm9zc3RhYkNzdkRvd25sb2FkID0gJ2V4cG9ydC1jcm9zc3RhYi1jc3YtZG93bmxvYWQnLFxuICBFeHBvcnRDcm9zc3RhYkV4Y2VsRG93bmxvYWQgPSAnZXhwb3J0LWNyb3NzdGFiLWV4Y2VsLWRvd25sb2FkJyxcbiAgRXhwb3J0RGF0YSA9ICdleHBvcnQtZGF0YScsXG4gIEV4cG9ydERhdGFEb3dubG9hZCA9ICdleHBvcnQtZGF0YS1kb3dubG9hZCcsXG4gIEV4cG9ydEltYWdlID0gJ2V4cG9ydC1pbWFnZScsXG4gIEV4cG9ydFBkZiA9ICdleHBvcnQtcGRmJyxcbiAgRXhwb3J0UGRmRG93bmxvYWQgPSAnZXhwb3J0LXBkZi1kb3dubG9hZCcsXG4gIEV4cG9ydFBvd2VycG9pbnQgPSAnZXhwb3J0LXBvd2VycG9pbnQnLFxuICBFeHBvcnRQb3dlcnBvaW50RG93bmxvYWQgPSAnZXhwb3J0LXBvd2VycG9pbnQtZG93bmxvYWQnLFxuXG4gIEZpbmRQYXJhbWV0ZXIgPSAnZmluZC1wYXJhbWV0ZXInLFxuXG4gIEdldEFjdGl2ZVRhYmxlcyA9ICdnZXQtYWN0aXZlLXRhYmxlcycsXG4gIEdldEFsbERhdGFTb3VyY2VzID0gJ2dldC1hbGwtZGF0YS1zb3VyY2VzJyxcbiAgR2V0QW5ub3RhdGlvbnMgPSAnZ2V0LWFubm90YXRpb25zJyxcbiAgR2V0Q2F0ZWdvcmljYWxEb21haW4gPSAnZ2V0LWNhdGVnb3JpY2FsLWRvbWFpbicsXG4gIEdldENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcmllcyA9ICdnZXQtY29ubmVjdGlvbi1kZXNjcmlwdGlvbi1zdW1tYXJpZXMnLFxuICBHZXRDdXJyZW50U3JjID0gJ2dldC1jdXJyZW50LXNyYycsXG4gIEdldEN1c3RvbVZpZXdzID0gJ2dldC1jdXN0b20tdmlld3MnLFxuICBHZXREYXNoYm9hcmRGaWx0ZXJzID0gJ2dldC1kYXNoYm9hcmQtZmlsdGVycycsXG4gIEdldERhdGFTb3VyY2UgPSAnZ2V0LWRhdGFzb3VyY2UnLFxuICBHZXREYXRhU291cmNlRGF0YSA9ICdnZXQtZGF0YXNvdXJjZS1kYXRhJyxcbiAgR2V0RGF0YVNvdXJjZXMgPSAnZ2V0LWRhdGEtc291cmNlcycsXG4gIEdldERhdGFTdW1tYXJ5RGF0YSA9ICdnZXQtc3VtbWFyeS1kYXRhJyxcbiAgR2V0RGF0YVN1bW1hcnlEYXRhUmVhZGVyID0gJ2dldC1zdW1tYXJ5LWRhdGEtcmVhZGVyJyxcbiAgR2V0RGF0YVRhYmxlUmVhZGVyUGFnZSA9ICdnZXQtZGF0YS10YWJsZS1yZWFkZXItcGFnZScsXG4gIEdldEVtYmVkZGluZ0Fic3RyYWN0UXVlcnlXaXRoRGF0YU1vZGVsID0gJ2dldC1lbWJlZGRpbmctYWJzdHJhY3QtcXVlcnktd2l0aC1kYXRhLW1vZGVsJyxcbiAgR2V0RW1iZWRkaW5nQ2xpZW50SW5mbyA9ICdnZXQtZW1iZWRkaW5nLWNsaWVudC1pbmZvJyxcbiAgR2V0Vml6U3RhdGVXaXRoRGF0YU1vZGVsID0gJ2dldC12aXotc3RhdGUtd2l0aC1kYXRhLW1vZGVsJyxcbiAgR2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcCA9ICdnZXQtZXhwb3J0LWNyb3NzdGFiLXNoZWV0LW1hcCcsXG4gIEdldEV4cG9ydFBkZk9wdGlvbnMgPSAnZ2V0LWV4cG9ydC1wZGYtb3B0aW9ucycsXG4gIEdldEZpZWxkID0gJ2dldC1maWVsZCcsXG4gIEdldEZpZWxkQW5kRGF0YVNvdXJjZSA9ICdnZXQtZmllbGQtYW5kLWRhdGFzb3VyY2UnLFxuICBHZXRWaXN1YWxTcGVjaWZpY2F0aW9uID0gJ2dldC12aXN1YWwtc3BlY2lmaWNhdGlvbicsXG4gIEdldEZpbHRlcnMgPSAnZ2V0LWZpbHRlcnMnLFxuICBHZXRGb250cyA9ICdnZXQtZm9udHMnLFxuICBHZXRIaWdobGlnaHRlZE1hcmtzID0gJ2dldC1oaWdobGlnaHRlZC1tYXJrcycsXG4gIEdldEpvaW5EZXNjcmlwdGlvbiA9ICdnZXQtam9pbi1kZXNjcmlwdGlvbicsXG4gIEdldExvZ2ljYWxUYWJsZURhdGEgPSAnZ2V0LWxvZ2ljYWwtdGFibGUtZGF0YScsXG4gIEdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXIgPSAnZ2V0LWxvZ2ljYWwtdGFibGUtZGF0YS1yZWFkZXInLFxuICBHZXRMb2dpY2FsVGFibGVzID0gJ2dldC1sb2dpY2FsLXRhYmxlcycsXG4gIEdldFBhcmFtZXRlcnNGb3JTaGVldCA9ICdnZXQtcGFyYW1ldGVycy1mb3Itc2hlZXQnLFxuICBHZXRQdWxzZUNhdGVnb3JpY2FsRG9tYWluID0gJ2dldC1wdWxzZS1jYXRlZ29yaWNhbC1kb21haW4nLFxuICBHZXRQdWxzZUZpbHRlcnMgPSAnZ2V0LXB1bHNlLWZpbHRlcnMnLFxuICBHZXRQdWxzZVRpbWVEaW1lbnNpb24gPSAnZ2V0LXB1bHNlLXRpbWUtZGltZW5zaW9uJyxcbiAgR2V0UmFuZ2VEb21haW4gPSAnZ2V0LXJhbmdlLWRvbWFpbicsXG4gIEdldFNlbGVjdGVkTWFya3MgPSAnZ2V0LXNlbGVjdGVkLW1hcmtzJyxcbiAgR2V0U2hhcmVkRmlsdGVyID0gJ2dldC1zaGFyZWQtZmlsdGVyJyxcbiAgR2V0VG9vbHRpcFRleHQgPSAnZ2V0LXRvb2x0aXAtdGV4dCcsXG4gIEdldFVuZGVybHlpbmdEYXRhID0gJ2dldC11bmRlcmx5aW5nLWRhdGEnLFxuICBHZXRVbmRlcmx5aW5nVGFibGVEYXRhID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlLWRhdGEnLFxuICBHZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlLWRhdGEtcmVhZGVyJyxcbiAgR2V0VW5kZXJseWluZ1RhYmxlcyA9ICdnZXQtdW5kZXJseWluZy10YWJsZXMnLFxuXG4gIEhpZXJhcmNoaWNhbEZpbHRlciA9ICdoaWVyYWNoaWNhbC1maWx0ZXInLFxuXG4gIEluaXRpYWxpemVFeHRlbnNpb24gPSAnaW5pdGlhbGl6ZS1leHRlbnNpb24nLFxuICBJc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZSA9ICdpcy1hbmFseXRpY3MtYXNzaXN0YW50LWF2YWlsYWJsZScsXG5cbiAgTGF1bmNoQW5hbHl0aWNzQXNzaXN0YW50ID0gJ2xhdW5jaC1hbmFseXRpY3MtYXNzaXN0YW50JyxcblxuICBNb3ZlQW5kUmVzaXplWm9uZXMgPSAnbW92ZS1hbmQtcmVzaXplLXpvbmVzJyxcbiAgTW92ZU1hcmtzQ2FyZEZpZWxkID0gJ21vdmUtbWFya3MtY2FyZC1maWVsZCcsXG5cbiAgUmFpc2VMZWF2ZU1hcmtOYXZOb3RpZmljYXRpb24gPSAncmFpc2UtbGVhdmUtbWFyay1uYXYtbm90aWZpY2F0aW9uJyxcbiAgUmFpc2VIb3ZlclR1cGxlTm90aWZpY2F0aW9uID0gJ3JhaXNlLWhvdmVyLXR1cGxlLW5vdGlmaWNhdGlvbicsXG4gIFJhaXNlU2VsZWN0VHVwbGVzTm90aWZpY2F0aW9uID0gJ3JhaXNlLXNlbGVjdC10dXBsZXMtbm90aWZpY2F0aW9uJyxcbiAgUmVkbyA9ICdyZWRvJyxcbiAgUmVmcmVzaERhdGFTb3VyY2UgPSAncmVmcmVzaC1kYXRhLXNvdXJjZScsXG4gIFJlbGVhc2VEYXRhVGFibGVSZWFkZXIgPSAncmVsZWFzZS1kYXRhLXRhYmxlLXJlYWRlcicsXG4gIFJlbW92ZUFubm90YXRpb24gPSAncmVtb3ZlLWFubm90YXRpb24nLFxuICBSZW1vdmVDdXN0b21WaWV3ID0gJ3JlbW92ZS1jdXN0b20tdmlldycsXG4gIFJlbW92ZUV4dGVybmFsTWVudUl0ZW0gPSAncmVtb3ZlLWV4dGVybmFsLW1lbnUtaXRlbScsXG4gIFJlbmFtZUV4dGVybmFsTWVudSA9ICdyZW5hbWUtZXh0ZXJuYWwtbWVudScsXG4gIFJlcGxheUFuaW1hdGlvbiA9ICdyZXBsYXktYW5pbWF0aW9uJyxcbiAgUmV2ZXJ0U3RvcnlQb2ludCA9ICdyZXZlcnQtc3RvcnktcG9pbnQnLFxuICBSZXZlcnRXb3JrYm9vayA9ICdyZXZlcnQtd29ya2Jvb2snLFxuXG4gIFNhdmVFeHRlbnNpb25TZXR0aW5ncyA9ICdzYXZlLWV4dGVuc2lvbi1zZXR0aW5ncycsXG4gIFNhdmVXb3JrYm9va0FzQ3VzdG9tVmlldyA9ICdzYXZlLXdvcmtib29rLWFzLWN1c3RvbS12aWV3JyxcbiAgU2VsZWN0QnlWYWx1ZSA9ICdzZWxlY3QtYnktdmFsdWUnLFxuICBTZXRBY3RpdmVDdXN0b21WaWV3QXNEZWZhdWx0ID0gJ3NldC1hY3RpdmUtY3VzdG9tLXZpZXctYXMtZGVmYXVsdCcsXG4gIFNldEF1dG9VcGRhdGUgPSAnc2V0LWF1dG8tdXBkYXRlJyxcbiAgU2V0Q2xpY2tUaHJvdWdoID0gJ3NldC1jbGljay10aHJvdWdoJyxcbiAgU2VuZERpYWxvZ01lc3NhZ2UgPSAnc2VuZC1kaWFsb2ctbWVzc2FnZScsXG4gIFNldFZpelN0YXRlV2l0aERhdGFNb2RlbCA9ICdzZXQtdml6LXN0YXRlLXdpdGgtZGF0YS1tb2RlbCcsXG4gIFNldFNoZWV0U2l6ZSA9ICdzZXQtc2hlZXQtc2l6ZScsXG4gIFNldFpvbmVWaXNpYmlsaXR5ID0gJ3NldC16b25lLXZpc2liaWxpdHknLFxuICBTaGFyZSA9ICdzaGFyZScsXG4gIFNob3dDdXN0b21WaWV3ID0gJ3Nob3ctY3VzdG9tLXZpZXcnLFxuICBTcGxpY2VNYXJrc0NhcmRGaWVsZHMgPSAnc3BsaWNlLW1hcmtzLWNhcmQtZmllbGRzJyxcblxuICBUZXN0Q29udmVyc2lvblZlcmIgPSAndGVzdC1jb252ZXJzaW9uLXZlcmInLFxuXG4gIFVuZG8gPSAndW5kbycsXG4gIFVwZGF0ZUN1c3RvbVZpZXcgPSAndXBkYXRlLWN1c3RvbS12aWV3JyxcblxuICBWaXpBUEkgPSAndml6LWFwaScsXG59XG4iLCJleHBvcnQgZW51bSBBc2tEYXRhT3B0aW9uTmFtZXMge1xuICB0b2tlbiA9ICd0b2tlbicsXG4gIG9yaWdpbiA9ICdvcmlnaW4nLFxuICBzaG93RW1iZWQgPSAnc2hvd0VtYmVkJyxcbiAgc2hvd1BpbiA9ICdzaG93UGluJyxcbiAgc2hvd1NhdmUgPSAnc2hvd1NhdmUnLFxuICBzaG93U2hhcmUgPSAnc2hvd1NoYXJlJyxcbiAgZGVidWcgPSAnOmpzZGVidWcnLFxuICBBcGlJRCA9ICc6YXBpSUQnLFxuICBBcGlFeHRlcm5hbFZlcnNpb24gPSAnOmFwaUV4dGVybmFsVmVyc2lvbicsXG4gIEFwaUludGVybmFsVmVyc2lvbiA9ICc6YXBpSW50ZXJuYWxWZXJzaW9uJyxcbiAgQXNrRGF0YVdlYkNvbXBvbmVudCA9ICc6YXNrRGF0YVdlYkNvbXBvbmVudCcsXG59XG4iLCJleHBvcnQgZW51bSBQdWxzZU9wdGlvbk5hbWVzIHtcbiAgZW1iZWQgPSAnZW1iZWQnLFxuICB0b2tlbiA9ICd0b2tlbicsXG4gIGRpc2FibGVFeHBsb3JlRmlsdGVyID0gJ2Rpc2FibGVFeHBsb3JlRmlsdGVyJyxcbiAgbGF5b3V0ID0gJ2VtYmVkX2xheW91dCcsXG4gIHRoZW1lID0gJ2VtYmVkX3RoZW1lJyxcbiAgQXBpRXh0ZXJuYWxWZXJzaW9uID0gJzphcGlFeHRlcm5hbFZlcnNpb24nLFxuICBBcGlJbnRlcm5hbFZlcnNpb24gPSAnOmFwaUludGVybmFsVmVyc2lvbicsXG4gIFB1bHNlV2ViQ29tcG9uZW50ID0gJzpwdWxzZVdlYkNvbXBvbmVudCcsXG59XG4iLCIvKipcbiAqIFRoZXNlIHN0cmluZ3Mgd2VyZSAqbWFudWFsbHkgY29waWVkKiBmcm9tIHRoZSBzZXJ2ZXIsXG4gKiB3b3JrZ3JvdXAvc3JjL3NpbG9zL3RhYmxlYXUtc2VydmVyL2xpYnJhcmllcy90YWItY29udHJvbGxlci12aXpxbC9zcmMvY29tL3RhYmxlYXVzb2Z0d2FyZS9cbiAqIGNvbnRyb2xsZXIvdml6cWwvY29uc3RhbnRzL1BhcmFtZXRlcktleXMuamF2YSNMOVxuICogc2hvdWxkIGJlIGV4cG9ydGVkIGluc3RlYWRcbiAqIHBhcmFtZXRlcnMgdGhhdCB2aXpxbCB3aWxsIGFjY2VwdCBpbiBhbiBlbWJlZGRpbmcgVVJMXG4gKiovXG5lbnVtIFZxbFBhcmFtZXRlck5hbWVzIHtcbiAgT05FID0gJzEnLFxuICBBTEVSVFMgPSAnOmFsZXJ0cycsXG4gIEFMSUFTID0gJ2FsaWFzJyxcbiAgQUxMT1dfREVGRVJSRURfQk9PVFNUUkFQID0gJzphbGxvd0RlZmVycmVkQm9vdHN0cmFwJyxcbiAgQUxMT1dfQVVUT0dFTl9XT1JLU0hFRVRfUEhPTkVfTEFZT1VUUyA9ICdhbGxvd0F1dG9nZW5Xb3Jrc2hlZXRQaG9uZUxheW91dHMnLFxuICBBUElfSUQgPSAnOmFwaUlEJyxcbiAgQVBQID0gJzphcHAnLFxuICBBVFRBQ0hNRU5UID0gJ2F0dGFjaG1lbnQnLFxuICBJU19JUEFEX0FQUCA9ICdhcHAnLFxuICBBTklNQVRFX1RSQU5TSVRJT04gPSAnOmFuaW1hdGVfdHJhbnNpdGlvbicsXG4gIEFTQ0VORElORyA9ICdhc2NlbmRpbmcnLFxuICBBVVRIRU5USUNBVElPTiA9ICdhdXRoZW50aWNhdGlvbicsXG4gIEFUVFJJQlVURVMgPSAnYXR0cmlidXRlcycsXG4gIEFVVEhPUklOR19TSEVFVCA9ICc6YXV0aFNoZWV0JyxcbiAgQVhJUyA9ICdheGlzJyxcbiAgQk9PVFNUUkFQX1dIRU5fTk9USUZJRUQgPSAnOmJvb3RzdHJhcFdoZW5Ob3RpZmllZCcsXG4gIEJST1dTRVJfQkFDS19CVVRUT05fVU5ETyA9ICc6YnJvd3NlckJhY2tCdXR0b25VbmRvJyxcbiAgQlJPV1NFUl9SRU5ERVJJTkdfT04gPSAnaXNCcm93c2VyUmVuZGVyaW5nJyxcbiAgQlJPV1NFUl9SRU5ERVJJTkdfVEhSRVNIT0xEID0gJ2Jyb3dzZXJSZW5kZXJpbmdUaHJlc2hvbGQnLFxuICBDSEFSU0VUID0gJ2NoYXJzZXQnLFxuICBDTElFTlRfRElNRU5TSU9OID0gJ2NsaWVudERpbWVuc2lvbicsXG4gIENMSUVOVF9JUCA9ICdjbGllbnRfaXAnLFxuICBDTElFTlRfTlVNID0gJ2NsaWVudE51bScsXG4gIENPTE9OX0VNQkVEREVEID0gJzplbWJlZGRlZCcsXG4gIENPTE9OX01PQklMRSA9ICc6bW9iaWxlJyxcbiAgQ09MT05fREVFUF9MSU5LSU5HX0RJU0FCTEVEID0gJzpkZWVwTGlua2luZ0Rpc2FibGVkJyxcbiAgQ09MT05fV0FURVJNQVJLID0gJzp3YXRlcm1hcmsnLFxuICBDT01NRU5UUyA9ICc6Y29tbWVudHMnLFxuICBDT01NRU5USU5HX0VOQUJMRUQgPSAnOmNvbW1lbnRpbmdFbmFibGVkJyxcbiAgQ09NTUVOVElOR19NRU5USU9OU19FTkFCTEVEID0gJzpjb21tZW50aW5nTWVudGlvbnMnLFxuICBDT05ORUNUSU9OID0gJ2Nvbm5lY3Rpb24nLFxuICBDUkVBVEVEX0JZX0ZFQVRVUkUgPSAnY3JlYXRlZEJ5RmVhdHVyZScsXG4gIENSWVBURURfUEFTU1dPUkQgPSAnY3J5cHRlZCcsXG4gIENTU0RFQlVHID0gJzpjc3NkZWJ1ZycsXG4gIENTViA9ICdjc3YnLFxuICBDVVNUT01fVklFV1MgPSAnOmN1c3RvbVZpZXdzJyxcbiAgQ1YgPSAnOmN2JyxcbiAgQ1ZfSUQgPSAnY3ZJZCcsXG4gIERBU0hCT0FSRF9QT1JUX1NJWkUgPSAnZGFzaGJvYXJkUG9ydFNpemUnLFxuICBEQVRBX0RFVEFJTFMgPSAnOmRhdGFEZXRhaWxzJyxcbiAgREFUQVNPVVJDRSA9ICdkYXRhc291cmNlJyxcbiAgREVCVUcgPSAnOmRlYnVnJyxcbiAgREVMQVkgPSAnOmRlbGF5JyxcbiAgREVQVEggPSAnZGVwdGgnLFxuICBERVZJQ0VfVFlQRSA9ICc6ZGV2aWNlJyxcbiAgREVWSUNFX1BJWEVMX1JBVElPID0gJ2RldmljZVBpeGVsUmF0aW8nLFxuICBERVZJQ0VfUFJFVklFV19NT0RFID0gJzpkZXZpY2VwcmV2aWV3bW9kZScsXG4gIERJTUVOU0lPTlMgPSAnOmRpbWVuc2lvbnMnLFxuICBESVNBQkxFX1NIQVJFRF9TRVNTSU9OUyA9ICc6ZGlzYWJsZV9zaGFyZWRfc2Vzc2lvbnMnLFxuICBESVNBQkxFX1VSTF9BQ1RJT05TX1BPUFVQUyA9ICc6ZGlzYWJsZVVybEFjdGlvbnNQb3B1cHMnLFxuICBESVJFQ1RJT04gPSAnZGlyZWN0aW9uJyxcbiAgRElTUExBWV9PVkVSTEFZID0gJzpkaXNwbGF5X292ZXJsYXknLFxuICBESVNQTEFZX1NIQVJFID0gJzpkaXNwbGF5X3NoYXJlJyxcbiAgRElTUExBWV9TUElOTkVSID0gJzpkaXNwbGF5X3NwaW5uZXInLFxuICBESVNQTEFZX1NUQVRJQ19JTUFHRSA9ICc6ZGlzcGxheV9zdGF0aWNfaW1hZ2UnLFxuICBESVNQTEFZX1RBQlMgPSAnZGlzcGxheV90YWJzJyxcbiAgRElTUExBWV9WSUVXX0NPVU5UID0gJzpkaXNwbGF5X2NvdW50JyxcbiAgSUdOT1JFX1NUSUNLWV9TRVNTSU9OID0gJzppZ25vcmVfc3RpY2t5X3Nlc3Npb24nLFxuICBJTkNSRU1FTlRfVklFV19DT1VOVCA9ICc6aW5jcmVtZW50X3ZpZXdfY291bnQnLFxuICBET0NNT0RFID0gJ2RvY21vZGUnLFxuICBET01BSU4gPSAnZG9tYWluJyxcbiAgRE9fV09SSyA9ICdkb193b3JrJyxcbiAgRFggPSAnZHgnLFxuICBEWSA9ICdkeScsXG4gIEVESVRfREFUQV9BTEVSVCA9ICc6ZWRpdERhdGFBbGVydCcsXG4gIEVNQkVEID0gJzplbWJlZCcsXG4gIEVNQkVEREVEID0gJ2VtYmVkZGVkJyxcbiAgRU5DUllQVEVEID0gJ2VuY3J5cHRlZCcsXG4gIEFQSV9FWFRFUk5BTF9WRVJTSU9OID0gJzphcGlFeHRlcm5hbFZlcnNpb24nLFxuICBBUElfSU5URVJOQUxfVkVSU0lPTiA9ICc6YXBpSW50ZXJuYWxWZXJzaW9uJyxcbiAgRVhDTFVERSA9ICdleGNsdWRlJyxcbiAgRVhQT1JUX0ZPUk1BVCA9ICc6ZXhwb3J0X2Zvcm1hdCcsXG4gIEZJRUxETkFNRSA9ICdmaWVsZG5hbWUnLFxuICBGSUVMRF9OQU1FID0gJ2ZpZWxkX25hbWUnLFxuICBGSUVMRF9TRVAgPSAnZmllbGRfc2VwJyxcbiAgRklMRSA9ICdmaWxlJyxcbiAgRklMVEVSX1RJTEVfU0laRSA9ICdmaWx0ZXJUaWxlU2l6ZScsXG4gIEZOID0gJ2ZuJyxcbiAgRk9DVVMgPSAnZm9jdXMnLFxuICBGT1JDRV9DQUNIRSA9ICdmb3JjZV9jYWNoZScsXG4gIEZPUk1BVCA9ICdmb3JtYXQnLFxuICBGT1JNQVRfREFUQV9WQUxVRV9MT0NBTExZID0gJ2Zvcm1hdERhdGFWYWx1ZUxvY2FsbHknLFxuICBGUk9NX1dHID0gJzpmcm9tX3dnJyxcbiAgR1JBUEhRTF9EQVRBQkFTRV9JRCA9ICc6Z3JhcGhRTERhdGFiYXNlSWQnLFxuICBHUkFQSFFMX1RBQkxFX0lEID0gJzpncmFwaFFMVGFibGVJZCcsXG4gIEdVSUQgPSAnOmd1aWQnLFxuICBIID0gJ2gnLFxuICBISURERU4gPSAnaGlkZGVuJyxcbiAgSElERV9DTE9TRV9CVVRUT04gPSAnOmhpZGVDbG9zZUJ1dHRvbicsXG4gIEhJREVfRURJVF9CVVRUT04gPSAnOmhpZGVFZGl0QnV0dG9uJyxcbiAgSElERV9FRElUX0lOX0RFU0tUT1BfQlVUVE9OID0gJzpoaWRlRWRpdEluRGVza3RvcEJ1dHRvbicsXG4gIEhJR0hfRFBJID0gJzpoaWdoZHBpJyxcbiAgSU1BR0VfU0laRV9MSU1JVCA9ICdpbWFnZVNpemVMaW1pdCcsXG4gIFRSQU5TUEFSRU5UX0xJTkVfTUFSS1NfTElNSVQgPSAndHJhbnNwYXJlbnRMaW5lTWFya0xpbWl0JyxcbiAgQ0xJRU5UX1JFTkRFUl9QSVhFTF9MSU1JVCA9ICdjbGllbnRSZW5kZXJQaXhlbExpbWl0JyxcbiAgSU4gPSAnaW4nLFxuICBJTlNUQU5DRV9JRCA9ICc6aWlkJyxcbiAgSVNfR1VFU1RfUkVESVJFQ1RfRlJPTV9WSVpQT1JUQUwgPSAnOmlzR3Vlc3RSZWRpcmVjdEZyb21WaXpwb3J0YWwnLFxuICBJU19NQVJLX0FOSU1BVElPTl9FTkFCTEVEID0gJ2lzTWFya0FuaW1hdGlvbkVuYWJsZWQnLFxuICBJU19WSVpQT1JUQUwgPSAnOmlzVml6UG9ydGFsJyxcbiAgSU5QVVRfID0gJ2lucHV0X3N0cmluZycsXG4gIEpTREVCVUcgPSAnOmpzZGVidWcnLFxuICBKU09OID0gJ2pzb24nLFxuICBKU09OX09OTFkgPSAnOmpzb25Pbmx5JyxcbiAgS0VFUEZJTEUgPSAna2VlcGZpbGUnLFxuICBLRVkgPSAna2V5JyxcbiAgTEFOR1VBR0UgPSAnbGFuZ3VhZ2UnLFxuICBMQU5HVUFHRV9SRVFVRVNURUQgPSAnOmxhbmd1YWdlJyxcbiAgTElOS1RBUkdFVCA9ICc6bGlua3RhcmdldCcsXG4gIExPQURfT1JERVJfSUQgPSAnOmxvYWRPcmRlcklEJywgLy8gdXNlZCBmb3IgUHVibGljXG4gIExPQURfTkVXRVNUX1JFVklTSU9OID0gJzpsb2FkTmV3ZXN0UmV2aXNpb24nLFxuICBMT0NBTF9QQVRIUyA9ICc6bG9jYWxQYXRocycsXG4gIExPQ0FMRSA9ICdsb2NhbGUnLFxuICBMT0NBVElPTl9JRCA9ICdsb2NhdGlvbmlkJyxcbiAgTE9DQVRJT05fVFlQRSA9ICdsb2NhdGlvbnR5cGUnLFxuICBXT1JLQk9PS19MT0NBTEUgPSAnd29ya2Jvb2tMb2NhbGUnLFxuICBNQVhST1dTID0gJ21heHJvd3MnLFxuICBNQVhfQUdFID0gJ21heEFnZScsXG4gIE1BWF9ST1dTID0gJ21heFJvd3MnLFxuICBNRVRIT0QgPSAnbWV0aG9kJyxcbiAgTU9CSUxFID0gJ21vYmlsZScsXG4gIE1PRElGSUVSID0gJ21vZGlmaWVyJyxcbiAgTkFNRSA9ICduYW1lJyxcbiAgTkFWX1RZUEUgPSAnbmF2VHlwZScsXG4gIE5BVl9TUkMgPSAnbmF2U3JjJyxcbiAgTk9BVFRBQ0hNRU5UID0gJ25vLWF0dGFjaG1lbnQnLFxuICBOT19PVkVSV1JJVEUgPSAnbm9fb3ZlcndyaXRlJyxcbiAgT1BFTl9BVVRIT1JJTkdfSU5fVE9QX1dJTkRPVyA9ICc6b3BlbkF1dGhvcmluZ0luVG9wV2luZG93JyxcbiAgT1BFTklEX0hEID0gJzpvcGVuaWRfaGQnLFxuICBPUEVOSURfTE9HSU5fSElOVCA9ICc6b3BlbmlkX2xvZ2luX2hpbnQnLFxuICBPQVVUSFJFUVVFU1QgPSAnb2F1dGhyZXF1ZXN0JyxcbiAgT0FVVEhfQ1JFREVOVElBTF9JRFMgPSAnb2F1dGhfY3JlZGVudGlhbF9pZHMnLFxuICBPRkZMSU5FX01PREUgPSAnOm9mZmxpbmVtb2RlJyxcbiAgT1JJR0lOID0gJzpvcmlnaW4nLFxuICBPVkVSTEFZID0gJzpvdmVybGF5JyxcbiAgUCA9ICdwJyxcbiAgUEFUSCA9ICdwYXRoJyxcbiAgUEFORV9SRVNPTFZFUl9YID0gJ3BhbmVSZXNvbHZlclgnLFxuICBQQU5FX1JFU09MVkVSX1kgPSAncGFuZVJlc29sdmVyWScsXG4gIFBBUkFNID0gJ3BhcmFtJyxcbiAgUEFSRU5UX0lEID0gJ3BhcmVudF9pZCcsXG4gIFBBU1NXT1JEID0gJ3Bhc3N3b3JkJyxcbiAgUEFUVEVSTiA9ICdwYXR0ZXJuJyxcbiAgUElYRUxfUkFUSU8gPSAnOnBpeGVscmF0aW8nLFxuICBQUkVGSVggPSAnOnByZWZpeCcsXG4gIFBSRVZJRVcgPSAnOnByZXZpZXcnLFxuICBQUklNQVJZX0NPTlRFTlRfVVJMID0gJ3ByaW1hcnlfY29udGVudF91cmwnLFxuICBQUk9KRUNUID0gJ3Byb2plY3QnLFxuICBQUk9UT0NPTCA9ICdwcm90b2NvbCcsXG4gIFBTRVVETyA9ICc6cHNldWRvJyxcbiAgUVVFUlkgPSAncXVlcnknLFxuICBSID0gJ3InLFxuICBSQU5HRV9UWVBFID0gJ3JhbmdlX3R5cGUnLFxuICBSRUNPUkRfU0VQID0gJ3JlY29yZF9zZXAnLFxuICBSRUNPUkRfQ0xJRU5UX1BFUkZPUk1BTkNFID0gJzpyZWNvcmRfY2xpZW50X3BlcmZvcm1hbmNlJyxcbiAgUkVDT1JEX1BFUkZPUk1BTkNFID0gJzpyZWNvcmRfcGVyZm9ybWFuY2UnLFxuICBSRUNPVkVSX09MRF9TRVNTSU9OX0lEID0gJzpyZWNvdmVyX29sZF9zZXNzaW9uX2lkJyxcbiAgUkVDT1ZFUl9TRVNTSU9OX1NUQVRFX1RJQ0tFVFMgPSAnOnJlY292ZXJfc2Vzc2lvbl9zdGF0ZV90aWNrZXRzJyxcbiAgUkVGUkVTSCA9ICc6cmVmcmVzaCcsXG4gIFJFRlJFU0hVTk1PRElGSUVEID0gJzpyZWZyZXNodW5tb2RpZmllZCcsXG4gIFJFR0lPTiA9ICdyZWdpb24nLFxuICBSRUxPQURfT05fQ1VTVE9NX1ZJRVdfU0FWRSA9ICc6cmVsb2FkT25DdXN0b21WaWV3U2F2ZScsXG4gIFJFTkRFUiA9ICc6cmVuZGVyJyxcbiAgUkVOREVSX01BUFNfQ0xJRU5UX1NJREUgPSAncmVuZGVyTWFwc0NsaWVudFNpZGUnLFxuICBSRVRSWSA9ICc6cmV0cnknLFxuICBSRVVTRSA9ICdyZXVzZScsXG4gIFJFVVNFX0ZPUkVWRVIgPSAncmV1c2VfZm9yZXZlcicsXG4gIFJFVkVSVCA9ICc6cmV2ZXJ0JyxcbiAgU0FWRV9EQl9QQVNTV09SRFMgPSAnc2F2ZV9kYl9wYXNzd29yZHMnLFxuICBTRUxFQ1RfWCA9ICdzZWxlY3RfeCcsXG4gIFNFTEVDVF9ZID0gJ3NlbGVjdF95JyxcbiAgU0VTU0lPTl9GRUFUVVJFX1BSRUZJWCA9ICc6ZmZfJyxcbiAgU0VTU0lPTl9GTEFHUyA9ICc6c2Vzc2lvbl9mZWF0dXJlX2ZsYWdzJyxcbiAgU0hBUkVfQlVUVE9OID0gJ3NoYXJlX2J1dHRvbicsXG4gIFNIRUVUX0lEID0gJ3NoZWV0X2lkJyxcbiAgU0hBUkVEID0gJ3NoYXJlZCcsXG4gIFNIT1dBTEwgPSAnc2hvd2FsbCcsXG4gIFNIT1dfQVBQX0JBTk5FUiA9ICc6c2hvd0FwcEJhbm5lcicsXG4gIFNIT1dfQVNLX0RBVEEgPSAnOnNob3dBc2tEYXRhJyxcbiAgU0hPV19QQVJBTVMgPSAnc2hvd1BhcmFtcycsXG4gIFNIT1dfU0hBUkVfT1BUSU9OUyA9ICc6c2hvd1NoYXJlT3B0aW9ucycsXG4gIFNJWkUgPSAnOnNpemUnLFxuICBTT1VSQ0UgPSAnc291cmNlJyxcbiAgU1RBVEUgPSAnc3RhdGUnLFxuICBTVElDS1lfU0VTU0lPTl9LRVkgPSAnc3RpY2t5U2Vzc2lvbktleScsXG4gIFNVQlNDUklQVElPTlMgPSAnOnN1YnNjcmlwdGlvbnMnLFxuICBTVU1NQVJZID0gJ3N1bW1hcnknLFxuICBTVVBQUkVTU19ERUZBVUxUX0VESVRfQkVIQVZJT1IgPSAnOnN1cHByZXNzRGVmYXVsdEVkaXRCZWhhdmlvcicsXG4gIFNZTkNfU0VTU0lPTiA9ICc6c3luY19zZXNzaW9uJyxcbiAgU1lOQ19TRVNTSU9OX1NUQVRFID0gJ3N5bmNfc2Vzc2lvbl9zdGF0ZScsXG4gIFRBQlMgPSAnOnRhYnMnLFxuICBUQVJHRVQgPSAndGFyZ2V0JyxcbiAgVEFSR0VUX1NJVEUgPSAndGFyZ2V0X3NpdGUnLFxuICBUT09MQkFSID0gJzp0b29sYmFyJyxcbiAgVE9PTFRJUCA9ICc6dG9vbHRpcCcsXG4gIFRTID0gJ3RzJyxcbiAgVU5ERVJMWUlOR19UQUJMRV9JRCA9ICd1bmRlcmx5aW5nX3RhYmxlX2lkJyxcbiAgVU5ERVJMWUlOR19UQUJMRV9DQVBUSU9OID0gJ3VuZGVybHlpbmdfdGFibGVfY2FwdGlvbicsXG4gIFVQREFURV9UWVBFID0gJ3VwZGF0ZV90eXBlJyxcbiAgVVNFX0dVRVNUID0gJzp1c2VHdWVzdCcsXG4gIFVTRV9JTkxJTkVfSU1BR0VTID0gJ3VzZV9pbmxpbmVfaW1hZ2VzJyxcbiAgVVNFUkFHRU5UID0gJ3VzZXJhZ2VudCcsXG4gIFVTRVJOQU1FID0gJ3VzZXJuYW1lJyxcbiAgVkFMVUUgPSAndmFsdWUnLFxuICBWRVJCT1NFX01PREUgPSAndmVyYm9zZU1vZGUnLFxuICBWSUVXX0lEID0gJ3ZpZXdzX2lkJyxcbiAgVklaX1NOQVBTSE9UX0lEID0gJ3Zpel9zbmFwc2hvdF9pZCcsXG4gIFZXID0gJzp2dycsXG4gIFcgPSAndycsXG4gIFdPUktTSEVFVF9QT1JUX1NJWkUgPSAnd29ya3NoZWV0UG9ydFNpemUnLFxuICBXQVRFUk1BUksgPSAnd2F0ZXJtYXJrJyxcbiAgV0FURVJNQVJLX01BUkdJTiA9ICc6d2F0ZXJtYXJrX21hcmdpbicsXG4gIFdCID0gJzp3YicsXG4gIFdISUNIID0gJ3doaWNoJyxcbiAgWCA9ICd4JyxcbiAgWSA9ICd5JyxcbiAgWklEID0gJ3ppZCcsXG4gIFpPTkVfSUQgPSAnem9uZV9pZCcsXG4gIEtFWUNIQUlOX1ZFUlNJT04gPSAna2V5Y2hhaW5fdmVyc2lvbicsXG4gIERBVEFTT1VSQ0VfSUQgPSAnZGF0YXNvdXJjZV9pZCcsXG4gIERBVEFTT1VSQ0VfTkFNRSA9ICdkYXRhc291cmNlX25hbWUnLFxuICBMRU5TX0lEID0gJ2xlbnNfaWQnLFxuICBXSURUSCA9ICd3aWR0aCcsXG4gIEhFSUdIVCA9ICdoZWlnaHQnLFxuXG4gIC8vIERlZmF1bHQgTGF5b3V0IHBhcmFtc1xuICBMQVlPVVRfVklFV1MgPSAndmlld3MnLFxuICBMQVlPVVRfTUVOVVMgPSAnbWVudXMnLFxuICBMQVlPVVRfR0VPTUVUUlkgPSAnZ2VvbWV0cnknLFxuICBMQVlPVVRfUEFHRVMgPSAncGFnZXMnLFxuICBMQVlPVVRfQ0FDSEVVUkwgPSAnY2FjaGV1cmwnLFxuICBMQVlPVVRfU0hFRVQgPSAnc2hlZXQnLFxuICBMQVlPVVRfREVQVEggPSAnZGVwdGgnLFxufVxuXG4vKipcbiAqIHBhcmFtZXRlcnMgdGhhdCBhcmUgb25seSByZWxldmFudCB3aGVuIHdvcmtpbmcgd2l0aCBUYWJsZWF1IFB1YmxpY1xuICogbWF5YmUgbm90IHJlYWxseSBuZWNlc3NyeSB0byBzcGxpdCB0aGVtIG91dFxuICovXG5lbnVtIFB1YmxpY1BhcmFtZXRlck5hbWVzIHtcbiAgU0hPV19WSVpfSE9NRSA9ICc6c2hvd1ZpekhvbWUnLFxuICAvLyBkaXNwbGF5IHZpZXcgY291bnRcbn1cblxuLyoqXG4gKiBNYXAgdGhlIHBhcmFtZXRlciBuYW1lcyBhcyB1c2VkIGluIHRoZSB1cmwgdG8gd2hhdCB3ZSBjYWxsIHRoZW0gcHVibGljbHkgaW4gdGhlIGVtYmVkZGluZyBsaWJyYXJ5LlxuICogVGhlIG9ubHkgcGFyYW1ldGVycyBsaXN0ZWQgaGVyZSBzaG91bGQgYmUgdGhlIG9uZXMgdGhhdCBnZXQgc2VudCB0byB2aXpxbFxuICogIC0gdGhpcyBzaG91bGQgbWF0Y2ggdGhlIGludGVyZmFjZSBhdCBleHRlcm5hbC1jb250cmFjdDpWaXpJbnRlcmZhY2VzOlZpelNldHRpbmdzXG4gKi9cbmV4cG9ydCBlbnVtIFZpek9wdGlvbk5hbWVzIHtcbiAgLy8gcHVibGljTmFtZSA9IGludGVybmFsU3RyaW5nVmFsdWVcbiAgU2l6ZSA9IFZxbFBhcmFtZXRlck5hbWVzLlNJWkUsXG4gIEVtYmVkID0gVnFsUGFyYW1ldGVyTmFtZXMuRU1CRUQsXG4gIEFwaUludGVybmFsVmVyc2lvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkFQSV9JTlRFUk5BTF9WRVJTSU9OLFxuICBBcGlFeHRlcm5hbFZlcnNpb24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5BUElfRVhURVJOQUxfVkVSU0lPTixcbiAgU2hvd1ZpekhvbWUgPSBQdWJsaWNQYXJhbWV0ZXJOYW1lcy5TSE9XX1ZJWl9IT01FLFxuICBKc2RlYnVnID0gVnFsUGFyYW1ldGVyTmFtZXMuSlNERUJVRyxcbiAgQm9vdHN0cmFwV2hlbk5vdGlmaWVkID0gVnFsUGFyYW1ldGVyTmFtZXMuQk9PVFNUUkFQX1dIRU5fTk9USUZJRUQsXG4gIE5hdlR5cGUgPSBWcWxQYXJhbWV0ZXJOYW1lcy5OQVZfVFlQRSxcbiAgTmF2U3JjID0gVnFsUGFyYW1ldGVyTmFtZXMuTkFWX1NSQyxcbiAgZGVidWcgPSBWcWxQYXJhbWV0ZXJOYW1lcy5KU0RFQlVHLFxuICBBcGlJRCA9IFZxbFBhcmFtZXRlck5hbWVzLkFQSV9JRCxcblxuICBkaXNhYmxlVXJsQWN0aW9uc1BvcHVwcyA9IFZxbFBhcmFtZXRlck5hbWVzLkRJU0FCTEVfVVJMX0FDVElPTlNfUE9QVVBTLFxuICBoaWRlVGFicyA9IFZxbFBhcmFtZXRlck5hbWVzLlRBQlMsXG4gIHRvb2xiYXIgPSBWcWxQYXJhbWV0ZXJOYW1lcy5UT09MQkFSLFxuICBkZXZpY2UgPSBWcWxQYXJhbWV0ZXJOYW1lcy5ERVZJQ0VfVFlQRSxcbiAgaW5zdGFuY2VJZFRvQ2xvbmUgPSBWcWxQYXJhbWV0ZXJOYW1lcy5JTlNUQU5DRV9JRCxcbiAgdG91Y2hPcHRpbWl6ZSA9IFZxbFBhcmFtZXRlck5hbWVzLk1PQklMRSxcbiAgaGlkZUVkaXRCdXR0b24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5ISURFX0VESVRfQlVUVE9OLFxuICBoaWRlRWRpdEluRGVza3RvcEJ1dHRvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkhJREVfRURJVF9JTl9ERVNLVE9QX0JVVFRPTixcbiAgc3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yID0gVnFsUGFyYW1ldGVyTmFtZXMuU1VQUFJFU1NfREVGQVVMVF9FRElUX0JFSEFWSU9SLFxuICBoaWRlQ2xvc2VCdXR0b24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5ISURFX0NMT1NFX0JVVFRPTixcbn1cbiIsImltcG9ydCAqIGFzIGd1aWQgZnJvbSAnZ3VpZCc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiwgTW9kZWwsIE5vdGlmaWNhdGlvbklkLCBWZXJiSWQsIFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25PcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlL0luaXRpYWxpemF0aW9uT3B0aW9ucyc7XG5pbXBvcnQgeyBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlIH0gZnJvbSAnLi9Dcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlJztcbmltcG9ydCB7XG4gIGlzQ29tbWFuZE1lc3NhZ2UsXG4gIGlzQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgaXNIYW5kc2hha2VNZXNzYWdlLFxuICBpc0luaXRNZXNzYWdlLFxuICBpc01lc3NhZ2UsXG4gIGlzTm90aWZpY2F0aW9uTWVzc2FnZSxcbn0gZnJvbSAnLi9NZXNzYWdlVHlwZUNoZWNrcyc7XG5pbXBvcnQge1xuICBDb21tYW5kTWVzc2FnZUhhbmRsZXIsXG4gIENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyLFxuICBIYW5kc2hha2VNZXNzYWdlSGFuZGxlcixcbiAgSW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyLFxuICBOb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcixcbn0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZUxpc3RlbmVyJztcbmltcG9ydCB7XG4gIENvbW1hbmRNZXNzYWdlLFxuICBDb21tYW5kUmVzcG9uc2VNZXNzYWdlLFxuICBIYW5kc2hha2VNZXNzYWdlLFxuICBJbml0aWFsaXplTWVzc2FnZSxcbiAgTWVzc2FnZSxcbiAgTWVzc2FnZVR5cGUsXG4gIE5vdGlmaWNhdGlvbk1lc3NhZ2UsXG59IGZyb20gJy4vaW50ZXJmYWNlL01lc3NhZ2VUeXBlcyc7XG5pbXBvcnQgeyBNZXNzZW5nZXIgfSBmcm9tICcuL2ludGVyZmFjZS9NZXNzZW5nZXInO1xuaW1wb3J0IHsgUHJlcGFyZWRNZXNzYWdlIH0gZnJvbSAnLi9pbnRlcmZhY2UvUHJlcGFyZWRNZXNzYWdlJztcblxuLyoqXG4gKiBUaGUgQ3Jvc3NGcmFtZU1lc3NlbmdlciBpcyB0aGUgcHJpbWFyeSBleHBvcnQgZnJvbSB0aGUgYXBpLW1lc3NhZ2luZyBtb2R1bGUuIEFuIGluc3RhbmNlIG9mXG4gKiB0aGlzIGNsYXNzIGNhbiBiZSBpbnN0YW50aWF0ZWQgb24gYm90aCBzaWRlcyBvZiBhIGZyYW1lIGJvdW5kYXJ5IHRvIGZhY2lsaXRhdGUgY29tbXVuaWNhdGlvblxuICogaW4gYm90aCBkaXJlY3Rpb25zIGJldHdlZW4gdGhlIGZyYW1lcy4gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGJvdGggdGhlIGRpc3BhdGNoZXIgYW5kIHRoZSBsaXN0ZW5lclxuICogcG9ydGlvbnMsIGJ1dCBkb2Vzbid0IHJlcXVpcmUgY2FsbGVycyB0byBjYXJlIGFib3V0IGJvdGguXG4gKi9cbmV4cG9ydCBjbGFzcyBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGltcGxlbWVudHMgTWVzc2VuZ2VyIHtcbiAgcHJpdmF0ZSB1bnJlZ2lzdGVyRnVuY3Rpb24/OiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIGluaXRpYWxpemVNZXNzYWdlSGFuZGxlcj86IEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcjtcbiAgcHJpdmF0ZSBjb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcj86IENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIGNvbW1hbmRNZXNzYWdlSGFuZGxlcj86IENvbW1hbmRNZXNzYWdlSGFuZGxlcjtcbiAgcHJpdmF0ZSBub3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcj86IE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIGhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyPzogSGFuZHNoYWtlTWVzc2FnZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ3Jvc3NGcmFtZU1lc3Nlbmdlci4gSWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRoZSBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGFzIGEgTWVzc2FnZUxpc3RlbmVyLFxuICAgKiBiZSBzdXJlIHRvIGNhbGwgU3RhcnRMaXN0ZW5pbmcgYW5kIHJlZ2lzdGVyIG1lc3NhZ2UgaGFuZGxlcnMuXG4gICAqIEBwYXJhbSB0aGlzV2luZG93IFRoZSB3aW5kb3cgb2JqZWN0IHdoaWNoIHRoZSBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGxpdmVzLiBBbiBvbk1lc3NhZ2UgbGlzdGVuZXIgd2lsbCBiZSBhZGRlZCBoZXJlLlxuICAgKiBAcGFyYW0gW290aGVyV2luZG93XSBPcHRpb25hbCBvdGhlcldpbmRvdyB3aGljaCBtZXNzYWdlcyB3aWxsIGJlIHBvc3RlZCB0by5cbiAgICogICAgICAgICAgICAgICAgICAgICAgSWYgZGVmaW5lZCwgaW5jb21pbmcgbWVzc2FnZXMgbXVzdCBvcmlnaW5hdGUgZnJvbSBvdGhlcldpbmRvdyB0byBiZSBwYXNzZWQgb25cbiAgICogQHBhcmFtIFtvdGhlcldpbmRvd09yaWdpbl0gVGhlIHRhcmdldCBvcmlnaW4gd2hpY2ggb3RoZXJXaW5kb3cgbXVzdCBoYXZlIGluIG9yZGVyIHRvIHJlY2VpdmUgZGlzcGF0Y2hlZCBtZXNzYWdlcy5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIGJlIHNlbnQgYXMgdGhlIHRhcmdldE9yaWdpbiBvZiBhIHBvc3RNZXNzYWdlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L3Bvc3RNZXNzYWdlKVxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgdGhpc1dpbmRvdzogV2luZG93LCBwcml2YXRlIG90aGVyV2luZG93PzogV2luZG93LCBwcml2YXRlIG90aGVyV2luZG93T3JpZ2luPzogc3RyaW5nKSB7XG4gICAgLy8gTWFrZSBzdXJlIHRvIGNhbGwgU3RhcnRMaXN0ZW5pbmdcbiAgfVxuXG4gIC8vLy8vIE1lc3NhZ2VMaXN0ZW5lciBJbXBsZW1lbnRhdGlvblxuXG4gIHB1YmxpYyBzdGFydExpc3RlbmluZygpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGFyZSBsaXN0ZW5pbmcsIGlmIG5vdCwgaG9vayB1cCBhIG1lc3NhZ2UgbGlzdGVuZXJcbiAgICBpZiAoIXRoaXMudW5yZWdpc3RlckZ1bmN0aW9uKSB7XG4gICAgICBjb25zdCBib3VuZEhhbmRsZXIgPSB0aGlzLm9uTWVzc2FnZVJlY2VpdmVkLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLnRoaXNXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGJvdW5kSGFuZGxlciwgdHJ1ZSk7XG4gICAgICB0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbiA9ICgpID0+IHRoaXMudGhpc1dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgYm91bmRIYW5kbGVyLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RvcExpc3RlbmluZygpOiB2b2lkIHtcbiAgICAvLyBTdG9wIGxpc3RlbmluZyBpZiB3ZSBoYXZlIHN0YXJ0ZWQgbGlzdGVuaW5nXG4gICAgaWYgKHRoaXMudW5yZWdpc3RlckZ1bmN0aW9uKSB7XG4gICAgICB0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbigpO1xuICAgICAgdGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogSW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsaXplTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuY29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldENvbW1hbmRNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogQ29tbWFuZE1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5jb21tYW5kTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBOb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMubm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBIYW5kc2hha2VNZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuaGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgLy8vLy8gTWVzc2FnZURpc3BhdGNoZXIgSW1wbGVtZW50YXRpb25cblxuICAvKipcbiAgICogQHBhcmFtIGFwaVZlcnNpb24gYXBpLWludGVybmFsLWNvbnRyYWN0LWpzIHZlcnNpb24gKGV4cG9ydGVkIGluIEpzQXBpSW50ZXJuYWxDb25udHJhY3QpXG4gICAqIEBwYXJhbSBjcm9zc0ZyYW1lVmVyc2lvbiBjcm9zc2ZyYW1lIG1lc3NhZ2luZyB2ZXJzaW9uIChleHBvcnRlZCBpbiBKc0FwaUludGVybmFsQ29ubnRyYWN0KVxuICAgKiBAcGFyYW0gb3B0aW9ucyBhZGRpdGlvbmFsIG9wdGlvbnMgdGhhdCBjYW4gYmUgcGFzc2VkIGF0IGluaXRpYWxpemF0aW9uIChpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVyc2lvbiBvZlxuICAgKiAgICAgICAgICAgICAgICBleHRlcm5hbCBiZWluZyB1c2VkIGZvciBleGFtcGxlKVxuICAgKi9cbiAgcHVibGljIHByZXBhcmVJbml0aWFsaXphdGlvbk1lc3NhZ2UoXG4gICAgYXBpVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBjcm9zc0ZyYW1lVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuICApOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IEluaXRpYWxpemVNZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLkluaXRpYWxpemUsXG4gICAgICBjcm9zc0ZyYW1lVmVyc2lvbjogY3Jvc3NGcmFtZVZlcnNpb24sXG4gICAgICBhcGlWZXJzaW9uOiBhcGlWZXJzaW9uLFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZUNvbW1hbmRNZXNzYWdlKHZlcmJJZDogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogQ29tbWFuZE1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuQ29tbWFuZCxcbiAgICAgIHZlcmJJZDogdmVyYklkLFxuICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZUNvbW1hbmRSZXNwb25zZU1lc3NhZ2UoY29tbWFuZEd1aWQ6IHN0cmluZywgZGF0YTogTW9kZWwgfCB1bmRlZmluZWQsIGVycm9yOiBNb2RlbCB8IHVuZGVmaW5lZCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2UsXG4gICAgICBjb21tYW5kR3VpZDogY29tbWFuZEd1aWQsXG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgIH07XG5cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIC8vIHN0cmluZ2lmeSBlcnJvciBvYmplY3QgdG8gcmVtb3ZlIHVuc2VyaWFsaXphYmxlIGZpZWxkcyBsaWtlIGZ1bmN0aW9ucyBhbmQgcHJldmVudCBzZXJpYWxpemF0aW9uIGVycm9yc1xuICAgICAgbWVzc2FnZS5lcnJvciA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVwYXJlTm90aWZpY2F0aW9uTWVzc2FnZShub3RpZmljYXRpb25JZDogTm90aWZpY2F0aW9uSWQsIGRhdGE6IE1vZGVsKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBOb3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLk5vdGlmaWNhdGlvbixcbiAgICAgIG5vdGlmaWNhdGlvbklkOiBub3RpZmljYXRpb25JZCxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIHByZXBhcmVBY2tNZXNzYWdlKCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogSGFuZHNoYWtlTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5BY2ssXG4gICAgICBwbGF0Zm9ybVZlcnNpb246IElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGEgcGVuZGluZyBtZXNzYWdlIGZvciBzZW5kaW5nIGFuZCByZXR1cm5zIHRoZSBwcmVwYXJlZCBtZXNzYWdlXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgVGhlIG1lc3NhZ2UgdG8gYmUgc2VudCB0byB0aGlzLm90aGVyV2luZG93XG4gICAqIEByZXR1cm5zIFRoZSBwcmVwYXJlZCBtZXNzYWdlXG4gICAqL1xuICBwcml2YXRlIHByZXBhcmVNZXNzYWdlKG1zZzogTWVzc2FnZSk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgaWYgKCF0aGlzLm90aGVyV2luZG93IHx8ICF0aGlzLm90aGVyV2luZG93T3JpZ2luKSB7XG4gICAgICB0aHJvdyAnT3RoZXIgd2luZG93IG5vdCBpbml0aWFsaXplZCwgY2Fubm90IGRpc3BhdGNoIG1lc3NhZ2VzJztcbiAgICB9XG5cbiAgICBjb25zdCBwcmVwYXJlZE1lc3NhZ2UgPSBuZXcgQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZShtc2csIHRoaXMub3RoZXJXaW5kb3csIHRoaXMub3RoZXJXaW5kb3dPcmlnaW4pO1xuICAgIHJldHVybiBwcmVwYXJlZE1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkLiBEb2VzIHNvbWUgdmFsaWRhdGlvbiBvZiB0aGUgbWVzc2FnZSwgYW5kIHRoZW5cbiAgICogY2FsbHMgYW4gYXBwcm9wcmlhdGUgbWVzc2FnZSBoYW5kbGVyIGlmIG9uZSBpcyBkZWZpbmVkXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCBUaGUgaW5jb21pbmcgTWVzc2FnZUV2ZW50XG4gICAqL1xuICBwcml2YXRlIG9uTWVzc2FnZVJlY2VpdmVkKGV2ZW50OiBNZXNzYWdlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGFuIG90aGVyV2luZG93IGRlZmluZWQsIG1ha2Ugc3VyZSB0aGUgbWVzc2FnZSBpcyBjb21pbmcgZnJvbSB0aGVyZVxuICAgIGlmICh0aGlzLm90aGVyV2luZG93ICYmIGV2ZW50LnNvdXJjZSAhPT0gdGhpcy5vdGhlcldpbmRvdykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERvIHNvbWUgdmFsaWRhdGlvbiBvbiBldmVudC5kYXRhIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgcmVjZWl2ZWQgYSByZWFsIG1lc3NhZ2VcbiAgICBpZiAoIWV2ZW50LmRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gZXZlbnQuZGF0YTtcbiAgICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHRoZSBkZWNsYXJlZCBtZXNzYWdlIHR5cGUsIHZhbGlkYXRlIHRoZSBtZXNzYWdlLCBhbmQgY2FsbCBhbiBhcHByb3ByaWF0ZSBoYW5kZXIgaWYgb25lIGV4aXN0c1xuICAgIHN3aXRjaCAobWVzc2FnZS5tc2dUeXBlKSB7XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLkluaXRpYWxpemU6IHtcbiAgICAgICAgaWYgKCFpc0luaXRNZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLmluaXRpYWxpemVNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2U6IHtcbiAgICAgICAgaWYgKCFpc0NvbW1hbmRSZXNwb25zZU1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMuY29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Db21tYW5kOiB7XG4gICAgICAgIGlmICghaXNDb21tYW5kTWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5jb21tYW5kTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbW1hbmRNZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uOiB7XG4gICAgICAgIGlmICghaXNOb3RpZmljYXRpb25NZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLm5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuSGFuZHNoYWtlOiB7XG4gICAgICAgIGlmICghaXNIYW5kc2hha2VNZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLmhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kc2hha2VNZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAvLyBKdXN0IGlnbm9yZSB0aGlzIHNpbmNlIHdlIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0aGUgbWVzc2FnZSB0eXBlXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldE90aGVyV2luZG93KG90aGVyV2luZG93OiBXaW5kb3cpOiB2b2lkIHtcbiAgICB0aGlzLm90aGVyV2luZG93ID0gb3RoZXJXaW5kb3c7XG4gIH1cblxuICBwdWJsaWMgc2V0T3RoZXJXaW5kb3dPcmlnaW4ob3JpZ2luOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm90aGVyV2luZG93T3JpZ2luID0gb3JpZ2luO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcbmltcG9ydCB7IFByZXBhcmVkTWVzc2FnZSB9IGZyb20gJy4vaW50ZXJmYWNlL1ByZXBhcmVkTWVzc2FnZSc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFByZXBhcmVkTWVzc2FnZSBpbnRlcmZhY2UgdXNlZCB0byBwb3N0IG1lc3NhZ2VzIGJldHdlZW5cbiAqIHR3byBmcmFtZXMgdXNpbmcgd2luZG93LnBvc3RNZXNzYWdlXG4gKi9cbmV4cG9ydCBjbGFzcyBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlIGltcGxlbWVudHMgUHJlcGFyZWRNZXNzYWdlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZS5cbiAgICogQHBhcmFtIF9tZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGJlIHNlbnRcbiAgICogQHBhcmFtIF90YXJnZXQgVGhlIHRhcmdldCB3aW5kb3cgd2hlcmUgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBzZW50XG4gICAqIEBwYXJhbSBfb3JpZ2luIFRoZSB0YXJnZXRPcmlnaW4gd2hlcmUgdGhpcyBtZXNzYWdlIGNhbiBiZSByZWNlaXZlZFxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX21lc3NhZ2U6IE1lc3NhZ2UsIHByaXZhdGUgX3RhcmdldDogV2luZG93LCBwcml2YXRlIF9vcmlnaW46IHN0cmluZykge31cblxuICBwdWJsaWMgZ2V0IG1lc3NhZ2VHdWlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2UubXNnR3VpZDtcbiAgfVxuXG4gIHB1YmxpYyBzZW5kKCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgdGhpcy5fdGFyZ2V0LnBvc3RNZXNzYWdlKHRoaXMuX21lc3NhZ2UsIHRoaXMuX29yaWdpbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIGd1aWQgZnJvbSAnZ3VpZCc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25JZCB9IGZyb20gJy4uL2NvbnRyYWN0L05vdGlmaWNhdGlvbnMnO1xuaW1wb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uL2ludGVyZmFjZS9WZXJzaW9uTnVtYmVyJztcbmltcG9ydCB7XG4gIENvbW1hbmRNZXNzYWdlLFxuICBDb21tYW5kUmVzcG9uc2VNZXNzYWdlLFxuICBIYW5kc2hha2VNZXNzYWdlLFxuICBJbml0aWFsaXplTWVzc2FnZSxcbiAgTWVzc2FnZSxcbiAgTWVzc2FnZVR5cGUsXG4gIE5vdGlmaWNhdGlvbk1lc3NhZ2UsXG59IGZyb20gJy4vaW50ZXJmYWNlL01lc3NhZ2VUeXBlcyc7XG5cbmNvbnN0IGV4cGVjdGVkRW1wdHlOb3RpZmljYXRpb25zID0gbmV3IFNldChbXG4gIE5vdGlmaWNhdGlvbklkLkVkaXRCdXR0b25DbGlja2VkLFxuICBOb3RpZmljYXRpb25JZC5FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZCxcbiAgTm90aWZpY2F0aW9uSWQuV29ya2Jvb2tQdWJsaXNoZWQsXG4gIE5vdGlmaWNhdGlvbklkLldvcmtib29rUmVhZHlUb0Nsb3NlLFxuICBOb3RpZmljYXRpb25JZC5SZWFkeVRvUmVjZWl2ZUF1dGhUb2tlbixcbl0pO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZSBuby1hbnkgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01lc3NhZ2UoZGF0YTogTWVzc2FnZSB8IGFueSk6IGRhdGEgaXMgTWVzc2FnZSB7XG4gIGlmICghZGF0YSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSBkYXRhIGFzIE1lc3NhZ2U7XG4gIGlmICghbWVzc2FnZSB8fCAhbWVzc2FnZS5tc2dHdWlkIHx8ICFtZXNzYWdlLm1zZ1R5cGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWd1aWQuaXNHdWlkKG1lc3NhZ2UubXNnR3VpZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIG1lc3NhZ2UubXNnVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtZXNzYWdlVHlwZXM6IEFycmF5PHN0cmluZz4gPSBbXG4gICAgTWVzc2FnZVR5cGUuQ29tbWFuZCxcbiAgICBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2UsXG4gICAgTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZSxcbiAgICBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb24sXG4gICAgTWVzc2FnZVR5cGUuSGFuZHNoYWtlLFxuICBdO1xuXG4gIGlmIChtZXNzYWdlVHlwZXMuaW5kZXhPZihtZXNzYWdlLm1zZ1R5cGUpIDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWZXJzaW9uKHZlcnNpb25OdW1iZXI6IFZlcnNpb25OdW1iZXIgfCBhbnkpOiB2ZXJzaW9uTnVtYmVyIGlzIFZlcnNpb25OdW1iZXIge1xuICBpZiAoIXZlcnNpb25OdW1iZXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB2ID0gdmVyc2lvbk51bWJlciBhcyBWZXJzaW9uTnVtYmVyO1xuXG4gIGlmICh0eXBlb2YgdiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIHYuZml4ICE9PSAnbnVtYmVyJyB8fCB0eXBlb2Ygdi5taW5vciAhPT0gJ251bWJlcicgfHwgdHlwZW9mIHYubWFqb3IgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0luaXRNZXNzYWdlKG1lc3NhZ2U6IEluaXRpYWxpemVNZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBJbml0aWFsaXplTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaW5pdE1lc3NhZ2UgPSBtZXNzYWdlIGFzIEluaXRpYWxpemVNZXNzYWdlO1xuICBpZiAoaW5pdE1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaW5pdE1lc3NhZ2UuYXBpVmVyc2lvbiB8fCAhaXNWZXJzaW9uKGluaXRNZXNzYWdlLmFwaVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFpbml0TWVzc2FnZS5jcm9zc0ZyYW1lVmVyc2lvbiB8fCAhaXNWZXJzaW9uKGluaXRNZXNzYWdlLmNyb3NzRnJhbWVWZXJzaW9uKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21tYW5kUmVzcG9uc2VNZXNzYWdlKG1lc3NhZ2U6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIENvbW1hbmRSZXNwb25zZU1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNyTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZTtcbiAgaWYgKGNyTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWd1aWQuaXNHdWlkKGNyTWVzc2FnZS5jb21tYW5kR3VpZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWNyTWVzc2FnZS5kYXRhICYmICFjck1lc3NhZ2UuZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tbWFuZE1lc3NhZ2UobWVzc2FnZTogQ29tbWFuZE1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIENvbW1hbmRNZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBjb21tYW5kTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ29tbWFuZE1lc3NhZ2U7XG4gIGlmIChjb21tYW5kTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Db21tYW5kKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFjb21tYW5kTWVzc2FnZS5wYXJhbWV0ZXJzIHx8IHR5cGVvZiBjb21tYW5kTWVzc2FnZS5wYXJhbWV0ZXJzICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghY29tbWFuZE1lc3NhZ2UudmVyYklkIHx8IHR5cGVvZiBjb21tYW5kTWVzc2FnZS52ZXJiSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05vdGlmaWNhdGlvbk1lc3NhZ2UobWVzc2FnZTogTm90aWZpY2F0aW9uTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgTm90aWZpY2F0aW9uTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZSA9IG1lc3NhZ2UgYXMgTm90aWZpY2F0aW9uTWVzc2FnZTtcbiAgaWYgKG5vdGlmaWNhdGlvbk1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFub3RpZmljYXRpb25NZXNzYWdlLmRhdGEgJiYgIWV4cGVjdGVkRW1wdHlOb3RpZmljYXRpb25zLmhhcyhub3RpZmljYXRpb25NZXNzYWdlLm5vdGlmaWNhdGlvbklkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCB8fCB0eXBlb2Ygbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSGFuZHNoYWtlTWVzc2FnZShtZXNzYWdlOiBIYW5kc2hha2VNZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBIYW5kc2hha2VNZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBoYW5kc2hha2VNZXNzYWdlID0gbWVzc2FnZSBhcyBIYW5kc2hha2VNZXNzYWdlO1xuICBpZiAoaGFuZHNoYWtlTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5IYW5kc2hha2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBNb2RlbCwgTm90aWZpY2F0aW9uSWQsIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvbk9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2UvSW5pdGlhbGl6YXRpb25PcHRpb25zJztcblxuLyoqXG4gKiBFbnVtIGRlZmluaW5nIHRoZSA0IGRpZmZlcmVudCB0eXBlcyBvZiBtZXNzYWdlcyB3ZSBoYXZlIGRlZmluZWRcbiAqL1xuZXhwb3J0IGVudW0gTWVzc2FnZVR5cGUge1xuICBJbml0aWFsaXplID0gJ2luaXRpYWxpemUnLFxuICBOb3RpZmljYXRpb24gPSAnbm90aWZpY2F0aW9uJyxcbiAgQ29tbWFuZCA9ICdjb21tYW5kJyxcbiAgQ29tbWFuZFJlc3BvbnNlID0gJ2NvbW1hbmQtcmVzcG9uc2UnLFxuICBIYW5kc2hha2UgPSAndi1oYW5kc2hha2UnLFxuICBBY2sgPSAndi1hY2snLFxufVxuXG4vKipcbiAqIFRoZSBNZXNzYWdlIGludGVyZmFjZSBpcyB0aGUgYmFzZSBpbnRlcmZhY2UgZm9yIGFsbCB0aGUgb3RoZXJcbiAqIG1lc3NhZ2UgdHlwZSBpbnRlcmZhY2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICAvKipcbiAgICogQSB1bmlxdWUgaWQgZm9yIHRoaXMgbWVzc2FnZVxuICAgKi9cbiAgbXNnR3VpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGlzIG1lc3NhZ2VcbiAgICovXG4gIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlO1xufVxuXG4vKipcbiAqIFRoZSBpbml0aWFsaXplIG1lc3NhZ2UgaXMgdGhlIGZpcnN0IG1lc3NhZ2Ugd2hpY2ggd2lsbCBiZSBzZW50XG4gKiBmcm9tIHRoZSBqYXZhc2NyaXB0IHRvIHNldCB1cCBjb21tdW5pY2F0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluaXRpYWxpemVNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgYXBpIHdoaWNoIHRoZSBzZW5kZXIgd2FudHMgdG8gdXNlXG4gICAqL1xuICBhcGlWZXJzaW9uOiBWZXJzaW9uTnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGlzIG1lc3NhZ2luZyBjb250cmFjdCB0byBiZSB1c2VkLiBGb3Igbm93LCB0aGVyZVxuICAgKiBzaG91bGQgb25seSBiZSBhIHNpbmdsZSB2ZXJzaW9uIGJ1dCBzZW5kaW5nIHRoaXMgYWxvbmcgc2hvdWxkIGhlbHBcbiAgICogaWYgd2UgbmVlZCB0byBhZGQgYSBuZXcgdmVyc2lvbiBpbiBhIGZ1dHVyZSByZWxlYXNlXG4gICAqL1xuICBjcm9zc0ZyYW1lVmVyc2lvbjogVmVyc2lvbk51bWJlcjtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBvcHRpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCBhdCB0aGUgdGltZSBvZiBpbml0aWFsaXphdGlvblxuICAgKi9cbiAgb3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucztcbn1cblxuLyoqXG4gKiBUaGlzIG1lc3NhZ2UgaXMgc2VudCB3aGVuIGEgbm90aWZpY2F0aW9uIG9jY3VycyBmcm9tIHRoZSBwcmVzbGF5ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb3RpZmljYXRpb25NZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgaWQgZm9yIHRoaXMgdHlwZSBvZiBub3RpZmljYXRpb25cbiAgICovXG4gIG5vdGlmaWNhdGlvbklkOiBOb3RpZmljYXRpb25JZDtcblxuICAvKipcbiAgICogVGhlIGRhdGEgd2hpY2ggY2FtZSBhbG9uZyB3aXRoIHRoZSBub3RpZmljYXRpb25cbiAgICovXG4gIGRhdGE6IE1vZGVsO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgY2FsbGluZyBhbiBpbnRlcm5hbCBjb250cmFjdCBjb21tYW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgY29tbWFuZCB3aGljaCBzaG91bGQgYmUgZXhlY3V0ZWRcbiAgICovXG4gIHZlcmJJZDogVmVyYklkO1xuXG4gIC8qKlxuICAgKiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGNvbW1hbmRcbiAgICovXG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzO1xufVxuXG4vKipcbiAqIFRoaXMgbWVzc2FnZSBpcyBzZW50IGluIHJlc3BvbnNlIHRvIGEgQ29tbWFuZE1lc3NhZ2Ugd2l0aCB0aGVcbiAqIHJlc3VsdCBvZiB0aGF0IGNvbW1hbmRzIGludm9jYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kUmVzcG9uc2VNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBHdWlkIG9mIHRoZSBDb21tYW5kTWVzc2FnZSB3aGljaCB0aGlzIGlzIGluIHJlc3BvbnNlIHRvXG4gICAqL1xuICBjb21tYW5kR3VpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmV0dXJuZWQgZnJvbSB0aGUgY29tbWFuZCwgdGhpcyB3aWxsIGJlIGRlZmluZWRcbiAgICogYW5kIGNvbnRhaW4gdGhlIGVycm9yXG4gICAqL1xuICBlcnJvcj86IE1vZGVsO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgY29tbWFuZCBleGVjdXRlZCBzdWNjZXNzZnVsbHksIHRoaXMgd2lsbCBjb250YWluIHRoZSBjb21tYW5kIHJlc3VsdFxuICAgKi9cbiAgZGF0YT86IE1vZGVsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRzaGFrZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIEludGVybmFsIEFQSSBjb250cmFjdCB2ZXJzaW9uXG4gICAqL1xuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXI7XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcblxuLyoqXG4gKiBUaGlzIHZlcnNpb24gY29udmVydGVyIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgYnV0IGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIHdlIGhhdmVcbiAqIGEgbWF0Y2hpbmcgcGxhdGZvcm0gYW5kIGludGVybmFsIHZlcnNpb24gbnVtYmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZUNhbGwodmVyYjogYW55LCBwYXJhbWV0ZXJzOiBhbnkpOiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcmI6IHZlcmIgYXMgVmVyYklkLFxuICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycyBhcyBFeGVjdXRlUGFyYW1ldGVycyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVSZXR1cm4oZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICBwdWJsaWMgZG93bmdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICByZXR1cm4gbm90aWZpY2F0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0ICogYXMgVHJhbnNsYXRpb25zIGZyb20gJy4vVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIGNvbnZlcnRlciBpcyBkZXNpZ25lZCB0byBhbGxvdyB0aGUgcGxhdGZvcm0gYW5kIGV4dGVybmFsIG1vZHVsZXNcbiAqIHRvIHNlZW1sZXNzbHkgY29tbXVuaWNhdGUgb3ZlciB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBpbnRlcm5hbCBBUEkuIFRoZSBvbmx5XG4gKiBtb2RlIGl0IHN1cHBvcnRzIGlzIGV4dGVybmFsJ3MgdmVyc2lvbiA8PSBwbGF0Zm9ybSdzIHZlcnNpb24uIFdoZW4gZXhlY3V0aW5nXG4gKiBjb21tYW5kcywgaXQgaXMgdXNlZCB0byB1cGdyYWRlIHRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbiB0byB3aGF0IHBsYXRmb3JtIGtub3dzIG9uIHRoZSB3YXkgaW5cbiAqIGFuZCBkb3duZ3JhZGUgdGhlIHJlcHJlc2VudGF0aW9ucyBvbiB0aGUgd2F5IG91dC4gU2ltaWxhcmx5IGZvciBub3RpZmljYXRpb25zLCBpdCBjYW5cbiAqIGRvd25ncmFkZSB0aG9zZSBvbiB0aGUgd2F5IGZyb20gcGxhdGZvcm0gdG8gZXh0ZXJuYWwuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXJcbiAgICpcbiAgICogQHBhcmFtIF9leHRlcm5hbFZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IGFwaS1leHRlcm5hbC1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3BsYXRmb3JtVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdGhlIGFwaS1wbGF0Zm9ybS1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3VwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB0aGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gd2hlbiB1cGdyYWRpbmcgY21kIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiBkb3duZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gYWZ0ZXIgYSBjbWRcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIGRvd25ncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBvbiBhIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRGF0YShcbiAgICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHVwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPixcbiAgICBkb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4sXG4gICAgZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPixcbiAgKTogU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIHtcbiAgICByZXR1cm4gbmV3IHRoaXMoXG4gICAgICBleHRlcm5hbFZlcnNpb24ubWFqb3IsXG4gICAgICBwbGF0Zm9ybVZlcnNpb24ubWFqb3IsXG4gICAgICB1cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyxcbiAgICAgIGRvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMsXG4gICAgICBkb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXJcbiAgICpcbiAgICogQHBhcmFtIF9leHRlcm5hbE1ham9yVmVyc2lvbiBUaGUgbWFqb3IgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgYXBpLWV4dGVybmFsLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfcGxhdGZvcm1NYWpvclZlcnNpb24gVGhlIG1ham9yIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHRoZSBhcGktcGxhdGZvcm0tanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF91cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdGhlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIHdoZW4gdXBncmFkaW5nIGNtZCBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBfZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgZG93bmdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGFmdGVyIGEgY21kXG4gICAqIEBwYXJhbSBfZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiBkb3duZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gb24gYSBub3RpZmljYXRpb25cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9leHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyLFxuICAgIHByaXZhdGUgX3BsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+LFxuICAgIHByaXZhdGUgX2Rvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgICBwcml2YXRlIF9kb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+LFxuICApIHtcbiAgICBpZiAodGhpcy5fZXh0ZXJuYWxNYWpvclZlcnNpb24gPiB0aGlzLl9wbGF0Zm9ybU1ham9yVmVyc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCBiZXR3ZWVuIGV4dGVybmFsIHZlcnNpb24gJHt0aGlzLl9leHRlcm5hbE1ham9yVmVyc2lvbn0gYW5kICR7dGhpcy5fcGxhdGZvcm1NYWpvclZlcnNpb259YCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiOiBhbnksIHBhcmFtZXRlcnM6IGFueSk6IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyB9IHtcbiAgICAvLyBQZXJmb3JtIHRoZSB1cGdyYWRlIG9mIHRoZSB2ZXJiIGFuZCBwYXJhbWV0ZXJzIHRvIHRoZSBsZXZlbCB0aGF0IHBsYXRmb3JtIGlzIHVzaW5nXG4gICAgbGV0IHVwZ3JhZGVkID0geyB2ZXJiOiB2ZXJiLCBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIH07XG4gICAgZm9yIChjb25zdCB1cGdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMpIHtcbiAgICAgIHVwZ3JhZGVkID0gdXBncmFkZVRyYW5zbGF0aW9uKHVwZ3JhZGVkLnZlcmIsIHVwZ3JhZGVkLnBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVFeGVjdXRlUmV0dXJuKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgICAvLyBEb3duZ3JhZGUgdGhlIHJlc3BvbnNlIHRvIHdoYXQgdGhlIGV4dGVybmFsIG1vZHVsZSBpcyBleHBlY3RpbmdcbiAgICBsZXQgZG93bmdyYWRlZCA9IGV4ZWN1dGVSZXNwb25zZTtcbiAgICBmb3IgKGNvbnN0IGRvd25ncmFkZVRyYW5zbGF0aW9uIG9mIHRoaXMuX2Rvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMpIHtcbiAgICAgIGRvd25ncmFkZWQgPSBkb3duZ3JhZGVUcmFuc2xhdGlvbihkb3duZ3JhZGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG93bmdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAgIC8vIERvd25ncmFkZSB0aGUgbm90aWZpY2F0aW9uIHRvIHdoYXQgdGhlIGV4dGVybmFsIG1vZHVsZSBpcyBleHBlY3RpbmdcbiAgICBsZXQgZG93bmdyYWRlZCA9IG5vdGlmaWNhdGlvbjtcbiAgICBmb3IgKGNvbnN0IGRvd25ncmFkZVRyYW5zbGF0aW9uIG9mIHRoaXMuX2Rvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucykge1xuICAgICAgZG93bmdyYWRlZCA9IGRvd25ncmFkZVRyYW5zbGF0aW9uKGRvd25ncmFkZWQpO1xuICAgIH1cblxuICAgIHJldHVybiBkb3duZ3JhZGVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9JbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL1N0YWNraW5nVmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnMgZnJvbSAnLi9WZXJzaW9uVHJhbnNsYXRpb25zJztcbmltcG9ydCB7XG4gIERvd25ncmFkZUV4dGVuc2lvbkVudmlyb25tZW50Q29udGV4dCxcbiAgRG93bmdyYWRlRmxpcGJvYXJkWm9uZUlELFxuICBEb3duZ3JhZGVXb3Jrc2hlZXRGb21hdHRpbmcxNzUsXG4gIERvd25ncmFkZVdvcmtzaGVldEZvbWF0dGluZ05vdGlmaWNhdGlvbjE3NSxcbiAgRG93bmdyYWRlV29ya3NoZWV0TmFtZXMsXG59IGZyb20gJy4vVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5cbi8qKlxuICogQHJldHVybnMgdHJ1ZSBpZiBsaHMgPCByaHMgKGlnbm9yaW5nIGZpeCBudW1iZXIpXG4gKiBAcGFyYW0gbGhzXG4gKiBAcGFyYW0gcmhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBWZXJzaW9uTGVzc1RoYW4obGhzOiBWZXJzaW9uTnVtYmVyLCByaHM6IFZlcnNpb25OdW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKGxocy5tYWpvciA+IHJocy5tYWpvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobGhzLm1ham9yIDwgcmhzLm1ham9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGxocy5taW5vciA8IHJocy5taW5vcjtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB0cnVlIGlmIGxocyA9PSByaHMgKGlnbm9yaW5nIGZpeCBudW1iZXIpXG4gKiBAcGFyYW0gbGhzXG4gKiBAcGFyYW0gcmhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBWZXJzaW9uRXF1YWxUbyhsaHM6IFZlcnNpb25OdW1iZXIsIHJoczogVmVyc2lvbk51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gbGhzLm1ham9yID09PSByaHMubWFqb3IgJiYgbGhzLm1pbm9yID09PSByaHMubWlub3I7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFqb3JNaW5vclRyYW5zbGF0b3JzPFQ+IHtcbiAgW21ham9yOiBudW1iZXJdOiB7IFttaW5vcjogbnVtYmVyXTogQXJyYXk8VD4gfTtcbn1cblxuLy8gQSBtYXBwaW5nIGZyb20gYW4gb2xkZXIgY2xpZW50IHZlcnNpb24gb2YgaW50ZXJuYWwtY29udHJhY3QgdG8gdGhlIGN1cnJlbnQgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGlzIGNvbnRyYWN0LlxuLy8gRWFjaCB2ZXJzaW9uIGJ1bXAgY2FuIGhhdmUgYW4gYXJyYXkgb2YgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gaW4gb3JkZXIuIE5vdGljZSB0aGF0IHRoaXMgaXNcbi8vIGRpZmZlcmVudCB0aGFuIHRoZSBtYWpvciB1cGdyYWRlcy9kb3duZ3JhZGVzIGFib3ZlIGJlY2F1c2UgaXQgaGFuZGxlcyBib3RoIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIGNoYW5nZXMuXG4vLyBBbHNvIHBsZWFzZSBub3RlOiBkb3duZ3JhZGVFeGVjdXRlQ2FsbCBpcyBoYW5kbGVkIG9uIHRoZSBjbGllbnQvZXh0ZXJuYWwgc2lkZSByYXRoZXIgdGhhbiBwbGF0Zm9ybSBzaWRlLlxuLy8gV2hlbiB1cGRhdGluZyB0aGUgbWFqb3Igb3IgbWlub3IgdmVyc2lvbiBvZiBvdXIgaW50ZXJuYWwtY29udHJhY3QsIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHRoZXNlIGRhdGEgc3RydWN0dXJlcy5cbi8vICogSWYgdGhlcmUgYXJlIHRyYW5zbGF0aW9ucyB0byBhZGQsIGFkZCB0aGVtIHRvIHRoZSB2ZXJzaW9uIHRvIFwidXBncmFkZSBmcm9tXCIgb3IgXCJkb3duZ3JhZGUgdG9cIi5cbmV4cG9ydCBjb25zdCBFeGVjdXRlTWlub3JVcGdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vckRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4gPSB7XG4gIDE6IHtcbiAgICA1OiBbRG93bmdyYWRlV29ya3NoZWV0TmFtZXNdLFxuICAgIDk6IFtdLFxuICAgIDE3NTogW0Rvd25ncmFkZVdvcmtzaGVldEZvbWF0dGluZzE3NV0sXG4gICAgMTgyOiBbRG93bmdyYWRlRXh0ZW5zaW9uRW52aXJvbm1lbnRDb250ZXh0XSxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBOb3RpZmljYXRpb25NaW5vckRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLFxuICAgIDEwOiBbRG93bmdyYWRlRmxpcGJvYXJkWm9uZUlEXSxcbiAgICAxNzU6IFtEb3duZ3JhZGVXb3Jrc2hlZXRGb21hdHRpbmdOb3RpZmljYXRpb24xNzVdLFxuICB9LFxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHdoaWNoIGhhcyB0aGUgYWJpbGl0eSB0byB1cGdyYWRlIGFuZCBkb3duZ3JhZGUgdGhlIGNvbnRyYWN0XG4gKiBiZXR3ZWVuIHRoZSB0d28gdmVyc2lvbnMsIHdoaWNoIGFyZSBzcGVjaWZpZWQuIElmIGV4dGVybmFsTWFqb3JWZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAqIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGJlY2F1c2Ugd2Ugd29uJ3Qga25vdyBob3cgdG8gZG8gdGhvc2UgY29udmVyc2lvbnMuXG4gKiBUaGlzIGNvbnZlcnRlciBjYW4gaGFuZGxlIGJvdGggbWFqb3IgYW5kIG1pbm9yIHVwZGF0ZXMgd2hlbiB0aGUgcGxhdGZvcm0gdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gZXh0ZXJuYWwgdmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gZXh0ZXJuYWxWZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIHVzaW5nXG4gKiBAcGFyYW0gcGxhdGZvcm1WZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVZlcnNpb25Db252ZXJ0ZXIoZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLCBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIpOiBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHJldHVybiBDcmVhdGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgRXhlY3V0ZU1pbm9yVXBncmFkZXMsXG4gICAgRXhlY3V0ZU1pbm9yRG93bmdyYWRlcyxcbiAgICBOb3RpZmljYXRpb25NaW5vckRvd25ncmFkZXMsXG4gICk7XG59XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgQ3JlYXRlVmVyc2lvbkNvbnZlcnRlci4gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgdXBncmFkZSwgZG93bmdyYWRlLCBhbmRcbiAqIG5vdGlmaWNhdGlvbiBhcnJheXMgc28gdGhhdCBhbGwgdGhlIGxvZ2ljIGNhbiBiZSB0ZXN0ZWQuXG4gKlxuICogQHBhcmFtIGV4dGVybmFsVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIHBsYXRmb3JtIGlzIHVzaW5nXG4gKiBAcGFyYW0gdXBncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciB1cGdyYWRlc1xuICogQHBhcmFtIGRvd25ncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciBkb3duZ3JhZGVzXG4gKiBAcGFyYW0gbm90aWZpY2F0aW9uRG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIG5vdGlmaWNhdGlvbiBkb3duZ3JhZGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgdXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPixcbiAgZG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgbm90aWZpY2F0aW9uRG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+LFxuKTogSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICBjb25zdCBleHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyID0gZXh0ZXJuYWxWZXJzaW9uLm1ham9yO1xuICBjb25zdCBleHRlcm5hbE1pbm9yVmVyc2lvbjogbnVtYmVyID0gZXh0ZXJuYWxWZXJzaW9uLm1pbm9yO1xuICBjb25zdCBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyID0gcGxhdGZvcm1WZXJzaW9uLm1ham9yO1xuXG4gIGlmIChleHRlcm5hbE1ham9yVmVyc2lvbiA+IHBsYXRmb3JtTWFqb3JWZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHRlcm5hbCB2ZXJzaW9uIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHBsYXRmb3JtIHZlcnNpb24uXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb249JHtleHRlcm5hbE1ham9yVmVyc2lvbn0gcGxhdGZvcm1NYWpvclZlcnNpb249JHtwbGF0Zm9ybU1ham9yVmVyc2lvbn1gKTtcbiAgfVxuXG4gIC8vIElmIHdlIGFyZSB1c2luZyB0aGUgZXhhY3Qgc2FtZSB2ZXJzaW9ucyAobWFqb3IubWlub3IpLCBqdXN0IHVzZSB0aGUgaWRlbnRpdHkgY29udmVydGVyXG4gIGlmIChWZXJzaW9uRXF1YWxUbyhleHRlcm5hbFZlcnNpb24sIHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcigpO1xuICB9XG5cbiAgLy8gV2FsayB0aGUgc3BhbiBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyB3ZSBoYXZlIGhlcmUgYW5kIGNvbGxlY3QgdGhlIHVwZ3JhZGUgYW5kIGRvd25ncmFkZXMgbmVjZXNzYXJ5XG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVVcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4gPSBHZXROZWVkZWRUcmFuc2xhdGlvbnMoXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgZXh0ZXJuYWxNaW5vclZlcnNpb24sXG4gICAgdXBncmFkZXMsXG4gICk7XG5cbiAgY29uc3QgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPiA9IEdldE5lZWRlZFRyYW5zbGF0aW9ucyhcbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBleHRlcm5hbE1pbm9yVmVyc2lvbixcbiAgICBkb3duZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+ID0gR2V0TmVlZGVkVHJhbnNsYXRpb25zKFxuICAgIGV4dGVybmFsTWFqb3JWZXJzaW9uLFxuICAgIHBsYXRmb3JtTWFqb3JWZXJzaW9uLFxuICAgIGV4dGVybmFsTWlub3JWZXJzaW9uLFxuICAgIG5vdGlmaWNhdGlvbkRvd25ncmFkZXMsXG4gICk7XG5cbiAgLy8gV2Ugd2FudCB0byBhcHBseSB0aGUgZG93bmdyYWRlcyBpbiByZXZlcnNlIG9yZGVyIGluIGNhc2Ugb2YgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlbVxuICBuZWVkZWRFeGVjdXRlRG93bmdyYWRlcy5yZXZlcnNlKCk7XG4gIG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXMucmV2ZXJzZSgpO1xuXG4gIHJldHVybiBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIuZnJvbURhdGEoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBuZWVkZWRFeGVjdXRlVXBncmFkZXMsXG4gICAgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXMsXG4gICAgbmVlZGVkTm90aWZpY2F0aW9uRG93bmdyYWRlcyxcbiAgKTtcbn1cblxuZnVuY3Rpb24gR2V0TmVlZGVkVHJhbnNsYXRpb25zPFQ+KFxuICBleHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBleHRlcm5hbE1pbm9yVmVyc2lvbjogbnVtYmVyLFxuICBtYWpvck1pbm9yVHJhbnNsYXRvcnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUPixcbik6IEFycmF5PFQ+IHtcbiAgY29uc3QgbmVlZGVkVHJhbnNsYXRpb25zOiBBcnJheTxUPiA9IFtdO1xuXG4gIGZvciAobGV0IG1ham9yID0gZXh0ZXJuYWxNYWpvclZlcnNpb247IG1ham9yIDw9IHBsYXRmb3JtTWFqb3JWZXJzaW9uOyBtYWpvcisrKSB7XG4gICAgaWYgKG1ham9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9ycykge1xuICAgICAgY29uc3Qgc3RhcnQgPSBtYWpvciA9PT0gZXh0ZXJuYWxNYWpvclZlcnNpb24gPyBleHRlcm5hbE1pbm9yVmVyc2lvbiA6IDA7XG4gICAgICBjb25zdCBtYXhpbXVtTWlub3JWZXJzaW9uID0gR2V0TWF4aW11bU1pbm9ySW5kZXgoT2JqZWN0LmtleXMobWFqb3JNaW5vclRyYW5zbGF0b3JzW21ham9yXSkpO1xuICAgICAgZm9yIChsZXQgbWlub3IgPSBzdGFydDsgbWlub3IgPD0gbWF4aW11bU1pbm9yVmVyc2lvbjsgbWlub3IrKykge1xuICAgICAgICBpZiAobWlub3IgaW4gbWFqb3JNaW5vclRyYW5zbGF0b3JzW21ham9yXSkge1xuICAgICAgICAgIG5lZWRlZFRyYW5zbGF0aW9ucy5wdXNoKC4uLm1ham9yTWlub3JUcmFuc2xhdG9yc1ttYWpvcl1bbWlub3JdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkZWRUcmFuc2xhdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBHZXRNYXhpbXVtTWlub3JJbmRleChtaW5vclZlcnNpb25zOiBBcnJheTxzdHJpbmc+KTogbnVtYmVyIHtcbiAgcmV0dXJuIG1pbm9yVmVyc2lvbnMubWFwKChhKSA9PiBOdW1iZXIoYSkpLnJlZHVjZSgoYSwgYikgPT4gKGEgPiBiID8gYSA6IGIpKTtcbn1cbiIsImltcG9ydCB7XG4gIENsYXNzTmFtZUtleSxcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4ZWN1dGVSZXNwb25zZSxcbiAgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbyxcbiAgRXh0ZW5zaW9uQ29udGV4dCxcbiAgTm90aWZpY2F0aW9uLFxuICBWZXJiSWQsXG59IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBWaXN1YWxJZCwgV29ya2Jvb2tGb3JtYXR0aW5nIH0gZnJvbSAnLi4vY29udHJhY3QvTW9kZWxzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnLi4vY29udHJhY3QvTm90aWZpY2F0aW9ucyc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIG9sZCB2ZXJzIGFuZCBwYXJhbWV0ZXJzIGZyb20gdGhlIGV4dGVybmFsIGJlZm9yZSB3ZSBzZW5kIGl0IHRvIHBsYXRmb3JtICovXG5leHBvcnQgdHlwZSBVcGdyYWRlRXhlY3V0ZUNhbGwgPSAodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycykgPT4geyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH07XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmVkIGEgcmVzcG9uc2UgYmFjayBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbmV4cG9ydCB0eXBlIERvd25ncmFkZUV4ZWN1dGVSZXR1cm4gPSAoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+IEV4ZWN1dGVSZXNwb25zZTtcblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbmV4cG9ydCB0eXBlIERvd25ncmFkZU5vdGlmaWNhdGlvbiA9IChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikgPT4gTm90aWZpY2F0aW9uO1xuXG4vLyBUaGlzIGlzIHdoZXJlIHdlIHdpbGwgc3RhcnQgdG8gZGVmaW5lIHNvbWUgb2YgdGhlc2UgdHJhbnNsYXRpb25zLlxuLy8gV2hlbiBtb2RpZnlpbmcgZXhpc3RpbmcgbW9kZWxzLCBhZGQgdGhlIHJlcXVpc2l0ZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBoZXJlLCB0aGVuIHVzZSB0aGVtXG4vLyBpbiB0aGUgVmVyc2lvbkNvbnZlcnRlckZhY3RvcnkgaW1wbGVtZW50YXRpb24uIEltcG9ydCBvbGQgdmVyc2lvbnMgYXMgeW91IHdvdWxkIGFueSBvdGhlciBtb2R1bGVcblxuLy8gMCA8LT4gVHJhbnNsYXRpb25zXG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGltcG9ydCBmcm9tIHRoZSBWMCBkZWZpbml0aW9uIG9mIHRoZSBBUElcbi8vIGltcG9ydCAqIGFzIFYwIGZyb20gJ0B0YWJsZWF1LWFwaS1pbnRlcm5hbC1jb250cmFjdC1qc192MCc7XG5cbi8vIDEgPC0+IDIgVHJhbnNsYXRpb25zXG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGltcG9ydCBmcm9tIHRoZSBWMSBkZWZpbml0aW9uIG9mIHRoZSBBUElcbi8vIGltcG9ydCAqIGFzIFYxIGZyb20gJ0B0YWJsZWF1LWFwaS1pbnRlcm5hbC1jb250cmFjdC1qc192MSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVXb3Jrc2hlZXROYW1lcyhleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gIC8vIEZpeCB0aGUgZGFzaGJvYXJkIGZyaWVuZGx5IG5hbWUgaXNzdWUuIFRoZSBzdHJ1Y3R1cmVzIGFyZSBjb21wYXRpYmxlLFxuICAvLyBzbyB3ZSBzdGlsbCByZXR1cm4gdGhlIG9yaWdpbmFsIHJlcGx5LCBidXQgd2UgY29weSB0aGUgU2hlZXRJbmZvLm5hbWVcbiAgLy8gaW50byB0aGUgRGFzaGJvYXJkWm9uZS5uYW1lLCB3aGVyZSB2MSB3YW50cyB0byBmaW5kIGl0LlxuXG4gIGNvbnN0IGJvb3RzdHJhcEluZm8gPSBleGVjdXRlUmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkJvb3RzdHJhcEluZm87XG4gIGlmIChib290c3RyYXBJbmZvLmV4dGVuc2lvbkRhc2hib2FyZEluZm8gIT09IHVuZGVmaW5lZCkge1xuICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRGFzaGJvYXJkSW5mby56b25lcy5mb3JFYWNoKCh6b25lKSA9PiB7XG4gICAgICBpZiAoem9uZS5zaGVldEluZm8pIHtcbiAgICAgICAgem9uZS5uYW1lID0gem9uZS5zaGVldEluZm8ubmFtZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVGbGlwYm9hcmRab25lSUQobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAvLyBGaXggdGhlIEZsaXBib2FyZFpvbmVJZCBpc3N1ZS4gT2xkZXIgZXh0ZXJuYWwgdmVyc2lvbnMgc3RpbGwgY2hlY2sgZm9yIGZsaXBib2FyZFpvbmVJRHMuXG4gIC8vIFdoZW4gcnVubmluZyBhZ2FpbnN0IGEgbmV3ZXIgc2VydmVyLCBpZiBmbGlwYm9hcmRab25lSWQgaXMgYWJzZW50LCBzZXQgaXQgdG8gZGVmYXVsdCgwKS5cblxuICBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbklkID09PSBOb3RpZmljYXRpb25JZC5TZWxlY3RlZE1hcmtzQ2hhbmdlZCkge1xuICAgIGNvbnN0IHZpc3VhbE1vZGVsID0gbm90aWZpY2F0aW9uLmRhdGEgYXMgVmlzdWFsSWQ7XG4gICAgaWYgKHZpc3VhbE1vZGVsLmZsaXBib2FyZFpvbmVJRCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2aXN1YWxNb2RlbC5mbGlwYm9hcmRab25lSUQgPSAwO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub3RpZmljYXRpb247XG59XG5cbi8vIEZpbHRlciBvdXQgZm9ybWF0dGluZyBzaGVldHMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSBjbGFzc05hbWVzIGxpc3RcbmZ1bmN0aW9uIERvd25ncmFkZVdvcmtzaGVldEZvcm1hdHRpbmcoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIGNsYXNzTmFtZXM6IENsYXNzTmFtZUtleVtdKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgY29uc3QgYm9vdHN0cmFwSW5mbyA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbztcblxuICBpZiAoYm9vdHN0cmFwSW5mbz8uZXh0ZW5zaW9uV29ya3NoZWV0SW5mbz8uZm9ybWF0dGluZylcbiAgICBib290c3RyYXBJbmZvLmV4dGVuc2lvbldvcmtzaGVldEluZm8uZm9ybWF0dGluZy5mb3JtYXR0aW5nU2hlZXRzID1cbiAgICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uV29ya3NoZWV0SW5mby5mb3JtYXR0aW5nLmZvcm1hdHRpbmdTaGVldHMuZmlsdGVyKCh4KSA9PiAhY2xhc3NOYW1lcy5pbmNsdWRlcyh4LmNsYXNzTmFtZUtleSkpO1xuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG4vLyBGaWx0ZXIgb3V0IGZvcm1hdHRpbmcgc2hlZXRzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgY2xhc3NOYW1lcyBsaXN0XG4vLyBGaWx0ZXIgb3V0IGZvcm1hdHRpbmcgc2hlZXRzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgY2xhc3NOYW1lcyBsaXN0XG5mdW5jdGlvbiBEb3duZ3JhZGVXb3Jrc2hlZXRGb3JtYXR0aW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uLCBjbGFzc05hbWVzOiBDbGFzc05hbWVLZXlbXSk6IE5vdGlmaWNhdGlvbiB7XG4gIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWQgPT09IE5vdGlmaWNhdGlvbklkLldvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkKSB7XG4gICAgY29uc3QgZm9ybWF0dGluZyA9IG5vdGlmaWNhdGlvbi5kYXRhIGFzIFdvcmtib29rRm9ybWF0dGluZztcbiAgICBub3RpZmljYXRpb24uZGF0YSA9IGZvcm1hdHRpbmcuZm9ybWF0dGluZ1NoZWV0cy5maWx0ZXIoKHgpID0+ICFjbGFzc05hbWVzLmluY2x1ZGVzKHguY2xhc3NOYW1lS2V5KSk7XG4gIH1cblxuICByZXR1cm4gbm90aWZpY2F0aW9uO1xufVxuXG4vLyBXZSBhZGRlZCBuZXcgZW51bSB2YWx1ZXMgZm9yIENsYXNzTmFtZUtleXMgZW51bSBpbiAxNzYuIE5lZWQgdG8gZmlsdGVyIHRoZW0gb3V0IGlmIHRoZSBjbGllbnQgdmVyc2lvbiBpcyA8MTc2XG5jb25zdCBDbGFzc05hbWVLZXlzVG9GaWx0ZXIxNzUgPSBbQ2xhc3NOYW1lS2V5LlJvd0RpdmlkZXJzLCBDbGFzc05hbWVLZXkuQ29sdW1uRGl2aWRlcnMsIENsYXNzTmFtZUtleS5QYW5lXTtcblxuZXhwb3J0IGNvbnN0IERvd25ncmFkZVdvcmtzaGVldEZvbWF0dGluZzE3NSA9IChyZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKSA9PlxuICBEb3duZ3JhZGVXb3Jrc2hlZXRGb3JtYXR0aW5nKHJlc3BvbnNlLCBDbGFzc05hbWVLZXlzVG9GaWx0ZXIxNzUpO1xuZXhwb3J0IGNvbnN0IERvd25ncmFkZVdvcmtzaGVldEZvbWF0dGluZ05vdGlmaWNhdGlvbjE3NSA9IChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikgPT5cbiAgRG93bmdyYWRlV29ya3NoZWV0Rm9ybWF0dGluZ05vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIENsYXNzTmFtZUtleXNUb0ZpbHRlcjE3NSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVFeHRlbnNpb25FbnZpcm9ubWVudENvbnRleHQoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAvLyBGaXggdGhlIGV4dGVuc2lvbiBlbnZpcm9ubWVudCBjb250ZXh0IGlzc3VlLiBSZXBsYWNlcyBuZXcgZW51bSB2YWx1ZXMgdGhhdCBnbyB1bnJlY29nbml6ZWRcbiAgLy8gYnkgb2xkZXIgZXh0ZW5zaW9ucyB3aXRoIHRoZWlyIHJlc3BlY3RpdmUgb2xkZXIgZW51bSB2YWx1ZXMuXG4gIGNvbnN0IGJvb3RzdHJhcEluZm8gPSBleGVjdXRlUmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkJvb3RzdHJhcEluZm87XG5cbiAgaWYgKGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRW52aXJvbm1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBib290c3RyYXBJbmZvLmV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkNvbnRleHQ7XG4gICAgaWYgKGNvbnRleHQgPT09IEV4dGVuc2lvbkNvbnRleHQuUHVibGljV2ViIHx8IGNvbnRleHQgPT09IEV4dGVuc2lvbkNvbnRleHQuQ2xvdWQpIHtcbiAgICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uQ29udGV4dCA9IEV4dGVuc2lvbkNvbnRleHQuU2VydmVyO1xuICAgIH0gZWxzZSBpZiAoY29udGV4dCA9PT0gRXh0ZW5zaW9uQ29udGV4dC5QdWJsaWNEZXNrdG9wKSB7XG4gICAgICBib290c3RyYXBJbmZvLmV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkNvbnRleHQgPSBFeHRlbnNpb25Db250ZXh0LkRlc2t0b3A7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkIH0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKipcbiAqIFRoaXMgdmVyc2lvbiBjb252ZXJ0ZXIgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyBidXQgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIG9yIHdoZW4gd2UgaGF2ZVxuICogYSBtYXRjaGluZyBwbGF0Zm9ybSBhbmQgZXh0ZXJuYWwgdmVyc2lvbiBudW1iZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICBwdWJsaWMgZG93bmdyYWRlRXhlY3V0ZUNhbGwodmVyYjogYW55LCBwYXJhbWV0ZXJzOiBhbnkpOiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcmI6IHZlcmIgYXMgVmVyYklkLFxuICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycyBhcyBFeGVjdXRlUGFyYW1ldGVycyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVFeGVjdXRlUmV0dXJuKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCB2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAgIHJldHVybiBub3RpZmljYXRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkLCBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnMgZnJvbSAnLi9FeHRlcm5hbFZlcnNpb25UcmFuc2xhdGlvbnMnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcbi8qKlxuICogVGhlIHZlcnNpb24gY29udmVydGVyIGlzIGRlc2lnbmVkIHRvIGFsbG93IHRoZSBwbGF0Zm9ybSBhbmQgZXh0ZXJuYWwgbW9kdWxlc1xuICogdG8gc2VlbWxlc3NseSBjb21tdW5pY2F0ZSBvdmVyIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIGludGVybmFsIEFQSS4gVGhpcyBjb252ZXJ0ZXJcbiAqIHN1cHBvcnRzIGV4dGVybmFsJ3MgdmVyc2lvbihtaW5vcikgPj0gcGxhdGZvcm0ncyB2ZXJzaW9uKG1pbm9yKS4gV2hlbiBleGVjdXRpbmdcbiAqIGNvbW1hbmRzLCBpdCBpcyB1c2VkIHRvIGRvd25ncmFkZSB0aGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gdG8gd2hhdCBwbGF0Zm9ybSBrbm93cyBvbiB0aGUgd2F5IGluXG4gKiBhbmQgdXBncmFkZSB0aGUgcmVwcmVzZW50YXRpb25zIG9uIHRoZSB3YXkgb3V0LlxuICovXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXJcbiAgICpcbiAgICogQHBhcmFtIF9leHRlcm5hbFZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IGFwaS1leHRlcm5hbC1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3BsYXRmb3JtVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdGhlIGFwaS1wbGF0Zm9ybS1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX2Rvd25ncmFkZUV4ZWN1dGVDYWxsVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB0aGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gd2hlbiBkb3duZ3JhZGluZyBjbWQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gX3VwZ3JhZGVFeGVjdXRlUmV0dXJuVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB1cGdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGFmdGVyIGEgY21kIGlzIGV4ZWN1dGVkXG4gICAqIEBwYXJhbSBfdXBncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdXBncmFkZSBub3RmaWNhdGlvbnMgdG8gcGVyZm9ybSBvbiBldmVudHNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9leHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgcHJpdmF0ZSBfcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHByaXZhdGUgX2Rvd25ncmFkZUV4ZWN1dGVDYWxsVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZUNhbGw+LFxuICAgIHByaXZhdGUgX3VwZ3JhZGVFeGVjdXRlUmV0dXJuVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVSZXR1cm4+LFxuICAgIHByaXZhdGUgX3VwZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlTm90aWZpY2F0aW9uPixcbiAgKSB7XG4gICAgaWYgKHRoaXMuX2V4dGVybmFsVmVyc2lvbi5tYWpvciA+IHRoaXMuX3BsYXRmb3JtVmVyc2lvbi5tYWpvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCBiZXR3ZWVuIGV4dGVybmFsIHZlcnNpb24gJHt0aGlzLl9leHRlcm5hbFZlcnNpb24ubWFqb3J9XG4gICAgICBhbmQgJHt0aGlzLl9wbGF0Zm9ybVZlcnNpb24ubWFqb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH0ge1xuICAgIC8vIFBlcmZvcm0gdGhlIGRvd25ncmFkZSBvZiB0aGUgdmVyYiBhbmQgcGFyYW1ldGVycyB0byB0aGUgbGV2ZWwgdGhhdCBwbGF0Zm9ybSBpcyB1c2luZ1xuICAgIGxldCBkb3duZ3JhZGVkID0geyB2ZXJiOiB2ZXJiLCBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIH07XG4gICAgZm9yIChjb25zdCBkb3duZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl9kb3duZ3JhZGVFeGVjdXRlQ2FsbFRyYW5zbGF0aW9ucykge1xuICAgICAgZG93bmdyYWRlZCA9IGRvd25ncmFkZVRyYW5zbGF0aW9uKGRvd25ncmFkZWQudmVyYiwgZG93bmdyYWRlZC5wYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG93bmdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgdmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgLy8gUGVyZm9ybSB0aGUgdXBncmFkZSBvZiB0aGUgcmVzcG9uc2UgdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCB1cGdyYWRlZCA9IGV4ZWN1dGVSZXNwb25zZTtcbiAgICBmb3IgKGNvbnN0IHVwZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl91cGdyYWRlRXhlY3V0ZVJldHVyblRyYW5zbGF0aW9ucykge1xuICAgICAgdXBncmFkZWQgPSB1cGdyYWRlVHJhbnNsYXRpb24odXBncmFkZWQsIHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICAvLyBQZXJmb3JtIHRoZSB1cGdyYWRlIG9mIG5vdGlmaWNhdGlvbiB0byB3aGF0IHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgZXhwZWN0aW5nXG4gICAgbGV0IHVwZ3JhZGVkID0gbm90aWZpY2F0aW9uO1xuICAgIGZvciAoY29uc3QgdXBncmFkZU5vdGlmaWNhdGlvbiBvZiB0aGlzLl91cGdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zKSB7XG4gICAgICB1cGdyYWRlZCA9IHVwZ3JhZGVOb3RpZmljYXRpb24odXBncmFkZWQpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGdyYWRlZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBHZXRNYXhpbXVtTWlub3JJbmRleCwgTWFqb3JNaW5vclRyYW5zbGF0b3JzLCBWZXJzaW9uRXF1YWxUbyB9IGZyb20gJy4uL1ZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5JztcbmltcG9ydCB7IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0V4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9uc0V4dGVybmFsIGZyb20gJy4vRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gQSBtYXBwaW5nIGZyb20gdGhlIGN1cnJlbnQgY2xpZW50IHZlcnNpb24gb2YgaW50ZXJuYWwtY29udHJhY3QgdG8gYW4gb2xkZXIgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGUgY29udHJhY3QuXG4vLyBFYWNoIHZlcnNpb24gYnVtcCBjYW4gaGF2ZSBhbiBhcnJheSBvZiB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBpbiBvcmRlci5cbi8vIFRoZXNlIHRyYW5zbGF0aW9ucyBoYW5kbGUgZG93bmdyYWRlRXhlY3V0ZUNhbGwgYW5kIHVwZ3JhZGVFeGVjdXRlUmV0dXJuIGFuZCBhcmUgbWVhbnQgdG8gYmUgY2FsbGVkIG9uIHRoZVxuLy8gY2xpZW50L2V4dGVybmFsIHNpZGUuXG4vLyBXaGVuIHVwZGF0aW5nIHRoZSBtYWpvciBvciBtaW5vciB2ZXJzaW9uIG9mIG91ciBpbnRlcm5hbC1jb250cmFjdCwgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzLlxuLy8gKiBJZiB0aGVyZSBhcmUgdHJhbnNsYXRpb25zIHRvIGFkZCwgYWRkIHRoZW0gdG8gdGhlIHZlcnNpb24gdG8gJ3VwZ3JhZGUgZnJvbScgb3IgJ2Rvd25ncmFkZSB0bycuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuRG93bmdyYWRlRXhlY3V0ZUNhbGw+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgZG93bmdyYWRlcyBmcm9tIDEuMTAgdG8gMS45IGluIHRoZSBbMV1bOV0gYnVja2V0XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yVXBncmFkZVJldHVybkV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vclVwZ3JhZGVOb3RpZmljYXRpb246IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlTm90aWZpY2F0aW9uPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLCAvLyBOb3RlIHRoYXQgd2UgcHV0IHVwZ3JhZGVzIGZyb20gMS45IHRvIDEuMTAgaW4gdGhlIFsxXVs5XSBidWNrZXRcbiAgfSxcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB3aGljaCBoYXMgdGhlIGFiaWxpdHkgdG8gdXBncmFkZSBhbmQgZG93bmdyYWRlXG4gKiB0aGUgY29udHJhY3QgYmV0d2VlbiB0aGUgdHdvIHZlcnNpb25zIHdoaWNoIGFyZSBzcGVjaWZpZWQuIElmIGV4dGVybmFsTWFqb3JWZXJzaW9uIGlzIGxlc3MgdGhhblxuICogcGxhdGZvcm1NYWpvclZlcnNpb24sIGFuIEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBIYW5kbGVzIHVwZ3JhZGUvZG93bmdyYWRlIGZvciBib3RoIG1ham9yIGFuZCBtaW5vciB1cGRhdGVzLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgdXNpbmdcbiAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBwbGF0Zm9ybSBpcyB1c2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlRXh0ZXJuYWxDb21wYXRpYmxlVmVyc2lvbkNvbnZlcnRlcihcbiAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHJldHVybiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsLFxuICAgIEV4ZWN1dGVNaW5vclVwZ3JhZGVSZXR1cm5FeHRlcm5hbCxcbiAgICBFeGVjdXRlTWlub3JVcGdyYWRlTm90aWZpY2F0aW9uLFxuICApO1xufVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXJXaXRoVHJhbnNsYXRvcnMuXG4gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB1cGdyYWRlLCBkb3duZ3JhZGUgYXJyYXlzIHNvIHRoYXQgYWxsIHRoZSBsb2dpYyBjYW4gYmUgdGVzdGVkLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3Qgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqIEBwYXJhbSB1cGdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIHJlc3BvbnNlIHVwZ3JhZGVzXG4gKiBAcGFyYW0gZG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIGV4ZWN1dGUgY2FsbCBkb3duZ3JhZGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgZG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9uc0V4dGVybmFsLkRvd25ncmFkZUV4ZWN1dGVDYWxsPixcbiAgdXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlRXhlY3V0ZVJldHVybj4sXG4gIHVwZ3JhZGVOb3RpZmljYXRpb25zOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZU5vdGlmaWNhdGlvbj4sXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIGNvbnN0IGV4dGVybmFsTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBleHRlcm5hbFZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWlub3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWlub3I7XG5cbiAgLy8gVGhpcyBjaGVjayBpcyBwcmVzZW50IGluIFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LiBXZSB0aHJvdyB0aGUgc2FtZSBlcnJvciBoZXJlIGFzIHdlbGwuXG4gIC8vIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgbWlub3IgdmVyc2lvbnMgZm9yIHRyYW5zbGF0aW9ucy5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uID4gcGxhdGZvcm1NYWpvclZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4dGVybmFsIHZlcnNpb24gbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcGxhdGZvcm0gdmVyc2lvbi5cbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbj0ke2V4dGVybmFsTWFqb3JWZXJzaW9ufSBwbGF0Zm9ybU1ham9yVmVyc2lvbj0ke3BsYXRmb3JtTWFqb3JWZXJzaW9ufWApO1xuICB9XG5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uIDwgcGxhdGZvcm1NYWpvclZlcnNpb24gfHwgVmVyc2lvbkVxdWFsVG8oZXh0ZXJuYWxWZXJzaW9uLCBwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIG5ldyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcigpO1xuICB9XG5cbiAgLy8gV2FsayB0aGUgc3BhbiBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyB3ZSBoYXZlIGhlcmUgYW5kIGNvbGxlY3QgdGhlIHVwZ3JhZGUgYW5kIGRvd25ncmFkZXMgbmVjZXNzYXJ5XG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVDYWxsRG93bmdyYWRlOiBBcnJheTxUcmFuc2xhdGlvbnNFeHRlcm5hbC5Eb3duZ3JhZGVFeGVjdXRlQ2FsbD4gPSBHZXROZWVkZWRFeHRlcm5hbFRyYW5zbGF0aW9ucyhcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1pbm9yVmVyc2lvbixcbiAgICBkb3duZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVSZXR1cm5VcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZXMsXG4gICk7XG5cbiAgY29uc3QgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9uc0V4dGVybmFsLlVwZ3JhZGVOb3RpZmljYXRpb24+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZU5vdGlmaWNhdGlvbnMsXG4gICk7XG5cbiAgLy8gUmV2ZXJzZSB0aGUgZG93bmdyYWRlIGNhbGxzLCBzbyB0aGF0IHdlIHN0YXJ0IHRoZSBkb3duZ3JhZGUgZnJvbSB0aGUgZXh0ZXJuYWwgdmVyc2lvbiB0byB0aGUgcGxhdGZvcm0gdmVyc2lvblxuICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZS5yZXZlcnNlKCk7XG4gIHJldHVybiBuZXcgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZSxcbiAgICBuZWVkZWRFeGVjdXRlUmV0dXJuVXBncmFkZXMsXG4gICAgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXMsXG4gICk7XG59XG5cbmZ1bmN0aW9uIEdldE5lZWRlZEV4dGVybmFsVHJhbnNsYXRpb25zPFQ+KFxuICBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBwbGF0Zm9ybU1pbm9yVmVyc2lvbjogbnVtYmVyLFxuICBtYWpvck1pbm9yVHJhbnNsYXRvcnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUPixcbik6IEFycmF5PFQ+IHtcbiAgY29uc3QgbmVlZGVkVHJhbnNsYXRpb25zOiBBcnJheTxUPiA9IFtdO1xuXG4gIGlmIChwbGF0Zm9ybU1ham9yVmVyc2lvbiBpbiBtYWpvck1pbm9yVHJhbnNsYXRvcnMpIHtcbiAgICBjb25zdCBzdGFydCA9IHBsYXRmb3JtTWlub3JWZXJzaW9uO1xuICAgIGNvbnN0IG1heGltdW1NaW5vclZlcnNpb24gPSBHZXRNYXhpbXVtTWlub3JJbmRleChPYmplY3Qua2V5cyhtYWpvck1pbm9yVHJhbnNsYXRvcnNbcGxhdGZvcm1NYWpvclZlcnNpb25dKSk7XG4gICAgZm9yIChsZXQgbWlub3IgPSBzdGFydDsgbWlub3IgPD0gbWF4aW11bU1pbm9yVmVyc2lvbjsgbWlub3IrKykge1xuICAgICAgaWYgKG1pbm9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9yc1twbGF0Zm9ybU1ham9yVmVyc2lvbl0pIHtcbiAgICAgICAgbmVlZGVkVHJhbnNsYXRpb25zLnB1c2goLi4ubWFqb3JNaW5vclRyYW5zbGF0b3JzW3BsYXRmb3JtTWFqb3JWZXJzaW9uXVttaW5vcl0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkZWRUcmFuc2xhdGlvbnM7XG59XG4iLCIvLyBFeHBvcnQgZXZlcnl0aGluZyB3aGljaCBoYWQgYmVlbiBwcmV2aW91c2x5IGluIHRoZSBhcGktc2hhcmVkIG1vZHVsZVxuXG5leHBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnLi9BcGlTaGFyZWQvQXBpVmVyc2lvbic7XG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVCb290c3RyYXAnO1xuZXhwb3J0IHsgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgfSBmcm9tICcuL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVEaXNwYXRjaGVyJztcbmV4cG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9EYXRhU291cmNlJztcbmV4cG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4vQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuZXhwb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi9BcGlTaGFyZWQvRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5leHBvcnQgeyBFdmVudExpc3RlbmVyTWFuYWdlciB9IGZyb20gJy4vQXBpU2hhcmVkL0V2ZW50TGlzdGVuZXJNYW5hZ2VyJztcbmV4cG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9BcGlTaGFyZWQvRmllbGQnO1xuZXhwb3J0IHsgQ3VzdG9tVmlld0ltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0N1c3RvbVZpZXdJbXBsJztcbmV4cG9ydCB7IERhc2hib2FyZEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZEltcGwnO1xuZXhwb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5leHBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGF0YVNvdXJjZUltcGwnO1xuZXhwb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvUGFyYW1ldGVySW1wbCc7XG5leHBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NoZWV0SW1wbCc7XG5leHBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TaGVldEluZm9JbXBsJztcbmV4cG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlckltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NpbmdsZUV2ZW50TWFuYWdlckltcGwnO1xuZXhwb3J0IHsgU3RvcnlJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TdG9yeUltcGwnO1xuZXhwb3J0IHsgU3RvcnlQb2ludEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbXBsJztcbmV4cG9ydCB7IFN0b3J5UG9pbnRJbmZvSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvU3RvcnlQb2ludEluZm9JbXBsJztcbmV4cG9ydCB7IFdvcmtib29rSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvV29ya2Jvb2tJbXBsJztcbmV4cG9ydCB7IFdvcmtzaGVldEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1dvcmtzaGVldEltcGwnO1xuZXhwb3J0IHsgUG9pbnQgfSBmcm9tICcuL0FwaVNoYXJlZC9Qb2ludCc7XG5leHBvcnQgeyBBbm5vdGF0aW9uU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0Fubm90YXRpb25TZXJ2aWNlJztcbmV4cG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuZXhwb3J0IHsgRXhwb3J0U2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0V4cG9ydFNlcnZpY2UnO1xuZXhwb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuZXhwb3J0IHsgR2V0RGF0YVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlLCBVbnJlZ2lzdGVyRm4gfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9Ob3RpZmljYXRpb25TZXJ2aWNlJztcbmV4cG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvUGFyYW1ldGVyc1NlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvUmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcyc7XG5leHBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU2VsZWN0aW9uU2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuZXhwb3J0IHsgU2l6ZVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TaXplU2VydmljZSc7XG5leHBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU3RvcnlBY3RpdmF0aW9uU2VydmljZSc7XG5leHBvcnQgeyBWaXpTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvVml6U2VydmljZSc7XG5leHBvcnQgeyBDbGllbnRJbmZvU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0NsaWVudEluZm9TZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwnO1xuZXhwb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlLCBSZWdpc3RyYXRpb24gfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgeyBTaXplU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NpemVTZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU3RvcnlBY3RpdmF0aW9uU2VydmljZUltcGwnO1xuZXhwb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2luZ2xlRXZlbnRNYW5hZ2VyJztcbmV4cG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vQXBpU2hhcmVkL1RhYmxlYXVFcnJvcic7XG5leHBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0RlZmVycmVkJztcbmV4cG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0Vycm9ySGVscGVycyc7XG5leHBvcnQgeyBFeHBvcnRIZWxwZXJzIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvRXhwb3J0SGVscGVycyc7XG5leHBvcnQgeyBTaGVldFV0aWxzIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvU2hlZXRVdGlscyc7XG5leHBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9BcGlTaGFyZWQvVmVyc2lvbk51bWJlcic7XG5leHBvcnQgeyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgfSBmcm9tICcuL1ZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlcic7XG4iLCJpbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9WZXJzaW9uTnVtYmVyJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXJDb250cmFjdCB9IGZyb20gJy4vVmVyc2lvbk51bWJlckNvbnRyYWN0JztcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGV0b24gd3JhcHBlciBvZiBWZXJzaW9uTnVtYmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBBcGlWZXJzaW9uIHtcbiAgLy8gVXNpbmcgc29tZSB3ZWJwYWNrIHRyaWNrcywgd2UgY2FuIGluamVjdCB0aGlzIHZlcnNpb24gaW50byBvdXIgY29kZSAoa2luZGEgbGlrZSBjKysgcHJlcHJvY2Vzc29yIHN0dWZmKVxuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFZlcnNpb25OdW1iZXJDb250cmFjdDtcblxuICAvKipcbiAgICogR2V0cyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSB2ZXJzaW9uIG51bWJlci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFZlcnNpb25OdW1iZXJDb250cmFjdCB7XG4gICAgcmV0dXJuIEFwaVZlcnNpb24uX2luc3RhbmNlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBTZXRWZXJzaW9uTnVtYmVyKG51bVN0cmluZzogc3RyaW5nLCBpc0FscGhhOiBib29sZWFuKTogdm9pZCB7XG4gICAgQXBpVmVyc2lvbi5faW5zdGFuY2UgPSBuZXcgVmVyc2lvbk51bWJlcihudW1TdHJpbmcsIGlzQWxwaGEpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSBjb25uZWN0aW9uIHN1bW1hcnkuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uU3VtbWFyeSBpbXBsZW1lbnRzIENvbnRyYWN0LkNvbm5lY3Rpb25TdW1tYXJ5IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Nvbm5lY3Rpb25JbmZvOiBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5KSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VydmVyVVJJKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25JbmZvLnNlcnZlclVSSTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby50eXBlO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgQ3Jvc3NGcmFtZU1lc3NlbmdlcixcbiAgSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuICBNRVNTQUdJTkdfVkVSU0lPTiBhcyBBcGlNZXNzYWdpbmdWZXJzaW9uLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgfSBmcm9tICcuL0Nyb3NzRnJhbWVEaXNwYXRjaGVyJztcblxuLy8gQ2hlY2tzIHRvIHNlZSBpZiB3ZSBhcmUgcnVubmluZyBpbiBhbiBpZnJhbWUgY3VycmVudGx5OiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzI2MDc2Lzg4MjExNTNcbmZ1bmN0aW9uIGluSWZyYW1lKHRoaXNXaW5kb3c6IFdpbmRvdyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiB0aGlzV2luZG93LnNlbGYgIT09IHRoaXNXaW5kb3cucGFyZW50O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byBib290c3RyYXAgdGhlIGV4dGVuc2lvbiB3aXRoIGEgY3Jvc3MtZnJhbWUgcGFyZW50IHdoZXJlIFRhYmxlYXUgaXMgcnVubmluZ1xuICpcbiAqIEBwYXJhbSB0aGlzV2luZG93IFRoZSB3aW5kb3cgd2hpY2ggd2UgYXJlIHJ1bm5pbmcgaW4gKGluamVjdGVkIGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMpXG4gKiBAcGFyYW0gaW50ZXJuYWxDb250cmFjdFZlcnNpb24gVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3ZSBhcmUgdXNpbmdcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCBpcyBkb2luZyB0aGUgYWN0dWFsIGJvb3RzdHJhcHBpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcChcbiAgdGhpc1dpbmRvdzogV2luZG93LFxuICBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbjogQ29udHJhY3QuVmVyc2lvbk51bWJlcixcbiAgb3B0aW9uczogSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuKTogUHJvbWlzZTxDb250cmFjdC5JbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxDb250cmFjdC5JbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IHBhcmVudDogV2luZG93O1xuXG4gICAgLy8gTm9ybWFsbHksIHdlIGFyZSBydW5uaW5nIGluc2lkZSBhbiBpZnJhbWUuICBUaGUgZXhjZXB0aW9uIHRvIHRoaXMgaXNcbiAgICAvLyB3aGVuIHdlIGFyZSBydW5uaW5nIGFzIGFuIGV4dGVuc2lvbiBpbnNpZGUgYSBkaWFsb2cgYXMgcGFydCBvZiB0aGUgVUlOYW1lc3BhY2VcbiAgICAvLyBmdW5jdGlvbmFsaXR5LiAgSW4gdGhhdCBjYXNlLCB3ZSB3YW50IHRoZSBvcGVuZXIgb2YgdGhpcyB3aW5kb3cgcmF0aGVyIHRoYW4gdGhlIHBhcmVudC5cbiAgICBpZiAoIWluSWZyYW1lKHRoaXNXaW5kb3cpKSB7XG4gICAgICBwYXJlbnQgPSB0aGlzV2luZG93Lm9wZW5lcjtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50ID0gdGhpc1dpbmRvdy5wYXJlbnQ7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJlamVjdCgnVGhpcyBleHRlbnNpb24gaXMgbm90IHJ1bm5pbmcgaW5zaWRlIGFuIGlmcmFtZSwgZGVza3RvcCwgb3IgcG9wdXAgd2luZG93LiBJbml0aWFsaXphdGlvbiBmYWlsZWQuJyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBtZXNzZW5nZXIgd2hpY2ggd2lsbCBkbyBoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhpcyB3aW5kb3cgYW5kIG91ciBwYXJlbnRcbiAgICAvLyBTaW5jZSB3ZSBkb24ndCBrbm93IHdoZXJlIHdlIGFyZSBydW5uaW5nIHlldCwgd2UgaGF2ZSB0byBtYWtlIHRoaXMgaW5pdGlhbCBvcmlnaW4gJyonLiBPbmNlXG4gICAgLy8gd2UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgb3VyIGV4dGVuc2lvbiwgd2Ugd2lsbCBsaW1pdCB3aGVyZSB3ZSBzZW5kIG1lc3NhZ2VzXG4gICAgY29uc3QgbWVzc2VuZ2VyID0gbmV3IENyb3NzRnJhbWVNZXNzZW5nZXIodGhpc1dpbmRvdywgcGFyZW50LCAnKicpO1xuXG4gICAgLy8gUHJlcGFyZSB0byBzZW5kIGFuIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UgdG8gdGhlIHBhcmVudCBmcmFtZVxuICAgIGNvbnN0IGluaXRpYWxpemF0aW9uTWVzc2FnZSA9IG1lc3Nlbmdlci5wcmVwYXJlSW5pdGlhbGl6YXRpb25NZXNzYWdlKGludGVybmFsQ29udHJhY3RWZXJzaW9uLCBBcGlNZXNzYWdpbmdWZXJzaW9uLCBvcHRpb25zKTtcblxuICAgIC8vIFdoZW4gd2UgcmVjZWl2ZSBhIHJlc3BvbnNlIGJhY2sgZnJvbSB0aGUgcGFyZW50LCB3ZSBjaGVjayB0byBtYWtlIHN1cmUgdGhlIGd1aWRzIG1hdGNoIGFuZCB0aGVuIHdlIGtub3dcbiAgICAvLyB0aGF0IHRoZSBwYXJlbnQgaXMgYXdhcmUgb2YgdXMgYW5kIHdlIGNhbiBzdGFydCBjb21tdW5pY2F0aW5nXG4gICAgbWVzc2VuZ2VyLnNldENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKGZ1bmN0aW9uIChtc2c6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UpOiB2b2lkIHtcbiAgICAgIC8vIFZlcmlmeSB3ZSBhcmUgZ2V0dGluZyBhIHJlc3BvbnNlIGZyb20gb3VyIGluaXRpYWxpemUgbWVzc2FnZVxuICAgICAgaWYgKG1zZy5jb21tYW5kR3VpZCA9PT0gaW5pdGlhbGl6YXRpb25NZXNzYWdlLm1lc3NhZ2VHdWlkKSB7XG4gICAgICAgIC8vIFRoZSB2ZXJzaW9uaW5nIG9mIHRoZSBkaXNwYXRjaGVyIGhhcHBlbnMgb24gdGhlIG90aGVyIHNpZGUgb2Ygb3VyIGZyYW1lLCBhbmRcbiAgICAgICAgLy8gaW4gYSB3cmFwcGVyIG9uIHRoaXMgc2lkZS4gVGhpcyBvbmUgZG9lc24ndCBoYXZlIGFueSB2ZXJzaW9uIGtub3dsZWRnZS5cbiAgICAgICAgY29uc3QgZGlzcGF0Y2hlckZhY3RvcnkgPSAoKSA9PiBuZXcgQ3Jvc3NGcmFtZURpc3BhdGNoZXIobWVzc2VuZ2VyKTtcbiAgICAgICAgcmVzb2x2ZShkaXNwYXRjaGVyRmFjdG9yeSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBOb3cgdGhhdCBvdXIgaGFuZGxlcnMgYXJlIHJlYWR5LCBzdGFydCBsaXN0ZW5pbmcgYW5kIHNlbmQgb3VyIGluaXRpYWxpemF0aW9uIG1lc3NhZ2VcbiAgICBtZXNzZW5nZXIuc3RhcnRMaXN0ZW5pbmcoKTtcbiAgICBpbml0aWFsaXphdGlvbk1lc3NhZ2Uuc2VuZCgpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IEVtYmVkZGluZ0Vycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4ZWN1dGVSZXNwb25zZSxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBNZXNzZW5nZXIsXG4gIE1vZGVsLFxuICBOb3RpZmljYXRpb25IYW5kbGVyLFxuICBOb3RpZmljYXRpb25NZXNzYWdlLFxuICBWZXJiSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEludGVybmFsQXBpRGlzcGF0Y2hlciBpbnRlcmZhY2Ugd2hpY2ggZnVuY3Rpb25zIGJ5IHBhc3NpbmcgbWVzc2FnZXNcbiAqIGFjcm9zcyBhIGZyYW1lIGJvdW5kYXJ5LiBUaGlzIGlzIHVzdWFsbHkgYmV0d2VlbiB0aGUgY29kZSB3aGVyZSBvdXIgamF2c2NyaXB0IGxpYnJhcnkgaGFzIGJlZW4gaW5jbHVkZWRcbiAqIGJ5IGEgM3JkIHBhcnR5IGRldiBhbmQgYW5vdGhlciBmcmFtZSB3aGVyZSBUYWJsZWF1IHNlcnZlciBoYXMgY29udGVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRnJhbWVEaXNwYXRjaGVyIGltcGxlbWVudHMgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIHtcbiAgLy8gQ29sbGVjdGlvbiBvZiBwZW5kaW5nIHByb21pc2VzIHdoaWNoIGFyZSB3YWl0aW5nIHRvIGJlIHJlc29sdmVkLiBXaGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gdGhlIG90aGVyIGZyYW1lLFxuICAvLyB0aGVzZSBwcm9taXNlcyBjYW4gYmUgZWl0aGVyIHJlc29sdmVkIG9yIHJlamVjdGVkXG4gIHByaXZhdGUgX3BlbmRpbmdQcm9taXNlczogeyBbbWVzc2FnZUd1aWQ6IHN0cmluZ106IHsgcmVzb2x2ZTogKHJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+IHZvaWQ7IHJlamVjdDogKGVycm9yOiBNb2RlbCkgPT4gdm9pZCB9IH0gPVxuICAgIHt9O1xuXG4gIC8vIFRoZSBjb2xsZWN0aW9uIG9mIG5vdGlmaWNhdGlvbiBoYW5kbGVycyB3aGljaCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZGlzcGF0Y2hlclxuICBwcml2YXRlIF9ub3RpZmljYXRpb25IYW5kbGVyczogQXJyYXk8Tm90aWZpY2F0aW9uSGFuZGxlcj4gPSBbXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lRGlzcGF0Y2hlciB3aGljaCB3aWxsIHVzZSB0aGUgZ2l2ZW4gbWVzc2VuZ2VyIHRvIGNvbW11bmljYXRlXG4gICAqIEBwYXJhbSBfbWVzc2VuZ2VyIGFuIGluc3RhbnRpYXRlZCBhbmQgbGlzdGVuaW5nIG1lc3NlbmdlciBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9tZXNzZW5nZXI6IE1lc3Nlbmdlcikge1xuICAgIGlmICghdGhpcy5fbWVzc2VuZ2VyKSB7XG4gICAgICB0aHJvdyAnTWlzc2luZyBtZXNzZW5nZXIgb2JqZWN0JztcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgb3VyIG1lc3NhZ2UgaGFuZGxlcnMuIFdlIG9ubHkgY2FyZSBhYm91dCBpbmNvbWluZyBub3RpZmljYXRpb25zIGFuZCBjb21tYW5kIHJlc3BvbnNlc1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXRDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcih0aGlzLm9uQ29tbWFuZFJlc3BvbnNlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXROb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcih0aGlzLm9uTm90aWZpY2F0aW9uLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLy8vLy8vIFN0YXJ0IEludGVybmFsQXBpRGlzcGF0Y2hlciBpbXBsZW1lbnRhdGlvblxuXG4gIHB1YmxpYyBleGVjdXRlKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgIC8vIFRvIGV4ZWN1dGUgYSB2ZXJiLCB3ZSBmaXJzdCBwcmVwYXJlIGEgY29tbWFuZCBtZXNzYWdlIGFuZCB0aGVuIGRlZmluZSBhIHByb21pc2UuXG4gICAgY29uc3QgcHJlcGFyZWRNZXNzYWdlID0gdGhpcy5fbWVzc2VuZ2VyLnByZXBhcmVDb21tYW5kTWVzc2FnZSh2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBTYXZlIG9mZiB0aGUgcGVuZGluZyBwcm9taXNlIGJ5IHRoZSBtZXNzYWdlR3VpZCB3ZSBhcmUgYWJvdXQgdG8gc2VuZC4gV2hlbiBhIHJlc3BvbnNlIGlzXG4gICAgICAvLyByZWNlaXZlZCwgd2UnbGwgYmUgYWJsZSB0byByZXNvbHZlIHRoaXMgcHJvbWlzZSB3aXRoIHRoZSByZXN1bHRcbiAgICAgIHRoaXMuX3BlbmRpbmdQcm9taXNlc1twcmVwYXJlZE1lc3NhZ2UubWVzc2FnZUd1aWRdID0geyByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWN0dWFsbHkgc2VuZCB0aGUgbWVzc2FnZSBhbmQgcmV0dXJuIHRoZSBwcm9taXNlXG4gICAgcHJlcGFyZWRNZXNzYWdlLnNlbmQoKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgdW5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzID0gdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZmlsdGVyKChoKSA9PiBoICE9PSBoYW5kbGVyKTtcbiAgfVxuXG4gIC8vLy8vLyBFbmQgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIGltcGxlbWVudGF0aW9uXG5cbiAgcHJpdmF0ZSBvbkNvbW1hbmRSZXNwb25zZShyZXNwb25zZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSk6IHZvaWQge1xuICAgIC8vIFdlIGdvdCBhIGNvbW1hbmQgcmVzcG9uc2UsIGxvb2sgdGhyb3VnaCB0aGUgcGVuZGluZyBwcm9taXNlcyBhbmQgcmVzb2x2ZVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9wZW5kaW5nUHJvbWlzZXMpLmluZGV4T2YocmVzcG9uc2UuY29tbWFuZEd1aWQpIDwgMCkge1xuICAgICAgcmV0dXJuOyAvLyBXZSBkb24ndCBoYXZlIGFueSByZWZlcmVuY2UgdG8gdGhpcyBjb21tYW5kLCBqdXN0IHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBlbmRpbmdQcm9taXNlID0gdGhpcy5fcGVuZGluZ1Byb21pc2VzW3Jlc3BvbnNlLmNvbW1hbmRHdWlkXTtcblxuICAgIC8vIElmIHdlIGhhdmUgYW4gZXJyb3IgZGVmaW5lZCwgcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICBwZW5kaW5nUHJvbWlzZS5yZWplY3QocmVzcG9uc2UuZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgZGF0YSBkZWZpbmVkLCByZXNvbHZlIHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgIHBlbmRpbmdQcm9taXNlLnJlc29sdmUoeyByZXN1bHQ6IHJlc3BvbnNlLmRhdGEgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgb3VyIHBlbmRpbmcgcHJvbWlzZXMgb2JqZWN0XG4gICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdQcm9taXNlc1tyZXNwb25zZS5jb21tYW5kR3VpZF07XG4gIH1cblxuICBwcml2YXRlIG9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2U6IE5vdGlmaWNhdGlvbk1lc3NhZ2UpOiB2b2lkIHtcbiAgICAvLyBHbyB0aHJvdWdoIGVhY2ggbm90aWZpY2F0aW9uIGhhbmRsZXIgd2UgaGF2ZSByZWdpc3RlcmVkIGFuZCBsZXQgdGhlbSBrbm93IGEgbm90aWZpY2F0aW9uIGNhbWUgaW5cbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXIoeyBub3RpZmljYXRpb25JZDogbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCwgZGF0YTogbm90aWZpY2F0aW9uTWVzc2FnZS5kYXRhIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJbmNhc2Ugb2YgYSBJbmNvbXBhdGlibGVWZXJzaW9uRXJyb3IsIHJlLXRocm93IHRoZSBlcnJvci5cbiAgICAgICAgaWYgKChlIGFzIFRhYmxlYXVFcnJvcikuZXJyb3JDb2RlID09PSBFbWJlZGRpbmdFcnJvckNvZGVzLkluY29tcGF0aWJsZVZlcnNpb25FcnJvcikge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRWxzZSBJZ25vcmUgIHNvIGlmIG9uZSBoYW5kbGVyIGVycm9ycywgdGhlIG90aGVyIHN0aWxsIGdldCB0aGUgbWVzc2FnZS5cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vSW1wbC9EYXRhU291cmNlSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXRhU291cmNlSW1wbDogRGF0YVNvdXJjZUltcGwpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZHMoKTogQXJyYXk8Q29udHJhY3QuRmllbGQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZmllbGRzO1xuICB9XG5cbiAgcHVibGljIGdldCBleHRyYWN0VXBkYXRlVGltZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5leHRyYWN0VXBkYXRlVGltZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNFeHRyYWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc0V4dHJhY3Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUHVibGlzaGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc1B1Ymxpc2hlZDtcbiAgfVxuXG4gIHB1YmxpYyBwdWJsaXNoZWRVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwucHVibGlzaGVkVXJsKCk7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5yZWZyZXNoQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LlRhYmxlU3VtbWFyeT4+IHtcbiAgICBjb25zb2xlLndhcm4oJ0RhdGFTb3VyY2UuZ2V0QWN0aXZlVGFibGVzQXN5bmMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZXNBc3luYy4nKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0QWN0aXZlVGFibGVzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeT4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ0RhdGFTb3VyY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlICcgK1xuICAgICAgICAnRGF0YVNvdXJjZS5nZXRMb2dpY2FsVGFibGVzQXN5bmMgYW5kIERhdGFTb3VyY2UuZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jLicsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5nZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMobG9naWNhbFRhYmxlSWQsIHBhZ2VSb3dDb3VudCwgb3B0aW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIERhdGVSYW5nZVR5cGUgYXMgRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEaWFsb2dTdHlsZSBhcyBFeHRlcm5hbERpYWxvZ1N0eWxlLFxuICBGaWx0ZXJEb21haW5UeXBlIGFzIEV4dGVybmFsRG9tYWluVHlwZSxcbiAgRmlsdGVyTnVsbE9wdGlvbiBhcyBFeHRlcm5hbE51bGxPcHRpb24sXG4gIEZpbHRlclVwZGF0ZVR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgUGVyaW9kVHlwZSxcbiAgUmVwbGF5U3BlZWRUeXBlLFxuICBTaGVldFR5cGUgYXMgRXh0ZXJuYWxTaGVldFR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNob3dEYXRhVGFibGVGb3JtYXQsXG4gIERhdGVSYW5nZVR5cGUgYXMgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEYXRlU3RlcFBlcmlvZCxcbiAgRGlhbG9nU3R5bGUgYXMgSW50ZXJuYWxEaWFsb2dTdHlsZSxcbiAgRmlsdGVyRG9tYWluVHlwZSBhcyBJbnRlcm5hbERvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24gYXMgSW50ZXJuYWxOdWxsT3B0aW9uLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEludGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEludGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRW51bUNvbnZlcnRlciB9IGZyb20gJy4uL1V0aWxzL0VudW1Db252ZXJ0ZXInO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTp0eXBlZGVmIC0gRGlzYWJsZSB0aGlzIHRvIG1ha2UgZGVjbGFyaW5nIHRoZXNlIGNsYXNzZXMgYSBiaXQgZWFzaWVyICovXG4vKipcbiAqIE1hcHMgZW51bXMgdXNlZCBieSB0aGUgZXh0ZXJuYWwtYXBpLWNvbnRyYWN0IHRvIHRoZSBlbnVtcyB1c2VkXG4gKiBpbiB0aGUgaW50ZXJuYWwtYXBpLWNvbnRyYWN0LCB3aGljaCBkZXZlbG9wZXJzIGNvZGUgYWdhaW5zdC5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB7XG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyRG9tYWluVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRG9tYWluVHlwZSwgSW50ZXJuYWxEb21haW5UeXBlPih7XG4gICAgW0V4dGVybmFsRG9tYWluVHlwZS5SZWxldmFudF06IEludGVybmFsRG9tYWluVHlwZS5SZWxldmFudCxcbiAgICBbRXh0ZXJuYWxEb21haW5UeXBlLkRhdGFiYXNlXTogSW50ZXJuYWxEb21haW5UeXBlLkRhdGFiYXNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIG51bGxPcHRpb25zID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxOdWxsT3B0aW9uLCBJbnRlcm5hbE51bGxPcHRpb24+KHtcbiAgICBbRXh0ZXJuYWxOdWxsT3B0aW9uLkFsbFZhbHVlc106IEludGVybmFsTnVsbE9wdGlvbi5BbGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5Ob25OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk5vbk51bGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk51bGxWYWx1ZXMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyVXBkYXRlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSwgSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlPih7XG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGRdOiBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWRkLFxuICAgIFtFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFsbCxcbiAgICBbRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZV06IEludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZW1vdmUsXG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZXBsYWNlXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2UsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2V0VmlzaWJpbGl0eVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxab25lVmlzaWJpbGl0eVR5cGUsIGJvb2xlYW4+KHtcbiAgICBbWm9uZVZpc2liaWxpdHlUeXBlLlNob3ddOiB0cnVlLFxuICAgIFtab25lVmlzaWJpbGl0eVR5cGUuSGlkZV06IGZhbHNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNldFJlcGxheVNwZWVkVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFJlcGxheVNwZWVkVHlwZSwgbnVtYmVyPih7XG4gICAgLy8gdGhlc2UgbnVtYmVycyBhcmUgZHVyYXRpb24gbXVsdGlwbGllcnNcbiAgICAvLyAyLjAsIGZvciBleGFtcGxlLCBkb3VibGVzIHRoZSBkdXJhdGlvbiBvZiB0aGUgcmVwbGF5LCBzbG93aW5nIGl0IGRvd24gdG8gMC41eCBzcGVlZFxuICAgIFtSZXBsYXlTcGVlZFR5cGUuU2xvd106IDIuMCxcbiAgICBbUmVwbGF5U3BlZWRUeXBlLk5vcm1hbF06IDEuMCxcbiAgICBbUmVwbGF5U3BlZWRUeXBlLkZhc3RdOiAwLjUsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hlZXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxTaGVldFR5cGUsIEludGVybmFsU2hlZXRUeXBlPih7XG4gICAgW0V4dGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZF06IEludGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICBbRXh0ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0XTogSW50ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0LFxuICAgIFtFeHRlcm5hbFNoZWV0VHlwZS5TdG9yeV06IEludGVybmFsU2hlZXRUeXBlLlN0b3J5LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNob3dEYXRhVGFibGVGb3JtYXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sIEFwaVNob3dEYXRhVGFibGVGb3JtYXQ+KHtcbiAgICBbSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzXTogQXBpU2hvd0RhdGFUYWJsZUZvcm1hdC5OYXRpdmVBbmRGb3JtYXR0ZWRWYWx1ZXMsXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlOYXRpdmVWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0Lk5hdGl2ZVZhbHVlc09ubHksXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlGb3JtYXR0ZWRWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0LkZvcm1hdHRlZFZhbHVlc09ubHksXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgcGVyaW9kVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFBlcmlvZFR5cGUsIERhdGVTdGVwUGVyaW9kPih7XG4gICAgW1BlcmlvZFR5cGUuWWVhcnNdOiBEYXRlU3RlcFBlcmlvZC5ZZWFycyxcbiAgICBbUGVyaW9kVHlwZS5RdWFydGVyc106IERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzLFxuICAgIFtQZXJpb2RUeXBlLk1vbnRoc106IERhdGVTdGVwUGVyaW9kLk1vbnRocyxcbiAgICBbUGVyaW9kVHlwZS5XZWVrc106IERhdGVTdGVwUGVyaW9kLldlZWtzLFxuICAgIFtQZXJpb2RUeXBlLkRheXNdOiBEYXRlU3RlcFBlcmlvZC5EYXlzLFxuICAgIFtQZXJpb2RUeXBlLkhvdXJzXTogRGF0ZVN0ZXBQZXJpb2QuSG91cnMsXG4gICAgW1BlcmlvZFR5cGUuTWludXRlc106IERhdGVTdGVwUGVyaW9kLk1pbnV0ZXMsXG4gICAgW1BlcmlvZFR5cGUuU2Vjb25kc106IERhdGVTdGVwUGVyaW9kLlNlY29uZHMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZVJhbmdlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRGF0ZVJhbmdlVHlwZSwgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlPih7XG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0XTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3QsXG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0Tl06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0TixcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHRdOiBJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dCxcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROXTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROLFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuQ3VycmVudF06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5DdXJyZW50LFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlXTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLlRvRGF0ZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkaWFsb2dTdHlsZXMgPSBuZXcgRW51bUNvbnZlcnRlcjxFeHRlcm5hbERpYWxvZ1N0eWxlLCBJbnRlcm5hbERpYWxvZ1N0eWxlPih7XG4gICAgW0V4dGVybmFsRGlhbG9nU3R5bGUuV2luZG93XTogSW50ZXJuYWxEaWFsb2dTdHlsZS5XaW5kb3csXG4gICAgW0V4dGVybmFsRGlhbG9nU3R5bGUuTW9kYWxdOiBJbnRlcm5hbERpYWxvZ1N0eWxlLk1vZGFsLFxuICAgIFtFeHRlcm5hbERpYWxvZ1N0eWxlLk1vZGVsZXNzXTogSW50ZXJuYWxEaWFsb2dTdHlsZS5Nb2RlbGVzcyxcbiAgfSk7XG59XG4vKiB0c2xpbnQ6ZW5hYmxlOnR5cGVkZWYgKi9cbiIsImltcG9ydCB7XG4gIEFubm90YXRpb25UeXBlIGFzIEV4dGVybmFsQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSBhcyBFeHRlcm5hbENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSBhcyBFeHRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhVHlwZSBhcyBFeHRlcm5hbERhdGFUeXBlLFxuICBQZXJpb2RUeXBlIGFzIEV4dGVybmFsRGF0ZVBlcmlvZCxcbiAgRGF0ZVJhbmdlVHlwZSBhcyBFeHRlcm5hbERhdGVSYW5nZVR5cGUsXG4gIEVycm9yQ29kZXMgYXMgRXh0ZXJuYWxFcnJvckNvZGVzLFxuICBFeHRlbnNpb25Db250ZXh0IGFzIEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUgYXMgRXh0ZXJuYWxFeHRlbnNpb25zTW9kZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUgYXMgRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSBhcyBFeHRlcm5hbEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlclR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSBhcyBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIE1hcmtUeXBlIGFzIEV4dGVybmFsTWFya1R5cGUsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSBhcyBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEV4dGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQW5ub3RhdGVFbnVtIGFzIEludGVybmFsQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSBhcyBJbnRlcm5hbENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSBhcyBJbnRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhVHlwZSBhcyBJbnRlcm5hbERhdGFUeXBlLFxuICBEYXRlUmFuZ2VUeXBlIGFzIEludGVybmFsRGF0ZVJhbmdlVHlwZSxcbiAgRGF0ZVN0ZXBQZXJpb2QgYXMgSW50ZXJuYWxEYXRlU3RlcFBlcmlvZCxcbiAgRG9tYWluUmVzdHJpY3Rpb25UeXBlIGFzIEludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLFxuICBFcnJvckNvZGVzIGFzIEludGVybmFsRXJyb3JDb2RlcyxcbiAgRXh0ZW5zaW9uQ29udGV4dCBhcyBJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LFxuICBFeHRlbnNpb25Nb2RlIGFzIEludGVybmFsRXh0ZW5zaW9uc01vZGUsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlIGFzIEludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUgYXMgSW50ZXJuYWxGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJUeXBlIGFzIEludGVybmFsRmlsdGVyVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSBhcyBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUgYXMgSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLFxuICBNYXJrVHlwZSBhcyBJbnRlcm5hbE1hcmtUeXBlLFxuICBTaGVldFR5cGUgYXMgSW50ZXJuYWxTaGVldFR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vVXRpbHMvRW51bUNvbnZlcnRlcic7XG5cbi8qIHRzbGludDpkaXNhYmxlOnR5cGVkZWYgLSBEaXNhYmxlIHRoaXMgdG8gbWFrZSBkZWNsYXJpbmcgdGhlc2UgY2xhc3NlcyBhIGJpdCBlYXNpZXIgKi9cbi8qKlxuICogTWFwcyBlbnVtcyB1c2VkIGJ5IHRoZSBpbnRlcm5hbC1hcGktY29udHJhY3QgdG8gdGhlIGVudW1zIHVzZWRcbiAqIGluIHRoZSBleHRlcm5hbC1hcGktY29udHJhY3QsIHdoaWNoIGRldmVsb3BlcnMgY29kZSBhZ2FpbnN0LlxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIHtcbiAgcHVibGljIHN0YXRpYyBleHRlbnNpb25Db250ZXh0ID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dCwgRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dD4oe1xuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3BdOiBFeHRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3AsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuU2VydmVyXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5TZXJ2ZXIsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuUHVibGljV2ViXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5QdWJsaWNXZWIsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuUHVibGljRGVza3RvcF06IEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuUHVibGljRGVza3RvcCxcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5DbG91ZF06IEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuQ2xvdWQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZXh0ZW5zaW9uTW9kZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRXh0ZW5zaW9uc01vZGUsIEV4dGVybmFsRXh0ZW5zaW9uc01vZGU+KHtcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zTW9kZS5BdXRob3JpbmddOiBFeHRlcm5hbEV4dGVuc2lvbnNNb2RlLkF1dGhvcmluZyxcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zTW9kZS5WaWV3aW5nXTogRXh0ZXJuYWxFeHRlbnNpb25zTW9kZS5WaWV3aW5nLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGNvbHVtblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbENvbHVtblR5cGUsIEV4dGVybmFsQ29sdW1uVHlwZT4oe1xuICAgIFtJbnRlcm5hbENvbHVtblR5cGUuQ29udGludW91c106IEV4dGVybmFsQ29sdW1uVHlwZS5Db250aW51b3VzLFxuICAgIFtJbnRlcm5hbENvbHVtblR5cGUuRGlzY3JldGVdOiBFeHRlcm5hbENvbHVtblR5cGUuRGlzY3JldGUsXG4gICAgW0ludGVybmFsQ29sdW1uVHlwZS5Vbmtub3duXTogRXh0ZXJuYWxDb2x1bW5UeXBlLlVua25vd24sXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmllbGRBZ2dyZWdhdGlvblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLCBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlPih7XG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5BdmddOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkF2ZyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db2xsZWN0XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db2xsZWN0LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudGRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50ZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5EYXldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkRheSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5FbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkVuZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ib3VyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ib3VyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkluT3V0XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Jbk91dCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5LdXJ0b3Npc106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuS3VydG9zaXMsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWF4XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NYXgsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWR5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZHksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWVkaWFuXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZWRpYW4sXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWluXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW4sXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWludXRlXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW51dGUsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTW9udGhZZWFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Nb250aFllYXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTm9uZV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTm9uZSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdHJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDFdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0MSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDNdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0MyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TZWNvbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlNlY29uZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ta2V3bmVzc106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU2tld25lc3MsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXZdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2cF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXZwLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN1bV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3VtLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jRGF5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0RheSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0hvdXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jSG91cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY01pbnV0ZV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNaW51dGUsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNb250aF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNb250aCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1F0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNRdHIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNTZWNvbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jU2Vjb25kLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jV2Vla106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNXZWVrLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jWWVhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNZZWFyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlVzZXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlVzZXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5WYXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFycF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFycCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWtkYXldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWtkYXksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuWWVhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuWWVhcixcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWVsZFJvbGVUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWVsZFJvbGVUeXBlLCBFeHRlcm5hbEZpZWxkUm9sZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWVsZFJvbGVUeXBlLkRpbWVuc2lvbl06IEV4dGVybmFsRmllbGRSb2xlVHlwZS5EaW1lbnNpb24sXG4gICAgW0ludGVybmFsRmllbGRSb2xlVHlwZS5NZWFzdXJlXTogRXh0ZXJuYWxGaWVsZFJvbGVUeXBlLk1lYXN1cmUsXG4gICAgW0ludGVybmFsRmllbGRSb2xlVHlwZS5Vbmtub3duXTogRXh0ZXJuYWxGaWVsZFJvbGVUeXBlLlVua25vd24sXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hlZXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxTaGVldFR5cGUsIEV4dGVybmFsU2hlZXRUeXBlPih7XG4gICAgW0ludGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZF06IEV4dGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICBbSW50ZXJuYWxTaGVldFR5cGUuU3RvcnldOiBFeHRlcm5hbFNoZWV0VHlwZS5TdG9yeSxcbiAgICBbSW50ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0XTogRXh0ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGRhc2hib2FyZE9iamVjdFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUsIEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZT4oe1xuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuRXh0ZW5zaW9uXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkV4dGVuc2lvbixcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2UsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5MZWdlbmRdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuTGVnZW5kLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFnZUZpbHRlcl06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYWdlRmlsdGVyLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFyYW1ldGVyQ29udHJvbF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYXJhbWV0ZXJDb250cm9sLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXJdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXIsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UZXh0XTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlRleHQsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZV06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldlYlBhZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuV2ViUGFnZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0YVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhdGFUeXBlLCBFeHRlcm5hbERhdGFUeXBlPih7XG4gICAgW0ludGVybmFsRGF0YVR5cGUuQm9vbF06IEV4dGVybmFsRGF0YVR5cGUuQm9vbCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5EYXRlXTogRXh0ZXJuYWxEYXRhVHlwZS5EYXRlLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLkRhdGVUaW1lXTogRXh0ZXJuYWxEYXRhVHlwZS5EYXRlVGltZSxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5GbG9hdF06IEV4dGVybmFsRGF0YVR5cGUuRmxvYXQsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuSW50XTogRXh0ZXJuYWxEYXRhVHlwZS5JbnQsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuU3BhdGlhbF06IEV4dGVybmFsRGF0YVR5cGUuU3BhdGlhbCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5TdHJpbmddOiBFeHRlcm5hbERhdGFUeXBlLlN0cmluZyxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJVcGRhdGVUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLCBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFkZF06IEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGQsXG4gICAgW0ludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BbGxdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsLFxuICAgIFtJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVtb3ZlXTogRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZSxcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2VdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVwbGFjZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBhbGxvd2FibGVWYWx1ZXMgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERvbWFpblJlc3RyaWN0aW9uVHlwZSwgRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUuQWxsXTogRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGUuQWxsLFxuICAgIFtJbnRlcm5hbERvbWFpblJlc3RyaWN0aW9uVHlwZS5MaXN0XTogRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGUuTGlzdCxcbiAgICBbSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUuUmFuZ2VdOiBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZS5SYW5nZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRlU3RlcFBlcmlvZCA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0ZVN0ZXBQZXJpb2QsIEV4dGVybmFsRGF0ZVBlcmlvZD4oe1xuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlllYXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlllYXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlF1YXJ0ZXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLk1vbnRoc106IEV4dGVybmFsRGF0ZVBlcmlvZC5Nb250aHMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuV2Vla3NdOiBFeHRlcm5hbERhdGVQZXJpb2QuV2Vla3MsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuRGF5c106IEV4dGVybmFsRGF0ZVBlcmlvZC5EYXlzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLkhvdXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLkhvdXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLk1pbnV0ZXNdOiBFeHRlcm5hbERhdGVQZXJpb2QuTWludXRlcyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5TZWNvbmRzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlNlY29uZHMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZVJhbmdlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0ZVJhbmdlVHlwZSwgRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlPih7XG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5DdXJyZW50XTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkN1cnJlbnQsXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0XTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3QsXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0Tl06IEV4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0TixcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHRdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dCxcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROXTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROLFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlXTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLlRvRGF0ZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBlcnJvckNvZGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEVycm9yQ29kZXMsIEV4dGVybmFsRXJyb3JDb2Rlcz4oXG4gICAge1xuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5JTklUSUFMSVpBVElPTl9FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5JTlRFUk5BTF9FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5NSVNTSU5HX0VOVU1fTUFQUElOR106IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5NSVNTSU5HX1BBUkFNRVRFUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5QRVJNSVNTSU9OX0RFTklFRF06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5QUkVTX01PREVMX1BBUlNJTkdfRVJST1JdOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuVU5LTk9XTl9WRVJCX0lEXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlZFUlNJT05fTk9UX0NPTkZJR1VSRURdOiBFeHRlcm5hbEVycm9yQ29kZXMuQVBJTm90SW5pdGlhbGl6ZWQsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlZJU0lCSUxJVFlfRVJST1JdOiBFeHRlcm5hbEVycm9yQ29kZXMuVmlzaWJpbGl0eUVycm9yLFxuICAgIH0sXG4gICAgRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWx0ZXJUeXBlLCBFeHRlcm5hbEZpbHRlclR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWx0ZXJUeXBlLkNhdGVnb3JpY2FsXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLkNhdGVnb3JpY2FsLFxuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuUmFuZ2VdOiBFeHRlcm5hbEZpbHRlclR5cGUuUmFuZ2UsXG4gICAgW0ludGVybmFsRmlsdGVyVHlwZS5SZWxhdGl2ZURhdGVdOiBFeHRlcm5hbEZpbHRlclR5cGUuUmVsYXRpdmVEYXRlLFxuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuSGllcmFyY2hpY2FsXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLkhpZXJhcmNoaWNhbCxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBjbGFzc05hbWVLZXkgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbENsYXNzTmFtZUtleSwgRXh0ZXJuYWxDbGFzc05hbWVLZXk+KHtcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuRGFzaGJvYXJkVGl0bGVdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5EYXNoYm9hcmRUaXRsZSxcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuU3RvcnlUaXRsZV06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlN0b3J5VGl0bGUsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LlRvb2x0aXBdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Ub29sdGlwLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXRdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXQsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldFRpdGxlXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0VGl0bGUsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LlBhbmVdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5QYW5lLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5Sb3dEaXZpZGVyc106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlJvd0RpdmlkZXJzLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5Db2x1bW5EaXZpZGVyc106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LkNvbHVtbkRpdmlkZXJzLFxuICAgIC8vIFRlbXBvcmFyeSB1bnRpbCB3ZSBmaXggMTMxNzI2NiAtIFBsYXRmb3JtIGhhc24ndCBiZWVuIHVwZGF0ZWQgY3VycmVudGx5IGJlY2F1c2UgbmVhciBicmFuY2ggaXMgY2xvc2VkXG4gICAgWydkYXNoYm9hcmQtdGl0bGUnXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuRGFzaGJvYXJkVGl0bGUsXG4gICAgWydzdG9yeS10aXRsZSddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5TdG9yeVRpdGxlLFxuICAgIFsndG9vbHRpcCddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Ub29sdGlwLFxuICAgIFsnd29ya3NoZWV0J106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldCxcbiAgICBbJ3dvcmtzaGVldC10aXRsZSddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXRUaXRsZSxcbiAgICBbJ3BhbmUnXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuUGFuZSxcbiAgICBbJ3Jvdy1kaXZpZGVycyddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Sb3dEaXZpZGVycyxcbiAgICBbJ2NvbHVtbi1kaXZpZGVycyddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Db2x1bW5EaXZpZGVycyxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBoaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlID0gbmV3IEVudW1Db252ZXJ0ZXI8XG4gICAgSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLFxuICAgIEV4dGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZVxuICA+KHtcbiAgICBbSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLkFsbFNlbGVjdGVkXTogRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLkFsbFNlbGVjdGVkLFxuICAgIFtJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuTm9uZVNlbGVjdGVkXTogRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLk5vbmVTZWxlY3RlZCxcbiAgICBbSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLlNvbWVTZWxlY3RlZF06IEV4dGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Tb21lU2VsZWN0ZWQsXG4gICAgW0ludGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Vbmtub3duU2VsZWN0ZWRdOiBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuVW5rbm93blNlbGVjdGVkLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGFubm90YXRpb25UeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxBbm5vdGF0aW9uVHlwZSwgRXh0ZXJuYWxBbm5vdGF0aW9uVHlwZT4oe1xuICAgIFtJbnRlcm5hbEFubm90YXRpb25UeXBlLkFyZWFdOiBFeHRlcm5hbEFubm90YXRpb25UeXBlLkFyZWEsXG4gICAgW0ludGVybmFsQW5ub3RhdGlvblR5cGUuTWFya106IEV4dGVybmFsQW5ub3RhdGlvblR5cGUuTWFyayxcbiAgICBbSW50ZXJuYWxBbm5vdGF0aW9uVHlwZS5Qb2ludF06IEV4dGVybmFsQW5ub3RhdGlvblR5cGUuUG9pbnQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgbWFya1R5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbE1hcmtUeXBlLCBFeHRlcm5hbE1hcmtUeXBlPih7XG4gICAgW0ludGVybmFsTWFya1R5cGUuQXJlYV06IEV4dGVybmFsTWFya1R5cGUuQXJlYSxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5CYXJdOiBFeHRlcm5hbE1hcmtUeXBlLkJhcixcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5DaXJjbGVdOiBFeHRlcm5hbE1hcmtUeXBlLkNpcmNsZSxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5HYW50dEJhcl06IEV4dGVybmFsTWFya1R5cGUuR2FudHRCYXIsXG4gICAgW0ludGVybmFsTWFya1R5cGUuSGVhdG1hcF06IEV4dGVybmFsTWFya1R5cGUuSGVhdG1hcCxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5MaW5lXTogRXh0ZXJuYWxNYXJrVHlwZS5MaW5lLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLk1hcF06IEV4dGVybmFsTWFya1R5cGUuTWFwLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlBpZV06IEV4dGVybmFsTWFya1R5cGUuUGllLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlBvbHlnb25dOiBFeHRlcm5hbE1hcmtUeXBlLlBvbHlnb24sXG4gICAgW0ludGVybmFsTWFya1R5cGUuU2hhcGVdOiBFeHRlcm5hbE1hcmtUeXBlLlNoYXBlLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlNxdWFyZV06IEV4dGVybmFsTWFya1R5cGUuU3F1YXJlLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlRleHRdOiBFeHRlcm5hbE1hcmtUeXBlLlRleHQsXG4gICAgW0ludGVybmFsTWFya1R5cGUuVml6RXh0ZW5zaW9uXTogRXh0ZXJuYWxNYXJrVHlwZS5WaXpFeHRlbnNpb24sXG4gIH0pO1xufVxuLyogdHNsaW50OmVuYWJsZTp0eXBlZGVmICovXG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcywgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaW5nbGVFdmVudE1hbmFnZXIgfSBmcm9tICcuL1NpbmdsZUV2ZW50TWFuYWdlcic7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuL1RhYmxlYXVFcnJvcic7XG5cbi8qKlxuICogQ2xhc3MgZGVzaWduZWQgdG8gcmVnaXN0ZXIgYW5kIHVucmVnaXN0ZXIgaGFuZGxlcnMgZnJvbSBhIHVzZXIuIE9ubHkgdGhvc2UgZXZlbnRzXG4gKiB3aGljaCBhcmUgYWRkZWQgdmlhIEFkZE5ld0V2ZW50VHlwZSB3aWxsIGJlIHN1cHBvcnRlZCBieSB0aGlzIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudExpc3RlbmVyTWFuYWdlciBpbXBsZW1lbnRzIENvbnRyYWN0LkV2ZW50TGlzdGVuZXJNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBfZXZlbnRMaXN0ZW5lck1hbmFnZXJzOiB7IFt0YWJsZWF1RXZlbnRUeXBlOiBzdHJpbmddOiBTaW5nbGVFdmVudE1hbmFnZXIgfTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzID0ge307XG4gIH1cblxuICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIGhhbmRsZXI6IENvbnRyYWN0LlRhYmxlYXVFdmVudEhhbmRsZXJGbik6IENvbnRyYWN0LlRhYmxlYXVFdmVudFVucmVnaXN0ZXJGbiB7XG4gICAgaWYgKCF0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnMuaGFzT3duUHJvcGVydHkoZXZlbnRUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLlVuc3VwcG9ydGVkRXZlbnROYW1lLCBgQ2Fubm90IGFkZCBldmVudCwgdW5zdXBwb3J0ZWQgZXZlbnQgdHlwZTogJHtldmVudFR5cGV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vyc1tldmVudFR5cGVdLmFkZEV2ZW50TGlzdGVuZXIoaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIGhhbmRsZXI6IENvbnRyYWN0LlRhYmxlYXVFdmVudEhhbmRsZXJGbik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzLmhhc093blByb3BlcnR5KGV2ZW50VHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5VbnN1cHBvcnRlZEV2ZW50TmFtZSwgYENhbm5vdCByZW1vdmUgZXZlbnQsIHVuc3VwcG9ydGVkIGV2ZW50IHR5cGU6ICR7ZXZlbnRUeXBlfWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnNbZXZlbnRUeXBlXS5yZW1vdmVFdmVudExpc3RlbmVyKGhhbmRsZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZE5ld0V2ZW50VHlwZShldmVudE1hbmFnZXI6IFNpbmdsZUV2ZW50TWFuYWdlcik6IHZvaWQge1xuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vyc1tldmVudE1hbmFnZXIuZXZlbnRUeXBlXSA9IGV2ZW50TWFuYWdlcjtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IENvbHVtblR5cGUsIERhdGFUeXBlLCBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSwgRmllbGRSb2xlVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBGaWVsZEltcGwgfSBmcm9tICcuL0ltcGwvRmllbGRJbXBsJztcblxuZXhwb3J0IGNsYXNzIEZpZWxkIGltcGxlbWVudHMgQ29udHJhY3QuRmllbGQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZmllbGRJbXBsOiBGaWVsZEltcGwpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogRGF0YVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuZGF0YVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFnZ3JlZ2F0aW9uKCk6IEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmFnZ3JlZ2F0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhU291cmNlKCk6IENvbnRyYWN0LkRhdGFTb3VyY2Uge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuZGF0YVNvdXJjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcm9sZSgpOiBGaWVsZFJvbGVUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLnJvbGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbHVtblR5cGUoKTogQ29sdW1uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5jb2x1bW5UeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0NhbGN1bGF0ZWRGaWVsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzQ2FsY3VsYXRlZEZpZWxkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0NvbWJpbmVkRmllbGQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc0NvbWJpbmVkRmllbGQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzR2VuZXJhdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNHZW5lcmF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzR2Vvc3BhdGlhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzR2Vvc3BhdGlhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc0hpZGRlbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNQcmVzZW50T25QdWJsaXNoZWREYXRhc291cmNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNQcmVzZW50T25QdWJsaXNoZWREYXRhc291cmNlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDdXN0b21WaWV3TW9kZWwgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMsIFZpelNlcnZpY2UgfSBmcm9tICcuLi8uLi9BcGlTaGFyZWQnO1xuZXhwb3J0IGNsYXNzIEN1c3RvbVZpZXdJbXBsIHtcbiAgcHJpdmF0ZSBfbHVpZDogc3RyaW5nO1xuICBwcml2YXRlIF9uYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgX3NoYXJlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfaXNEZWZhdWx0OiBib29sZWFuO1xuICBwcml2YXRlIF9vd25lck5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfdXJsOiBzdHJpbmc7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihjdXN0b21WaWV3TW9kZWw6IEN1c3RvbVZpZXdNb2RlbCwgcHJpdmF0ZSBfcmVnaXN0cnlJZDogbnVtYmVyKSB7XG4gICAgdGhpcy5fbHVpZCA9IGN1c3RvbVZpZXdNb2RlbC5sdWlkO1xuICAgIHRoaXMuX25hbWUgPSBjdXN0b21WaWV3TW9kZWwubmFtZTtcbiAgICB0aGlzLl9zaGFyZWQgPSBjdXN0b21WaWV3TW9kZWwuc2hhcmVkO1xuICAgIHRoaXMuX2lzRGVmYXVsdCA9IGN1c3RvbVZpZXdNb2RlbC5pc0RlZmF1bHQ7XG4gICAgdGhpcy5fb3duZXJOYW1lID0gY3VzdG9tVmlld01vZGVsLm93bmVyLnVzZXJGcmllbmRseU5hbWU7XG4gICAgdGhpcy5fdXJsID0gY3VzdG9tVmlld01vZGVsLnVybDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbHVpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbHVpZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9uYW1lID0gbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hhcmVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zaGFyZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNoYXJlZChzaGFyZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaGFyZWQgPSBzaGFyZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNEZWZhdWx0O1xuICB9XG5cbiAgcHVibGljIHNldCBpc0RlZmF1bHQoaXNEZWZhdWx0OiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNEZWZhdWx0ID0gaXNEZWZhdWx0O1xuICB9XG5cbiAgcHVibGljIGdldCBvd25lck5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX293bmVyTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXJsKCkge1xuICAgIHJldHVybiB0aGlzLl91cmw7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUFzeW5jKCk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGw+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFZpelNlcnZpY2U+KFNlcnZpY2VOYW1lcy5WaXopO1xuICAgIHJldHVybiBzZXJ2aWNlLnNhdmVBc3luYyh0aGlzKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIERhc2hib2FyZExheW91dENoYW5nZSxcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyxcbiAgRXJyb3JDb2RlcyxcbiAgU2hhcmVkRXJyb3JDb2RlcyxcbiAgU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0VHlwZSwgRGFzaGJvYXJkWm9uZSwgU2hlZXRQYXRoLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vUG9pbnQnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0FuaW1hdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9ab25lU2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdEltcGwgfSBmcm9tICcuL0Rhc2hib2FyZE9iamVjdEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbXBsIH0gZnJvbSAnLi9TaGVldEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vU2hlZXRJbmZvSW1wbCc7XG5pbXBvcnQgeyBTdG9yeVBvaW50SW1wbCB9IGZyb20gJy4vU3RvcnlQb2ludEltcGwnO1xuaW1wb3J0IHsgV29ya3NoZWV0SW1wbCB9IGZyb20gJy4vV29ya3NoZWV0SW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRJbXBsIGV4dGVuZHMgU2hlZXRJbXBsIHtcbiAgcHJpdmF0ZSBfd29ya3NoZWV0c0ltcGw6IEFycmF5PFdvcmtzaGVldEltcGw+O1xuICBwcml2YXRlIF9vYmplY3RzOiBBcnJheTxEYXNoYm9hcmRPYmplY3RJbXBsPjtcbiAgcHJpdmF0ZSB6b25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgX3NoZWV0SW5mbzogU2hlZXRJbmZvSW1wbCxcbiAgICBwcml2YXRlIF96b25lczogQXJyYXk8RGFzaGJvYXJkWm9uZT4sXG4gICAgcHJpdmF0ZSBfc2hlZXRQYXRoOiBTaGVldFBhdGgsXG4gICAgX3JlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9wYXJlbnRTdG9yeVBvaW50SW1wbDogU3RvcnlQb2ludEltcGwgfCBudWxsLFxuICAgIHByaXZhdGUgX2FjdGl2ZURhc2hib2FyZE9iamVjdElkOiBudW1iZXIgPSAwLFxuICApIHtcbiAgICBzdXBlcihfc2hlZXRJbmZvLCBfcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldHNJbXBsKCk6IEFycmF5PFdvcmtzaGVldEltcGw+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0c0ltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9iamVjdHMoKTogQXJyYXk8RGFzaGJvYXJkT2JqZWN0SW1wbD4ge1xuICAgIHJldHVybiB0aGlzLl9vYmplY3RzO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJlbnRTdG9yeVBvaW50KCk6IFN0b3J5UG9pbnRJbXBsIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFN0b3J5UG9pbnRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmVEYXNoYm9hcmRPYmplY3RJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVEYXNoYm9hcmRPYmplY3RJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRGFzaGJvYXJkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zaGVldFBhdGguc2hlZXROYW1lO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcygpOiB2b2lkIHtcbiAgICB0aGlzLl93b3Jrc2hlZXRzSW1wbCA9IG5ldyBBcnJheTxXb3Jrc2hlZXRJbXBsPigpO1xuICAgIHRoaXMuX29iamVjdHMgPSBuZXcgQXJyYXk8RGFzaGJvYXJkT2JqZWN0SW1wbD4oKTtcbiAgICB0aGlzLnpvbmVNYXAgPSBuZXcgTWFwPG51bWJlciwgRGFzaGJvYXJkT2JqZWN0SW1wbD4oKTtcblxuICAgIC8vIFByb2Nlc3MgYWxsIHRoZSB6b25lcyB3aGljaCBhcmUgY29udGFpbmVkIGluIHRoaXMgZGFzaGJvYXJkXG4gICAgZm9yIChjb25zdCB6b25lIG9mIHRoaXMuX3pvbmVzKSB7XG4gICAgICBsZXQgd29ya3NoZWV0SW1wbDogV29ya3NoZWV0SW1wbCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3Qgem9uZVNpemU6IENvbnRyYWN0LlNpemUgPSB7IHdpZHRoOiB6b25lLndpZHRoLCBoZWlnaHQ6IHpvbmUuaGVpZ2h0IH07XG4gICAgICAvLyBBcyB0aGUgZGFzaGJvYXJkIGlzIGFjdGl2ZSwgYWxsIG90aGVyIHpvbmVzIGluIHRoZSBkYXNoYm9hcmQgYXJlIGluYWN0aXZlLlxuICAgICAgY29uc3QgaXNBY3RpdmUgPSBmYWxzZTtcblxuICAgICAgaWYgKHpvbmUuem9uZVR5cGUgPT09IERhc2hib2FyZE9iamVjdFR5cGUuV29ya3NoZWV0IHx8IHpvbmUuem9uZVR5cGUgPT09IERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXIpIHtcbiAgICAgICAgbGV0IHdvcmtzaGVldE5hbWUgPSAnJztcbiAgICAgICAgbGV0IHdvcmtzaGVldFVybCA9ICcnO1xuICAgICAgICBsZXQgaXNIaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKHpvbmUuc2hlZXRJbmZvKSB7XG4gICAgICAgICAgLy8gem9uZS5zaGVldEluZm8gd2FzIG5vdCBpbml0aWFsaXplZCBwcmlvciB0byBpbnRlcm5hbC1jb250cmFjdCAxLjYuMFxuICAgICAgICAgIHdvcmtzaGVldE5hbWUgPSB6b25lLnNoZWV0SW5mby5uYW1lO1xuXG4gICAgICAgICAgLy8gd29ya3NoZWV0VXJsICYgaXNIaWRkZW4gaXMgZm9yIEVtYmVkZGluZyBvbmx5XG4gICAgICAgICAgd29ya3NoZWV0VXJsID0gem9uZS5zaGVldEluZm8udXJsIHx8ICcnO1xuICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYSB1cmwsIHRoZW4gaXQncyBub3QgaGlkZGVuXG4gICAgICAgICAgaXNIaWRkZW4gPSB3b3Jrc2hlZXRVcmwgPT09ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdvcmtzaGVldE5hbWUgPSB6b25lLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW5kZXhlcywgaXNBY3RpdmUgYW5kIHNvbWUgbW9yZSBwcm9wZXJ0aWVzIGluIHNoZWV0SW5mb0ltcGwgYXJlIGVtYmVkZGluZyBzcGVjaWZpYy5cbiAgICAgICAgLy8gQnV0IHdlIGluaXQgdGhlbSBmb3IgYm90aCBleHRlbnNpb25zIGFuZCBlbWJlZGRpbmcgYXMgdGhlIE1vZGVscyB3aWxsIG9ubHkgdXNlIHdoYXQgaXMgcmVsZXZhbnQuXG4gICAgICAgIGNvbnN0IHNoZWV0SW5mb0ltcGwgPSBuZXcgU2hlZXRJbmZvSW1wbChcbiAgICAgICAgICB3b3Jrc2hlZXROYW1lLFxuICAgICAgICAgIFNoZWV0VHlwZS5Xb3Jrc2hlZXQsXG4gICAgICAgICAgem9uZVNpemUsXG4gICAgICAgICAgdGhpcy5fd29ya3NoZWV0c0ltcGwubGVuZ3RoLFxuICAgICAgICAgIGlzQWN0aXZlLFxuICAgICAgICAgIGlzSGlkZGVuLFxuICAgICAgICAgIHdvcmtzaGVldFVybCxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB2aXpJZDogVmlzdWFsSWQgPSB7XG4gICAgICAgICAgd29ya3NoZWV0OiB3b3Jrc2hlZXROYW1lLFxuICAgICAgICAgIGRhc2hib2FyZDogdGhpcy5fc2hlZXRJbmZvSW1wbC5uYW1lLFxuICAgICAgICAgIHN0b3J5Ym9hcmQ6IHRoaXMuX3NoZWV0UGF0aC5zdG9yeWJvYXJkLFxuICAgICAgICAgIGZsaXBib2FyZFpvbmVJRDogdGhpcy5fc2hlZXRQYXRoLmZsaXBib2FyZFpvbmVJRCxcbiAgICAgICAgICBzdG9yeVBvaW50SUQ6IHRoaXMuX3NoZWV0UGF0aC5zdG9yeVBvaW50SUQsXG4gICAgICAgIH07XG5cbiAgICAgICAgd29ya3NoZWV0SW1wbCA9IG5ldyBXb3Jrc2hlZXRJbXBsKHNoZWV0SW5mb0ltcGwsIHRoaXMuX3JlZ2lzdHJ5SWQsIHZpeklkLCB0aGlzLCB0aGlzLl9wYXJlbnRTdG9yeVBvaW50SW1wbCk7XG4gICAgICAgIGlmICh6b25lLnpvbmVUeXBlID09PSBEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldCkge1xuICAgICAgICAgIHRoaXMuX3dvcmtzaGVldHNJbXBsLnB1c2god29ya3NoZWV0SW1wbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgem9uZVBvaW50ID0gbmV3IFBvaW50KHpvbmUueCwgem9uZS55KTtcblxuICAgICAgY29uc3QgZGFzaGJvYXJkT2JqZWN0SW1wbCA9IG5ldyBEYXNoYm9hcmRPYmplY3RJbXBsKFxuICAgICAgICB0aGlzLFxuICAgICAgICBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuZGFzaGJvYXJkT2JqZWN0VHlwZS5jb252ZXJ0KHpvbmUuem9uZVR5cGUpLFxuICAgICAgICB6b25lUG9pbnQsXG4gICAgICAgIHpvbmVTaXplLFxuICAgICAgICB3b3Jrc2hlZXRJbXBsLFxuICAgICAgICB6b25lLm5hbWUsXG4gICAgICAgIHpvbmUuaXNGbG9hdGluZyAhPT0gdW5kZWZpbmVkID8gem9uZS5pc0Zsb2F0aW5nIDogZmFsc2UsIC8vIGJlZm9yZSAxLjYuMCB3ZSBkaWRuJ3QgaGF2ZSBpc0Zsb2F0aW5nLCBzbyB3ZSBhc3N1bWUgZmFsc2VcbiAgICAgICAgem9uZS5pc1Zpc2libGUgIT09IHVuZGVmaW5lZCA/IHpvbmUuaXNWaXNpYmxlIDogdHJ1ZSwgLy8gYmVmb3JlIDEuNi4wIHdlIGRpZG4ndCBoYXZlIGlzVmlzaWJsZSwgc28gd2UgYXNzdW1lIHRydWVcbiAgICAgICAgem9uZS56b25lSWQsXG4gICAgICAgIHpvbmUuZmllbGRJZCxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuX29iamVjdHMucHVzaChkYXNoYm9hcmRPYmplY3RJbXBsKTtcbiAgICAgIHRoaXMuem9uZU1hcC5zZXQoem9uZS56b25lSWQsIGRhc2hib2FyZE9iamVjdEltcGwpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXREYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5QXN5bmMoZGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcDogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcCB8IG9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHpvbmVTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFpvbmVTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuWm9uZSk7XG5cbiAgICByZXR1cm4gem9uZVNlcnZpY2Uuc2V0VmlzaWJpbGl0eUFzeW5jKC8qRGFzaGJvYXJkIE5hbWUqLyB0aGlzLm5hbWUsIHRoaXMuem9uZU1hcCwgZGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGFzaGJvYXJkT2JqZWN0QnlJZChkYXNoYm9hcmRPYmplY3RJZDogbnVtYmVyKTogRGFzaGJvYXJkT2JqZWN0SW1wbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuem9uZU1hcC5nZXQoZGFzaGJvYXJkT2JqZWN0SWQpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVpvbmVzKG5ld1pvbmVzOiBBcnJheTxEYXNoYm9hcmRab25lPiwgbmV3QWN0aXZlWm9uZUlkID0gMCwgbmV3QWN0aXZlRGFzaGJvYXJkTmFtZSA9ICcnKTogRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyB7XG4gICAgLy8gZ2V0dGluZyBwcmV2aW91cyBkYXNoYm9hcmQgb2JqZWN0cywgYWN0aXZlIHpvbmUgSUQgYW5kIGFjdGl2ZSBkYXNoYm9hcmQgbmFtZVxuICAgIGNvbnN0IG9sZERhc2hib2FyZE9iamVjdHMgPSB0aGlzLl9vYmplY3RzO1xuICAgIGNvbnN0IG9sZFpvbmVNYXAgPSB0aGlzLnpvbmVNYXA7XG4gICAgY29uc3Qgb2xkQWN0aXZlWm9uZUlkID0gdGhpcy5fYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQ7XG4gICAgY29uc3Qgb2xkQWN0aXZlRGFzaGJvYXJkTmFtZSA9IHRoaXMuX3NoZWV0UGF0aC5zaGVldE5hbWU7XG4gICAgLy8gdXBkYXRpbmcgem9uZXMgYW5kIHJlaW5pdGlhbGl6aW5nIGluc3RhbmNlIHZhcmlhYmxlc1xuICAgIHRoaXMuX3pvbmVzID0gbmV3Wm9uZXM7XG4gICAgdGhpcy5fYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQgPSBuZXdBY3RpdmVab25lSWQ7XG4gICAgaWYgKG5ld0FjdGl2ZURhc2hib2FyZE5hbWUpIHtcbiAgICAgIHRoaXMuX3NoZWV0UGF0aC5zaGVldE5hbWUgPSBuZXdBY3RpdmVEYXNoYm9hcmROYW1lO1xuICAgICAgdGhpcy5fc2hlZXRJbmZvSW1wbC5uYW1lID0gbmV3QWN0aXZlRGFzaGJvYXJkTmFtZTtcbiAgICB9XG4gICAgdGhpcy5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoKTtcbiAgICAvLyBnZXR0aW5nIG5ldyBkYXNoYm9hcmQgb2JqZWN0c1xuICAgIGNvbnN0IG5ld0Rhc2hib2FyZE9iamVjdHMgPSB0aGlzLl9vYmplY3RzO1xuICAgIGNvbnN0IG5ld1pvbmVNYXAgPSB0aGlzLnpvbmVNYXA7XG4gICAgLy8gaW5pdGlhbGl6aW5nIG1hcCBmb3IgY2hhbmdlc1xuICAgIGNvbnN0IHpvbmVDaGFuZ2VzOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzID0gbmV3IE1hcCgpO1xuXG4gICAgLy8gY29tcGFyaW5nIG9sZCBkYXNoYm9hcmQgb2JqZWN0cyB3aXRoIG5ldyBvbmVzXG4gICAgb2xkRGFzaGJvYXJkT2JqZWN0cy5mb3JFYWNoKChvbGRPYmplY3QpID0+IHtcbiAgICAgIGNvbnN0IG9sZElkOiBudW1iZXIgPSBvbGRPYmplY3QuaWQ7XG5cbiAgICAgIC8vIGNoZWNraW5nIGlmIHpvbmUgd2FzIHJlbW92ZWRcbiAgICAgIGlmICghbmV3Wm9uZU1hcC5oYXMob2xkSWQpKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLlJlbW92ZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld09iamVjdCA9IG5ld1pvbmVNYXAuZ2V0KG9sZElkKTtcbiAgICAgIGlmIChvbGRPYmplY3QuaXNGbG9hdGluZyAhPT0gbmV3T2JqZWN0IS5pc0Zsb2F0aW5nKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLklzRmxvYXRpbmdDaGFuZ2VkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZE9iamVjdC5pc1Zpc2libGUgIT09IG5ld09iamVjdCEuaXNWaXNpYmxlKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLklzVmlzaWJsZUNoYW5nZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkT2JqZWN0Lm5hbWUgIT09IG5ld09iamVjdCEubmFtZSkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5OYW1lQ2hhbmdlZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRPYmplY3QucG9zaXRpb24ueCAhPT0gbmV3T2JqZWN0IS5wb3NpdGlvbi54IHx8IG9sZE9iamVjdC5wb3NpdGlvbi55ICE9PSBuZXdPYmplY3QhLnBvc2l0aW9uLnkpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuUG9zaXRpb25DaGFuZ2VkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZE9iamVjdC5zaXplLndpZHRoICE9PSBuZXdPYmplY3QhLnNpemUud2lkdGggfHwgb2xkT2JqZWN0LnNpemUuaGVpZ2h0ICE9PSBuZXdPYmplY3QhLnNpemUuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLlNpemVDaGFuZ2VkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENoZWNraW5nIGZvciBhbnkgYWRkZWQgem9uZXNcbiAgICBuZXdEYXNoYm9hcmRPYmplY3RzLmZvckVhY2goKG5ld09iamVjdCkgPT4ge1xuICAgICAgaWYgKCFvbGRab25lTWFwLmhhcyhuZXdPYmplY3QuaWQpKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG5ld09iamVjdC5pZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5BZGRlZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDaGVja2luZyBpZiB6b25lIHNlbGVjdGlvbiBoYXMgY2hhbmdlZFxuICAgIGlmIChvbGRBY3RpdmVab25lSWQgIT09IG5ld0FjdGl2ZVpvbmVJZCkge1xuICAgICAgaWYgKG5ld0FjdGl2ZVpvbmVJZCAhPT0gMCkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShuZXdBY3RpdmVab25lSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuU2VsZWN0ZWQpO1xuICAgICAgfVxuICAgICAgaWYgKG9sZEFjdGl2ZVpvbmVJZCAhPT0gMCkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRBY3RpdmVab25lSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuRGVzZWxlY3RlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2tpbmcgaWYgc3dpdGNoZWQgdG8gYW5vdGhlciBkYXNoYm9hcmRcbiAgICBpZiAobmV3QWN0aXZlRGFzaGJvYXJkTmFtZSAmJiBvbGRBY3RpdmVEYXNoYm9hcmROYW1lICE9PSBuZXdBY3RpdmVEYXNoYm9hcmROYW1lKSB7XG4gICAgICB0aGlzLmFkZENoYW5nZSgwLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLkRhc2hib2FyZENoYW5nZWQpO1xuICAgIH1cblxuICAgIHJldHVybiB6b25lQ2hhbmdlcztcbiAgfVxuXG4gIHByaXZhdGUgYWRkQ2hhbmdlKHpvbmVJZDogbnVtYmVyLCB6b25lQ2hhbmdlczogRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscywgY2hhbmdlOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UpOiB2b2lkIHtcbiAgICBpZiAoIXpvbmVDaGFuZ2VzLmhhcyh6b25lSWQpKSB7XG4gICAgICB6b25lQ2hhbmdlcy5zZXQoem9uZUlkLCBbXSk7XG4gICAgfVxuXG4gICAgem9uZUNoYW5nZXMuZ2V0KHpvbmVJZCkhLnB1c2goY2hhbmdlKTtcbiAgfVxuXG4gIHB1YmxpYyBtb3ZlQW5kUmVzaXplRGFzaGJvYXJkT2JqZWN0c0FzeW5jKFxuICAgIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5OiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgem9uZVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Wm9uZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5ab25lKTtcblxuICAgIHJldHVybiB6b25lU2VydmljZS5tb3ZlQW5kUmVzaXplQXN5bmMoLypEYXNoYm9hcmQgTmFtZSovIHRoaXMubmFtZSwgdGhpcy56b25lTWFwLCBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSk7XG4gIH1cblxuICBwdWJsaWMgcmVwbGF5QW5pbWF0aW9uQXN5bmMocmVwbGF5U3BlZWQ6IENvbnRyYWN0LlJlcGxheVNwZWVkVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFuaW1hdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5pbWF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLkFuaW1hdGlvbik7XG5cbiAgICByZXR1cm4gYW5pbWF0aW9uU2VydmljZS5yZXBsYXlBc3luYyhyZXBsYXlTcGVlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXRPckVtYmVkZGVkSW5BY3RpdmVTdG9yeVBvaW50KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldERhc2hib2FyZEZpbHRlcnNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgb3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGU+KHVwZGF0ZVR5cGUsIENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsICdGaWx0ZXJVcGRhdGVUeXBlJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVN0cmluZ1BhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICd2YWx1ZXMgcGFyYW1ldGVyIGZvciBhcHBseURhc2hib2FyZEZpbHRlckFzeW5jIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldE9yRW1iZWRkZWRJbkFjdGl2ZVN0b3J5UG9pbnQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlEYXNoYm9hcmRGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyBAVy0xMjk4NjQzOTogcmVtb3ZlIG9uY2UgaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzIGlzIG1vdmVkIHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhpcyBjbGFzc1xuICAvLyBUaGlzIG1ldGhvZCBvbmx5IGV4aXN0cyBzaW5jZSB3b3Jrc2hlZXRzSW1wbCBjYW4gYmUgdW5kZWZpbmVkLCBidXQgd2UgbmVlZCB0aGUgd29ya3NoZWV0IG5hbWVzIGluIHRoZSBFeHBvcnQgQVBJc1xuICBwdWJsaWMgZ2V0V29ya3NoZWV0TmFtZXNGcm9tWm9uZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgY29uc3Qgd29ya3NoZWV0TmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCB6b25lIG9mIHRoaXMuX3pvbmVzKSB7XG4gICAgICBpZiAoem9uZS56b25lVHlwZSAhPT0gRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyB6b25lLnNoZWV0SW5mbyB3YXMgbm90IGluaXRpYWxpemVkIHByaW9yIHRvIGludGVybmFsLWNvbnRyYWN0IDEuNi4wXG4gICAgICBjb25zdCB3b3Jrc2hlZXROYW1lID0gem9uZS5zaGVldEluZm8gPyB6b25lLnNoZWV0SW5mby5uYW1lIDogem9uZS5uYW1lO1xuICAgICAgd29ya3NoZWV0TmFtZXMucHVzaCh3b3Jrc2hlZXROYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd29ya3NoZWV0TmFtZXM7XG4gIH1cblxuICBwcml2YXRlIHZlcmlmeUFjdGl2ZVNoZWV0T3JFbWJlZGRlZEluQWN0aXZlU3RvcnlQb2ludCgpIHtcbiAgICBjb25zdCBpc1Jvb3RBbmRBY3RpdmVEYXNoYm9hcmQgPSB0aGlzLmFjdGl2ZTtcbiAgICBjb25zdCBpc1dpdGhpbkFjdGl2ZVN0b3J5UG9pbnQgPSB0aGlzLnBhcmVudFN0b3J5UG9pbnQgIT0gbnVsbCAmJiB0aGlzLnBhcmVudFN0b3J5UG9pbnQuYWN0aXZlO1xuICAgIGlmICghaXNSb290QW5kQWN0aXZlRGFzaGJvYXJkICYmICFpc1dpdGhpbkFjdGl2ZVN0b3J5UG9pbnQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5Ob3RBY3RpdmVTaGVldCwgJ09wZXJhdGlvbiBub3QgYWxsb3dlZCBvbiBub24tYWN0aXZlIHNoZWV0Jyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRJbXBsIH0gZnJvbSAnLi9EYXNoYm9hcmRJbXBsJztcbmltcG9ydCB7IFdvcmtzaGVldEltcGwgfSBmcm9tICcuL1dvcmtzaGVldEltcGwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkYXNoYm9hcmQgb2JqZWN0cyAtIHRoZSB6b25lcyBpbiBhIGRhc2hib2FyZC5cbiAqIFRoaXMgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgaXQgaXMganVzdCBhIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIERhc2hib2FyZE9iamVjdEltcGwge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZGFzaGJvYXJkSW1wbDogRGFzaGJvYXJkSW1wbCxcbiAgICBwcml2YXRlIF90eXBlOiBEYXNoYm9hcmRPYmplY3RUeXBlLFxuICAgIHByaXZhdGUgX3Bvc2l0aW9uOiBDb250cmFjdC5Qb2ludCxcbiAgICBwcml2YXRlIF9zaXplOiBDb250cmFjdC5TaXplLFxuICAgIHByaXZhdGUgX3dvcmtzaGVldEltcGw6IFdvcmtzaGVldEltcGwgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgX2lzRmxvYXRpbmc6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNWaXNpYmxlOiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfZmllbGRJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICApIHt9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmRJbXBsKCk6IERhc2hib2FyZEltcGwge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IERhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBwb3NpdGlvbigpOiBDb250cmFjdC5Qb2ludCB7XG4gICAgcmV0dXJuIHRoaXMuX3Bvc2l0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBzaXplKCk6IENvbnRyYWN0LlNpemUge1xuICAgIHJldHVybiB0aGlzLl9zaXplO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXRJbXBsKCk6IFdvcmtzaGVldEltcGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRmxvYXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRmxvYXRpbmc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNWaXNpYmxlO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZElkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgSW50ZXJuYWxDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvblN1bW1hcnkgfSBmcm9tICcuLi9Db25uZWN0aW9uU3VtbWFyeSc7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4uL0ZpZWxkJztcbmltcG9ydCB7IExvZ2ljYWxUYWJsZSB9IGZyb20gJy4uL0xvZ2ljYWxUYWJsZSc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0RhdGFTb3VyY2VTZXJ2aWNlJztcbmltcG9ydCB7IEdldERhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvR2V0RGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgVGFibGVTdW1tYXJ5IH0gZnJvbSAnLi4vVGFibGVTdW1tYXJ5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBGaWVsZEltcGwgfSBmcm9tICcuL0ZpZWxkSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlSW1wbCB7XG4gIHByaXZhdGUgX2ZpZWxkczogQXJyYXk8RmllbGQ+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXRhU291cmNlSW5mbzogSW50ZXJuYWxDb250cmFjdC5EYXRhU291cmNlLCBwcml2YXRlIF9yZWdpc3RyeUlkOiBudW1iZXIpIHtcbiAgICB0aGlzLl9maWVsZHMgPSBfZGF0YVNvdXJjZUluZm8uZmllbGRzLm1hcCgoZmllbGRNb2RlbCkgPT4ge1xuICAgICAgY29uc3QgZmllbGRJbXBsID0gbmV3IEZpZWxkSW1wbChmaWVsZE1vZGVsLCB0aGlzKTtcbiAgICAgIHJldHVybiBuZXcgRmllbGQoZmllbGRJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXh0cmFjdFVwZGF0ZVRpbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uZXh0cmFjdFVwZGF0ZVRpbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBBcnJheTxDb250cmFjdC5GaWVsZD4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXh0cmFjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uaXNFeHRyYWN0O1xuICB9XG5cbiAgcHVibGljIGdldCBpc1B1Ymxpc2hlZCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uaXNQdWJsaXNoZWQ7XG4gIH1cblxuICBwdWJsaWMgcHVibGlzaGVkVXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbmZvLnB1Ymxpc2hlZFVybDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXhQYWdlUm93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLnJlZnJlc2hBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuQ29ubmVjdGlvblN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLmdldENvbm5lY3Rpb25TdW1tYXJpZXNBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCkudGhlbjxDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeVtdPigoc3VtbWFyaWVzKSA9PiB7XG4gICAgICByZXR1cm4gc3VtbWFyaWVzLm1hcCgoc3VtbWFyeSkgPT4gbmV3IENvbm5lY3Rpb25TdW1tYXJ5KHN1bW1hcnkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LlRhYmxlU3VtbWFyeT4+IHtcbiAgICBjb25zdCBkYXRhU291cmNlU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcblxuICAgIHJldHVybiBkYXRhU291cmNlU2VydmljZS5nZXRBY3RpdmVUYWJsZXNBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCkudGhlbjxBcnJheTxDb250cmFjdC5UYWJsZVN1bW1hcnk+PigodGFibGVJbmZvcykgPT4ge1xuICAgICAgcmV0dXJuIHRhYmxlSW5mb3MubWFwKCh0YWJsZUluZm8pID0+IG5ldyBUYWJsZVN1bW1hcnkodGFibGVJbmZvKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgZ2V0RGF0YVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHJldHVybiBnZXREYXRhU2VydmljZS5nZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgICAgdGhpcy5pZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsIC8vIDAgYW5kIFtdIGFyZSBkZWZhdWx0c1xuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlIHx8IFtdLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jKGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBnZXREYXRhU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIGdldERhdGFTZXJ2aWNlLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhcbiAgICAgIHRoaXMuaWQsXG4gICAgICBsb2dpY2FsVGFibGVJZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsIC8vIDAgYW5kIFtdIGFyZSBkZWZhdWx0c1xuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlIHx8IFtdLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIGNvbnN0IGdldERhdGFTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICByZXR1cm4gZ2V0RGF0YVNlcnZpY2UuZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgICAgdGhpcy5pZCxcbiAgICAgIGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgcGFnZVJvd0NvdW50IHx8IHRoaXMuZ2V0TWF4UGFnZVJvd0xpbWl0KCksXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcyhkYXRhU291cmNlOiBDb250cmFjdC5EYXRhU291cmNlKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUludGVybmFsVmFsdWUoZGF0YVNvdXJjZSwgJ2RhdGFTb3VyY2UnKTtcblxuICAgIHRoaXMuX2ZpZWxkcyA9IHRoaXMuX2RhdGFTb3VyY2VJbmZvLmZpZWxkcy5tYXAoKGZpZWxkTW9kZWwpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkSW1wbCA9IG5ldyBGaWVsZEltcGwoZmllbGRNb2RlbCwgZGF0YVNvdXJjZSk7XG4gICAgICByZXR1cm4gbmV3IEZpZWxkKGZpZWxkSW1wbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLmdldExvZ2ljYWxUYWJsZXNBc3luYyh0aGlzLmlkKS50aGVuPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+KChsb2dpY2FsVGFibGVJbmZvcykgPT4ge1xuICAgICAgcmV0dXJuIGxvZ2ljYWxUYWJsZUluZm9zLm1hcCgobG9naWNhbFRhYmxlSW5mbykgPT4gbmV3IExvZ2ljYWxUYWJsZShsb2dpY2FsVGFibGVJbmZvKSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcblxuZXhwb3J0IGNsYXNzIEZpZWxkSW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9maWVsZEluZm86IEludGVybmFsQ29udHJhY3QuRmllbGQsIHByaXZhdGUgX3BhcmVudERhdGFTb3VyY2U/OiBDb250cmFjdC5EYXRhU291cmNlKSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uZGVzY3JpcHRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IENvbnRyYWN0LkRhdGFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmRhdGFUeXBlID8/IENvbnRyYWN0LkRhdGFUeXBlLlVua25vd247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFnZ3JlZ2F0aW9uKCk6IENvbnRyYWN0LkZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICByZXR1cm4gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmZpZWxkQWdncmVnYXRpb25UeXBlLmNvbnZlcnQodGhpcy5fZmllbGRJbmZvLmFnZ3JlZ2F0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVNvdXJjZSgpOiBDb250cmFjdC5EYXRhU291cmNlIHtcbiAgICBpZiAoIXRoaXMuX3BhcmVudERhdGFTb3VyY2UpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEYXRhIHNvdXJjZSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGlzIGZpZWxkLiBQbGVhc2UgdXNlIGdldEZpZWxkQXN5bmMgbWV0aG9kIHRvIGdldCBmaWVsZCdzIGRhdGEgc291cmNlIGluZm9ybWF0aW9uYCxcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudERhdGFTb3VyY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJvbGUoKTogQ29udHJhY3QuRmllbGRSb2xlVHlwZSB7XG4gICAgcmV0dXJuIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5maWVsZFJvbGVUeXBlLmNvbnZlcnQodGhpcy5fZmllbGRJbmZvLnJvbGUpO1xuICB9XG5cbiAgcHVibGljIGdldCBjb2x1bW5UeXBlKCk6IENvbnRyYWN0LkNvbHVtblR5cGUge1xuICAgIGxldCBkZWZpbmVkVmFsdWU6IEludGVybmFsQ29udHJhY3QuQ29sdW1uVHlwZSA9IHRoaXMuX2ZpZWxkSW5mby5jb2x1bW5UeXBlIHx8IEludGVybmFsQ29udHJhY3QuQ29sdW1uVHlwZS5Vbmtub3duO1xuICAgIHJldHVybiBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuY29sdW1uVHlwZS5jb252ZXJ0KGRlZmluZWRWYWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ2FsY3VsYXRlZEZpZWxkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNDYWxjdWxhdGVkRmllbGQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ29tYmluZWRGaWVsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlzQ29tYmluZWRGaWVsZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNHZW5lcmF0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc0dlbmVyYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNHZW9zcGF0aWFsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNHZW9zcGF0aWFsO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0hpZGRlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlzSGlkZGVuO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1ByZXNlbnRPblB1Ymxpc2hlZERhdGFzb3VyY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc1ByZXNlbnRPblB1Ymxpc2hlZERhdGFzb3VyY2U7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhVHlwZSwgUGFyYW1ldGVyVmFsdWVUeXBlLCBQZXJpb2RUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFBhcmFtZXRlckluZm8gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBEYXRhVmFsdWUgfSBmcm9tICcuLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1BhcmFtZXRlcnNTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IERhdGFWYWx1ZUZhY3RvcnkgfSBmcm9tICcuLi9VdGlscy9EYXRhVmFsdWVGYWN0b3J5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uL1V0aWxzL1BhcmFtJztcblxuZXhwb3J0IGNsYXNzIFBhcmFtZXRlckltcGwge1xuICBwcml2YXRlIF9hbGxvd2FibGVWYWx1ZXM6IENvbnRyYWN0LlBhcmFtZXRlckRvbWFpblJlc3RyaWN0aW9uO1xuICBwcml2YXRlIF9nbG9iYWxGaWVsZE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfcGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbztcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbywgcHJpdmF0ZSBfcmVnaXN0cnlJZDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQYXJhbWV0ZXJJbmZvKHBhcmFtZXRlckluZm8pO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlckluZm8ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFZhbHVlKCk6IERhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVBhcmFtZXRlckRhdGFWYWx1ZSh0aGlzLl9wYXJhbWV0ZXJJbmZvLmN1cnJlbnRWYWx1ZSwgdGhpcy5fcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IERhdGFUeXBlIHtcbiAgICByZXR1cm4gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmRhdGFUeXBlLmNvbnZlcnQodGhpcy5fcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2dsb2JhbEZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWxsb3dhYmxlVmFsdWVzKCk6IENvbnRyYWN0LlBhcmFtZXRlckRvbWFpblJlc3RyaWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dhYmxlVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVZhbHVlQXN5bmMobmV3VmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlKTogUHJvbWlzZTxEYXRhVmFsdWU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKG5ld1ZhbHVlLCAnbmV3VmFsdWUnKTtcblxuICAgIGNvbnN0IGNvZXJjZWRWYWx1ZSA9IFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKG5ld1ZhbHVlKTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBwYXJhbWV0ZXJzU2VydmljZS5jaGFuZ2VQYXJhbWV0ZXJWYWx1ZUFzeW5jKHRoaXMuX2dsb2JhbEZpZWxkTmFtZSwgY29lcmNlZFZhbHVlKS50aGVuKChwYXJhbWV0ZXJJbmZvKSA9PiB7XG4gICAgICB0aGlzLnNldFBhcmFtZXRlckluZm8ocGFyYW1ldGVySW5mbyk7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50VmFsdWU7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldFBhcmFtZXRlckluZm8ocGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbyk6IHZvaWQge1xuICAgIHRoaXMuX3BhcmFtZXRlckluZm8gPSBwYXJhbWV0ZXJJbmZvO1xuICAgIHRoaXMuX2dsb2JhbEZpZWxkTmFtZSA9IHBhcmFtZXRlckluZm8uZmllbGROYW1lO1xuXG4gICAgY29uc3QgdHlwZSA9IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5hbGxvd2FibGVWYWx1ZXMuY29udmVydChwYXJhbWV0ZXJJbmZvLmFsbG93YWJsZVZhbHVlc1R5cGUpO1xuICAgIGxldCBsaXN0VmFsdWVzOiBBcnJheTxEYXRhVmFsdWU+IHwgdW5kZWZpbmVkO1xuICAgIGxldCBtaW5WYWx1ZTogRGF0YVZhbHVlIHwgdW5kZWZpbmVkO1xuICAgIGxldCBtYXhWYWx1ZTogRGF0YVZhbHVlIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdGVwU2l6ZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGxldCBkYXRlU3RlcFBlcmlvZDogUGVyaW9kVHlwZSB8IHVuZGVmaW5lZDtcblxuICAgIGlmICh0eXBlID09PSBQYXJhbWV0ZXJWYWx1ZVR5cGUuTGlzdCkge1xuICAgICAgY29uc3QgdmFsdWVzID0gcGFyYW1ldGVySW5mby5hbGxvd2FibGVWYWx1ZXMgfHwgW107XG4gICAgICBsaXN0VmFsdWVzID0gdmFsdWVzLm1hcCgodmFsKSA9PiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUodmFsLCBwYXJhbWV0ZXJJbmZvLmRhdGFUeXBlKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBQYXJhbWV0ZXJWYWx1ZVR5cGUuUmFuZ2UpIHtcbiAgICAgIG1pblZhbHVlID0gcGFyYW1ldGVySW5mby5taW5WYWx1ZSAmJiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUocGFyYW1ldGVySW5mby5taW5WYWx1ZSwgcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gICAgICBtYXhWYWx1ZSA9IHBhcmFtZXRlckluZm8ubWF4VmFsdWUgJiYgRGF0YVZhbHVlRmFjdG9yeS5NYWtlUGFyYW1ldGVyRGF0YVZhbHVlKHBhcmFtZXRlckluZm8ubWF4VmFsdWUsIHBhcmFtZXRlckluZm8uZGF0YVR5cGUpO1xuICAgICAgc3RlcFNpemUgPSBwYXJhbWV0ZXJJbmZvLnN0ZXBTaXplO1xuICAgICAgZGF0ZVN0ZXBQZXJpb2QgPSBwYXJhbWV0ZXJJbmZvLmRhdGVTdGVwUGVyaW9kICYmIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5kYXRlU3RlcFBlcmlvZC5jb252ZXJ0KHBhcmFtZXRlckluZm8uZGF0ZVN0ZXBQZXJpb2QpO1xuICAgIH1cblxuICAgIHRoaXMuX2FsbG93YWJsZVZhbHVlcyA9IHtcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBhbGxvd2FibGVWYWx1ZXM6IGxpc3RWYWx1ZXMsXG4gICAgICBtaW5WYWx1ZTogbWluVmFsdWUsXG4gICAgICBtYXhWYWx1ZTogbWF4VmFsdWUsXG4gICAgICBzdGVwU2l6ZTogc3RlcFNpemUsXG4gICAgICBkYXRlU3RlcFBlcmlvZDogZGF0ZVN0ZXBQZXJpb2QsXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNoZWV0UGF0aCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDbGllbnRJbmZvU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0NsaWVudEluZm9TZXJ2aWNlJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvUGFyYW1ldGVyc1NlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2l6ZVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9TaXplU2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi4vVXRpbHMvUGFyYW0nO1xuaW1wb3J0IHsgU2hlZXRVdGlscyB9IGZyb20gJy4uL1V0aWxzL1NoZWV0VXRpbHMnO1xuaW1wb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4vUGFyYW1ldGVySW1wbCc7XG5pbXBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9TaGVldEluZm9JbXBsJztcblxuaW50ZXJmYWNlIFBhcnRpYWxTaGVldFNpemUge1xuICAvKipcbiAgICogQ29udGFpbnMgYW4gZW51bWVyYXRpb24gdmFsdWUgb2Ygb25lIG9mIHRoZSBmb2xsb3dpbmc6IEFVVE9NQVRJQywgRVhBQ1RMWSwgUkFOR0UsIEFUTEVBU1QsIGFuZCBBVE1PU1QuXG4gICAqL1xuICByZWFkb25seSBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqICBUaGlzIGlzIG9ubHkgZGVmaW5lZCB3aGVuIGJlaGF2aW9yIGlzIEVYQUNUTFksIFJBTkdFLCBvciBBVExFQVNULlxuICAgKi9cbiAgcmVhZG9ubHkgbWluU2l6ZT86IFBhcnRpYWw8Q29udHJhY3QuU2l6ZT47XG5cbiAgLyoqXG4gICAqICBUaGlzIGlzIG9ubHkgZGVmaW5lZCB3aGVuIGJlaGF2aW9yIGlzIEVYQUNUTFksIFJBTkdFIG9yIEFUTU9TVC5cbiAgICovXG4gIHJlYWRvbmx5IG1heFNpemU/OiBQYXJ0aWFsPENvbnRyYWN0LlNpemU+O1xufVxuXG5leHBvcnQgY2xhc3MgU2hlZXRJbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfc2hlZXRJbmZvSW1wbDogU2hlZXRJbmZvSW1wbCwgcHJvdGVjdGVkIF9yZWdpc3RyeUlkOiBudW1iZXIpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hlZXRUeXBlKCk6IENvbnRyYWN0LlNoZWV0VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuc2hlZXRUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFBhdGgoKTogU2hlZXRQYXRoIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5zaGVldFBhdGg7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpemUoKTogQ29udHJhY3QuU2l6ZSB8IENvbnRyYWN0LlNoZWV0U2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuc2hlZXRTaXplO1xuICB9XG5cbiAgcHVibGljIGdldCBoaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX3NoZWV0SW5mb0ltcGwuaXNIaWRkZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuaXNIaWRkZW47XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgaXNIaWRkZW4gbm90IGltcGxlbWVudGVkYCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fc2hlZXRJbmZvSW1wbC5pc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5pc0FjdGl2ZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBhY3RpdmUgbm90IGltcGxlbWVudGVkYCk7XG4gIH1cblxuICBwdWJsaWMgc2V0IGFjdGl2ZShhY3RpdmU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5fc2hlZXRJbmZvSW1wbC5pc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9zaGVldEluZm9JbXBsLmFjdGl2ZSA9IGFjdGl2ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX3NoZWV0SW5mb0ltcGwuaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuaW5kZXg7XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgaW5kZXggbm90IGltcGxlbWVudGVkYCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl9zaGVldEluZm9JbXBsLnVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC51cmw7XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgdXJsIG5vdCBpbXBsZW1lbnRlZGApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTaGVldFNpemUoKTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBpZiAoIVNoZWV0VXRpbHMuaXNWYWxpZFNoZWV0U2l6ZSh0aGlzLnNpemUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3NpemUgaXMgbm90IG9mIHR5cGUgU2hlZXRTaXplJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQXN5bmMocGFyYW1ldGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTxQYXJhbWV0ZXJJbXBsIHwgdW5kZWZpbmVkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lLCAncGFyYW1ldGVyTmFtZScpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBzZXJ2aWNlLmZpbmRQYXJhbWV0ZXJCeU5hbWVBc3luYyhwYXJhbWV0ZXJOYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxQYXJhbWV0ZXJJbXBsPj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8UGFyYW1ldGVyc1NlcnZpY2U+KFNlcnZpY2VOYW1lcy5QYXJhbWV0ZXJzKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRQYXJhbWV0ZXJzRm9yU2hlZXRBc3luYyh0aGlzLnNoZWV0UGF0aCk7XG4gIH1cblxuICBwdWJsaWMgY2hhbmdlU2l6ZUFzeW5jKG5ld1NpemU6IENvbnRyYWN0LlNoZWV0U2l6ZSk6IFByb21pc2U8Q29udHJhY3QuU2hlZXRTaXplPiB7XG4gICAgY29uc3QgaW52YWxpZFNpemVFcnJvciA9IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkU2l6ZSwgJ0ludmFsaWQgc2hlZXQgc2l6ZSBwYXJhbWV0ZXInKTtcbiAgICBpZiAoIW5ld1NpemUgfHwgIW5ld1NpemUuYmVoYXZpb3IpIHtcbiAgICAgIHRocm93IGludmFsaWRTaXplRXJyb3I7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydGlhbFNoZWV0U2l6ZSA9IHRoaXMubm9ybWFsaXplU2hlZXRTaXplKG5ld1NpemUpO1xuXG4gICAgY29uc3QgaXNBdXRvbWF0aWMgPSBwYXJ0aWFsU2hlZXRTaXplLmJlaGF2aW9yID09PSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWM7XG4gICAgaWYgKCFpc0F1dG9tYXRpYyAmJiAhcGFydGlhbFNoZWV0U2l6ZS5taW5TaXplICYmICFwYXJ0aWFsU2hlZXRTaXplLm1heFNpemUpIHtcbiAgICAgIHRocm93IGludmFsaWRTaXplRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKCFpc0F1dG9tYXRpYyAmJiB0aGlzLnNoZWV0VHlwZSA9PT0gQ29udHJhY3QuU2hlZXRUeXBlLldvcmtzaGVldCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkU2l6ZUJlaGF2aW9yT25Xb3Jrc2hlZXQsXG4gICAgICAgICdPbmx5IFNoZWV0U2l6ZUJlaGF2aW9yLkF1dG9tYXRpYyBpcyBhbGxvd2VkIG9uIFdvcmtzaGVldHMnLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNBdXRvbWF0aWMgJiYgdGhpcy5nZXRTaGVldFNpemUoKS5iZWhhdmlvciA9PT0gcGFydGlhbFNoZWV0U2l6ZS5iZWhhdmlvcikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXdTaXplKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9jZXNzZWROZXdTaXplID0gdGhpcy5wcm9jZXNzTmV3U2l6ZShwYXJ0aWFsU2hlZXRTaXplKTtcblxuICAgIGNvbnN0IHNpemVTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNpemVTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2l6ZSk7XG4gICAgcmV0dXJuIHNpemVTZXJ2aWNlLmNoYW5nZVNpemVBc3luYyh0aGlzLm5hbWUsIHByb2Nlc3NlZE5ld1NpemUpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgY2xpZW50SW5mb1NlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Q2xpZW50SW5mb1NlcnZpY2U+KFNlcnZpY2VOYW1lcy5DbGllbnRJbmZvKTtcblxuICAgICAgcmV0dXJuIGNsaWVudEluZm9TZXJ2aWNlLmdldENsaWVudEluZm9Bc3luYygpLnRoZW4oKGJvb3RzdHJhcEluZm8pID0+IHtcbiAgICAgICAgY29uc3Qgc2hlZXQgPSBib290c3RyYXBJbmZvLnB1Ymxpc2hlZFNoZWV0cy5maW5kKChzKSA9PiBzLm5hbWUgPT09IHRoaXMubmFtZSk7XG4gICAgICAgIGlmICghc2hlZXQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYENhbid0IGZpbmQgc2hlZXQgd2l0aCBuYW1lICR7dGhpcy5uYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2hlZXRTaXplID0gU2hlZXRVdGlscy5nZXRTaGVldFNpemVGcm9tU2l6ZUNvbnN0cmFpbnRzKHNoZWV0LnNpemVDb25zdHJhaW50KTtcbiAgICAgICAgdGhpcy5fc2hlZXRJbmZvSW1wbC5zaGVldFNpemUgPSBzaGVldFNpemU7XG5cbiAgICAgICAgcmV0dXJuIHNoZWV0U2l6ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVTaGVldFNpemUobmV3U2l6ZTogQ29udHJhY3QuU2hlZXRTaXplKTogUGFydGlhbFNoZWV0U2l6ZSB7XG4gICAgY29uc3QgeyBiZWhhdmlvciB9ID0gbmV3U2l6ZTtcblxuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3I+KGJlaGF2aW9yLCBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvciwgJ1NoZWV0U2l6ZUJlaGF2aW9yJyk7XG5cbiAgICBjb25zdCBtaW5TaXplID0gU2hlZXRJbXBsLnBhcnNlRGltZW5zaW9ucyhuZXdTaXplLm1pblNpemUpO1xuICAgIGNvbnN0IG1heFNpemUgPSBTaGVldEltcGwucGFyc2VEaW1lbnNpb25zKG5ld1NpemUubWF4U2l6ZSk7XG5cbiAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSwgbWF4U2l6ZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzTmV3U2l6ZShuZXdTaXplOiBQYXJ0aWFsU2hlZXRTaXplKTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBjb25zdCB7IGJlaGF2aW9yLCBtaW5TaXplOiBtaW5TaXplTWF5YmUsIG1heFNpemU6IG1heFNpemVNYXliZSB9ID0gbmV3U2l6ZTtcblxuICAgIGNvbnN0IGhhc01pbldpZHRoID0gIVBhcmFtLmlzTnVsbE9yVW5kZWZpbmVkKG1pblNpemVNYXliZT8ud2lkdGgpO1xuICAgIGNvbnN0IGhhc01pbkhlaWdodCA9ICFQYXJhbS5pc051bGxPclVuZGVmaW5lZChtaW5TaXplTWF5YmU/LmhlaWdodCk7XG4gICAgY29uc3QgaGFzTWF4V2lkdGggPSAhUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQobWF4U2l6ZU1heWJlPy53aWR0aCk7XG4gICAgY29uc3QgaGFzTWF4SGVpZ2h0ID0gIVBhcmFtLmlzTnVsbE9yVW5kZWZpbmVkKG1heFNpemVNYXliZT8uaGVpZ2h0KTtcbiAgICBjb25zdCBoYXNWYWxpZE1pblNpemUgPSBoYXNNaW5XaWR0aCAmJiBoYXNNaW5IZWlnaHQ7XG4gICAgY29uc3QgaGFzVmFsaWRNYXhTaXplID0gaGFzTWF4V2lkdGggJiYgaGFzTWF4SGVpZ2h0O1xuXG4gICAgc3dpdGNoIChiZWhhdmlvcikge1xuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWM6IHtcbiAgICAgICAgcmV0dXJuIHsgYmVoYXZpb3IgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdE1vc3Q6IHtcbiAgICAgICAgaWYgKCFtYXhTaXplTWF5YmUgfHwgIWhhc1ZhbGlkTWF4U2l6ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5NaXNzaW5nTWF4U2l6ZSwgJ01pc3NpbmcgbWF4U2l6ZSBmb3IgU2hlZXRTaXplQmVoYXZpb3IuQXRNb3N0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXhTaXplID0geyB3aWR0aDogbWF4U2l6ZU1heWJlLndpZHRoISwgaGVpZ2h0OiBtYXhTaXplTWF5YmUuaGVpZ2h0ISB9O1xuICAgICAgICBpZiAobWF4U2l6ZS53aWR0aCA8IDAgfHwgbWF4U2l6ZS5oZWlnaHQgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnU2l6ZSB2YWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtYXhTaXplIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuQXRMZWFzdDoge1xuICAgICAgICBpZiAoIW1pblNpemVNYXliZSB8fCAhaGFzVmFsaWRNaW5TaXplKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLk1pc3NpbmdNaW5TaXplLCAnTWlzc2luZyBtaW5TaXplIGZvciBTaGVldFNpemVCZWhhdmlvci5BdExlYXN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtaW5TaXplID0geyB3aWR0aDogbWluU2l6ZU1heWJlLndpZHRoISwgaGVpZ2h0OiBtaW5TaXplTWF5YmUuaGVpZ2h0ISB9O1xuICAgICAgICBpZiAobWluU2l6ZS53aWR0aCA8IDAgfHwgbWluU2l6ZS5oZWlnaHQgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnU2l6ZSB2YWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2U6IHtcbiAgICAgICAgaWYgKCFtaW5TaXplTWF5YmUgfHwgIW1heFNpemVNYXliZSB8fCAhaGFzVmFsaWRNaW5TaXplIHx8ICFoYXNWYWxpZE1heFNpemUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuTWlzc2luZ01pbk1heFNpemUsICdNaXNzaW5nIG1pblNpemUgb3IgbWF4U2l6ZSBmb3IgU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1pblNpemUgPSB7IHdpZHRoOiBtaW5TaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1pblNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgIGNvbnN0IG1heFNpemUgPSB7IHdpZHRoOiBtYXhTaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1heFNpemVNYXliZS5oZWlnaHQhIH07XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1pblNpemUud2lkdGggPCAwIHx8XG4gICAgICAgICAgbWluU2l6ZS5oZWlnaHQgPCAwIHx8XG4gICAgICAgICAgbWF4U2l6ZS53aWR0aCA8IDAgfHxcbiAgICAgICAgICBtYXhTaXplLmhlaWdodCA8IDAgfHxcbiAgICAgICAgICBtaW5TaXplLndpZHRoID4gbWF4U2l6ZS53aWR0aCB8fFxuICAgICAgICAgIG1pblNpemUuaGVpZ2h0ID4gbWF4U2l6ZS5oZWlnaHRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnTWlzc2luZyBtaW5TaXplIG9yIG1heFNpemUgZm9yIFNoZWV0U2l6ZUJlaGF2aW9yLlJhbmdlJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSwgbWF4U2l6ZSB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlIENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLkV4YWN0bHk6IHtcbiAgICAgICAgaWYgKG1pblNpemVNYXliZSAmJiBtYXhTaXplTWF5YmUpIHtcbiAgICAgICAgICBpZiAoaGFzVmFsaWRNaW5TaXplICYmIGhhc1ZhbGlkTWF4U2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgbWluU2l6ZSA9IHsgd2lkdGg6IG1pblNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWluU2l6ZU1heWJlLmhlaWdodCEgfTtcbiAgICAgICAgICAgIGNvbnN0IG1heFNpemUgPSB7IHdpZHRoOiBtYXhTaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1heFNpemVNYXliZS5oZWlnaHQhIH07XG5cbiAgICAgICAgICAgIGlmIChtaW5TaXplLndpZHRoICE9PSBtYXhTaXplLndpZHRoIHx8IG1pblNpemUuaGVpZ2h0ICE9PSBtYXhTaXplLmhlaWdodCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW52YWxpZFNpemUsICdDb25mbGljdGluZyBzaXplIHZhbHVlcyBmb3IgU2hlZXRTaXplQmVoYXZpb3IuRXhhY3RseScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSwgbWF4U2l6ZSB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNWYWxpZE1pblNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pblNpemUgPSB7IHdpZHRoOiBtaW5TaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1pblNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSwgbWF4U2l6ZTogbWluU2l6ZSB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNWYWxpZE1heFNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1heFNpemUgPSB7IHdpZHRoOiBtYXhTaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1heFNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZTogbWF4U2l6ZSwgbWF4U2l6ZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkU2l6ZSwgJ0ludmFsaWQgc2hlZXQgc2l6ZSBwYXJhbWV0ZXInKTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFVuc3VwcG9ydGVkIHNoZWV0IHNpemUgYmVoYXZpb3I6ICR7YmVoYXZpb3J9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VEaW1lbnNpb25zID0gKHNpemU6IENvbnRyYWN0LlNpemUgfCB1bmRlZmluZWQpOiBQYXJ0aWFsPENvbnRyYWN0LlNpemU+ID0+IHtcbiAgICBjb25zdCBlbXB0eSA9IHsgd2lkdGg6IHVuZGVmaW5lZCwgaGVpZ2h0OiB1bmRlZmluZWQgfTtcblxuICAgIGlmICghc2l6ZSkge1xuICAgICAgcmV0dXJuIGVtcHR5O1xuICAgIH1cblxuICAgIGNvbnN0IHsgc3VjY2Vzczogd2lkdGhQYXJzZWQsIHBhcnNlZDogcGFyc2VkV2lkdGggfSA9IFBhcmFtLnRyeVBhcnNlTnVtYmVyKHNpemUud2lkdGgpO1xuICAgIGNvbnN0IHsgc3VjY2VzczogaGVpZ2h0UGFyc2VkLCBwYXJzZWQ6IHBhcnNlZEhlaWdodCB9ID0gUGFyYW0udHJ5UGFyc2VOdW1iZXIoc2l6ZS5oZWlnaHQpO1xuXG4gICAgaWYgKHdpZHRoUGFyc2VkICYmIGhlaWdodFBhcnNlZCkge1xuICAgICAgcmV0dXJuIHsgd2lkdGg6IHBhcnNlZFdpZHRoISwgaGVpZ2h0OiBwYXJzZWRIZWlnaHQhIH07XG4gICAgfVxuXG4gICAgaWYgKHdpZHRoUGFyc2VkKSB7XG4gICAgICByZXR1cm4geyB3aWR0aDogcGFyc2VkV2lkdGghIH07XG4gICAgfVxuXG4gICAgaWYgKGhlaWdodFBhcnNlZCkge1xuICAgICAgcmV0dXJuIHsgaGVpZ2h0OiBwYXJzZWRIZWlnaHQhIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGVtcHR5O1xuICB9O1xufVxuIiwiaW1wb3J0IHsgU2hlZXRTaXplIGFzIEVtYmVkZGluZ1NoZWV0U2l6ZSwgU2l6ZSBhcyBFeHRlbnNpb25TaGVldFNpemUsIFNoZWV0VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaGVldFBhdGggfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgU2hlZXRJbmZvSW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9uYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfc2hlZXRUeXBlOiBTaGVldFR5cGUsXG4gICAgcHJpdmF0ZSBfc2hlZXRTaXplOiBFeHRlbnNpb25TaGVldFNpemUgfCBFbWJlZGRpbmdTaGVldFNpemUsXG4gICAgcHJpdmF0ZSBfaW5kZXg/OiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfaXNBY3RpdmU/OiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lzSGlkZGVuPzogYm9vbGVhbixcbiAgICBwcml2YXRlIF91cmw/OiBzdHJpbmcsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbmFtZShzaGVldE5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuX25hbWUgPSBzaGVldE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0U2l6ZSgpOiBFeHRlbnNpb25TaGVldFNpemUgfCBFbWJlZGRpbmdTaGVldFNpemUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldFNpemU7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNoZWV0U2l6ZSh2YWx1ZTogRXh0ZW5zaW9uU2hlZXRTaXplIHwgRW1iZWRkaW5nU2hlZXRTaXplKSB7XG4gICAgdGhpcy5fc2hlZXRTaXplID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0VHlwZSgpOiBTaGVldFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0UGF0aCgpOiBTaGVldFBhdGgge1xuICAgIHJldHVybiB7XG4gICAgICBzaGVldE5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGlzRGFzaGJvYXJkOiB0aGlzLnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICAgIC8vIFRPRE8gLSBTdG9yaWVzXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faW5kZXg7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQWN0aXZlKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc0FjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgYWN0aXZlKGFjdGl2ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzQWN0aXZlID0gYWN0aXZlO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0hpZGRlbigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXNIaWRkZW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVybCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91cmw7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlciB9IGZyb20gJy4uL1NpbmdsZUV2ZW50TWFuYWdlcic7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBTaW5nbGVFdmVudE1hbmFnZXIgaW50ZXJmYWNlIGZvciBhIHNpbmdsZSB0eXBlIG9mIFRhYmxlYXUgZXZlbnRcbiAqXG4gKiBAdGVtcGxhdGUgVEV2ZW50VHlwZSBUaGUgVGFibGVhdSBldmVudCB0eXBlIHRoaXMgY2xhc3Mgc3BlY2lhbGl6ZXNcbiAqL1xuZXhwb3J0IGNsYXNzIFNpbmdsZUV2ZW50TWFuYWdlckltcGw8VEV2ZW50VHlwZSBleHRlbmRzIENvbnRyYWN0LlRhYmxlYXVFdmVudD4gaW1wbGVtZW50cyBTaW5nbGVFdmVudE1hbmFnZXIge1xuICBwcml2YXRlIF9ldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGU7XG4gIHByaXZhdGUgX2hhbmRsZXJzOiBBcnJheTwoZXZlbnRPYmo6IFRFdmVudFR5cGUpID0+IHZvaWQ+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGUpIHtcbiAgICB0aGlzLl9ldmVudFR5cGUgPSBldmVudFR5cGU7XG4gICAgdGhpcy5faGFuZGxlcnMgPSBbXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXZlbnRUeXBlKCk6IFRhYmxlYXVFdmVudFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9ldmVudFR5cGU7XG4gIH1cblxuICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcihoYW5kbGVyOiAoZXZlbnRPYmo6IFRFdmVudFR5cGUpID0+IHZvaWQpOiBDb250cmFjdC5UYWJsZWF1RXZlbnRVbnJlZ2lzdGVyRm4ge1xuICAgIHRoaXMuX2hhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gICAgcmV0dXJuICgpID0+IHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihoYW5kbGVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVFdmVudExpc3RlbmVyKGhhbmRsZXI6IChldmVudE9iajogVEV2ZW50VHlwZSkgPT4gdm9pZCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJlZm9yZUNvdW50ID0gdGhpcy5faGFuZGxlcnMubGVuZ3RoO1xuICAgIHRoaXMuX2hhbmRsZXJzID0gdGhpcy5faGFuZGxlcnMuZmlsdGVyKChoKSA9PiBoICE9PSBoYW5kbGVyKTtcbiAgICByZXR1cm4gYmVmb3JlQ291bnQgPiB0aGlzLl9oYW5kbGVycy5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgdHJpZ2dlckV2ZW50KGV2ZW50R2VuZXJhdG9yOiAoKSA9PiBURXZlbnRUeXBlKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHRoaXMuX2hhbmRsZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBldmVudE1vZGVsID0gZXZlbnRHZW5lcmF0b3IoKTtcbiAgICAgICAgaGFuZGxlcihldmVudE1vZGVsKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gU2luY2UgdGhpcyBoYW5kbGVyIGNvdWxkIGJlIG91dHNpZGUgb3VyIGNvbnRyb2wsIGp1c3QgY2F0Y2ggYW55dGhpbmcgaXQgdGhyb3dzIGFuZCBjb250aW51ZSBvblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaGVldEluZm8sIFN0b3J5TW9kZWwsIFN0b3J5UG9pbnRNb2RlbCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvU3RvcnlBY3RpdmF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFNob3J0TGl2ZWREZWZlcnJlZCB9IGZyb20gJy4uL1V0aWxzL1Nob3J0TGl2ZWREZWZlcnJlZCc7XG5pbXBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL1NoZWV0SW1wbCc7XG5pbXBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9TaGVldEluZm9JbXBsJztcbmltcG9ydCB7IFN0b3J5UG9pbnRJbXBsIH0gZnJvbSAnLi9TdG9yeVBvaW50SW1wbCc7XG5pbXBvcnQgeyBTdG9yeVBvaW50SW5mb0ltcGwgfSBmcm9tICcuL1N0b3J5UG9pbnRJbmZvSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBTdG9yeUltcGwgZXh0ZW5kcyBTaGVldEltcGwge1xuICBwcml2YXRlIF9hY3RpdmVTdG9yeVBvaW50SW1wbDogU3RvcnlQb2ludEltcGw7XG4gIHByaXZhdGUgX3N0b3J5UG9pbnRJbmZvSW1wbHM6IEFycmF5PFN0b3J5UG9pbnRJbmZvSW1wbD4gPSBbXTtcbiAgcHJpdmF0ZSBfZGVmZXJyZWQ6IFNob3J0TGl2ZWREZWZlcnJlZDxTdG9yeVBvaW50SW1wbD47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBfc2hlZXRJbmZvSW1wbDogU2hlZXRJbmZvSW1wbCxcbiAgICBzdG9yeU1vZGVsOiBTdG9yeU1vZGVsLFxuICAgIHByaXZhdGUgX3B1Ymxpc2hlZFNoZWV0SW5mb3M6IEFycmF5PFNoZWV0SW5mbz4sXG4gICAgcHJvdGVjdGVkIF9yZWdpc3RyeUlkOiBudW1iZXIsXG4gICkge1xuICAgIHN1cGVyKF9zaGVldEluZm9JbXBsLCBfcmVnaXN0cnlJZCk7XG4gICAgdGhpcy5fZGVmZXJyZWQgPSBuZXcgU2hvcnRMaXZlZERlZmVycmVkPFN0b3J5UG9pbnRJbXBsPigpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVN0b3J5KHN0b3J5TW9kZWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU3Rvcnkoc3RvcnlNb2RlbDogU3RvcnlNb2RlbCkge1xuICAgIHN0b3J5TW9kZWwuc3RvcnlQb2ludHMuZm9yRWFjaCgoc3RvcnlQb2ludE1vZGVsKSA9PiB7XG4gICAgICBjb25zdCBpc0FjdGl2ZSA9IHN0b3J5UG9pbnRNb2RlbC5pbmRleCA9PT0gc3RvcnlNb2RlbC5hY3RpdmVTdG9yeVBvaW50SW5kZXg7XG4gICAgICBjb25zdCBzdG9yeVBvaW50SW5mb0ltcGwgPSBuZXcgU3RvcnlQb2ludEluZm9JbXBsKFxuICAgICAgICBzdG9yeVBvaW50TW9kZWwuY2FwdGlvbixcbiAgICAgICAgc3RvcnlQb2ludE1vZGVsLmluZGV4LFxuICAgICAgICBzdG9yeVBvaW50TW9kZWwuc3RvcnlQb2ludElkLFxuICAgICAgICBpc0FjdGl2ZSxcbiAgICAgICAgc3RvcnlQb2ludE1vZGVsLnVwZGF0ZWQsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgICAgdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5wdXNoKHN0b3J5UG9pbnRJbmZvSW1wbCk7XG5cbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICB0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbCA9IG5ldyBTdG9yeVBvaW50SW1wbChcbiAgICAgICAgICBzdG9yeVBvaW50SW5mb0ltcGwsXG4gICAgICAgICAgdGhpcy5fcHVibGlzaGVkU2hlZXRJbmZvcyxcbiAgICAgICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgICAgIHN0b3J5UG9pbnRNb2RlbC5jb250YWluZWRTaGVldEluZm8sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0b3J5SW5mbyhpbmRleDogbnVtYmVyLCBzdG9yeVBvaW50TW9kZWw6IFN0b3J5UG9pbnRNb2RlbCkge1xuICAgIGlmICghdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBzdG9yeUluZm9JbXBsID0gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsc1tpbmRleF07XG4gICAgaWYgKHN0b3J5SW5mb0ltcGwuc3RvcnlQb2ludElkICE9PSBzdG9yeVBvaW50TW9kZWwuc3RvcnlQb2ludElkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLlN0b3J5UG9pbnRJZE1pc21hdGNoLFxuICAgICAgICBgV2Ugc2hvdWxkIG5vdCBiZSB1cGRhdGluZyBhIHN0b3J5IHBvaW50IHdoZW4gdGhlIElEcyBkb24ndCBtYXRjaC4gRXhpc3Rpbmcgc3RvcnlQb2ludElEPSR7c3RvcnlJbmZvSW1wbC5zdG9yeVBvaW50SWR9LCBuZXdTdG9yeVBvaW50SUQ9JHtzdG9yeVBvaW50TW9kZWwuc3RvcnlQb2ludElkfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBzdG9yeUluZm9JbXBsLmNhcHRpb24gPSBzdG9yeVBvaW50TW9kZWwuY2FwdGlvbjtcbiAgICBzdG9yeUluZm9JbXBsLnVwZGF0ZWQgPSBzdG9yeVBvaW50TW9kZWwudXBkYXRlZDtcblxuICAgIGlmICh0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbC5zdG9yeVBvaW50SWQgPT09IHN0b3J5UG9pbnRNb2RlbC5zdG9yeVBvaW50SWQpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsLnVwZGF0ZWQgPSBzdG9yeUluZm9JbXBsLnVwZGF0ZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZVN0b3J5KHN0b3J5UG9pbnRNb2RlbDogU3RvcnlQb2ludE1vZGVsKSB7XG4gICAgaWYgKCF0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5mb3JFYWNoKChzdG9yeVBvaW50SW5mb0ltcGwpID0+IHtcbiAgICAgIGNvbnN0IGlzQWN0aXZlID0gc3RvcnlQb2ludEluZm9JbXBsLnN0b3J5UG9pbnRJZCA9PT0gc3RvcnlQb2ludE1vZGVsLnN0b3J5UG9pbnRJZDtcbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICAvLyB1cGRhdGUgdGhlIHN0YXRlXG4gICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbC5jYXB0aW9uID0gc3RvcnlQb2ludE1vZGVsLmNhcHRpb247XG4gICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbC5pbmRleCA9IHN0b3J5UG9pbnRNb2RlbC5pbmRleDtcbiAgICAgICAgc3RvcnlQb2ludEluZm9JbXBsLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbC51cGRhdGVkID0gc3RvcnlQb2ludE1vZGVsLnVwZGF0ZWQ7XG5cbiAgICAgICAgLy8gcmUtaW5pdGlhbGl6ZSBhY3RpdmVTdG9yeVBvaW50SW1wbFxuICAgICAgICB0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbCA9IG5ldyBTdG9yeVBvaW50SW1wbChcbiAgICAgICAgICBzdG9yeVBvaW50SW5mb0ltcGwsXG4gICAgICAgICAgdGhpcy5fcHVibGlzaGVkU2hlZXRJbmZvcyxcbiAgICAgICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgICAgIHN0b3J5UG9pbnRNb2RlbC5jb250YWluZWRTaGVldEluZm8sXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzZXQgb2xkIG9uZXMgdG8gZmFsc2VcbiAgICAgICAgc3RvcnlQb2ludEluZm9JbXBsLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuYWN0aXZlU3RvcnlQb2ludCkge1xuICAgICAgdGhpcy5fZGVmZXJyZWQucmVzb2x2ZSh0aGlzLmFjdGl2ZVN0b3J5UG9pbnQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlU3RvcnlQb2ludCgpOiBTdG9yeVBvaW50SW1wbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBzdG9yeVBvaW50c0luZm8oKTogQXJyYXk8U3RvcnlQb2ludEluZm9JbXBsPiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLmFjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5fc2hlZXRJbmZvSW1wbC5pc0hpZGRlbjtcbiAgfVxuXG4gIHB1YmxpYyBhY3RpdmF0ZU5leHRTdG9yeVBvaW50QXN5bmMoKTogUHJvbWlzZTxTdG9yeVBvaW50SW1wbD4ge1xuICAgIGlmICh0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbC5pbmRleCA9PT0gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsKTtcbiAgICB9XG5cbiAgICBsZXQgcHJvbWlzZSA9IHRoaXMuX2RlZmVycmVkLmdldE5ld1Byb21pc2VPclRocm93SWZCdXN5KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFN0b3J5QWN0aXZhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TdG9yeUFjdGl2YXRpb24pO1xuICAgIHNlcnZpY2UuYWN0aXZhdGVOZXh0U3RvcnlQb2ludEFzeW5jKCk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgYWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnRBc3luYygpOiBQcm9taXNlPFN0b3J5UG9pbnRJbXBsPiB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsLmluZGV4ID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsKTtcbiAgICB9XG5cbiAgICBsZXQgcHJvbWlzZSA9IHRoaXMuX2RlZmVycmVkLmdldE5ld1Byb21pc2VPclRocm93SWZCdXN5KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFN0b3J5QWN0aXZhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TdG9yeUFjdGl2YXRpb24pO1xuICAgIHNlcnZpY2UuYWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnRBc3luYygpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlU3RvcnlQb2ludEFzeW5jKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPFN0b3J5UG9pbnRJbXBsPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihpbmRleCwgJ2luZGV4Jyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlclR5cGUoaW5kZXgsICdudW1iZXInLCAnaW5kZXgnKTtcblxuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbmRleE91dE9mUmFuZ2UsICdUaGUgaW5kZXggcGFzc2VkIHRvIHRoaXMgY29tbWFuZCBpcyBvdXQgb2YgcmFuZ2UuJyk7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID09PSB0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbC5pbmRleCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbCk7XG4gICAgfVxuXG4gICAgbGV0IHByb21pc2UgPSB0aGlzLl9kZWZlcnJlZC5nZXROZXdQcm9taXNlT3JUaHJvd0lmQnVzeSgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTdG9yeUFjdGl2YXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU3RvcnlBY3RpdmF0aW9uKTtcbiAgICBzZXJ2aWNlLmFjdGl2YXRlU3RvcnlQb2ludEFzeW5jKGluZGV4KTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZXZlcnRTdG9yeVBvaW50QXN5bmMoaW5kZXg6IG51bWJlcik6IFByb21pc2U8U3RvcnlQb2ludEluZm9JbXBsPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihpbmRleCwgJ2luZGV4Jyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlclR5cGUoaW5kZXgsICdudW1iZXInLCAnaW5kZXgnKTtcblxuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbmRleE91dE9mUmFuZ2UsICdUaGUgaW5kZXggcGFzc2VkIHRvIHRoaXMgY29tbWFuZCBpcyBvdXQgb2YgcmFuZ2UuJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTdG9yeUFjdGl2YXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU3RvcnlBY3RpdmF0aW9uKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLnJldmVydFN0b3J5UG9pbnRBc3luYyhpbmRleCkudGhlbjxTdG9yeVBvaW50SW5mb0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVTdG9yeUluZm8ocmVzcG9uc2UuaW5kZXgsIHJlc3BvbnNlKTtcbiAgICAgIGNvbnN0IHN0b3J5UG9pbnRJbmZvSW1wbCA9IG5ldyBTdG9yeVBvaW50SW5mb0ltcGwoXG4gICAgICAgIHJlc3BvbnNlLmNhcHRpb24sXG4gICAgICAgIHJlc3BvbnNlLmluZGV4LFxuICAgICAgICByZXNwb25zZS5zdG9yeVBvaW50SWQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICByZXNwb25zZS51cGRhdGVkLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBzdG9yeVBvaW50SW5mb0ltcGw7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJQZW5kaW5nUHJvbWlzZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2RlZmVycmVkKSB7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZWplY3QoJ0FsbCBwZW5kaW5nIHByb21pc2VzIGNsZWFyZWQnKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDb250YWluZWRTaGVldEluZm9Nb2RlbCwgU2hlZXRJbmZvLCBTaGVldFBhdGgsIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBTaGVldFV0aWxzIH0gZnJvbSAnLi4vVXRpbHMvU2hlZXRVdGlscyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRJbXBsIH0gZnJvbSAnLi9EYXNoYm9hcmRJbXBsJztcbmltcG9ydCB7IFNoZWV0SW1wbCB9IGZyb20gJy4vU2hlZXRJbXBsJztcbmltcG9ydCB7IFNoZWV0SW5mb0ltcGwgfSBmcm9tICcuL1NoZWV0SW5mb0ltcGwnO1xuaW1wb3J0IHsgU3RvcnlJbXBsIH0gZnJvbSAnLi9TdG9yeUltcGwnO1xuaW1wb3J0IHsgU3RvcnlQb2ludEluZm9JbXBsIH0gZnJvbSAnLi9TdG9yeVBvaW50SW5mb0ltcGwnO1xuaW1wb3J0IHsgV29ya3NoZWV0SW1wbCB9IGZyb20gJy4vV29ya3NoZWV0SW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBTdG9yeVBvaW50SW1wbCB7XG4gIHByaXZhdGUgX2NvbnRhaW5lZFNoZWV0SW1wbDogU2hlZXRJbXBsO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9zdG9yeVBvaW50SW5mb0ltcGw6IFN0b3J5UG9pbnRJbmZvSW1wbCxcbiAgICBzaGVldEluZm9zOiBBcnJheTxTaGVldEluZm8+LFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBjb250YWluZWRTaGVldEluZm8/OiBDb250YWluZWRTaGVldEluZm9Nb2RlbCxcbiAgKSB7XG4gICAgaWYgKGNvbnRhaW5lZFNoZWV0SW5mbykge1xuICAgICAgdGhpcy5fY29udGFpbmVkU2hlZXRJbXBsID0gdGhpcy5jcmVhdGVDb250YWluZWRTaGVldChjb250YWluZWRTaGVldEluZm8sIHNoZWV0SW5mb3MsIHJlZ2lzdHJ5SWQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLmluZGV4O1xuICB9XG5cbiAgcHVibGljIGdldCBjYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC5jYXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC5hY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVwZGF0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC51cGRhdGVkO1xuICB9XG5cbiAgcHVibGljIHNldCB1cGRhdGVkKHVwZGF0ZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGwudXBkYXRlZCA9IHVwZGF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudFN0b3J5KCk6IFN0b3J5SW1wbCB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC5wYXJlbnRTdG9yeTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29udGFpbmVkU2hlZXQoKTogU2hlZXRJbXBsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGFpbmVkU2hlZXRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBzdG9yeVBvaW50SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLnN0b3J5UG9pbnRJZDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ29udGFpbmVkU2hlZXQoY29udGFpbmVkU2hlZXRJbmZvOiBDb250YWluZWRTaGVldEluZm9Nb2RlbCwgc2hlZXRJbmZvczogQXJyYXk8U2hlZXRJbmZvPiwgcmVnaXN0cnlJZDogbnVtYmVyKTogU2hlZXRJbXBsIHtcbiAgICBjb25zdCBjb250YWluZWRTaGVldElkeCA9IC0xO1xuXG4gICAgY29uc3QgcHVibGlzaGVkU2hlZXRJbmZvID0gU2hlZXRVdGlscy5nZXRQdWJsaXNoZWRTaGVldEluZm9CeU5hbWUoY29udGFpbmVkU2hlZXRJbmZvLm5hbWUsIHNoZWV0SW5mb3MpO1xuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0U2l6ZSA9IFNoZWV0VXRpbHMuY3JlYXRlQXV0b21hdGljU2l6ZSgpO1xuICAgIGNvbnN0IGlzQ29udGFpbmVkU2hlZXRIaWRkZW4gPSBwdWJsaXNoZWRTaGVldEluZm8gPT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb250YWluZWRTaGVldFVybCA9IHB1Ymxpc2hlZFNoZWV0SW5mbyA/IHB1Ymxpc2hlZFNoZWV0SW5mby51cmwgOiAnJztcbiAgICAvLyBDb250YWluZWQgc2hlZXRzIGFyZW4ndCBhY3RpdmUgLSB0aGUgY29udGFpbmluZyBzaGVldCBpcyBhY3RpdmUuXG4gICAgY29uc3QgY29udGFpbmVkU2hlZXRBY3RpdmUgPSBmYWxzZTtcblxuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwgPSBuZXcgU2hlZXRJbmZvSW1wbChcbiAgICAgIGNvbnRhaW5lZFNoZWV0SW5mby5uYW1lLFxuICAgICAgU2hlZXRVdGlscy5nZXRTaGVldFR5cGVFbnVtKGNvbnRhaW5lZFNoZWV0SW5mby5zaGVldFR5cGUpLFxuICAgICAgY29udGFpbmVkU2hlZXRTaXplLFxuICAgICAgY29udGFpbmVkU2hlZXRJZHgsXG4gICAgICBjb250YWluZWRTaGVldEFjdGl2ZSxcbiAgICAgIGlzQ29udGFpbmVkU2hlZXRIaWRkZW4sXG4gICAgICBjb250YWluZWRTaGVldFVybCxcbiAgICApO1xuXG4gICAgbGV0IHNoZWV0SW1wbDogU2hlZXRJbXBsO1xuICAgIHN3aXRjaCAoY29udGFpbmVkU2hlZXRJbmZvSW1wbC5zaGVldFR5cGUpIHtcbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRUeXBlLldvcmtzaGVldDoge1xuICAgICAgICBjb25zdCB2aXpJZDogVmlzdWFsSWQgPSB7XG4gICAgICAgICAgd29ya3NoZWV0OiBjb250YWluZWRTaGVldEluZm9JbXBsLm5hbWUsXG4gICAgICAgIH07XG5cbiAgICAgICAgc2hlZXRJbXBsID0gbmV3IFdvcmtzaGVldEltcGwoY29udGFpbmVkU2hlZXRJbmZvSW1wbCwgcmVnaXN0cnlJZCwgdml6SWQsIG51bGwsIHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRUeXBlLkRhc2hib2FyZDoge1xuICAgICAgICBjb25zdCBzaGVldFBhdGg6IFNoZWV0UGF0aCA9IHtcbiAgICAgICAgICBzaGVldE5hbWU6IGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwubmFtZSxcbiAgICAgICAgICBpc0Rhc2hib2FyZDogdHJ1ZSxcbiAgICAgICAgfTtcblxuICAgICAgICBzaGVldEltcGwgPSBuZXcgRGFzaGJvYXJkSW1wbChjb250YWluZWRTaGVldEluZm9JbXBsLCBjb250YWluZWRTaGVldEluZm8uZGFzaGJvYXJkWm9uZXMsIHNoZWV0UGF0aCwgcmVnaXN0cnlJZCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuU2VydmVyRXJyb3IsICdJbnZhbGlkIFNoZWV0VHlwZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaGVldEltcGw7XG4gIH1cbn1cbiIsImltcG9ydCB7IFN0b3J5SW1wbCB9IGZyb20gJy4vU3RvcnlJbXBsJztcblxuZXhwb3J0IGNsYXNzIFN0b3J5UG9pbnRJbmZvSW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9jYXB0aW9uOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfaW5kZXg6IG51bWJlcixcbiAgICBwcml2YXRlIF9zdG9yeVBvaW50SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9hY3RpdmU6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfdXBkYXRlZDogYm9vbGVhbixcbiAgICBwcml2YXRlIF9wYXJlbnRTdG9yeUltcGw6IFN0b3J5SW1wbCxcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgY2FwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fY2FwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgY2FwdGlvbihjYXB0aW9uOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jYXB0aW9uID0gY2FwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2luZGV4O1xuICB9XG5cbiAgcHVibGljIHNldCBpbmRleChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5faW5kZXggPSBpbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc3RvcnlQb2ludElkKCkge1xuICAgIHJldHVybiB0aGlzLl9zdG9yeVBvaW50SWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICB9XG5cbiAgcHVibGljIHNldCBhY3RpdmUoaXNBY3RpdmU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9hY3RpdmUgPSBpc0FjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXBkYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXBkYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdXBkYXRlZChpc1VwZGF0ZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl91cGRhdGVkID0gaXNVcGRhdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJlbnRTdG9yeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50U3RvcnlJbXBsO1xuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgV29ya2Jvb2tJbXBsIHt9XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpTWVudVR5cGUsXG4gIENvbnRleHRNZW51T3B0aW9ucyxcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRXJyb3JDb2RlcyxcbiAgRmlsdGVyTnVsbE9wdGlvbixcbiAgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gIFBlcmlvZFR5cGUsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG4gIFRvb2x0aXBDb250ZXh0LFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNjaGVtYSwgRGF0YVNvdXJjZSBhcyBEYXRhU291cmNlSW5mbywgVmlzdWFsSWQsIFdvcmtzaGVldERhdGFTb3VyY2VJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuLi9EYXRhU291cmNlJztcbmltcG9ydCB7IExvZ2ljYWxUYWJsZSB9IGZyb20gJy4uL0xvZ2ljYWxUYWJsZSc7XG5pbXBvcnQgeyBBY2Nlc3NpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0FjY2Vzc2liaWxpdHlTZXJ2aWNlJztcbmltcG9ydCB7IEFubm90YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvQW5ub3RhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9EYXRhU291cmNlU2VydmljZSc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlJztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9GaWx0ZXJTZXJ2aWNlJztcbmltcG9ydCB7IEdldERhdGFTZXJ2aWNlLCBHZXREYXRhVHlwZSB9IGZyb20gJy4uL1NlcnZpY2VzL0dldERhdGFTZXJ2aWNlJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZWxlY3Rpb25TZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFZpc3VhbE1vZGVsU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1Zpc3VhbE1vZGVsU2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IERhc2hib2FyZEltcGwgfSBmcm9tICcuL0Rhc2hib2FyZEltcGwnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZUltcGwgfSBmcm9tICcuL0RhdGFTb3VyY2VJbXBsJztcbmltcG9ydCB7IFNoZWV0SW1wbCB9IGZyb20gJy4vU2hlZXRJbXBsJztcbmltcG9ydCB7IFNoZWV0SW5mb0ltcGwgfSBmcm9tICcuL1NoZWV0SW5mb0ltcGwnO1xuaW1wb3J0IHsgU3RvcnlQb2ludEltcGwgfSBmcm9tICcuL1N0b3J5UG9pbnRJbXBsJztcblxuZXhwb3J0IGNsYXNzIFdvcmtzaGVldEltcGwgZXh0ZW5kcyBTaGVldEltcGwge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgc2hlZXRJbmZvSW1wbDogU2hlZXRJbmZvSW1wbCxcbiAgICBfcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX3Zpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBwcml2YXRlIF9wYXJlbnREYXNoYm9hcmRJbXBsOiBEYXNoYm9hcmRJbXBsIHwgbnVsbCxcbiAgICBwcml2YXRlIF9wYXJlbnRTdG9yeVBvaW50SW1wbDogU3RvcnlQb2ludEltcGwgfCBudWxsLFxuICAgIHByaXZhdGUgX2JhY2tncm91bmRDb2xvcjogc3RyaW5nIHwgbnVsbCA9IG51bGwsXG4gICAgcHJpdmF0ZSBfZm9ybWF0dGluZzogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nIHwgbnVsbCA9IG51bGwsXG4gICkge1xuICAgIHN1cGVyKHNoZWV0SW5mb0ltcGwsIF9yZWdpc3RyeUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50RGFzaGJvYXJkKCk6IERhc2hib2FyZEltcGwgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50U3RvcnlQb2ludCgpOiBTdG9yeVBvaW50SW1wbCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRTdG9yeVBvaW50SW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmlzdWFsSWQoKTogVmlzdWFsSWQge1xuICAgIHJldHVybiB0aGlzLl92aXN1YWxJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXhQYWdlUm93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJhY2tncm91bmRDb2xvcigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYmFja2dyb3VuZENvbG9yO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JtYXR0aW5nKCk6IENvbnRyYWN0LldvcmtzaGVldEZvcm1hdHRpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlPih1cGRhdGVUeXBlLCBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLCAnQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZScpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmllbGROYW1lLCAnZmllbGROYW1lJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWx0ZXJPcHRpb25zLCAnZmlsdGVyT3B0aW9ucycpO1xuICAgIGlmIChmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24pIHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RmlsdGVyTnVsbE9wdGlvbj4oZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uLCBGaWx0ZXJOdWxsT3B0aW9uLCAnRmlsdGVyTnVsbE9wdGlvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5UmFuZ2VQYXJhbVR5cGUoZmlsdGVyT3B0aW9ucy5taW4sIGZpbHRlck9wdGlvbnMubWF4KTtcbiAgICB9XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5hcHBseVJhbmdlRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lLCBmaWx0ZXJPcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUhpZXJhcmNoaWNhbEZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPiB8IENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVscyxcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHZhbHVlcywgJ3ZhbHVlcycpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZT4odXBkYXRlVHlwZSwgQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSwgJ0NvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUnKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSAmJiAhdmFsdWVzLmxldmVscykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAndmFsdWVzIHBhcmFtZXRlciBmb3IgYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyBtdXN0IGJlIGFuIGFycmF5IG9yIGNvbnRhaW4gYSBsZXZlbHMga2V5JyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmNsZWFyRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U3RyaW5nUGFyYW1ldGVyKGZpZWxkTmFtZSwgJ2ZpZWxkTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIob3B0aW9ucywgJ29wdGlvbnMnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFBlcmlvZFR5cGU+KG9wdGlvbnMucGVyaW9kVHlwZSwgUGVyaW9kVHlwZSwgJ1BlcmlvZFR5cGUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPERhdGVSYW5nZVR5cGU+KG9wdGlvbnMucmFuZ2VUeXBlLCBEYXRlUmFuZ2VUeXBlLCAnRGF0ZVJhbmdlVHlwZScpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RGF0YVNvdXJjZXNBc3luYyh0aGlzLnZpc3VhbElkKS50aGVuPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PigocmVzdWx0KSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hOiBEYXRhU2NoZW1hID0gcmVzdWx0O1xuICAgICAgY29uc3Qgd29ya3NoZWV0RGF0YVNvdXJjZUluZm86IFdvcmtzaGVldERhdGFTb3VyY2VJbmZvID0gZGF0YVNjaGVtYS53b3Jrc2hlZXREYXRhU2NoZW1hTWFwW3RoaXMubmFtZV07XG5cbiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzOiBBcnJheTxDb250cmFjdC5EYXRhU291cmNlPiA9IFtdO1xuXG4gICAgICAvLyBGaXJzdCwgYWRkIHRoZSBwcmltYXJ5IGRhdGFzb3VyY2UuICBCeSBjb252ZW50aW9uLCBpdCBjb21lcyBmaXJzdCBpbiB0aGUgcmV0dXJuZWQgYXJyYXkuXG4gICAgICBjb25zdCBwcmltYXJ5SWQ6IHN0cmluZyA9IHdvcmtzaGVldERhdGFTb3VyY2VJbmZvLnByaW1hcnlEYXRhU291cmNlO1xuICAgICAgZGF0YVNvdXJjZXMucHVzaCh0aGlzLmNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU2NoZW1hLmRhdGFTb3VyY2VzW3ByaW1hcnlJZF0pKTtcblxuICAgICAgLy8gVGhlbiwgbG9vcCB0aHJvdWdoIGFueSBzZWNvbmRhcnkgZGF0YSBzb3VyY2VzIGFuZCBhZGQgdGhlbS5cbiAgICAgIGZvciAoY29uc3Qgc2Vjb25kYXJ5SWQgb2Ygd29ya3NoZWV0RGF0YVNvdXJjZUluZm8ucmVmZXJlbmNlZERhdGFTb3VyY2VMaXN0KSB7XG4gICAgICAgIGlmIChzZWNvbmRhcnlJZCAhPT0gcHJpbWFyeUlkKSB7XG4gICAgICAgICAgZGF0YVNvdXJjZXMucHVzaCh0aGlzLmNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU2NoZW1hLmRhdGFTb3VyY2VzW3NlY29uZGFyeUlkXSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhU291cmNlcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRGaWx0ZXJzQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFNlbGVjdGVkTWFya3NBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhQXN5bmMob3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgICAgdGhpcy52aXN1YWxJZCxcbiAgICAgIEdldERhdGFUeXBlLlN1bW1hcnksXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVTZWxlY3Rpb24sXG4gICAgICB0cnVlLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgICBvcHRpb25zLmFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyA/PyBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMocGFnZVJvd0NvdW50OiBudW1iZXIsIG9wdGlvbnM6IENvbnRyYWN0LkdldFN1bW1hcnlEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBwYWdlUm93Q291bnQgfHwgdGhpcy5nZXRNYXhQYWdlUm93TGltaXQoKSxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgIHRydWUsIC8vIGluY2x1ZGVBbGxDb2x1bW5zIChjYW4gYmUgb3ZlcnJpZGRlbiBieSBjb2x1bW5zVG9JbmNsdWRlQnlJZClcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICAgIG9wdGlvbnMuYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nID8/IGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGFkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jKFxuICAgIG1hcmtzQ2FyZEluZGV4OiBudW1iZXIsXG4gICAgZW5jb2RpbmdUeXBlOiBDb250cmFjdC5FbmNvZGluZ1R5cGUsXG4gICAgY29sdW1uczogQXJyYXk8Q29udHJhY3QuQ29sdW1uPixcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuYWRkTWFya3NDYXJkRmllbGRzQXN5bmModGhpcy52aXN1YWxJZCwgbWFya3NDYXJkSW5kZXgsIGVuY29kaW5nVHlwZSwgY29sdW1ucywgc3RhcnRJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgbW92ZU1hcmtzQ2FyZEZpZWxkQXN5bmMobWFya3NDYXJkSW5kZXg6IG51bWJlciwgZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlciwgZmllbGRDb3VudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxWaXN1YWxNb2RlbFNlcnZpY2U+KFNlcnZpY2VOYW1lcy5WaXN1YWxNb2RlbCk7XG5cbiAgICByZXR1cm4gc2VydmljZS5tb3ZlTWFya3NDYXJkRmllbGRBc3luYyh0aGlzLnZpc3VhbElkLCBtYXJrc0NhcmRJbmRleCwgZnJvbUluZGV4LCB0b0luZGV4LCBmaWVsZENvdW50KTtcbiAgfVxuXG4gIHB1YmxpYyBzcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyhcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGVuY29kaW5nVHlwZTogQ29udHJhY3QuRW5jb2RpbmdUeXBlLFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgICBkZWxldGVDb3VudDogbnVtYmVyLFxuICAgIGNvbHVtbnM6IEFycmF5PENvbnRyYWN0LkNvbHVtbj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2Uuc3BsaWNlTWFya3NDYXJkRmllbGRzQXN5bmModGhpcy52aXN1YWxJZCwgbWFya3NDYXJkSW5kZXgsIGVuY29kaW5nVHlwZSwgc3RhcnRJbmRleCwgZGVsZXRlQ291bnQsIGNvbHVtbnMpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdEYXRhQXN5bmMoXG4gICAgICB0aGlzLnZpc3VhbElkLFxuICAgICAgR2V0RGF0YVR5cGUuVW5kZXJseWluZyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgICEhb3B0aW9ucy5pbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICAgb3B0aW9ucy5hcHBseVdvcmtzaGVldEZvcm1hdHRpbmcgPz8gZmFsc2UsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRVbmRlcmx5aW5nVGFibGVzQXN5bmModGhpcy52aXN1YWxJZCkudGhlbjxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PigobG9naWNhbFRhYmxlSW5mb3MpID0+IHtcbiAgICAgIHJldHVybiBsb2dpY2FsVGFibGVJbmZvcy5tYXAoKGxvZ2ljYWxUYWJsZUluZm8pID0+IG5ldyBMb2dpY2FsVGFibGUobG9naWNhbFRhYmxlSW5mbykpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICAgICAgdGhpcy52aXN1YWxJZCxcbiAgICAgIGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgISFvcHRpb25zLmluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgICBvcHRpb25zLmFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyA/PyBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIHBhZ2VSb3dDb3VudD86IG51bWJlcixcbiAgICBvcHRpb25zPzogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgICB0aGlzLnZpc3VhbElkLFxuICAgICAgbG9naWNhbFRhYmxlSWQsXG4gICAgICBwYWdlUm93Q291bnQgfHwgdGhpcy5nZXRNYXhQYWdlUm93TGltaXQoKSxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgICEhb3B0aW9ucy5pbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICAgIG9wdGlvbnMuYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nID8/IGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5jbGVhclNlbGVjdGVkTWFya3NBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5VmFsdWVBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5TZWxlY3Rpb25Dcml0ZXJpYT4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNlbGVjdGlvbnMsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFNlbGVjdGlvblVwZGF0ZVR5cGU+KHNlbGVjdGlvblVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUsICdTZWxlY3Rpb25VcGRhdGVUeXBlJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5zZWxlY3RNYXJrc0J5VmFsdWVBc3luYyh0aGlzLnZpc3VhbElkLCBzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5SWRBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNlbGVjdGlvbnMsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFNlbGVjdGlvblVwZGF0ZVR5cGU+KHNlbGVjdGlvblVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUsICdTZWxlY3Rpb25VcGRhdGVUeXBlJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5zZWxlY3RNYXJrc0J5SWRBc3luYyh0aGlzLnZpc3VhbElkLCBzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBhbm5vdGF0ZU1hcmtBc3luYyhtYXJrOiBDb250cmFjdC5NYXJrSW5mbywgYW5ub3RhdGlvblRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIobWFyaywgJ21hcmsnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEFubm90YXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuQW5ub3RhdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYW5ub3RhdGVNYXJrQXN5bmModGhpcy52aXN1YWxJZCwgbWFyaywgYW5ub3RhdGlvblRleHQpO1xuICB9XG5cbiAgcHVibGljIGdldEFubm90YXRpb25zQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5ub3RhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRBbm5vdGF0aW9uc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFubm90YXRpb25Bc3luYyhhbm5vdGF0aW9uOiBDb250cmFjdC5Bbm5vdGF0aW9uKSB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihhbm5vdGF0aW9uLCAnYW5ub3RhdGlvbicpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5ub3RhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5yZW1vdmVBbm5vdGF0aW9uQXN5bmModGhpcy52aXN1YWxJZCwgYW5ub3RhdGlvbik7XG4gIH1cblxuICBwdWJsaWMgYXBwZW5kQ29udGV4dE1lbnVBc3luYyh0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgY29uZmlnOiBDb250ZXh0TWVudU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51KTtcbiAgICByZXR1cm4gc2VydmljZS5hcHBlbmRDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBjb25maWcpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUNvbnRleHRNZW51QXN5bmModGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVJdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51KTtcbiAgICByZXR1cm4gc2VydmljZS5yZW1vdmVDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBtZW51SXRlbUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBleGVjdXRlQ29udGV4dE1lbnVBc3luYyh0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgbWVudUl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLmV4ZWN1dGVDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBtZW51SXRlbUlkKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5hbWVDb250ZXh0TWVudUFzeW5jKHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SGVhZGVyOiBzdHJpbmcsIG1lbnVEZXNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLnJlbmFtZUNvbnRleHRNZW51QXN5bmModGhpcy52aXN1YWxJZC53b3Jrc2hlZXQsIHRhcmdldE1lbnUsIG1lbnVIZWFkZXIsIG1lbnVEZXNjcmlwdGlvbik7XG4gIH1cblxuICBwdWJsaWMgaG92ZXJUdXBsZUFzeW5jKGhvdmVyZWRUdXBsZT86IG51bWJlciwgdG9vbHRpcD86IFRvb2x0aXBDb250ZXh0IHwgbnVsbCwgYWxsb3dIb3ZlckFjdGlvbnM/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNJbnNpZGVEYXNoYm9hcmRFeHRlbnNpb24oKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYGhvdmVyVHVwbGVBc3luYyBpcyBub3Qgc3VwcG9ydGVkIGluIGRhc2hib2FyZCBleHRlbnNpb25zYCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2UuaG92ZXJUdXBsZUFzeW5jKHRoaXMudmlzdWFsSWQsIGhvdmVyZWRUdXBsZSwgdG9vbHRpcCwgYWxsb3dIb3ZlckFjdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdFR1cGxlc0FzeW5jKHNlbGVjdGVkVHVwbGVzOiBBcnJheTxudW1iZXI+LCBzZWxlY3RPcHRpb246IENvbnRyYWN0LlNlbGVjdE9wdGlvbnMsIHRvb2x0aXA/OiBUb29sdGlwQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBzZWxlY3RUdXBsZXNBc3luYyBpcyBub3Qgc3VwcG9ydGVkIGluIGRhc2hib2FyZCBleHRlbnNpb25zYCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2Uuc2VsZWN0VHVwbGVzQXN5bmModGhpcy52aXN1YWxJZCwgc2VsZWN0ZWRUdXBsZXMsIHNlbGVjdE9wdGlvbiwgdG9vbHRpcCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9vbHRpcFRleHRBc3luYyh0dXBsZUlkOiBudW1iZXIpOiBQcm9taXNlPFN0cmluZz4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBnZXRUb29sdGlwVGV4dEFzeW5jIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZGFzaGJvYXJkIGV4dGVuc2lvbnNgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QWNjZXNzaWJpbGl0eVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5BY2Nlc3NpYmlsaXR5KTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRUb29sdGlwVGV4dEFzeW5jKHRoaXMudmlzdWFsSWQsIHR1cGxlSWQpO1xuICB9XG5cbiAgcHVibGljIGxlYXZlTWFya05hdmlnYXRpb25Bc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0luc2lkZURhc2hib2FyZEV4dGVuc2lvbigpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgICAgQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLFxuICAgICAgICAgIGBsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMgaXMgbm90IHN1cHBvcnRlZCBpbiBkYXNoYm9hcmQgZXh0ZW5zaW9uc2AsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEFjY2Vzc2liaWxpdHlTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuQWNjZXNzaWJpbGl0eSk7XG4gICAgcmV0dXJuIHNlcnZpY2UubGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGVkaXRBbGlhc2VzRGlhbG9nQXN5bmMoZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFZpc3VhbE1vZGVsU2VydmljZT4oU2VydmljZU5hbWVzLlZpc3VhbE1vZGVsKTtcbiAgICByZXR1cm4gc2VydmljZS5lZGl0QWxpYXNlc0RpYWxvZ0FzeW5jKGZpZWxkTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU291cmNlSW5mbzogRGF0YVNvdXJjZUluZm8pOiBDb250cmFjdC5EYXRhU291cmNlIHtcbiAgICBjb25zdCBkYXRhU291cmNlSW1wbCA9IG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlSW5mbywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEYXRhU291cmNlKGRhdGFTb3VyY2VJbXBsKTtcbiAgICBkYXRhU291cmNlSW1wbC5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoZGF0YVNvdXJjZSk7XG4gICAgcmV0dXJuIGRhdGFTb3VyY2U7XG4gIH1cblxuICBwcml2YXRlIHZlcmlmeUFjdGl2ZVNoZWV0KCkge1xuICAgIGNvbnN0IGlzUm9vdEFuZEFjdGl2ZVdvcmtzaGVldCA9IHRoaXMuYWN0aXZlO1xuICAgIGNvbnN0IGlzSW5zaWRlQWN0aXZlRGFzaGJvYXJkID0gdGhpcy5pc0luc2lkZUFjdGl2ZURhc2hib2FyZCgpO1xuICAgIGNvbnN0IGlzSW5zaWRlQWN0aXZlU3RvcnlQb2ludCA9IHRoaXMuaXNJbnNpZGVBY3RpdmVTdG9yeVBvaW50KCk7XG5cbiAgICBpZiAoIWlzUm9vdEFuZEFjdGl2ZVdvcmtzaGVldCAmJiAhaXNJbnNpZGVBY3RpdmVEYXNoYm9hcmQgJiYgIWlzSW5zaWRlQWN0aXZlU3RvcnlQb2ludCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLk5vdEFjdGl2ZVNoZWV0LCAnT3BlcmF0aW9uIG5vdCBhbGxvd2VkIG9uIG5vbi1hY3RpdmUgc2hlZXQnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzSW5zaWRlQWN0aXZlU3RvcnlQb2ludCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50U3RvcnlQb2ludEltcGwgJiYgdGhpcy5fcGFyZW50U3RvcnlQb2ludEltcGwuYWN0aXZlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0luc2lkZUFjdGl2ZURhc2hib2FyZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbCAmJiB0aGlzLl9wYXJlbnREYXNoYm9hcmRJbXBsLmFjdGl2ZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbnNpZGVEYXNoYm9hcmRFeHRlbnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudERhc2hib2FyZEltcGwgIT09IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBMb2dpY2FsVGFibGVJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIGxvZ2ljYWwgdGFibGUuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dpY2FsVGFibGUgaW1wbGVtZW50cyBDb250cmFjdC5Mb2dpY2FsVGFibGUge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbG9naWNhbFRhYmxlOiBMb2dpY2FsVGFibGVJbmZvKSB7fVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbG9naWNhbFRhYmxlLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBjYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2ljYWxUYWJsZS5jYXB0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBUb29sdGlwVGV4dFJlcXVlc3QsIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIFRvb2x0aXBUZXh0UmVxdWVzdE1vZGVsIGltcGxlbWVudHMgVG9vbHRpcFRleHRSZXF1ZXN0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyB2aXN1YWxJZFByZXNNb2RlbDogVmlzdWFsSWQsIHB1YmxpYyB0dXBsZUlkOiBudW1iZXIpIHt9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlVHlwZSwgRmlsdGVyRG9tYWluVHlwZSwgRmlsdGVyVHlwZSwgUGVyaW9kVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL2xpYi9zcmMvRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1JztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcblxuZXhwb3J0IGNsYXNzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LkZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgX3dvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX2ZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICBwcm90ZWN0ZWQgX2ZpZWxkSWQ6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX3JlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlclR5cGUoKTogRmlsdGVyVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlclR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmllbGRBc3luYygpOiBQcm9taXNlPENvbnRyYWN0LkZpZWxkPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRGaWVsZEFzeW5jKHRoaXMuX2ZpZWxkSWQpO1xuICB9XG5cbiAgcHVibGljIGdldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkSWQpO1xuICB9XG5cbiAgcHVibGljIHNldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoYXBwbHlUb1dvcmtzaGVldHM6IEFycmF5PHN0cmluZz4pOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGFwcGx5VG9Xb3Jrc2hlZXRzLCAnYXBwbHlUb1dvcmtzaGVldHMnKTtcbiAgICBjb25zdCB1bmlxdWVXb3Jrc2hlZXRzID0gbmV3IFNldChhcHBseVRvV29ya3NoZWV0cyk7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5zZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkTmFtZSwgdGhpcy5fZmllbGRJZCwgQXJyYXkuZnJvbSh1bmlxdWVXb3Jrc2hlZXRzKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhdGVnb3JpY2FsRmlsdGVyIGV4dGVuZHMgRmlsdGVyIGltcGxlbWVudHMgQ29udHJhY3QuQ2F0ZWdvcmljYWxGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9hcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+LFxuICAgIHByaXZhdGUgX2lzRXhjbHVkZU1vZGU6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNBbGxTZWxlY3RlZD86IGJvb2xlYW4sXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzQWxsU2VsZWN0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwcGxpZWRWYWx1ZXMoKTogQXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwcGxpZWRWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXhjbHVkZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRXhjbHVkZU1vZGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RG9tYWluQXN5bmMoZG9tYWluVHlwZT86IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPiB7XG4gICAgaWYgKCFkb21haW5UeXBlKSB7XG4gICAgICBkb21haW5UeXBlID0gRmlsdGVyRG9tYWluVHlwZS5SZWxldmFudDtcbiAgICB9XG5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPEZpbHRlckRvbWFpblR5cGU+KGRvbWFpblR5cGUsIEZpbHRlckRvbWFpblR5cGUsICdGaWx0ZXJEb21haW5UeXBlJyk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldENhdGVnb3JpY2FsRG9tYWluQXN5bmModGhpcy5fd29ya3NoZWV0TmFtZSwgdGhpcy5fZmllbGRJZCwgZG9tYWluVHlwZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoaWNhbERhdGFWYWx1ZSBpbXBsZW1lbnRzIENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlckRhdGFWYWx1ZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF92YWx1ZTogQ29udHJhY3QuRGF0YVZhbHVlLCBwcml2YXRlIF9oaWVyYXJjaGljYWxQYXRoOiBzdHJpbmcsIHByaXZhdGUgX2xldmVsOiBudW1iZXIpIHt9XG5cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGllcmFyY2hpY2FsUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9oaWVyYXJjaGljYWxQYXRoO1xuICB9XG5cbiAgcHVibGljIGdldCBsZXZlbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9sZXZlbDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWwgaW1wbGVtZW50cyBDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9uYW1lOiBzdHJpbmcsIHByaXZhdGUgX2xldmVsU2VsZWN0aW9uU3RhdGU6IEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxldmVsU2VsZWN0aW9uU3RhdGUoKTogSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2xldmVsU2VsZWN0aW9uU3RhdGU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoaWNhbEZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2RpbWVuc2lvbk5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9oaWVyYXJjaHlDYXB0aW9uOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfbnVtYmVyT2ZMZXZlbHM6IG51bWJlcixcbiAgICBwcml2YXRlIF9sZXZlbERldGFpbHM6IEFycmF5PENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVsRGV0YWlsPixcbiAgICBwcml2YXRlIF9hcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXJEYXRhVmFsdWU+LFxuICAgIHByaXZhdGUgX2lzQWxsU2VsZWN0ZWQ6IGJvb2xlYW4sXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cbiAgZ2V0RG9tYWluQXN5bmMoZG9tYWluVHlwZT86IENvbnRyYWN0LkZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgcHVibGljIGdldCBkaW1lbnNpb25OYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpbWVuc2lvbk5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhpZXJhcmNoeUNhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faGllcmFyY2h5Q2FwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbnVtYmVyT2ZMZXZlbHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbnVtYmVyT2ZMZXZlbHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxldmVsRGV0YWlscygpOiBDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbFtdIHtcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWxEZXRhaWxzO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0FsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0FsbFNlbGVjdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBhcHBsaWVkVmFsdWVzKCk6IEFycmF5PENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlckRhdGFWYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLl9hcHBsaWVkVmFsdWVzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSYW5nZUZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LlJhbmdlRmlsdGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICByZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfbWluOiBDb250cmFjdC5EYXRhVmFsdWUsXG4gICAgcHJpdmF0ZSBfbWF4OiBDb250cmFjdC5EYXRhVmFsdWUsXG4gICAgcHJpdmF0ZSBfaW5jbHVkZU51bGxWYWx1ZXM6IGJvb2xlYW4sXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1pblZhbHVlKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWF4VmFsdWUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG5cbiAgcHVibGljIGdldCBpbmNsdWRlTnVsbFZhbHVlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW5jbHVkZU51bGxWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0RG9tYWluQXN5bmMoZG9tYWluVHlwZT86IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LlJhbmdlRG9tYWluPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICBpZiAoIWRvbWFpblR5cGUpIHtcbiAgICAgIGRvbWFpblR5cGUgPSBGaWx0ZXJEb21haW5UeXBlLlJlbGV2YW50O1xuICAgIH1cblxuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RmlsdGVyRG9tYWluVHlwZT4oZG9tYWluVHlwZSwgRmlsdGVyRG9tYWluVHlwZSwgJ0ZpbHRlckRvbWFpblR5cGUnKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLmdldFJhbmdlRG9tYWluQXN5bmModGhpcy5fd29ya3NoZWV0TmFtZSwgdGhpcy5fZmllbGRJZCwgZG9tYWluVHlwZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlbGF0aXZlRGF0ZUZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2FuY2hvckRhdGU6IENvbnRyYWN0LkRhdGFWYWx1ZSxcbiAgICBwcml2YXRlIF9wZXJpb2RUeXBlOiBQZXJpb2RUeXBlLFxuICAgIHByaXZhdGUgX3JhbmdlVHlwZTogRGF0ZVJhbmdlVHlwZSxcbiAgICBwcml2YXRlIF9yYW5nZU46IG51bWJlcixcbiAgKSB7XG4gICAgc3VwZXIod29ya3NoZWV0TmFtZSwgZmllbGROYW1lLCBmaWx0ZXJUeXBlLCBmaWVsZElkLCByZWdpc3RyeUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYW5jaG9yRGF0ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9hbmNob3JEYXRlO1xuICB9XG5cbiAgcHVibGljIGdldCBwZXJpb2RUeXBlKCk6IFBlcmlvZFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9wZXJpb2RUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCByYW5nZVR5cGUoKTogRGF0ZVJhbmdlVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3JhbmdlVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmFuZ2VOKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JhbmdlTjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2F0ZWdvcmljYWxEb21haW4gaW1wbGVtZW50cyBDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF92YWx1ZXM6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4sIHByaXZhdGUgX2RvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpIHt9XG5cbiAgcHVibGljIGdldCB2YWx1ZXMoKTogQXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBGaWx0ZXJEb21haW5UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZG9tYWluVHlwZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFuZ2VEb21haW4gaW1wbGVtZW50cyBDb250cmFjdC5SYW5nZURvbWFpbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9taW46IENvbnRyYWN0LkRhdGFWYWx1ZSwgcHJpdmF0ZSBfbWF4OiBDb250cmFjdC5EYXRhVmFsdWUsIHByaXZhdGUgX2RvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpIHt9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IEZpbHRlckRvbWFpblR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kb21haW5UeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBtaW4oKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG5cbiAgcHVibGljIGdldCBtYXgoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVR5cGUsIE1hcmtUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZSBpbXBsZW1lbnRzIENvbnRyYWN0LkRhdGFUYWJsZSB7XG4gIHByaXZhdGUgX25hbWU6IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZGF0YTogQXJyYXk8QXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPj4sXG4gICAgcHJpdmF0ZSBfY29sdW1uczogQXJyYXk8Q29udHJhY3QuQ29sdW1uPixcbiAgICBwcml2YXRlIF90b3RhbFJvd0NvdW50OiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfaXNUb3RhbFJvd0NvdW50TGltaXRlZDogYm9vbGVhbixcbiAgICBwcml2YXRlIF9pc1N1bW1hcnlEYXRhOiBib29sZWFuLFxuICAgIHByaXZhdGUgX21hcmtzSW5mbz86IEFycmF5PE1hcmtJbmZvPixcbiAgKSB7XG4gICAgdGhpcy5fbmFtZSA9IF9pc1N1bW1hcnlEYXRhID8gJ1N1bW1hcnkgRGF0YSBUYWJsZScgOiAnVW5kZXJseWluZyBEYXRhIFRhYmxlJztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhKCk6IEFycmF5PEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sdW1ucygpOiBBcnJheTxDb250cmFjdC5Db2x1bW4+IHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWFya3NJbmZvKCk6IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21hcmtzSW5mbztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdG90YWxSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFJvd0NvdW50O1xuICB9XG5cbiAgcHVibGljIGdldCBpc1RvdGFsUm93Q291bnRMaW1pdGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc1RvdGFsUm93Q291bnRMaW1pdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1N1bW1hcnlEYXRhKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc1N1bW1hcnlEYXRhO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXJrSW5mbyBpbXBsZW1lbnRzIENvbnRyYWN0Lk1hcmtJbmZvIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3R5cGU6IE1hcmtUeXBlLCBwcml2YXRlIF9jb2xvcjogc3RyaW5nLCBwcml2YXRlIF90dXBsZUlkPzogbnVtYmVyKSB7fVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBNYXJrVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbG9yO1xuICB9XG5cbiAgcHVibGljIGdldCB0dXBsZUlkKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3R1cGxlSWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbHVtbiBpbXBsZW1lbnRzIENvbnRyYWN0LkNvbHVtbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9maWVsZE5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9maWVsZElkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfZGF0YVR5cGU6IERhdGFUeXBlLFxuICAgIHByaXZhdGUgX2lzUmVmZXJlbmNlZDogYm9vbGVhbixcbiAgICBwcml2YXRlIF9pbmRleDogbnVtYmVyLFxuICApIHt9XG5cbiAgcHVibGljIGdldCBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IERhdGFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUmVmZXJlbmNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNSZWZlcmVuY2VkO1xuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pbmRleDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGF0YVZhbHVlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgLyogdHNsaW50OmRpc2FibGU6bm8tYW55ICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF92YWx1ZTogYW55LFxuICAgIHByaXZhdGUgX25hdGl2ZVZhbHVlOiBhbnksXG4gICAgcHJpdmF0ZSBfZm9ybWF0dGVkVmFsdWU/OiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfYWxpYXNWYWx1ZT86IHN0cmluZyxcbiAgICBwcml2YXRlIF9oYXNBbGlhcz86IGJvb2xlYW4sXG4gICkge31cblxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBuYXRpdmVWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9uYXRpdmVWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGVkVmFsdWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGVkVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsaWFzVmFsdWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYWxpYXNWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzQWxpYXMoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc0FsaWFzO1xuICB9XG4gIC8qIHRzbGludDplbmFibGU6bm8tYW55ICovXG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlUmVhZGVyIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVRhYmxlUmVhZGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfaWQ6IHN0cmluZywgcHJvdGVjdGVkIF90b3RhbFJvd0NvdW50OiBudW1iZXIsIHByb3RlY3RlZCBfcGFnZVJvd0NvdW50LCBwcml2YXRlIF9yZWdpc3RyeUlkOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wYWdlQ291bnQgPSBNYXRoLmNlaWwoX3RvdGFsUm93Q291bnQgLyBfcGFnZVJvd0NvdW50KTtcbiAgfVxuICBwcm90ZWN0ZWQgX3BhZ2VDb3VudDogbnVtYmVyO1xuXG4gIHB1YmxpYyBnZXQgdG90YWxSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFJvd0NvdW50O1xuICB9XG5cbiAgcHVibGljIGdldCBwYWdlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUNvdW50O1xuICB9XG5cbiAgcHVibGljIGdldFBhZ2VBc3luYyhwYWdlTnVtYmVyOiBudW1iZXIpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlSYW5nZShwYWdlTnVtYmVyLCAwLCB0aGlzLl9wYWdlQ291bnQpO1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRQYWdlQXN5bmModGhpcy5faWQsIHBhZ2VOdW1iZXIsIHRoaXMuX3BhZ2VSb3dDb3VudCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QWxsUGFnZXNBc3luYyhtYXhSb3dzPzogbnVtYmVyKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBmaXJzdFBhZ2U6IENvbnRyYWN0LkRhdGFUYWJsZSA9IGF3YWl0IHRoaXMuZ2V0UGFnZUFzeW5jKDApO1xuICAgIG1heFJvd3MgPSBtYXhSb3dzIHx8IHRoaXMudG90YWxSb3dDb3VudDtcbiAgICBjb25zdCByb3dzUmVxdWVzdGVkID0gTWF0aC5taW4obWF4Um93cywgdGhpcy50b3RhbFJvd0NvdW50KTtcbiAgICBjb25zdCBwYWdlc1JlcXVlc3RlZCA9IE1hdGguY2VpbChyb3dzUmVxdWVzdGVkIC8gdGhpcy5fcGFnZVJvd0NvdW50KTtcblxuICAgIC8vIEZldGNoIHVwIHRvIDQwMCBwYWdlcywgd2l0aCBhIGRlZmF1bHQgb2YgMTAsMDAwIHBhZ2VSb3dDb3VudCB0aGF0IGdpdmVzIHVzIDQsMDAwLDAwMCByb3dzXG4gICAgY29uc3QgcGFnZXNUb0ZldGNoID0gTWF0aC5taW4ocGFnZXNSZXF1ZXN0ZWQsIDQwMCk7XG4gICAgY29uc3QgaXNEYXRhTGltaXRlZCA9IHBhZ2VzVG9GZXRjaCA8IHBhZ2VzUmVxdWVzdGVkO1xuICAgIGxldCByZW1haW5pbmdEYXRhOiBBcnJheTxBcnJheTxBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+Pj4gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhZ2VzVG9GZXRjaDsgaSsrKSB7XG4gICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGhpcy5nZXRQYWdlQXN5bmMoaSk7XG4gICAgICByZW1haW5pbmdEYXRhLnB1c2gocGFnZS5kYXRhKTtcbiAgICB9XG5cbiAgICBsZXQgZnVsbERhdGEgPSBmaXJzdFBhZ2UuZGF0YS5jb25jYXQoLi4ucmVtYWluaW5nRGF0YSk7XG4gICAgLy8gVGhpcyBzbGljZXMgdGhlIGFycmF5IG9ubHkgaWYgbWF4Um93cyBoYXMgYmVlbiBzZXQgYW5kIGlzIGxlc3MgdGhhbiB0b3RhbFJvd0NvdW50XG4gICAgZnVsbERhdGEubGVuZ3RoID0gcm93c1JlcXVlc3RlZDtcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBmaXJzdFBhZ2UubmFtZSxcbiAgICAgIGRhdGE6IGZ1bGxEYXRhLFxuICAgICAgY29sdW1uczogZmlyc3RQYWdlLmNvbHVtbnMsXG4gICAgICB0b3RhbFJvd0NvdW50OiBpc0RhdGFMaW1pdGVkID8gcGFnZXNUb0ZldGNoICogdGhpcy5fcGFnZVJvd0NvdW50IDogcm93c1JlcXVlc3RlZCxcbiAgICAgIGlzVG90YWxSb3dDb3VudExpbWl0ZWQ6IGlzRGF0YUxpbWl0ZWQsXG4gICAgICBpc1N1bW1hcnlEYXRhOiBmaXJzdFBhZ2UuaXNTdW1tYXJ5RGF0YSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHJlbGVhc2VBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UucmVsZWFzZUFzeW5jKHRoaXMuX2lkKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVG9vbHRpcENvbnRleHQgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSG92ZXJUdXBsZUludGVyYWN0aW9uLCBTZWxlY3RPcHRpb25zLCBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbiwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIFNlbGVjdGlvbiBNb2RlbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdGlvbk1vZGVsIHtcbiAgcHVibGljIHF1YWxpZmllZEZpZWxkQ2FwdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFZhbHVlIGJhc2VkIHNlbGVjdGlvbiBtb2RlbC4gTWVhbnQgZm9yIGhpZXJhcmNoaWNhbCwgcmFuZ2UgYW5kIGNhdGVnb3JpY2FsIHNlbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgc2VsZWN0VmFsdWVzOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbi8qKlxuICogSGllcmFyY2hpY2FsIHZhbHVlIHNlbGVjdGlvbiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgSGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWwgZXh0ZW5kcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIHt9XG5cbi8qKlxuICogUmFuZ2UgYmFzZWQgdmFsdWUgc2VsZWN0aW9uIG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW5nZVNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgbWluVmFsdWU6IHN0cmluZztcbiAgcHVibGljIG1heFZhbHVlOiBzdHJpbmc7XG4gIHB1YmxpYyBpbmNsdWRlZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIERpbWVuc2lvbiB2YWx1ZSBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIERpbWVuc2lvblNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgVmFsdWVTZWxlY3Rpb25Nb2RlbCB7fVxuLyoqXG4gKiBUdXBsZSBiYXNlZCBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFR1cGxlU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgc2VsZWN0aW9uVHlwZTogc3RyaW5nO1xuICBwdWJsaWMgb2JqZWN0SWRzOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbi8qKlxuICogQ29udGFpbmVyIGNsYXNzIHRvIHBvcHVsYXRlIGFsbCB0aGUgc2VsZWN0aW9uIG1vZGVscyB3aGVuIHBhcnNpbmcgaW5wdXRcbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciB7XG4gIHB1YmxpYyBoaWVyTW9kZWxBcnI6IEFycmF5PEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsPiA9IFtdO1xuICBwdWJsaWMgZGltTW9kZWxBcnI6IEFycmF5PERpbWVuc2lvblNlbGVjdGlvbk1vZGVsPiA9IFtdO1xuICBwdWJsaWMgcXVhbnRNb2RlbEFycjogQXJyYXk8UmFuZ2VTZWxlY3Rpb25Nb2RlbD4gPSBbXTtcbiAgcHVibGljIHNlbGVjdGlvbjogVHVwbGVTZWxlY3Rpb25Nb2RlbDtcbn1cblxuZXhwb3J0IGNsYXNzIFNlbGVjdFR1cGxlc0ludGVyYWN0aW9uTW9kZWwgaW1wbGVtZW50cyBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdmlzdWFsSWRQcmVzTW9kZWw6IFZpc3VhbElkLFxuICAgIHB1YmxpYyB0dXBsZUlkczogQXJyYXk8bnVtYmVyPiA9IFtdLFxuICAgIHB1YmxpYyBzZWxlY3RPcHRpb25zOiBTZWxlY3RPcHRpb25zLFxuICAgIHB1YmxpYyB0b29sdGlwQ29udGV4dD86IFRvb2x0aXBDb250ZXh0LFxuICApIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBIb3ZlclR1cGxlSW50ZXJhY3Rpb25Nb2RlbCBpbXBsZW1lbnRzIEhvdmVyVHVwbGVJbnRlcmFjdGlvbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdmlzdWFsSWRQcmVzTW9kZWw6IFZpc3VhbElkLFxuICAgIHB1YmxpYyB0dXBsZUlkOiBudW1iZXIsXG4gICAgcHVibGljIHRvb2x0aXBDb250ZXh0PzogVG9vbHRpcENvbnRleHQgfCBudWxsLFxuICAgIHB1YmxpYyBhbGxvd0hvdmVyQWN0aW9ucz86IGJvb2xlYW4sXG4gICkge31cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBQb2ludCBpbXBsZW1lbnRzIENvbnRyYWN0LlBvaW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3g6IG51bWJlciwgcHJpdmF0ZSBfeTogbnVtYmVyKSB7fVxuXG4gIHB1YmxpYyBnZXQgeCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl94O1xuICB9XG5cbiAgcHVibGljIGdldCB5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3k7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi9TZXJ2aWNlUmVnaXN0cnknO1xuXG4vKipcbiAqIERlZmluZXMgd2hpY2ggdHlwZSBvZiBnZXREYXRhIGNhbGwgdG8gbWFrZS5cbiAqL1xuZXhwb3J0IGVudW0gR2V0RGF0YVR5cGUge1xuICBTdW1tYXJ5ID0gJ3N1bW1hcnknLFxuICBVbmRlcmx5aW5nID0gJ3VuZGVybHlpbmcnLFxufVxuXG4vKipcbiAqIFNlcnZpY2UgZm9yIGltcGxlbWVudGluZyB0aGUgbG9naWMgZm9yIHZhcmlvdXMgZ2V0RGF0YSBjYWxsc1xuICpcbiAqIEBpbnRlcmZhY2UgR2V0RGF0YVNlcnZpY2VcbiAqIEBleHRlbmRzIHtBcGlTZXJ2aWNlfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldERhdGFTZXJ2aWNlIGV4dGVuZHMgQXBpU2VydmljZSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaW1pdCBvZiByb3dzIGZvciBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jXG4gICAqL1xuICBnZXRNYXhSb3dMaW1pdCgpOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVuZGVybHlpbmcgZGF0YSBmb3IgYSBwYXJ0aWN1bGFyIHZpc3VhbFxuICAgKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcGFyYW0ge0dldERhdGFUeXBlfSBnZXRUeXBlICBUaGUgdHlwZSBvZiBnZXREYXRhIGNhbGwgdG8gbWFrZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgb3Igbm90IGFsaWFzZXMgc2hvdWxkIGJlIGlnbm9yZWRcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVTZWxlY3Rpb24gIFdoZXRoZXIgb3Igbm90IHNlbGVjdGlvbiBzaG91bGQgYmUgaWdub3JlZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVBbGxDb2x1bW5zICBTaG91bGQgYWxsIGNvbHVtbnMgYmUgaW5jbHVkZWRcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1ucy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgIE1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0dXJuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBnZXRUeXBlOiBHZXREYXRhVHlwZSxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICAgIGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZVJvd0NvdW50IFRoZSBudW1iZXIgb2Ygcm93cyBwZXIgcGFnZS4gVGhlIGRlZmF1bHQgYW5kIG1heGltdW0gaXMgMTAsMDAwIHJvd3MuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVTZWxlY3Rpb24gIFdoZXRoZXIgc2VsZWN0aW9ucyBpbiB0aGlzIHZpeiBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVBbGxDb2x1bW5zICBTaG91bGQgYWxsIGNvbHVtbnMgYmUgaW5jbHVkZWRcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+fSAgRGF0YSB0YWJsZSByZWFkZXIgdG8gYWNjZXNzIHRoZSB1bmRlcmx5aW5nIGRhdGFcbiAgICovXG4gIGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgICBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmc6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1hcmtzIGZvciBhIGdpdmVuIHZpc3VhbFxuICAgKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBY3RpdmVNYXJrcz59ICBDb2xsZWN0aW9uIG9mIGRhdGEgdGFibGVzIHdpdGggdGhlIGFjdGl2ZSBtYXJrc1xuICAgKi9cbiAgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudGx5IGhpZ2hsaWdodGVkIG1hcmtzIGZvciBhIGdpdmVuIHZpc3VhbFxuICAgKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBY3RpdmVNYXJrcz59ICBDb2xsZWN0aW9uIG9mIGRhdGEgdGFibGVzIHdpdGggdGhlIGFjdGl2ZSBtYXJrc1xuICAgKi9cbiAgZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFzb3VyY2VJZCAgVGhlIGlkIG9mIHRoZSBkYXRhc291cmNlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBjYXB0aW9uLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGVCeUlkIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBuYW1lLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0RGF0YVNvdXJjZURhdGFBc3luYyhcbiAgICBkYXRhc291cmNlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YXNvdXJjZUlkICBUaGUgaWQgb2YgdGhlIGRhdGFzb3VyY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2ljYWxUYWJsZUlkICBUaGUgaWQgb2YgdGhlIGxvZ2NpYWwgdGFibGVcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Um93cyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGUgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IGNhcHRpb24uIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IG5hbWUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YXNvdXJjZUlkICBUaGUgaWQgb2YgdGhlIGRhdGFzb3VyY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2ljYWxUYWJsZUlkICBUaGUgaWQgb2YgdGhlIGxvZ2NpYWwgdGFibGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2VSb3dDb3VudCBUaGUgbnVtYmVyIG9mIHJvd3MgcGVyIHBhZ2UuIFRoZSBkZWZhdWx0IGFuZCBtYXhpbXVtIGlzIDEwLDAwMCByb3dzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IG5hbWUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9naWNhbFRhYmxlSWQgIFRoZSBpZCBvZiB0aGUgbG9nY2lhbCB0YWJsZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlU2VsZWN0aW9uICBXaGV0aGVyIHNlbGVjdGlvbnMgaW4gdGhpcyB2aXogc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQWxsQ29sdW1ucyAgV2hldGhlciB0byBpbmNsdWRlIGFsbCBjb2x1bW5zIG9yIG9ubHkgdGhlIHJlZmVyZW5jZWQgY29sdW1uc1xuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBPdmVycmlkZXMgaW5jbHVkZUFsbENvbHVtbnMsIGxpc3RzIHRoZSBjb2x1bW5zIHRvIGluY2x1ZGUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Um93cyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nOiBib29sZWFuLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpY2FsVGFibGVJZCAgVGhlIGlkIG9mIHRoZSBsb2djaWFsIHRhYmxlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlUm93Q291bnQgVGhlIG51bWJlciBvZiByb3dzIHBlciBwYWdlLiBUaGUgZGVmYXVsdCBhbmQgbWF4aW11bSBpcyAxMCwwMDAgcm93cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBzZWxlY3Rpb25zIGluIHRoaXMgdml6IHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFdoZXRoZXIgdG8gaW5jbHVkZSBhbGwgY29sdW1ucyBvciBvbmx5IHRoZSByZWZlcmVuY2VkIGNvbHVtbnNcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqL1xuICBnZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkNvbHVtbj4+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gdGFibGVJZCAgICAgVGhlIHRhYmxlIGlkIHVzZWQgdG8gZmV0Y2ggZGF0YS5cbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgIFRoZSBwYWdlIG51bWJlciAoemVyby1iYXNlZCkuXG4gICAqIEBwYXJhbSBwYWdlU2l6ZSAgICBUaGUgcGFnZSBzaXplIG9mIHRoZSBvd25pbmcgRGF0YVRhYmxlUmVhZGVyXG4gICAqIEByZXR1cm5zICAgICAgICAgICBBIERhdGFUYWJsZSBjb250YWluaW5nIHRoZSByZXF1ZXN0ZWQgcGFnZS4gVGhlIG51bWJlciBvZiByb3dzIHJldHVybmVkXG4gICAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgbGVzcyB0aGFuIHJlcXVlc3RlZCBhdCB0aGUgZW5kIG9mIHRoZSBkYXRhLlxuICAgKi9cbiAgZ2V0UGFnZUFzeW5jKHRhYmxlSWQ6IHN0cmluZywgcGFnZU51bWJlcjogbnVtYmVyLCBwYWdlU2l6ZTogbnVtYmVyKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gdGFibGVJZCAgICAgVGhlIHRhYmxlIGlkIHVzZWQgdG8gZmV0Y2ggZGF0YS5cbiAgICovXG4gIHJlbGVhc2VBc3luYyh0YWJsZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSB9IGZyb20gJy4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9BY2Nlc3NpYmlsaXR5U2VydmljZUltcGwnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvQW5pbWF0aW9uU2VydmljZUltcGwnO1xuaW1wb3J0IHsgQW5ub3RhdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0Fubm90YXRpb25TZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvRGF0YVNvdXJjZVNlcnZpY2VJbXBsJztcbmltcG9ydCB7IEV4cG9ydFNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0V4cG9ydFNlcnZpY2VJbXBsJztcbmltcG9ydCB7IEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9FeHRlcm5hbENvbnRleHRNZW51U2VydmljZUltcGwnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvRmlsdGVyU2VydmljZUltcGwnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0dldERhdGFTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvUGFyYW1ldGVyc1NlcnZpY2VJbXBsJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1NlbGVjdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFNpemVTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9TaXplU2VydmljZUltcGwnO1xuaW1wb3J0IHsgVmlzdWFsTW9kZWxTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9WaXN1YWxNb2RlbFNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFZpelNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1ZpelNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFpvbmVTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9ab25lU2VydmljZUltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQ6IG51bWJlcik6IHZvaWQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgQW5pbWF0aW9uU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgRGF0YVNvdXJjZVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEV4cG9ydFNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEdldERhdGFTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBGaWx0ZXJTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBQYXJhbWV0ZXJzU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgU2VsZWN0aW9uU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgQW5ub3RhdGlvblNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFpvbmVTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBTaXplU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgVmlzdWFsTW9kZWxTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBWaXpTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcblxuLyoqXG4gKiBCYXNlIGludGVyZmFjZSBmb3IgYW4gYXBpIHNlcnZpY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIG5hbWUgZm9yIHRoaXMgc2VydmljZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29sbGVjdGlvbiBvZiBzZXJ2aWNlIG5hbWUgd2hpY2ggd2lsbCBiZSByZWdpc3RlcmVkIGluIHRoZSBhcGktc2hhcmVkIHByb2plY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gU2VydmljZU5hbWVzIHtcbiAgQWNjZXNzaWJpbGl0eSA9ICdhY2Nlc3NpYmlsaXR5JyxcbiAgQXV0aGVudGljYXRpb24gPSAnYXV0aGVudGljYXRpb24nLFxuICBDbGllbnRJbmZvID0gJ2NsaWVudC1pbmZvLXNlcnZpY2UnLFxuICBEYXRhU291cmNlU2VydmljZSA9ICdkYXRhLXNvdXJjZS1zZXJ2aWNlJyxcbiAgR2V0RGF0YSA9ICdnZXQtZGF0YS1zZXJ2aWNlJyxcbiAgRmlsdGVyID0gJ2ZpbHRlci1zZXJ2aWNlJyxcbiAgTm90aWZpY2F0aW9uID0gJ25vdGlmaWNhdGlvbi1zZXJ2aWNlJyxcbiAgUGFyYW1ldGVycyA9ICdwYXJhbWV0ZXJzLXNlcnZpY2UnLFxuICBTZWxlY3Rpb24gPSAnc2VsZWN0aW9uLXNlcnZpY2UnLFxuICBBbm5vdGF0aW9uID0gJ2Fubm90YXRpb24tc2VydmljZScsXG4gIFpvbmUgPSAnem9uZS1zZXJ2aWNlJyxcbiAgQW5pbWF0aW9uID0gJ2FuaW1hdGlvbi1zZXJ2aWNlJyxcbiAgVml6ID0gJ3Zpei1zZXJ2aWNlJyxcbiAgRXh0ZXJuYWxDb250ZXh0TWVudSA9ICdleHRlcm5hbC1jb250ZXh0LW1lbnUtc2VydmljZScsXG4gIEluaXRpYWxpemF0aW9uID0gJ2luaXRpYWxpemF0aW9uLXNlcnZpY2UnLFxuICBTdG9yeUFjdGl2YXRpb24gPSAnc3RvcnktYWN0aXZhdGlvbi1zZXJ2aWNlJyxcbiAgU2l6ZSA9ICdzaXplLXNlcnZpY2UnLFxuICBFeHBvcnQgPSAnZXhwb3J0LXNlcnZpY2UnLFxuICBWaXN1YWxNb2RlbCA9ICd2aXN1YWwtbW9kZWwtc2VydmljZScsXG59XG5cbi8qKlxuICogRG8gc29tZSBnbG9iYWwgZGVjbGFyYXRpb25zIHNvIHdlIGNhbiBjcmVhdGUgYSBzaW5nbGV0b24gb24gdGhlIHdpbmRvdyBvYmplY3RcbiAqL1xuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBfX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnk6IHsgW3JlZ2lzdHJ5SWQ6IG51bWJlcl06IFNlcnZpY2VSZWdpc3RyeSB9O1xuICB9XG59XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5ID0gd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSB8fCB7fTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlUmVnaXN0cnkge1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbmV3IHNlcnZpY2UgaW50byB0aGUgc2VydmljZSByZWdpc3RyeS4gQW55IGV4aXN0aW5nIG9uZSB3aWxsXG4gICAqIGJlIG92ZXJ3cml0dGVuLiB0aGUgc2VydmljZSBpcyByZWdpc3RlcmVkIHVuZGVyIHNlcnZpY2Uuc2VydmljZU5hbWVcbiAgICpcbiAgICogQHBhcmFtIHtBcGlTZXJ2aWNlfSBzZXJ2aWNlIFRoZSBzZXJ2aXZlIHRvIHJlZ2lzdGVyXG4gICAqL1xuICByZWdpc3RlclNlcnZpY2Uoc2VydmljZTogQXBpU2VydmljZSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgZ2l2ZW4gc2VydmljZSBmcm9tIHRoZSByZWdpc3RyeS4gSWYgdGhlcmUgaXMgbm90IGFcbiAgICogc2VydmljZSByZWdpc3RlcmVkIHVuZGVyIHRoYXQgbmFtZSwgdGhyb3dzIGFuZCBlcnJvclxuICAgKlxuICAgKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgc2VydmljZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VydmljZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UuXG4gICAqIEByZXR1cm5zIHtUfSBUaGUgcmVxdWVzdGVkIHNlcnZpY2VcbiAgICovXG4gIGdldFNlcnZpY2U8VCBleHRlbmRzIEFwaVNlcnZpY2U+KHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBUO1xufVxuXG5jbGFzcyBTZXJ2aWNlUmVnaXN0cnlJbXBsIGltcGxlbWVudHMgU2VydmljZVJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBfc2VydmljZXM6IHsgW3NlcnZpY2VOYW1lOiBzdHJpbmddOiBBcGlTZXJ2aWNlIH07XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3NlcnZpY2VzID0ge307XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJTZXJ2aWNlKHNlcnZpY2U6IEFwaVNlcnZpY2UpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXJ2aWNlc1tzZXJ2aWNlLnNlcnZpY2VOYW1lXSA9IHNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VydmljZTxUIGV4dGVuZHMgQXBpU2VydmljZT4oc2VydmljZU5hbWU6IHN0cmluZyk6IFQge1xuICAgIGlmICghdGhpcy5fc2VydmljZXMuaGFzT3duUHJvcGVydHkoc2VydmljZU5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFNlcnZpY2Ugbm90IHJlZ2lzdGVyZWQ6ICR7c2VydmljZU5hbWV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3NlcnZpY2VzW3NlcnZpY2VOYW1lXSBhcyBUO1xuICB9XG59XG5cbi8qKlxuICogU3RhdGljIGNsYXNzIHVzZWQgZm9yIGdldHRpbmcgYWNjZXNzIHRvIHRoZSBzaW5nbGUgaW5zdGFuY2VcbiAqIG9mIHRoZSBBcGlTZXJ2aWNlUmVnaXN0cnkgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWdpc3RyeUlkLlxuICpcbiAqIEV4dGVuc2lvbnMgYnkgZGVzaWduIGRvbid0IG5lZWQgdG8gc3RvcmUvYWNjZXNzIG11bHRpcGxlIHNlcnZpY2UgcmVnaXN0cmllcy4gVGhlaXIgc2luZ2xlIGluc3RhbmNlIG9mIFNlcnZpY2VSZWdpc3RyeSBpc1xuICogc3RvcmVkL2FjY2VzcyB3aXRoIHJlZ2lzdHJ5SWQgPSAwLlxuICpcbiAqIFdoZXJlYXMgRW1iZWRkaW5nIG5lZWRzIHRvIGJlIGF3YXJlIG9mIHdoaWNoIFNlcnZpY2VSZWdpc3RyeSB0byB1c2Ugd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgdml6emVzIGVtYmVkZGVkLlxuICogQW4gZXhhbXBsZSBvZiBob3cgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSB3aWxsIGxvb2sgd2hlbiB0aGVyZSBhcmUgdHdvIHZpenplczogeyAwIDogU2VydmljZVJlZ2lzdHJ5LCAxIDogU2VydmljZVJlZ2lzdHJ5fVxuICogd2hlcmUgcmVnaXN0cnkgSUQgb2YgMCAmIDEgcmVmZXJzIHRvIHZpeidzIGludGVybmFsIGlkZW50aWZpZXIgKHdoaWNoIGlzIGdlbmVyYXRlZCBieSBWaXpNYW5hZ2VyKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwaVNlcnZpY2VSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIFNlcnZpY2VSZWdpc3RyeVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXQocmVnaXN0cnlJZDogbnVtYmVyKTogU2VydmljZVJlZ2lzdHJ5IHtcbiAgICBpZiAoIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnkgfHwgIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnlbcmVnaXN0cnlJZF0pIHtcbiAgICAgIEFwaVNlcnZpY2VSZWdpc3RyeS5zZXRJbnN0YW5jZShyZWdpc3RyeUlkLCBuZXcgU2VydmljZVJlZ2lzdHJ5SW1wbCgpKTtcbiAgICB9XG5cbiAgICBpZiAoIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnlbcmVnaXN0cnlJZF0pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnU2VydmljZSByZWdpc3RyeSBmYWlsZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeVtyZWdpc3RyeUlkXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHRoYXQgc2V0cyB0aGUgc2VydmljZSByZWdpc3RyeSBpbnN0YW5jZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0cnlJZC4gQ2FuIGJlIHVzZWQgYnkgdW5pdCB0ZXN0c1xuICAgKlxuICAgKiBAcGFyYW0ge1NlcnZpY2VSZWdpc3RyeX0gc2VydmljZVJlZ2lzdHJ5IFRoZSBuZXcgcmVnaXN0cnlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0SW5zdGFuY2UocmVnaXN0cnlJZDogbnVtYmVyLCBzZXJ2aWNlUmVnaXN0cnk6IFNlcnZpY2VSZWdpc3RyeSk6IHZvaWQge1xuICAgIGlmICghd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSkge1xuICAgICAgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSA9IHt9O1xuICAgIH1cbiAgICB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5W3JlZ2lzdHJ5SWRdID0gc2VydmljZVJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIE9ubHkgdXNlZCBieSB1bml0IHRlc3RzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNsZWFyUmVnaXN0cnkoKTogdm9pZCB7XG4gICAgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSA9IHt9O1xuICB9XG5cbiAgLy8gUHJpdmF0ZSB0byBhdm9pZCBhbnlvbmUgY29uc3RydWN0aW5nIHRoaXNcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVG9vbHRpcFRleHRSZXF1ZXN0TW9kZWwgfSBmcm9tICcuLi8uLi9Nb2RlbHMvQWNjZXNzaWJpbGl0eU1vZGVscyc7XG5pbXBvcnQgeyBBY2Nlc3NpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL0FjY2Vzc2liaWxpdHlTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBBY2Nlc3NpYmlsaXR5U2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBBY2Nlc3NpYmlsaXR5U2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkFjY2Vzc2liaWxpdHk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9vbHRpcFRleHRBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIHR1cGxlSWQ6IG51bWJlcik6IFByb21pc2U8U3RyaW5nPiB7XG4gICAgbGV0IHRvb2x0aXBUZXh0UmVxdWVzdCA9IG5ldyBUb29sdGlwVGV4dFJlcXVlc3RNb2RlbCh2aXN1YWxJZCwgdHVwbGVJZCk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0VG9vbHRpcFRleHRBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVG9vbHRpcFRleHRSZXF1ZXN0XTogdG9vbHRpcFRleHRSZXF1ZXN0LFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRUb29sdGlwVGV4dCwgcGFyYW1ldGVycykudGhlbjxTdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBTdHJpbmc7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJhaXNlTGVhdmVNYXJrTmF2Tm90aWZpY2F0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBSZXBsYXlTcGVlZFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRXh0ZXJuYWxFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi8uLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZSB9IGZyb20gJy4uL0FuaW1hdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEFuaW1hdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgQW5pbWF0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkFuaW1hdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyByZXBsYXlBc3luYyhyZXBsYXlTcGVlZDogUmVwbGF5U3BlZWRUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5SZXBsYXlTcGVlZF06IDEuMCxcbiAgICB9O1xuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxSZXBsYXlTcGVlZFR5cGU+KHJlcGxheVNwZWVkLCBSZXBsYXlTcGVlZFR5cGUsICdSZXBsYXlTcGVlZFR5cGUnKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlJlcGxheVNwZWVkXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5zZXRSZXBsYXlTcGVlZFR5cGUuY29udmVydChyZXBsYXlTcGVlZCk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZXBsYXlBbmltYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBbm5vdGF0ZUVudW0sIEFubm90YXRpb24sIEV4ZWN1dGVQYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJZCwgVmVyYklkLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciwgVHVwbGVTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJy4uLy4uL01vZGVscy9TZWxlY3Rpb25Nb2RlbHMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IEFubm90YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vQW5ub3RhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEFubm90YXRpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEFubm90YXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuQW5ub3RhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gYW5ub3RhdGUgYSBtYXJrIG9uIHRoZSBnaXZlbiB3b3Jrc2hlZXQuXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcGFyYW0gbWFya1xuICAgKiBAcGFyYW0gYW5ub3RhdGlvblRleHRcbiAgICovXG4gIHB1YmxpYyBhbm5vdGF0ZU1hcmtBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIG1hcms6IENvbnRyYWN0Lk1hcmtJbmZvLCBhbm5vdGF0aW9uVGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IHRoaXMucGFyc2VNYXJrU2VsZWN0aW9uSWRzKFttYXJrXSk7XG4gICAgY29uc3QgZHVtbXlUYXJnZXRQb2ludCA9IHsgeDogMCwgeTogMCB9O1xuICAgIGNvbnN0IGZvcm1hdHRlZFRleHQgPSBgPGZvcm1hdHRlZC10ZXh0PjxydW4+JHthbm5vdGF0aW9uVGV4dH08L3J1bj48L2Zvcm1hdHRlZC10ZXh0PmA7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYW5ub3RhdGVNYXJrQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuQW5ub3RhdGVFbnVtXTogQW5ub3RhdGVFbnVtLk1hcmssXG4gICAgICBbUGFyYW1ldGVySWQuVGFyZ2V0UG9pbnRdOiBkdW1teVRhcmdldFBvaW50LFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvbkxpc3RdOiBbc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uXSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Gb3JtYXR0ZWRUZXh0XTogZm9ybWF0dGVkVGV4dCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNyZWF0ZUFubm90YXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBFeHBlY3RpbmcgYW4gZW1wdHkgbW9kZWwgYW5kIGhlbmNlIHRoZSB2b2lkIHJlc3BvbnNlLlxuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byByZXRyaWV2ZSBhbm5vdGF0aW9ucyBmb3IgdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PEFubm90YXRpb24+Pn1cbiAgICovXG4gIHB1YmxpYyBnZXRBbm5vdGF0aW9uc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0QW5ub3RhdGlvbnNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEFubm90YXRpb25zLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+PigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGFubm90YXRpb25zTGlzdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxBbm5vdGF0aW9uPjtcbiAgICAgIHJldHVybiB0aGlzLmFubm90YXRpb25GaWx0ZXJNYXAoYW5ub3RhdGlvbnNMaXN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcmVtb3ZlIGFuIGFubm90YXRpb24gZnJvbSBhIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBhbm5vdGF0aW9uXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlQW5ub3RhdGlvbkFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgYW5ub3RhdGlvbjogQ29udHJhY3QuQW5ub3RhdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSB0aGlzLnBhcnNlQW5ub3RhdGlvblNlbGVjdGlvbklkcyhbYW5ub3RhdGlvbl0pO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbW92ZUFubm90YXRpb25Bc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3Rpb25MaXN0XTogW3NlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbl0sXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZW1vdmVBbm5vdGF0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgLy8gRXhwZWN0aW5nIGFuIGVtcHR5IG1vZGVsIGFuZCBoZW5jZSB0aGUgdm9pZCByZXNwb25zZS5cbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSBNYXJrc0luZm9cbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlTWFya1NlbGVjdGlvbklkcyhtYXJrczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+KTogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyIHtcbiAgICBjb25zdCBpZHM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gbmV3IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lcigpO1xuICAgIG1hcmtzLmZvckVhY2goKG1hcmspID0+IHtcbiAgICAgIGNvbnN0IHR1cGxlSWQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IG1hcmsudHVwbGVJZDtcbiAgICAgIGlmICh0dXBsZUlkICE9PSB1bmRlZmluZWQgJiYgdHVwbGVJZCAhPT0gbnVsbCAmJiB0dXBsZUlkID4gMCkge1xuICAgICAgICBpZHMucHVzaCh0dXBsZUlkLnRvU3RyaW5nKCkpOyAvLyBjb2xsZWN0IHRoZSB0dXBsZSBpZHNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnaW52YWxpZCB0dXBsZUlkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IDApIHtcbiAgICAgIC8vIHR1cGxlIGlkcyBiYXNlZCBzZWxlY3Rpb25cbiAgICAgIGNvbnN0IHR1cGxlU2VsZWN0aW9uTW9kZWw6IFR1cGxlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVHVwbGVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb25UeXBlID0gJ3R1cGxlcyc7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLm9iamVjdElkcyA9IGlkcztcbiAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbiA9IHR1cGxlU2VsZWN0aW9uTW9kZWw7XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSBNYXJrQW5ub3RhdGlvbkluZm9cbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlQW5ub3RhdGlvblNlbGVjdGlvbklkcyhhbm5vdGF0aW9uczogQXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4pOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICAgIGNvbnN0IGlkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG4gICAgYW5ub3RhdGlvbnMuZm9yRWFjaCgoYW5ub3RhdGlvbikgPT4ge1xuICAgICAgY29uc3QgYW5ub3RhdGlvbklkOiBudW1iZXIgfCB1bmRlZmluZWQgPSBhbm5vdGF0aW9uLmFubm90YXRpb25JZDtcbiAgICAgIGlmIChhbm5vdGF0aW9uSWQgIT09IHVuZGVmaW5lZCAmJiBhbm5vdGF0aW9uSWQgIT09IG51bGwgJiYgYW5ub3RhdGlvbklkID49IDApIHtcbiAgICAgICAgaWRzLnB1c2goYW5ub3RhdGlvbklkLnRvU3RyaW5nKCkpOyAvLyBjb2xsZWN0IHRoZSBhbm5vdGF0aW9uIGlkc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdpbnZhbGlkIGFubm90YXRpb25JZCcpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAvLyBhbm5vdGF0aW9uIGlkcyBiYXNlZCBzZWxlY3Rpb25cbiAgICAgIGNvbnN0IHR1cGxlU2VsZWN0aW9uTW9kZWw6IFR1cGxlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVHVwbGVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb25UeXBlID0gJ2Fubm90YXRpb25zJztcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwub2JqZWN0SWRzID0gaWRzO1xuICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uID0gdHVwbGVTZWxlY3Rpb25Nb2RlbDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBtYXAgQW5ub3RhdGlvbiB0byBNYXJrQW5ub3RhdGlvbkluZm9cbiAgICogQHBhcmFtIGFubm90YXRpb25cbiAgICogQHJldHVybnMge0Fubm90YXRpb259XG4gICAqL1xuICBwcml2YXRlIG1hcEFubm90YXRpb24oYW5ub3RhdGlvbjogQW5ub3RhdGlvbik6IENvbnRyYWN0LkFubm90YXRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBhbm5vdGF0aW9uSFRNTDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uVGV4dCxcbiAgICAgIGFubm90YXRpb25JZDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uSWQsXG4gICAgICBhbm5vdGF0aW9uVGV4dDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uUGxhaW5UZXh0LFxuICAgICAgYW5ub3RhdGlvblR5cGU6IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5hbm5vdGF0aW9uVHlwZS5jb252ZXJ0KGFubm90YXRpb24uYW5ub3RhdGVFbnVtKSxcbiAgICAgIHR1cGxlSWQ6IGFubm90YXRpb24udHVwbGVJZCEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgdGhlIEFubm90YXRpb25zIHRvIE1hcmsgQW5ub3RhdGlvbnMsIGFuZCBtYXAgdGhlbSB0byBNYXJrQW5ub3RhdGlvbkluZm9cbiAgICogQHBhcmFtIGFubm90YXRpb25zXG4gICAqIEByZXR1cm5zIHtBcnJheTxBbm5vdGF0aW9uPn1cbiAgICovXG4gIHByaXZhdGUgYW5ub3RhdGlvbkZpbHRlck1hcChhbm5vdGF0aW9uczogQXJyYXk8QW5ub3RhdGlvbj4pOiBBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPiB7XG4gICAgY29uc3QgYW5ub3RhdGlvbkluZm9zID0gYW5ub3RhdGlvbnMubWFwKChhbm5vdGF0aW9uKSA9PiB0aGlzLm1hcEFubm90YXRpb24oYW5ub3RhdGlvbikpO1xuXG4gICAgcmV0dXJuIGFubm90YXRpb25JbmZvcztcbiAgfVxufVxuIiwiaW1wb3J0IHsgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbywgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ2xpZW50SW5mb1NlcnZpY2UgfSBmcm9tICcuLi9DbGllbnRJbmZvU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgQ2xpZW50SW5mb1NlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgQ2xpZW50SW5mb1NlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5DbGllbnRJbmZvO1xuICB9XG5cbiAgcHVibGljIGdldENsaWVudEluZm9Bc3luYygpOiBQcm9taXNlPEVtYmVkZGluZ0Jvb3RzdHJhcEluZm8+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldEVtYmVkZGluZ0NsaWVudEluZm87XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldENsaWVudEluZm9Bc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxFbWJlZGRpbmdCb290c3RyYXBJbmZvPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudEluZm8gPSByZXNwb25zZS5yZXN1bHQgYXMgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbztcbiAgICAgIHJldHVybiBjbGllbnRJbmZvO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5LFxuICBEYXRhU2NoZW1hLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBMb2dpY2FsVGFibGVJbmZvLFxuICBQYXJhbWV0ZXJJZCxcbiAgVGFibGVJbmZvLFxuICBUYWJsZUluZm9zLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL0RhdGFTb3VyY2UnO1xuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuLi8uLi9GaWVsZCc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvRGF0YVNvdXJjZUltcGwnO1xuaW1wb3J0IHsgRmllbGRJbXBsIH0gZnJvbSAnLi4vLi4vSW1wbC9GaWVsZEltcGwnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBEYXRhU291cmNlU2VydmljZSB7XG4gIC8vIFNpbmNlIE9iamVjdCBNb2RlbCBpcyBzdXBwb3J0ZWQgc2luY2UgVGFibGVhdSAyMDIwLjIsIERhdGFTb3VyY2VTZXJ2aWNlSW1wbCBjYW4gYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGVcbiAgLy8gcGxhdGZvcm0gdmVyc2lvbiB3aGVuIE9NIHdhcyBzdXBwb3J0ZWQuIE9uY2Ugd2UgZHJvcCBzdXBwb3J0IGZvciBUYWJsZWF1IHZlcnNpb25zIDw9IDIwMjAuMSwgYWxsIGFkZGl0aW9uYWxcbiAgLy8gY29kZSBpbiBoZXJlIGZvciBPYmplY3QgTW9kZWwgY2FuIGJlIHJlbW92ZWQuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQ6IG51bWJlcikge1xuICAgIHN1cGVyKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpO1xuICB9XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIHJlZnJlc2hBc3luYyhkYXRhU291cmNlSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVmcmVzaEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EZWx0YVRpbWVNc106IDAsXG4gICAgICBbUGFyYW1ldGVySWQuU2hvdWxkUmVmcmVzaERTXTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgLy8gT24gc2VydmVyOiBOb3QgcGFzc2luZyB0aGUgZGF0YXNvdXJjZSBpZCB3aWxsIHJlZnJlc2ggYWxsIGRhdGFzb3VyY2VzLlxuICAgIGlmIChkYXRhU291cmNlSWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXSA9IGRhdGFTb3VyY2VJZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZWZyZXNoRGF0YVNvdXJjZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYyhkYXRhU291cmNlSWQ6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8VGFibGVJbmZvPj4ge1xuICAgIGNvbnN0IGpvaW5QYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0QWN0aXZlVGFibGVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICB9O1xuXG4gICAgLy8gR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdGFibGVzIHVzZWQgYnkgdGhpcyBjb25uZWN0aW9uXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0QWN0aXZlVGFibGVzLCBqb2luUGFyYW1ldGVycykudGhlbjxBcnJheTxUYWJsZUluZm8+Pigoam9pblJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZUluZm9zID0gam9pblJlc3BvbnNlLnJlc3VsdCBhcyBUYWJsZUluZm9zO1xuXG4gICAgICAvLyBnZXRBY3RpdmVUYWJsZXMgaXMgdW5zdXBwb3J0ZWQgZm9yIGN1YmVzIGFuZCBHQS4gV2UgZG8gbm90IGhhdmUgYSBjb25uZWN0aW9uIHR5cGUgcHJvcGVydHlcbiAgICAgIC8vIGF2YWlsYWJsZSBmcm9tIHRoZSBwbGF0Zm9ybSAoaW50ZW50aW9uYWxseSwgdG8gcmVkdWNlIGNvZGUgY2h1cm4gYXMgbmV3IGNvbm5lY3Rpb25zIGFyZSBhZGRlZCkuXG4gICAgICAvLyBJbnN0ZWFkLGp1c3QgY2hlY2sgaWYgYW55IHRhYmxlcyBhcmUgcmV0dXJuZWQuIFRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eSBmb3IgYW55IG5vbi10YWJsZSBiYXNlZCBkYXRhc291cmNlLlxuICAgICAgaWYgKHRhYmxlSW5mb3MudGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuVW5zdXBwb3J0ZWRNZXRob2RGb3JEYXRhU291cmNlVHlwZSwgYGdldEFjdGl2ZVRhYmxlcyBpcyBub3Qgc3VwcG9ydGVkIGZvcjogJHtkYXRhU291cmNlSWR9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZUluZm9zLnRhYmxlcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8RGF0YVNjaGVtYT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXRhU291cmNlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0RGF0YVNvdXJjZXMsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVNjaGVtYT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFTY2hlbWE7XG4gICAgICByZXR1cm4gZGF0YVNjaGVtYTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGxEYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8RGF0YVNjaGVtYT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRBbGxEYXRhU291cmNlc0FzeW5jJyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEFsbERhdGFTb3VyY2VzLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFTY2hlbWE+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBEYXRhU2NoZW1hO1xuICAgICAgcmV0dXJuIGRhdGFTY2hlbWE7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKGRhdGFTb3VyY2VJZDogc3RyaW5nKTogUHJvbWlzZTxDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5W10+IHtcbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICB9O1xuXG4gICAgLy8gR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdGFibGVzIHVzZWQgYnkgdGhpcyBjb25uZWN0aW9uXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0Q29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyaWVzLCBwYXJhbXMpLnRoZW48Q29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeVtdPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uU3VtbWFyaWVzID0gcmVzcG9uc2UucmVzdWx0IGFzIENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnlbXTtcbiAgICAgIHJldHVybiBkZXNjcmlwdGlvblN1bW1hcmllcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWVsZEFzeW5jKGdsb2JhbGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb250cmFjdC5GaWVsZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RmllbGRBbmREYXRhU291cmNlO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRGaWVsZEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5GaWVsZElkXTogZ2xvYmFsZmllbGROYW1lLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuRmllbGQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IHJlc3BvbnNlLnJlc3VsdFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlXSBhcyBJbnRlcm5hbENvbnRyYWN0LkRhdGFTb3VyY2U7XG4gICAgICBjb25zdCBmaWVsZCA9IHJlc3BvbnNlLnJlc3VsdFtQYXJhbWV0ZXJJZC5GaWVsZF0gYXMgRmllbGQ7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RmllbGQoZmllbGQsIHRoaXMuY29udmVydERhdGFTb3VyY2UoZGF0YVNvdXJjZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZXNBc3luYyhkYXRhU291cmNlSWQ6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+IHtcbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRMb2dpY2FsVGFibGVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldExvZ2ljYWxUYWJsZXMsIHBhcmFtcykudGhlbjxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PExvZ2ljYWxUYWJsZUluZm8+O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZXNBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PiB7XG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0VW5kZXJseWluZ1RhYmxlcywgcGFyYW1zKS50aGVuPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8TG9naWNhbFRhYmxlSW5mbz47XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRGaWVsZChmaWVsZDogSW50ZXJuYWxDb250cmFjdC5GaWVsZCwgZGF0YVNvdXJjZTogQ29udHJhY3QuRGF0YVNvdXJjZSk6IENvbnRyYWN0LkZpZWxkIHtcbiAgICByZXR1cm4gbmV3IEZpZWxkKG5ldyBGaWVsZEltcGwoZmllbGQsIGRhdGFTb3VyY2UpKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydERhdGFTb3VyY2UoZGF0YVNvdXJjZTogSW50ZXJuYWxDb250cmFjdC5EYXRhU291cmNlKTogQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRhU291cmNlKG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlLCB0aGlzLl9yZWdpc3RyeUlkKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeHBvcnRDcm9zc3RhYlNoZWV0TWFwLFxuICBFeHBvcnRGaWxlLFxuICBFeHBvcnRQREZPcHRpb25zIGFzIEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgUGFyYW1ldGVySWQsXG4gIFZlcmJJZCxcbiAgVmlzdWFsSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDcm9zc3RhYkZpbGVGb3JtYXQsXG4gIEV4cG9ydERhdGFPcHRpb25zLFxuICBFeHBvcnRQREZPcHRpb25zIGFzIEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCxcbiAgU2hhcmVkRXJyb3JDb2RlcyxcbiAgU2hlZXRUeXBlIGFzIEV4dGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBFeHBvcnRIZWxwZXJzIH0gZnJvbSAnLi4vLi4vVXRpbHMvRXhwb3J0SGVscGVycyc7XG5pbXBvcnQgeyBFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vRXhwb3J0U2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBFeHBvcnRTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEV4cG9ydFNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5FeHBvcnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcEFzeW5jKGN1cnJlbnRTaGVldFR5cGU6IEV4dGVybmFsU2hlZXRUeXBlKTogUHJvbWlzZTxFeHBvcnRDcm9zc3RhYlNoZWV0TWFwPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRFeHBvcnRDcm9zc3RhYlNoZWV0TWFwO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRFeHBvcnRDcm9zc3RhYlNoZWV0TWFwQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1cnJlbnRTaGVldFR5cGVdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hlZXRUeXBlLmNvbnZlcnQoY3VycmVudFNoZWV0VHlwZSksXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgRXhwb3J0Q3Jvc3N0YWJTaGVldE1hcDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZXhwb3J0Q3Jvc3N0YWJBc3luYyhcbiAgICBzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmb3JtYXQ6IENyb3NzdGFiRmlsZUZvcm1hdCxcbiAgICBleHBvcnRhYmxlV29ya3NoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sXG4gICAgY3VycmVudFNoZWV0VHlwZTogRXh0ZXJuYWxTaGVldFR5cGUsXG4gICk6IFByb21pc2U8RXhwb3J0RmlsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlTaGVldE5hbWUoZXhwb3J0YWJsZVdvcmtzaGVldE5hbWVzLCBzaGVldE5hbWUpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q3Jvc3N0YWJGaWxlRm9ybWF0Pihmb3JtYXQsIENyb3NzdGFiRmlsZUZvcm1hdCwgJ0Nyb3NzdGFiRmlsZUZvcm1hdCcpO1xuXG4gICAgLy8gVGhlIHByZXMgbGF5ZXIgY29tbWFuZCBmb3IgZXhwb3J0aW5nIENyb3NzdGFiIHVzZXMgU2ltcGxlU2hlZXRJZGVudGlmaWVycyBpbnN0ZWFkIG9mIHNoZWV0IG5hbWVzLlxuICAgIC8vIFRoZSBleHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpIGN1cnJlbnQgZG9lcyBub3Qgc3RvcmUgcmVmZXJlbmNlcyB0byB0aGUgU2ltcGxlU2hlZXRJZGVudGlmaWVycyBvZiBpdHMgc2hlZXRzXG4gICAgLy8gc28gd2UgY2FsbCBhIHByZXMgbGF5ZXIgY29tbWFuZCB0aGF0IGdpdmVzIHVzIHRoZSBTaW1wbGVTaGVldElkZW50aWZpZXIgZm9yIGVhY2ggc2hlZXQgbmFtZSB0aGF0IGFwcGVhcnMgaW4gdGhlXG4gICAgLy8gZXhwb3J0IENyb3NzdGFiIGRpYWxvZyBwb3B1cC5cbiAgICBjb25zdCBzaGVldE5hbWVUb0lkTWFwID0gYXdhaXQgdGhpcy5nZXRFeHBvcnRDcm9zc3RhYlNoZWV0TWFwQXN5bmMoY3VycmVudFNoZWV0VHlwZSk7XG4gICAgaWYgKCFzaGVldE5hbWVUb0lkTWFwW3NoZWV0TmFtZV0pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnbWlzc2luZyBzaGVldCBkb2MgaWQgZnJvbSBzaGVldE1hcCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdleHBvcnRDcm9zc3RhYkFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaGVldElkZW50aWZpZXJdOiBzaGVldE5hbWVUb0lkTWFwW3NoZWV0TmFtZV0sXG4gICAgICBbUGFyYW1ldGVySWQuU2VuZE5vdGlmaWNhdGlvbnNdOiB0cnVlLCAvLyBzZW5kIG5vdGlmaWNhdGlvbiBvbiBwcmVzIGxheWVyIHRoYXQgdHJpZ2dlcnMgZmlsZSBkb3dubG9hZFxuICAgIH07XG5cbiAgICAvLyBwcmVzIGxheWVyIGNvbW1hbmQgaW52b2tlZCBkZXBlbmRzIG9uIHRoZSBjcm9zc3RhYiBmaWxlIGZvcm1hdFxuICAgIGxldCB2ZXJiO1xuICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICBjYXNlIENyb3NzdGFiRmlsZUZvcm1hdC5DU1Y6XG4gICAgICAgIHZlcmIgPSBWZXJiSWQuRXhwb3J0Q3Jvc3N0YWJDc3ZEb3dubG9hZDtcbiAgICAgICAgLy8gQ1NWIG9ubHkgcGFyYW1ldGVyOiBzZWUgYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1jcm9zc3RhYi1vcHRpb25zLWRpYWxvZyByZXBvXG4gICAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVXNlVGFiRGVsaW1pdGVyc10gPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ3Jvc3N0YWJGaWxlRm9ybWF0LkV4Y2VsOlxuICAgICAgICB2ZXJiID0gVmVyYklkLkV4cG9ydENyb3NzdGFiRXhjZWxEb3dubG9hZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3Vuc3VwcG9ydGVkIENyb3NzdGFiIGZpbGUgZm9ybWF0LicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycylcbiAgICAgIC50aGVuPEV4cG9ydEZpbGU+KChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgRXhwb3J0RmlsZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuQ3Jvc3N0YWJDcmVhdGlvbkVycm9yLCAnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3aGlsZSBnZW5lcmF0aW5nIHRoZSBkb2N1bWVudC4nKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGV4cG9ydERhdGFBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIG9wdGlvbnM6IEV4cG9ydERhdGFPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUV4cG9ydERhdGFPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgLy8gUmVtb3ZlIGFueSBkdXBsaWNhdGVzIGZyb20gdGhlIGlucHV0IGFycmF5XG4gICAgY29uc3QgY29sdW1uc0FzU2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQob3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCk7XG4gICAgY29uc3QgY29sdW1uc1RvSW5jbHVkZUJ5SWQgPSBBcnJheS5mcm9tKGNvbHVtbnNBc1NldCk7XG5cbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkV4cG9ydERhdGFEb3dubG9hZDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhwb3J0RGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBvcHRpb25zLmlnbm9yZUFsaWFzZXMgPz8gZmFsc2UsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdOiBjb2x1bW5zVG9JbmNsdWRlQnlJZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKVxuICAgICAgLnRoZW48dm9pZD4oKCkgPT4ge30pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuRGF0YUNyZWF0aW9uRXJyb3IsICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGRvY3VtZW50LicpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZXhwb3J0UG93ZXJQb2ludEFzeW5jKHNoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sIGV4cG9ydFNjZW5hcmlvczogRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCk6IFByb21pc2U8RXhwb3J0RmlsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlTaGVldE5hbWVzRm9yUERGQW5kUFBUKHNoZWV0TmFtZXMsIGV4cG9ydFNjZW5hcmlvcyk7XG5cbiAgICAvLyBOb3RlOiB0aGUgRXhwb3J0T3JpZ2luVXJsIHBhcmFtIGlzIGxpc3RlZCBhcyBvcHRpb25hbCBmb3IgdGhlIHByZXMgbGF5ZXIgY29tbWFuZCB3ZSBhcmUgaW52b2tpbmc7IGhvd2V2ZXIsXG4gICAgLy8gcmVjZW50IGNoYW5nZXMgd2VyZSBtYWRlIHRoYXQgZW5mb3JjZWQgdGhlIHVzZSBvZiB0aGUgZW1wdHkgc3RyaW5nIHdoZW4gaW52b2tpbmcgdGhpcyBjb21tYW5kIHdpdGggbm8gRXhwb3J0T3JpZ2luVXJsLlxuICAgIC8vIHNlZSBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBvd2VycG9pbnQtb3B0aW9ucy1kaWFsb2cgcmVwby5cbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkV4cG9ydFBvd2VycG9pbnREb3dubG9hZDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhwb3J0UG93ZXJQb2ludEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHBvcnRPcmlnaW5VcmxdOiAnJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3RlZFNoZWV0TmFtZXNdOiBzaGVldE5hbWVzLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpXG4gICAgICAudGhlbjxFeHBvcnRGaWxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4cG9ydEZpbGU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgICBTaGFyZWRFcnJvckNvZGVzLlBvd2VyUG9pbnRDcmVhdGlvbkVycm9yLFxuICAgICAgICAgICdBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZ2VuZXJhdGUgdGhlIFBvd2VyUG9pbnQgZmlsZS4nLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZXhwb3J0UERGQXN5bmMoXG4gICAgc2hlZXROYW1lczogQXJyYXk8c3RyaW5nPixcbiAgICBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBleHBvcnRTY2VuYXJpb3M6IEV4cG9ydFNjZW5hcmlvc0ZvclBERkFuZFBvd2VyUG9pbnQsXG4gICk6IFByb21pc2U8RXhwb3J0RmlsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFeHBvcnRQREZPcHRpb25zKGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVNoZWV0TmFtZXNGb3JQREZBbmRQUFQoc2hlZXROYW1lcywgZXhwb3J0U2NlbmFyaW9zKTtcblxuICAgIGNvbnN0IGludGVybmFsRXhwb3J0UGRmT3B0aW9uczogSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zID0gYXdhaXQgdGhpcy5nZXRFeHBvcnRQREZPcHRpb25zQXN5bmMoKTtcbiAgICBFeHBvcnRIZWxwZXJzLnVwZGF0ZUludGVybmFsRXhwb3J0UERGT3B0aW9ucyhpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMsIGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucywgc2hlZXROYW1lcyk7XG5cbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkV4cG9ydFBkZkRvd25sb2FkO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdleHBvcnRQREZBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRXhwb3J0UGRmT3B0aW9uc106IGludGVybmFsRXhwb3J0UGRmT3B0aW9ucyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKVxuICAgICAgLnRoZW48RXhwb3J0RmlsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHBvcnRGaWxlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5QREZDcmVhdGlvbkVycm9yLCAnVW5hYmxlIHRvIGNyZWF0ZSBQREYgYmVjYXVzZSBzb21ldGhpbmcgd2VudCB3cm9uZy4gVHJ5IGFnYWluLicpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RXhwb3J0UERGT3B0aW9uc0FzeW5jKCk6IFByb21pc2U8SW50ZXJuYWxFeHBvcnRQREZPcHRpb25zPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRFeHBvcnRQZGZPcHRpb25zO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRFeHBvcnRQZGZPcHRpb25zQXN5bmMnLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEludGVybmFsRXhwb3J0UERGT3B0aW9ucz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQXBpTWVudVR5cGUsIENvbnRleHRNZW51T3B0aW9ucyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZSB9IGZyb20gJy4uL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnU7XG4gIH1cblxuICBwdWJsaWMgYXBwZW5kQ29udGV4dE1lbnVBc3luYyhzaGVldE5hbWU6IHN0cmluZywgdGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIGNvbmZpZzogQ29udGV4dE1lbnVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFwcGVuZEV4dGVybmFsTWVudUl0ZW07XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGVuZENvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SXRlbURpc3BsYXlOYW1lXTogY29uZmlnLmRpc3BsYXlOYW1lLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IG5ld01lbnVJdGVtSWQgPSByZXNwb25zZS5yZXN1bHQgYXMgc3RyaW5nO1xuICAgICAgcmV0dXJuIG5ld01lbnVJdGVtSWQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQ29udGV4dE1lbnVBc3luYyhzaGVldE5hbWU6IHN0cmluZywgdGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVJdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuUmVtb3ZlRXh0ZXJuYWxNZW51SXRlbTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVtb3ZlQ29udGV4dE1lbnVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuV29ya3NoZWV0TmFtZV06IHNoZWV0TmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVJdGVtSWRdOiBtZW51SXRlbUlkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZXhlY3V0ZUNvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkV4ZWN1dGVFeHRlcm5hbE1lbnVJdGVtO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdleGVjdXRlQ29udGV4dE1lbnVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuV29ya3NoZWV0TmFtZV06IHNoZWV0TmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVJdGVtSWRdOiBtZW51SXRlbUlkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVuYW1lQ29udGV4dE1lbnVBc3luYyhzaGVldE5hbWU6IHN0cmluZywgdGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVIZWFkZXI6IHN0cmluZywgbWVudURlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLlJlbmFtZUV4dGVybmFsTWVudTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVuYW1lQ29udGV4dE1lbnVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuV29ya3NoZWV0TmFtZV06IHNoZWV0TmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVIZWFkZXJdOiBtZW51SGVhZGVyLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVybmFsTWVudURlc2NyaXB0aW9uXTogbWVudURlc2NyaXB0aW9uLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBEYXRlUmFuZ2VUeXBlLFxuICBFbWJlZGRpbmdFcnJvckNvZGVzLFxuICBFcnJvckNvZGVzLFxuICBGaWx0ZXJEb21haW5UeXBlLFxuICBGaWx0ZXJUeXBlIGFzIEV4dGVybmFsRmlsdGVyVHlwZSxcbiAgU2hhcmVkRXJyb3JDb2Rlcyxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBGaWx0ZXJUeXBlLCBQYXJhbWV0ZXJJZCwgVmVyYklkLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi8uLi9BcGlTaGFyZWQnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIGFzIEV4dGVybmFsRW51bUNvbnZlcnRlciB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIGFzIEludGVybmFsRW51bUNvbnZlcnRlciB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHtcbiAgQ2F0ZWdvcmljYWxEb21haW4sXG4gIENhdGVnb3JpY2FsRmlsdGVyLFxuICBIaWVyYXJjaGljYWxEYXRhVmFsdWUsXG4gIEhpZXJhcmNoaWNhbEZpbHRlcixcbiAgSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWwsXG4gIFJhbmdlRG9tYWluLFxuICBSYW5nZUZpbHRlcixcbiAgUmVsYXRpdmVEYXRlRmlsdGVyLFxufSBmcm9tICcuLi8uLi9Nb2RlbHMvRmlsdGVyTW9kZWxzJztcbmltcG9ydCB7IERhdGFWYWx1ZSB9IGZyb20gJy4uLy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcbmltcG9ydCB7IERhdGFWYWx1ZUZhY3RvcnkgfSBmcm9tICcuLi8uLi9VdGlscy9EYXRhVmFsdWVGYWN0b3J5JztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi4vLi4vVXRpbHMvUGFyYW0nO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEZpbHRlclNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgRmlsdGVyU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkZpbHRlcjtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4sXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQXBwbHlDYXRlZ29yaWNhbEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICd2YWx1ZXMgcGFyYW1ldGVyIGZvciBhcHBseUZpbHRlckFzeW5jIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJWYWx1ZXNdID0gdmFsdWVzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVXBkYXRlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyVXBkYXRlVHlwZS5jb252ZXJ0KHVwZGF0ZVR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSXNFeGNsdWRlTW9kZV0gPVxuICAgICAgZmlsdGVyT3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IGZpbHRlck9wdGlvbnMuaXNFeGNsdWRlTW9kZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBmaWx0ZXJPcHRpb25zLmlzRXhjbHVkZU1vZGU7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZE5hbWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgZmllbGROYW1lOiBzdHJpbmcsIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LlJhbmdlRmlsdGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BcHBseVJhbmdlRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhcHBseVJhbmdlRmlsdGVyQXN5bmMnLFxuICAgIH07XG5cbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5taW4gIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXJPcHRpb25zLm1pbiAhPT0gbnVsbCkge1xuICAgICAgbGV0IG1pbjogc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgaWYgKGZpbHRlck9wdGlvbnMubWluIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBtaW4gPSBQYXJhbS5zZXJpYWxpemVEYXRlRm9yUGxhdGZvcm0oZmlsdGVyT3B0aW9ucy5taW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWluID0gZmlsdGVyT3B0aW9ucy5taW47XG4gICAgICB9XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclJhbmdlTWluXSA9IG1pbjtcbiAgICB9XG5cbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5tYXggIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXJPcHRpb25zLm1heCAhPT0gbnVsbCkge1xuICAgICAgbGV0IG1heDogc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgaWYgKGZpbHRlck9wdGlvbnMubWF4IGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBtYXggPSBQYXJhbS5zZXJpYWxpemVEYXRlRm9yUGxhdGZvcm0oZmlsdGVyT3B0aW9ucy5tYXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWF4ID0gZmlsdGVyT3B0aW9ucy5tYXg7XG4gICAgICB9XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclJhbmdlTWF4XSA9IG1heDtcbiAgICB9XG5cbiAgICAvLyBUaGUgbnVsbCBvcHRpb24gaXMgdXNlZCB3aXRoIG1pbittYXggZm9yICdpbmNsdWRlLXJhbmdlJyBvciAnaW5jbHVkZS1yYW5nZS1vci1udWxsJ1xuICAgIGlmIChmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24pIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyUmFuZ2VOdWxsT3B0aW9uXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5udWxsT3B0aW9ucy5jb252ZXJ0KGZpbHRlck9wdGlvbnMubnVsbE9wdGlvbik7XG4gICAgfVxuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZE5hbWVdID0gZmllbGROYW1lO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHRoaXMuYXBpRmlsdGVySGFuZGxlckNoZWNrRm9yQ29tbWFuZEVycm9yKHJlc3BvbnNlLnJlc3VsdCBhcyB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTtcbiAgICAgIHJldHVybiBmaWVsZE5hbWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+IHwgQ29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxzLFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkhpZXJhcmNoaWNhbEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcblxuICAgIGNvbnN0IGhpZXJhcmNoaWNhbExldmVscyA9ICh2YWx1ZXMgYXMgQ29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxzKS5sZXZlbHM7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShoaWVyYXJjaGljYWxMZXZlbHMpICYmIGhpZXJhcmNoaWNhbExldmVscy5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlckxldmVsc10gPSBoaWVyYXJjaGljYWxMZXZlbHM7XG4gICAgfSBlbHNlIGlmICgodmFsdWVzIGFzIEFycmF5PFN0cmluZz4pLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVmFsdWVzXSA9IHZhbHVlcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhlIHNlcnZlciBjb21tYW5kIGV4cGVjdHMgZW1wdHkgbGlzdCBmb3IgY2xlYXJpbmcgdGhlIGZpbHRlclxuICAgICAgLy8gaXQgYWxzbyBleHBlY3RzIGVpdGhlcnMgRmlsdGVyTGV2ZWxzIG9yIEZpbHRlclZhbHVlcyB0byBiZSBzZXRcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyTGV2ZWxzXSA9IFtdO1xuICAgIH1cblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVXBkYXRlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyVXBkYXRlVHlwZS5jb252ZXJ0KHVwZGF0ZVR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSXNFeGNsdWRlTW9kZV0gPSBmaWx0ZXJPcHRpb25zICYmICEhZmlsdGVyT3B0aW9ucy5pc0V4Y2x1ZGVNb2RlO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNsZWFyRmlsdGVyQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5DbGVhckZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnY2xlYXJGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9zbmUpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZE5hbWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zKSB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BcHBseVJlbGF0aXZlRGF0ZUZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlBlcmlvZFR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLnBlcmlvZFR5cGUuY29udmVydChvcHRpb25zLnBlcmlvZFR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRGF0ZVJhbmdlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZGF0ZVJhbmdlVHlwZS5jb252ZXJ0KG9wdGlvbnMucmFuZ2VUeXBlKTtcbiAgICBpZiAob3B0aW9ucy5yYW5nZVR5cGUgPT09IERhdGVSYW5nZVR5cGUuTGFzdE4gfHwgb3B0aW9ucy5yYW5nZVR5cGUgPT09IERhdGVSYW5nZVR5cGUuTmV4dE4pIHtcbiAgICAgIGlmIChvcHRpb25zLnJhbmdlTiA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMucmFuZ2VOID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgICAgRW1iZWRkaW5nRXJyb3JDb2Rlcy5NaXNzaW5nUmFuZ2VORm9yUmVsYXRpdmVEYXRlRmlsdGVycyxcbiAgICAgICAgICAnTWlzc2luZyByYW5nZU4gZmllbGQgZm9yIGEgcmVsYXRpdmUgZGF0ZSBmaWx0ZXIgb2YgTEFTVE4gb3IgTkVYVE4uJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUmFuZ2VOXSA9IG9wdGlvbnMucmFuZ2VOO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmFuY2hvckRhdGUgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmFuY2hvckRhdGUgIT09IG51bGwpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuQW5jaG9yRGF0ZV0gPSB0aGlzLmNvbnZlcnRBbmNob3JEYXRlKG9wdGlvbnMuYW5jaG9yRGF0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRGaWx0ZXJzO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRGaWx0ZXJzQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJzID0gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PEludGVybmFsQ29udHJhY3QuRmlsdGVyPjtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnREb21haW5GaWx0ZXJzKGZpbHRlcnMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldENhdGVnb3JpY2FsRG9tYWluQXN5bmMoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRDYXRlZ29yaWNhbERvbWFpbjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0Q2F0ZWdvcmljYWxEb21haW5Bc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZElkXSA9IGZpZWxkSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Eb21haW5UeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJEb21haW5UeXBlLmNvbnZlcnQoZG9tYWluVHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IHJlc3BvbnNlLnJlc3VsdCBhcyBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluO1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydENhdGVnb3JpY2FsRG9tYWluKGRvbWFpbiwgZG9tYWluVHlwZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmFuZ2VEb21haW5Bc3luYyh3b3Jrc2hlZXROYW1lOiBzdHJpbmcsIGZpZWxkSWQ6IHN0cmluZywgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSk6IFByb21pc2U8Q29udHJhY3QuUmFuZ2VEb21haW4+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldFJhbmdlRG9tYWluO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRSYW5nZURvbWFpbkFzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0ge1xuICAgICAgd29ya3NoZWV0OiB3b3Jrc2hlZXROYW1lLFxuICAgIH07XG5cbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkSWRdID0gZmllbGRJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkRvbWFpblR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmZpbHRlckRvbWFpblR5cGUuY29udmVydChkb21haW5UeXBlKTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuUmFuZ2VEb21haW4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZG9tYWluID0gcmVzcG9uc2UucmVzdWx0IGFzIEludGVybmFsQ29udHJhY3QuUmFuZ2VEb21haW47XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRSYW5nZURvbWFpbihkb21haW4sIGRvbWFpblR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldERhc2hib2FyZEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldERhc2hib2FyZEZpbHRlcnM7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldERhc2hib2FyZEZpbHRlcnNBc3luYycsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJzID0gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PEludGVybmFsQ29udHJhY3QuRmlsdGVyPjtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnREb21haW5GaWx0ZXJzKGZpbHRlcnMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RGFzaGJvYXJkRmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkRhc2hib2FyZENhdGVnb3JpY2FsRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhcHBseURhc2hib2FyZEZpbHRlckFzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclZhbHVlc10gPSB2YWx1ZXM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJVcGRhdGVUeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJVcGRhdGVUeXBlLmNvbnZlcnQodXBkYXRlVHlwZSk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Jc0V4Y2x1ZGVNb2RlXSA9IGZpbHRlck9wdGlvbnMgJiYgISFmaWx0ZXJPcHRpb25zLmlzRXhjbHVkZU1vZGU7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgc3RyaW5nO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMod29ya3NoZWV0TmFtZTogc3RyaW5nLCBmaWVsZElkOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgICBjb25zdCBzaGFyZWRGaWx0ZXJNb2RlbCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUdldEFwcGxpZWRXb3Jrc2hlZXRzKHdvcmtzaGVldE5hbWUsIGZpZWxkSWQsICdnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jJyk7XG4gICAgY29uc3Qgd29ya3NoZWV0TmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgc2hhcmVkRmlsdGVyTW9kZWwud29ya3NoZWV0cz8ubWFwKCh3b3Jrc2hlZXRJbmZvOiBJbnRlcm5hbENvbnRyYWN0LlNoYXJlZEZpbHRlcldvcmtzaGVldE1vZGVsKSA9PiB7XG4gICAgICBpZiAod29ya3NoZWV0SW5mby5pc1NlbGVjdGVkKSB7XG4gICAgICAgIHdvcmtzaGVldE5hbWVzLnB1c2god29ya3NoZWV0SW5mby53b3Jrc2hlZXROYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gd29ya3NoZWV0TmFtZXM7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0QXBwbGllZFdvcmtzaGVldHNBc3luYyhcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGFwcGx5VG9Xb3Jrc2hlZXRzOiBBcnJheTxzdHJpbmc+LFxuICApOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgICBjb25zdCBzaGFyZWRGaWx0ZXJNb2RlbCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUdldEFwcGxpZWRXb3Jrc2hlZXRzKHdvcmtzaGVldE5hbWUsIGZpZWxkSWQsICdnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jSW50ZXJuYWwnKTtcbiAgICBpZiAoIXNoYXJlZEZpbHRlck1vZGVsIHx8ICFzaGFyZWRGaWx0ZXJNb2RlbC53b3Jrc2hlZXRzKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1RoaXMgZmlsdGVyIGRvZXMgbm90IGFwcGx5IHRvIG11bHRpcGxlIHdvcmtzaGVldHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxvd2VkV29ya3NoZWV0czogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgYWN0aXZlV29ya3NoZWV0ID0gJyc7XG4gICAgc2hhcmVkRmlsdGVyTW9kZWwud29ya3NoZWV0cy5mb3JFYWNoKCh3b3Jrc2hlZXQpID0+IHtcbiAgICAgIC8vIEdldCBhY3RpdmUgd29ya3NoZWV0XG4gICAgICBpZiAod29ya3NoZWV0LmlzQWN0aXZlKSB7XG4gICAgICAgIGFjdGl2ZVdvcmtzaGVldCA9IHdvcmtzaGVldC53b3Jrc2hlZXROYW1lO1xuICAgICAgfVxuXG4gICAgICAvLyBQb3B1bGF0ZSBhbGxvd2VkIHdvcmtzaGVldHNcbiAgICAgIGlmICh3b3Jrc2hlZXQuaXNTZWxlY3RlZCB8fCB3b3Jrc2hlZXQuaXNFbmFibGVkKSB7XG4gICAgICAgIGFsbG93ZWRXb3Jrc2hlZXRzLnB1c2god29ya3NoZWV0LndvcmtzaGVldE5hbWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGFjdGl2ZVdvcmtzaGVldCA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnTm8gYWN0aXZlIHdvcmtzaGVldCcpO1xuICAgIH1cblxuICAgIGlmICghYXBwbHlUb1dvcmtzaGVldHMuaW5jbHVkZXMoYWN0aXZlV29ya3NoZWV0KSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAke2FjdGl2ZVdvcmtzaGVldH0gbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgYXBwbGllZCB3b3Jrc2hlZXRzYCk7XG4gICAgfVxuXG4gICAgYXBwbHlUb1dvcmtzaGVldHMuZm9yRWFjaCgoc2hlZXQpID0+IHtcbiAgICAgIC8vIGNoZWNrIGlmIGl0J3MgcHJlc2VudCB3aXRoaW4gY29tcGF0aWJsZSBzaGVldHNcbiAgICAgIGlmICghYWxsb3dlZFdvcmtzaGVldHMuaW5jbHVkZXMoc2hlZXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgVGhlIGZpZWxkICR7ZmllbGROYW1lfSBpc24ndCBhcHBsaWNhYmxlIHRvIHRoZSB3b3Jrc2hlZXQgJHtzaGVldH1gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQ2hhbmdlU2hhcmVkRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge307XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdID0gJ3NldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMnO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0ge1xuICAgICAgd29ya3NoZWV0OiB3b3Jrc2hlZXROYW1lLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZElkXSA9IGZpZWxkSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5TaGFyZWRGaWx0ZXJTaGVldHNdID0gYXBwbHlUb1dvcmtzaGVldHM7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nW10+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIGFwcGx5VG9Xb3Jrc2hlZXRzO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gSGVscGVyIE1ldGhvZHNcblxuICBwcml2YXRlIGV4ZWN1dGVHZXRBcHBsaWVkV29ya3NoZWV0cyhcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIHRlbGVtZXRyeUZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPEludGVybmFsQ29udHJhY3QuU2hhcmVkRmlsdGVyTW9kZWw+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldFNoYXJlZEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHt9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXSA9IHRlbGVtZXRyeUZ1bmN0aW9uTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGRJZF0gPSBmaWVsZElkO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEludGVybmFsQ29udHJhY3QuU2hhcmVkRmlsdGVyTW9kZWw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3Qgc2hhcmVkRmlsdGVyTW9kZWwgPSByZXNwb25zZS5yZXN1bHQgYXMgSW50ZXJuYWxDb250cmFjdC5TaGFyZWRGaWx0ZXJNb2RlbDtcbiAgICAgIHJldHVybiBzaGFyZWRGaWx0ZXJNb2RlbDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydERvbWFpbkZpbHRlcnMoZG9tYWluRmlsdGVyczogQXJyYXk8SW50ZXJuYWxDb250cmFjdC5GaWx0ZXI+KTogQXJyYXk8Q29udHJhY3QuRmlsdGVyPiB7XG4gICAgY29uc3QgZmlsdGVyczogQXJyYXk8Q29udHJhY3QuRmlsdGVyPiA9IFtdO1xuICAgIGRvbWFpbkZpbHRlcnMuZm9yRWFjaCgoZG9tYWluRmlsdGVyKSA9PiB7XG4gICAgICBzd2l0Y2ggKGRvbWFpbkZpbHRlci5maWx0ZXJUeXBlKSB7XG4gICAgICAgIGNhc2UgRmlsdGVyVHlwZS5DYXRlZ29yaWNhbDoge1xuICAgICAgICAgIGNvbnN0IGZpbHRlciA9IGRvbWFpbkZpbHRlciBhcyBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRDYXRlZ29yaWNhbEZpbHRlcihmaWx0ZXIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIENhdGVnb3JpY2FsIEZpbHRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgRmlsdGVyVHlwZS5IaWVyYXJjaGljYWw6IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBkb21haW5GaWx0ZXIgYXMgSW50ZXJuYWxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXI7XG4gICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgZmlsdGVycy5wdXNoKHRoaXMuY29udmVydEhpZXJhcmNoaWNhbEZpbHRlcihmaWx0ZXIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEhpZXJhcmNoaWNhbCBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEZpbHRlclR5cGUuUmFuZ2U6IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBkb21haW5GaWx0ZXIgYXMgSW50ZXJuYWxDb250cmFjdC5SYW5nZUZpbHRlcjtcbiAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2godGhpcy5jb252ZXJ0UmFuZ2VGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBSYW5nZSBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEZpbHRlclR5cGUuUmVsYXRpdmVEYXRlOiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRSZWxhdGl2ZURhdGVGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBSZWxhdGl2ZSBEYXRlIEZpbHRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmaWx0ZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Q2F0ZWdvcmljYWxGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyKTogQ29udHJhY3QuQ2F0ZWdvcmljYWxGaWx0ZXIge1xuICAgIGNvbnN0IGFwcGxpZWRWYWx1ZXM6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4gPSBkb21haW5GaWx0ZXIudmFsdWVzLm1hcCgoZHYpID0+IHtcbiAgICAgIHJldHVybiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZHYpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBDYXRlZ29yaWNhbEZpbHRlcihcbiAgICAgIGRvbWFpbkZpbHRlci52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGRDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkTmFtZSxcbiAgICAgIEZpbHRlclR5cGUuQ2F0ZWdvcmljYWwsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgYXBwbGllZFZhbHVlcyxcbiAgICAgIGRvbWFpbkZpbHRlci5pc0V4Y2x1ZGUsXG4gICAgICBkb21haW5GaWx0ZXIuaXNBbGxTZWxlY3RlZCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0SGllcmFyY2hpY2FsRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXIpOiBDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXIge1xuICAgIGNvbnN0IGFwcGxpZWRWYWx1ZXM6IEFycmF5PENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlckRhdGFWYWx1ZT4gPSBkb21haW5GaWx0ZXIudmFsdWVzLm1hcCgoaGllcmFyY2hpY2FsRGF0YVZhbHVlKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEhpZXJhcmNoaWNhbERhdGFWYWx1ZShcbiAgICAgICAgRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGhpZXJhcmNoaWNhbERhdGFWYWx1ZS52YWx1ZSksXG4gICAgICAgIGhpZXJhcmNoaWNhbERhdGFWYWx1ZS5oaWVyYXJjaGljYWxQYXRoLFxuICAgICAgICBoaWVyYXJjaGljYWxEYXRhVmFsdWUubGV2ZWwsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgbGV2ZWxEZXRhaWxzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbD4gPSBkb21haW5GaWx0ZXIubGV2ZWxJbmZvLm1hcCgoYUxldmVsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEhpZXJhcmNoaWNhbExldmVsRGV0YWlsKFxuICAgICAgICBhTGV2ZWwubmFtZSxcbiAgICAgICAgSW50ZXJuYWxFbnVtQ29udmVydGVyLmhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuY29udmVydChhTGV2ZWwubGV2ZWxTZWxlY3Rpb25TdGF0ZSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBIaWVyYXJjaGljYWxGaWx0ZXIoXG4gICAgICBkb21haW5GaWx0ZXIudmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkQ2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZE5hbWUsXG4gICAgICBGaWx0ZXJUeXBlLkhpZXJhcmNoaWNhbCxcbiAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICBkb21haW5GaWx0ZXIuZGltZW5zaW9uTmFtZSxcbiAgICAgIGRvbWFpbkZpbHRlci5oaWVyYXJjaHlDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmxldmVscyxcbiAgICAgIGxldmVsRGV0YWlscyxcbiAgICAgIGFwcGxpZWRWYWx1ZXMsXG4gICAgICBkb21haW5GaWx0ZXIuaXNBbGxTZWxlY3RlZCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UmFuZ2VGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRmlsdGVyKTogQ29udHJhY3QuUmFuZ2VGaWx0ZXIge1xuICAgIGNvbnN0IG1pblZhbHVlOiBEYXRhVmFsdWUgPSBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZG9tYWluRmlsdGVyLm1pbik7XG4gICAgY29uc3QgbWF4VmFsdWU6IERhdGFWYWx1ZSA9IERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW5GaWx0ZXIubWF4KTtcbiAgICByZXR1cm4gbmV3IFJhbmdlRmlsdGVyKFxuICAgICAgZG9tYWluRmlsdGVyLnZpc3VhbElkLndvcmtzaGVldCxcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZENhcHRpb24sXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGROYW1lLFxuICAgICAgRmlsdGVyVHlwZS5SYW5nZSxcbiAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICBtaW5WYWx1ZSxcbiAgICAgIG1heFZhbHVlLFxuICAgICAgZG9tYWluRmlsdGVyLmluY2x1ZGVOdWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRSZWxhdGl2ZURhdGVGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlcik6IENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlciB7XG4gICAgY29uc3QgYW5jaG9yRGF0ZVZhbHVlOiBEYXRhVmFsdWUgPSBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZG9tYWluRmlsdGVyLmFuY2hvckRhdGUpO1xuICAgIHJldHVybiBuZXcgUmVsYXRpdmVEYXRlRmlsdGVyKFxuICAgICAgZG9tYWluRmlsdGVyLnZpc3VhbElkLndvcmtzaGVldCxcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZENhcHRpb24sXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGROYW1lLFxuICAgICAgRXh0ZXJuYWxGaWx0ZXJUeXBlLlJlbGF0aXZlRGF0ZSxcbiAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICBhbmNob3JEYXRlVmFsdWUsXG4gICAgICBJbnRlcm5hbEVudW1Db252ZXJ0ZXIuZGF0ZVN0ZXBQZXJpb2QuY29udmVydChkb21haW5GaWx0ZXIucGVyaW9kVHlwZSksXG4gICAgICBJbnRlcm5hbEVudW1Db252ZXJ0ZXIuZGF0ZVJhbmdlVHlwZS5jb252ZXJ0KGRvbWFpbkZpbHRlci5yYW5nZVR5cGUpLFxuICAgICAgZG9tYWluRmlsdGVyLnJhbmdlTixcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Q2F0ZWdvcmljYWxEb21haW4oZG9tYWluOiBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluLCBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKTogQ29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW4ge1xuICAgIGNvbnN0IHZhbHVlczogQXJyYXk8RGF0YVZhbHVlPiA9IGRvbWFpbi52YWx1ZXMubWFwKChkb21haW5EdikgPT4ge1xuICAgICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW5Edik7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBDYXRlZ29yaWNhbERvbWFpbih2YWx1ZXMsIGRvbWFpblR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UmFuZ2VEb21haW4oZG9tYWluOiBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRG9tYWluLCBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKTogQ29udHJhY3QuUmFuZ2VEb21haW4ge1xuICAgIGNvbnN0IG1pbjogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbi5taW4pO1xuICAgIGNvbnN0IG1heDogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbi5tYXgpO1xuICAgIHJldHVybiBuZXcgUmFuZ2VEb21haW4obWluLCBtYXgsIGRvbWFpblR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0QW5jaG9yRGF0ZShhbmNob3JEYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICAvLyBDb252ZXJ0cyBhIERhdGUgb2JqZWN0IGludG8gYSBzdHJpbmcgZm9ybWF0IHRoYXQgdGhlIHNlcnZlciBleHBlY3RzIGZvciBkYXRlL3RpbWUgdmFsdWVzLlxuICAgIC8vIElmIGFuY2hvckRhdGUgZG9lc24ndCByZXByZXNlbnQgYSB2YWxpZCBEYXRlIG9iamVjdCwgYW55IG9mIHRoZXNlIHdvdWxkIGJlIE5hTi5cbiAgICBjb25zdCB5ZWFyID0gYW5jaG9yRGF0ZS5nZXRVVENGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1vbnRoID0gYW5jaG9yRGF0ZS5nZXRVVENNb250aCgpICsgMTtcbiAgICBjb25zdCBkYXkgPSBhbmNob3JEYXRlLmdldFVUQ0RhdGUoKTtcbiAgICBjb25zdCBoaCA9IGFuY2hvckRhdGUuZ2V0VVRDSG91cnMoKTtcbiAgICBjb25zdCBtbSA9IGFuY2hvckRhdGUuZ2V0VVRDTWludXRlcygpO1xuICAgIGNvbnN0IHNlYyA9IGFuY2hvckRhdGUuZ2V0VVRDU2Vjb25kcygpO1xuXG4gICAgaWYgKGlzTmFOKHllYXIpIHx8IGlzTmFOKG1vbnRoKSB8fCBpc05hTihkYXkpIHx8IGlzTmFOKGhoKSB8fCBpc05hTihtbSkgfHwgaXNOYU4oc2VjKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWREYXRlUGFyYW1ldGVyLCAnSW52YWxpZCBkYXRlIHBhcmFtZXRlcjogYW5jaG9yRGF0ZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fSAke2hofToke21tfToke3NlY31gO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGFwaUZpbHRlckhhbmRsZXJDaGVja0ZvckNvbW1hbmRFcnJvcihzZXJ2ZXJQbTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIGlmICghc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5QYXJhbWV0ZXJFcnJvcl0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNlcnZlclBtW0ludGVybmFsQ29udHJhY3QuUGFyYW1ldGVySWQuSW52YWxpZEZpZWxkQ2FwdGlvbl0pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkRmlsdGVyRmllbGROYW1lLCBzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRGaWVsZENhcHRpb25dKTtcbiAgICB9XG4gICAgaWYgKHNlcnZlclBtW0ludGVybmFsQ29udHJhY3QuUGFyYW1ldGVySWQuSW52YWxpZFZhbHVlc10pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkRmlsdGVyRmllbGRWYWx1ZSwgc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5JbnZhbGlkVmFsdWVzXSk7XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRBZ2dGaWVsZE5hbWVdKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZEFnZ3JlZ2F0aW9uRmllbGROYW1lLCBzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRBZ2dGaWVsZE5hbWVdKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLlNlcnZlckVycm9yLCAnU2VydmVyIEVycm9yJyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTaG93RGF0YVRhYmxlRm9ybWF0LFxuICBEYXRhVGFibGUgYXMgRGF0YVRhYmxlSW50ZXJuYWxDb250cmFjdCxcbiAgRGF0YVRhYmxlUmVhZGVyIGFzIERhdGFUYWJsZVJlYWRlckludGVybmFsQ29udHJhY3QsXG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBIaWdobGlnaHRlZE1hcmtzVGFibGUsXG4gIFBhcmFtZXRlcklkLFxuICBTZWxlY3RlZE1hcmtzVGFibGUsXG4gIFVuZGVybHlpbmdEYXRhVGFibGUsXG4gIFZlcmJJZCxcbiAgVmlzdWFsSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uLy4uL0FwaVNoYXJlZCc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IENvbHVtbiwgRGF0YVRhYmxlLCBNYXJrSW5mbyB9IGZyb20gJy4uLy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcbmltcG9ydCB7IERhdGFUYWJsZVJlYWRlciB9IGZyb20gJy4uLy4uL01vZGVscy9HZXREYXRhVGFibGVSZWFkZXJNb2RlbHMnO1xuaW1wb3J0IHsgRGF0YVZhbHVlRmFjdG9yeSB9IGZyb20gJy4uLy4uL1V0aWxzL0RhdGFWYWx1ZUZhY3RvcnknO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UsIEdldERhdGFUeXBlIH0gZnJvbSAnLi4vR2V0RGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEdldERhdGFTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEdldERhdGFTZXJ2aWNlIHtcbiAgLy8gVGhlIGV4dGVuc2lvbi9lbWJlZGRpbmcgaW5zdGFuY2UgdXNlcyB0aGUgc2FtZSBjYWNoZSBmb3IgYWxsIERhdGFUYWJsZVJlYWRlcnMuXG4gIHByaXZhdGUgdmlld0RhdGFUYWJsZUNhY2hlSWQ6IHN0cmluZyA9IHV1aWR2NCgpO1xuXG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkdldERhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWF4Um93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy52aWV3RGF0YVRhYmxlQ2FjaGVJZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGltaXRlZE1heFJvd3MocmVxdWVzdGVkUm93czogbnVtYmVyLCByb3dDb3VudExpbWl0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiByZXF1ZXN0ZWRSb3dzID4gMCAmJiByZXF1ZXN0ZWRSb3dzIDwgcm93Q291bnRMaW1pdCA/IHJlcXVlc3RlZFJvd3MgOiByb3dDb3VudExpbWl0O1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdEYXRhQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGdldFR5cGU6IEdldERhdGFUeXBlLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nOiBib29sZWFuLFxuICApOiBQcm9taXNlPERhdGFUYWJsZT4ge1xuICAgIC8vIENyZWF0ZSBhbGwgb2Ygb3VyIHBhcmFtZXRlcnNcbiAgICBjb25zdCBzdW1tYXJ5RGF0YSA9IGdldFR5cGUgPT09IEdldERhdGFUeXBlLlN1bW1hcnk7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gc3VtbWFyeURhdGEgPyAnZ2V0U3VtbWFyeURhdGFBc3luYycgOiAnZ2V0VW5kZXJseWluZ0RhdGFBc3luYyc7XG4gICAgY29uc3QgdmVyYiA9IHN1bW1hcnlEYXRhID8gVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YSA6IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YTtcbiAgICBjb25zdCByZXF1ZXN0TWF4Um93cyA9IHZlcmIgPT09IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YSA/IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cywgdGhpcy5nZXRNYXhSb3dMaW1pdCgpICsgMSkgOiBtYXhSb3dzO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06IGZ1bmN0aW9uTmFtZSxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXSA9IGlnbm9yZUFsaWFzZXM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dID0gaWdub3JlU2VsZWN0aW9uO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSW5jbHVkZUFsbENvbHVtbnNdID0gaW5jbHVkZUFsbENvbHVtbnM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF0gPSB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5NYXhSb3dzXSA9IHJlcXVlc3RNYXhSb3dzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF0gPSBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbik7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5BcHBseVdvcmtzaGVldEZvcm1hdHRpbmddID0gYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIHJlc3BvbnNlRGF0YS5pc1N1bW1hcnkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgICBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmc6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8RGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpZXdEYXRhVGFibGVDYWNoZUlkXTogdGhpcy5nZXRWaWV3RGF0YVRhYmxlQ2FjaGVJZCgpLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuUGFnZVJvd0NvdW50XTogcGFnZVJvd0NvdW50LFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZVNlbGVjdGlvbl06IGlnbm9yZVNlbGVjdGlvbixcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IGluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgICBbUGFyYW1ldGVySWQuQXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nXTogYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXREYXRhU3VtbWFyeURhdGFSZWFkZXIsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlUmVhZGVyPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBEYXRhVGFibGVSZWFkZXJJbnRlcm5hbENvbnRyYWN0O1xuXG4gICAgICByZXR1cm4gbmV3IERhdGFUYWJsZVJlYWRlcihyZXNwb25zZURhdGEuaWQsIHJlc3BvbnNlRGF0YS50b3RhbFJvd0NvdW50LCBwYWdlUm93Q291bnQsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj4ge1xuICAgIC8vIENyZWF0ZSBhbGwgdGhlIHBhcmFtZXRlcnMgZm9yIEdldERhdGFUeXBlIG9mIFN1bW1hcnkgd2l0aCAxIHJvdywgYW5kIG9ubHkgbmF0aXZlIHZhbHVlc1xuICAgIC8vIFRoZW4gcmV0dXJuIGp1c3QgdGhlIGNvbHVtbnNcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IHRydWUsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlU2VsZWN0aW9uXTogdHJ1ZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IHRydWUsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IDEsXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEFwaVNob3dEYXRhVGFibGVGb3JtYXQuTmF0aXZlVmFsdWVzT25seSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkNvbHVtbj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgdW5kZXJseWluZ0RhdGFUYWJsZSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgY29uc3QgZGF0YVRhYmxlID0gdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhO1xuICAgICAgY29uc3QgY29sdW1ucyA9IGRhdGFUYWJsZS5oZWFkZXJzLm1hcCgoaCkgPT4gbmV3IENvbHVtbihoLmZpZWxkQ2FwdGlvbiwgaC5maWVsZE5hbWUsIGguZGF0YVR5cGUsIGguaXNSZWZlcmVuY2VkLCBoLmluZGV4KSk7XG4gICAgICByZXR1cm4gY29sdW1ucztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0U2VsZWN0ZWRNYXJrcywgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIFNlbGVjdGVkTWFya3NUYWJsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YS5kYXRhLm1hcCgodGFibGUpID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZSh0YWJsZSwgdHJ1ZSkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0SGlnaGxpZ2h0ZWRNYXJrcywgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIEhpZ2hsaWdodGVkTWFya3NUYWJsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YS5kYXRhLm1hcCgodGFibGUpID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZSh0YWJsZSwgdHJ1ZSkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgIGRhdGFTb3VyY2VJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGNvbHVtbnNUb0luY2x1ZGU6IEFycmF5PHN0cmluZz4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPERhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXRhU291cmNlRGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhU291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cywgdGhpcy5nZXRNYXhSb3dMaW1pdCgpICsgMSksXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZV06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGUpLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldERhdGFTb3VyY2VEYXRhLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxEYXRhVGFibGU+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlXTogY29sdW1uc1RvSW5jbHVkZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhc291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhSb3dzXTogdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhtYXhSb3dzLCB0aGlzLmdldE1heFJvd0xpbWl0KCkgKyAxKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRMb2dpY2FsVGFibGVEYXRhLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxEYXRhVGFibGVSZWFkZXI+IHtcbiAgICBwYWdlUm93Q291bnQgPSB0aGlzLmdldExpbWl0ZWRNYXhSb3dzKHBhZ2VSb3dDb3VudCwgdGhpcy5nZXRNYXhSb3dMaW1pdCgpKTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlQ2FjaGVJZF06IHRoaXMuZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhc291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5QYWdlUm93Q291bnRdOiBwYWdlUm93Q291bnQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdOiB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCksXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5zaG93RGF0YVRhYmxlRm9ybWF0VHlwZS5jb252ZXJ0KGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlciwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGVSZWFkZXI+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFUYWJsZVJlYWRlckludGVybmFsQ29udHJhY3Q7XG5cbiAgICAgIHJldHVybiBuZXcgRGF0YVRhYmxlUmVhZGVyKHJlc3BvbnNlRGF0YS5pZCwgcmVzcG9uc2VEYXRhLnRvdGFsUm93Q291bnQsIHBhZ2VSb3dDb3VudCwgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nOiBib29sZWFuLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogaWdub3JlQWxpYXNlcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dOiBpZ25vcmVTZWxlY3Rpb24sXG4gICAgICBbUGFyYW1ldGVySWQuSW5jbHVkZUFsbENvbHVtbnNdOiBpbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhSb3dzXTogdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhtYXhSb3dzLCB0aGlzLmdldE1heFJvd0xpbWl0KCkgKyAxKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pLFxuICAgICAgW1BhcmFtZXRlcklkLkFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZ106IGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0VW5kZXJseWluZ1RhYmxlRGF0YSwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGU+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIFVuZGVybHlpbmdEYXRhVGFibGU7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVzdWx0c1RhYmxlKHJlc3BvbnNlRGF0YS5kYXRhLCBmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgICBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmc6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgcGFnZVJvd0NvdW50ID0gdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhwYWdlUm93Q291bnQsIHRoaXMuZ2V0TWF4Um93TGltaXQoKSk7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUNhY2hlSWRdOiB0aGlzLmdldFZpZXdEYXRhVGFibGVDYWNoZUlkKCksXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Mb2dpY2FsVGFibGVJZF06IGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZVNlbGVjdGlvbl06IGlnbm9yZVNlbGVjdGlvbixcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IGluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgICBbUGFyYW1ldGVySWQuUGFnZVJvd0NvdW50XTogcGFnZVJvd0NvdW50LFxuICAgICAgW1BhcmFtZXRlcklkLkFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZ106IGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlciwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGVSZWFkZXI+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFUYWJsZVJlYWRlckludGVybmFsQ29udHJhY3Q7XG5cbiAgICAgIHJldHVybiBuZXcgRGF0YVRhYmxlUmVhZGVyKHJlc3BvbnNlRGF0YS5pZCwgcmVzcG9uc2VEYXRhLnRvdGFsUm93Q291bnQsIHBhZ2VSb3dDb3VudCwgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdW1tYXJ5VGFibGVJZCA9ICcnO1xuXG4gIHB1YmxpYyBnZXRQYWdlQXN5bmModGFibGVJZDogc3RyaW5nLCBwYWdlTnVtYmVyOiBudW1iZXIsIHBhZ2VTaXplOiBudW1iZXIpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRQYWdlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpZXdEYXRhVGFibGVDYWNoZUlkXTogdGhpcy5nZXRWaWV3RGF0YVRhYmxlQ2FjaGVJZCgpLFxuICAgICAgW1BhcmFtZXRlcklkLlZpZXdEYXRhVGFibGVJZF06IHRhYmxlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVJvd0luZGV4XTogcGFnZU51bWJlciAqIHBhZ2VTaXplLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXREYXRhVGFibGVSZWFkZXJQYWdlLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgRGF0YVRhYmxlSW50ZXJuYWxDb250cmFjdDtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzUGFnZShyZXNwb25zZURhdGEsIHRhYmxlSWQgPT09IEdldERhdGFTZXJ2aWNlSW1wbC5zdW1tYXJ5VGFibGVJZCA/IHRydWUgOiBmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVsZWFzZUFzeW5jKHRhYmxlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZWxlYXNlJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlQ2FjaGVJZF06IHRoaXMuZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlSWRdOiB0YWJsZUlkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZWxlYXNlRGF0YVRhYmxlUmVhZGVyLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB2ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uczogQXJyYXk8c3RyaW5nPik6IEFycmF5PHN0cmluZz4ge1xuICAgIC8vIGNvbHVtbnMgbXVzdCBiZSBhIHZhbGlkIGFycmF5XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbHVtbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ2NvbHVtbnNUb0luY2x1ZGUgYW5kIGNvbHVtbnNUb0luY2x1ZGVCeUlkIG11c3QgYmUgdmFsaWQgYXJyYXlzJyk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFueSBkdXBsaWNhdGVzIGZyb20gdGhlIGlucHV0IGFycmF5XG4gICAgY29uc3QgY29sdW1uc0FzU2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoY29sdW1ucyk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oY29sdW1uc0FzU2V0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzUmVzdWx0c1RhYmxlKHJlc3BvbnNlRGF0YTogRGF0YVRhYmxlSW50ZXJuYWxDb250cmFjdCwgaXNTdW1tYXJ5OiBib29sZWFuKTogRGF0YVRhYmxlIHtcbiAgICBjb25zdCBoZWFkZXJzID0gcmVzcG9uc2VEYXRhLmhlYWRlcnMubWFwKChoKSA9PiBuZXcgQ29sdW1uKGguZmllbGRDYXB0aW9uLCBoLmZpZWxkTmFtZSwgaC5kYXRhVHlwZSwgaC5pc1JlZmVyZW5jZWQsIGguaW5kZXgpKTtcblxuICAgIC8vIFRPRE8gVGhpcyBzaG91bGQgYmUgY29udHJvbGxlZCBieSBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgYXBpIHdpbGwgcmVzcG9uZCBtYXJrcyBpbmZvIG9yIG5vdFxuICAgIGxldCBtYXJrcztcbiAgICBpZiAocmVzcG9uc2VEYXRhLm1hcmtzKSB7XG4gICAgICBtYXJrcyA9IHJlc3BvbnNlRGF0YS5tYXJrcy5tYXAoKGgpID0+IG5ldyBNYXJrSW5mbyhoLnR5cGUsIGguY29sb3IsIGgudHVwbGVJZCkpO1xuICAgIH1cblxuICAgIC8vIExpbWl0KzEgaXMgb3VyIHNlbnRpbmFsIHRoYXQgdW5kZXJseWluZyBkYXRhIGNvbnRhaW5zIG1vcmUgcm93cyB0aGFuIHVzZXIgaXMgYWxsb3dlZCB0byBmZXRjaC5cbiAgICAvLyBSZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBzbyB3ZSBhbHdheXMgcmV0dXJuIE1heFJvd0xpbWl0XG4gICAgY29uc3QgaXNUb3RhbFJvd0NvdW50TGltaXRlZCA9IGlzU3VtbWFyeSA9PT0gZmFsc2UgJiYgcmVzcG9uc2VEYXRhLmRhdGFUYWJsZS5sZW5ndGggPT09IHRoaXMuZ2V0TWF4Um93TGltaXQoKSArIDE7XG4gICAgaWYgKGlzVG90YWxSb3dDb3VudExpbWl0ZWQpIHtcbiAgICAgIHJlc3BvbnNlRGF0YS5kYXRhVGFibGUubGVuZ3RoIC09IDE7XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGUgPSByZXNwb25zZURhdGEuZGF0YVRhYmxlLm1hcCgocm93KSA9PiB7XG4gICAgICByZXR1cm4gcm93Lm1hcCgoY2VsbCwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVRhYmxlRGF0YVZhbHVlKGNlbGwsIGhlYWRlcnNbaW5kZXhdLmRhdGFUeXBlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKG1hcmtzKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGFUYWJsZSh0YWJsZSwgaGVhZGVycywgdGFibGUubGVuZ3RoLCBpc1RvdGFsUm93Q291bnRMaW1pdGVkLCBpc1N1bW1hcnksIG1hcmtzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRhVGFibGUodGFibGUsIGhlYWRlcnMsIHRhYmxlLmxlbmd0aCwgaXNUb3RhbFJvd0NvdW50TGltaXRlZCwgaXNTdW1tYXJ5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzUmVzdWx0c1BhZ2UocmVzcG9uc2VEYXRhOiBEYXRhVGFibGVJbnRlcm5hbENvbnRyYWN0LCBpc1N1bW1hcnk6IGJvb2xlYW4pOiBEYXRhVGFibGUge1xuICAgIGNvbnN0IGhlYWRlcnMgPSByZXNwb25zZURhdGEuaGVhZGVycy5tYXAoKGgpID0+IG5ldyBDb2x1bW4oaC5maWVsZENhcHRpb24sIGguZmllbGROYW1lLCBoLmRhdGFUeXBlLCBoLmlzUmVmZXJlbmNlZCwgaC5pbmRleCkpO1xuXG4gICAgbGV0IG1hcmtzO1xuICAgIGlmIChyZXNwb25zZURhdGEubWFya3MpIHtcbiAgICAgIG1hcmtzID0gcmVzcG9uc2VEYXRhLm1hcmtzLm1hcCgoaCkgPT4gbmV3IE1hcmtJbmZvKGgudHlwZSwgaC5jb2xvciwgaC50dXBsZUlkKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGUgPSByZXNwb25zZURhdGEuZGF0YVRhYmxlLm1hcCgocm93KSA9PiB7XG4gICAgICByZXR1cm4gcm93Lm1hcCgoY2VsbCwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVRhYmxlRGF0YVZhbHVlKGNlbGwsIGhlYWRlcnNbaW5kZXhdLmRhdGFUeXBlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKG1hcmtzKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGFUYWJsZSh0YWJsZSwgaGVhZGVycywgdGFibGUubGVuZ3RoLCBmYWxzZSwgaXNTdW1tYXJ5LCBtYXJrcyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0YVRhYmxlKHRhYmxlLCBoZWFkZXJzLCB0YWJsZS5sZW5ndGgsIGZhbHNlLCBpc1N1bW1hcnkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vTm90aWZpY2F0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uU2VydmljZUltcGwgZXh0ZW5kcyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBOb3RpZmljYXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIE1vZGVsLCBOb3RpZmljYXRpb24sIE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFVucmVnaXN0ZXJGbiB9IGZyb20gJy4uL05vdGlmaWNhdGlvblNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgUmVnaXN0cmF0aW9uIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ZpbHRlckZuOiAobm90aWZpY2F0aW9uTW9kZWw6IE1vZGVsKSA9PiBib29sZWFuLCBwcml2YXRlIF9jYWxsYmFja0ZuOiAobm90aWZpY2F0aW9uTW9kZWw6IE1vZGVsKSA9PiB2b2lkKSB7XG4gICAgLy8gTm90aGluZyBIZXJlXG4gIH1cblxuICBwdWJsaWMgb25Ob3RpZmljYXRpb24obm90aWZpY2F0aW9uTW9kZWw6IE1vZGVsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2ZpbHRlckZuKG5vdGlmaWNhdGlvbk1vZGVsKSkge1xuICAgICAgdGhpcy5fY2FsbGJhY2tGbihub3RpZmljYXRpb25Nb2RlbCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2Uge1xuICBwcml2YXRlIF9oYW5kbGVyczogeyBbbm90aWZpY2F0aW9uSWQ6IHN0cmluZ106IEFycmF5PFJlZ2lzdHJhdGlvbj4gfTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpIHtcbiAgICB0aGlzLl9oYW5kbGVycyA9IHt9O1xuICAgIHRoaXMuZGlzcGF0Y2hlci5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIodGhpcy5vbk5vdGlmaWNhdGlvbi5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckhhbmRsZXIoaWQ6IE5vdGlmaWNhdGlvbklkLCBmaWx0ZXJGbjogKG1vZGVsOiBNb2RlbCkgPT4gYm9vbGVhbiwgaGFuZGxlcjogKG1vZGVsOiBNb2RlbCkgPT4gdm9pZCk6IFVucmVnaXN0ZXJGbiB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLl9oYW5kbGVyc1tpZF0gfHwgbmV3IEFycmF5PFJlZ2lzdHJhdGlvbj4oKTtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSBuZXcgUmVnaXN0cmF0aW9uKGZpbHRlckZuLCBoYW5kbGVyKTtcbiAgICBoYW5kbGVycy5wdXNoKHJlZ2lzdHJhdGlvbik7XG4gICAgdGhpcy5faGFuZGxlcnNbaWRdID0gaGFuZGxlcnM7XG4gICAgcmV0dXJuICgpID0+IHRoaXMucmVtb3ZlUmVnaXN0cmF0aW9uKGlkLCByZWdpc3RyYXRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNIYW5kbGVyc0Zvck5vdGlmaWNhdGlvblR5cGUoaWQ6IE5vdGlmaWNhdGlvbklkKTogYm9vbGVhbiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgIHJldHVybiB0aGlzLl9oYW5kbGVycy5oYXNPd25Qcm9wZXJ0eShpZCk7XG4gIH1cblxuICBwcml2YXRlIG9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc0hhbmRsZXJzRm9yTm90aWZpY2F0aW9uVHlwZShub3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gR28gdGhyb3VnaCBhbmQgY2hlY2sgZm9yIGFsbCB0aGUgaGFuZGxlcnMgb2YgdGhpcyBwYXJ0aWN1bGFyIG5vdGlmaWNhdGlvblxuICAgIHRoaXMuX2hhbmRsZXJzW25vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25JZF0uZm9yRWFjaCgoaCkgPT4gaC5vbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb24uZGF0YSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVSZWdpc3RyYXRpb24oaWQ6IE5vdGlmaWNhdGlvbklkLCByZWdpc3RyYXRpb246IFJlZ2lzdHJhdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNIYW5kbGVyc0Zvck5vdGlmaWNhdGlvblR5cGUoaWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5faGFuZGxlcnNbaWRdID0gdGhpcy5faGFuZGxlcnNbaWRdLmZpbHRlcigocmVnKSA9PiByZWcgIT09IHJlZ2lzdHJhdGlvbik7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIE1vZGVsLCBQYXJhbWV0ZXJJZCwgUGFyYW1ldGVySW5mbywgU2hlZXRQYXRoLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvUGFyYW1ldGVySW1wbCc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi9QYXJhbWV0ZXJzU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgUGFyYW1ldGVyc1NlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgUGFyYW1ldGVyc1NlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5QYXJhbWV0ZXJzO1xuICB9XG5cbiAgcHVibGljIGdldFBhcmFtZXRlcnNGb3JTaGVldEFzeW5jKHNoZWV0UGF0aDogU2hlZXRQYXRoKTogUHJvbWlzZTxBcnJheTxQYXJhbWV0ZXJJbXBsPj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFBhcmFtZXRlcnNGb3JTaGVldEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaGVldFBhdGhdOiBzaGVldFBhdGgsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcnNBc3luYyhwYXJhbWV0ZXJzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGxQYXJhbWV0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxQYXJhbWV0ZXJJbXBsPj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFBhcmFtZXRlcnNGb3JTaGVldEFzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyc0FzeW5jKHBhcmFtZXRlcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXJhbWV0ZXJzQXN5bmMoaW5wdXRQYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByb21pc2U8QXJyYXk8UGFyYW1ldGVySW1wbD4+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRQYXJhbWV0ZXJzRm9yU2hlZXQsIGlucHV0UGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxQYXJhbWV0ZXJJbmZvPjtcbiAgICAgIHJldHVybiByZXN1bHQubWFwKChwYXJhbWV0ZXJJbmZvKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVySW1wbChwYXJhbWV0ZXJJbmZvLCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVBhcmFtZXRlclZhbHVlQXN5bmMoZmllbGROYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPFBhcmFtZXRlckluZm8+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdjaGFuZ2VQYXJhbWV0ZXJWYWx1ZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5QYXJhbWV0ZXJGaWVsZE5hbWVdOiBmaWVsZE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuUGFyYW1ldGVyVmFsdWVdOiBuZXdWYWx1ZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuQ2hhbmdlUGFyYW1ldGVyVmFsdWUsIHBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgUGFyYW1ldGVySW5mbztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZmluZFBhcmFtZXRlckJ5TmFtZUFzeW5jKG5hbWU6IHN0cmluZyk6IFByb21pc2U8UGFyYW1ldGVySW1wbCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLmZpbmRQYXJhbWV0ZXJBc3luYyhuYW1lLCB1bmRlZmluZWQpO1xuICB9XG5cbiAgcHVibGljIGZpbmRQYXJhbWV0ZXJCeUdsb2JhbEZpZWxkTmFtZUFzeW5jKGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTxQYXJhbWV0ZXJJbXBsIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuZmluZFBhcmFtZXRlckFzeW5jKHVuZGVmaW5lZCwgZmllbGROYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFBhcmFtZXRlckFzeW5jKG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZmllbGROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPFBhcmFtZXRlckltcGwgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZmluZFBhcmFtZXRlckFzeW5jJyxcbiAgICB9O1xuICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUGFyYW1ldGVyQ2FwdGlvbl0gPSBuYW1lO1xuICAgIH0gZWxzZSBpZiAoZmllbGROYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUGFyYW1ldGVyRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICduYW1lIG9yIGZpZWxkTmFtZSBtdXN0IGJlIHByb3ZpZGVkIHRvIGZpbmQgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuRmluZFBhcmFtZXRlciwgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlT2ZQYXJhbWV0ZXJJbmZvID0gKG9iamVjdDogTW9kZWwpOiBvYmplY3QgaXMgUGFyYW1ldGVySW5mbyA9PiB7XG4gICAgICAgIHJldHVybiAnZmllbGROYW1lJyBpbiBvYmplY3Q7XG4gICAgICB9O1xuXG4gICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIHRvIHNlZSBpZiB3ZSBnb3QgYSB2YWxpZCByZXNwb25zZSBiYWNrIGFnYWluXG4gICAgICBpZiAoaW5zdGFuY2VPZlBhcmFtZXRlckluZm8ocmVzcG9uc2UucmVzdWx0KSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQ7XG4gICAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVySW1wbChyZXN1bHQsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBQYXJhbWV0ZXJJZCxcbiAgUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUgYXMgU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRGltZW5zaW9uU2VsZWN0aW9uTW9kZWwsXG4gIEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsLFxuICBIb3ZlclR1cGxlSW50ZXJhY3Rpb25Nb2RlbCxcbiAgUmFuZ2VTZWxlY3Rpb25Nb2RlbCxcbiAgU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb25Nb2RlbCxcbiAgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyLFxuICBUdXBsZVNlbGVjdGlvbk1vZGVsLFxuICBWYWx1ZVNlbGVjdGlvbk1vZGVsLFxufSBmcm9tICcuLi8uLi9Nb2RlbHMvU2VsZWN0aW9uTW9kZWxzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uLy4uL1V0aWxzL1BhcmFtJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZWxlY3Rpb25TZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFNlbGVjdGlvblNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5TZWxlY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIGNsZWFyIGFsbCB0aGUgc2VsZWN0ZWQgbWFya3MgZm9yIHRoZSBnaXZlbiB3b3Jrc2hlZXQuXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKi9cbiAgcHVibGljIGNsZWFyU2VsZWN0ZWRNYXJrc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdjbGVhclNlbGVjdGVkTWFya3NBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNsZWFyU2VsZWN0ZWRNYXJrcywgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjsgLy8gRXhwZWN0aW5nIGFuIGVtcHR5IG1vZGVsIGFuZCBoZW5jZSB0aGUgdm9pZCByZXNwb25zZS5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gc2VsZWN0IG1hcmtzIGZvciB0aGUgZ2l2ZW4gd29ya3NoZWV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICogQHBhcmFtIHNlbGVjdGlvbkNyaXRlcmlhXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25VcGRhdGVUeXBlXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHNlbGVjdGlvbkNyaXRlcmlhczogQXJyYXk8Q29udHJhY3QuU2VsZWN0aW9uQ3JpdGVyaWE+LFxuICAgIHNlbGVjdGlvblVwZGF0ZVR5cGU6IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChzZWxlY3Rpb25Dcml0ZXJpYXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ1NlbGVjdGlvbiBjcml0ZXJpYSBtaXNzaW5nIGZvciBzZWxlY3RpbmcgbWFya3MgYnkgdmFsdWUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlOiBzdHJpbmcgPSB0aGlzLnZhbGlkYXRlU2VsZWN0aW9uVXBkYXRlVHlwZShzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gdGhpcy5wYXJzZVNlbGVjdGlvbk1hcmtzKHNlbGVjdGlvbkNyaXRlcmlhcyk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0aW9uVXBkYXRlVHlwZV06IHNlbGVjdGlvblR5cGUsXG4gICAgfTtcblxuICAgIGlmIChzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5oaWVyTW9kZWxBcnIgJiYgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuaGllck1vZGVsQXJyLmxlbmd0aCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5IaWVyVmFsU2VsZWN0aW9uTW9kZWxzXSA9IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmhpZXJNb2RlbEFycjtcbiAgICB9XG4gICAgaWYgKHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnF1YW50TW9kZWxBcnIgJiYgc2VsZWN0aW9uTW9kZWxDb250YWluZXIucXVhbnRNb2RlbEFyci5sZW5ndGgpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUXVhbnRSYW5nZVNlbGVjdGlvbk1vZGVsc10gPSBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5xdWFudE1vZGVsQXJyO1xuICAgIH1cbiAgICBpZiAoc2VsZWN0aW9uTW9kZWxDb250YWluZXIuZGltTW9kZWxBcnIgJiYgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuZGltTW9kZWxBcnIubGVuZ3RoKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkRpbVZhbFNlbGVjdGlvbk1vZGVsc10gPSBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5kaW1Nb2RlbEFycjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TZWxlY3RCeVZhbHVlLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgdGhpcy5hcGlGaWx0ZXJIYW5kbGVyQ2hlY2tGb3JDb21tYW5kRXJyb3IocmVzcG9uc2UucmVzdWx0IGFzIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBleGVjdXRlIGhvdmVyIGFjdGlvbnMgYW5kIHJlbmRlciB0b29sdGlwIGZvciBhIGdpdmVuIHR1cGxlIHJlcHJlc2VudGluZyBhIG1hcmsgaW4gdGhlIHZpc3VhbGl6YXRpb24uXG4gICAqIElmIHRoZSB0b29sdGlwIHBhcmFtZXRlciBpcyBpbmNsdWRlZCBpdCB3aWxsIHNob3cgdGhlIHRvb2x0aXAgb24gaG92ZXIuIElmIG5vdCwgbm8gdG9vbHRpcCBpcyBzaG93bi5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBob3ZlcmVkVHVwbGVcbiAgICogQHBhcmFtIHRvb2x0aXBcbiAgICogQHJldHVybnMgZW1wdHkgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGV4dGVuc2lvbiBob3N0IGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBpbmZvcm1lZCBvZiB0aGUgcmVxdWVzdCBhbmQgcmVqZWN0cyBvbiBlcnJvclxuICAgKi9cbiAgcHVibGljIGhvdmVyVHVwbGVBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgaG92ZXJlZFR1cGxlPzogbnVtYmVyLFxuICAgIHRvb2x0aXA/OiBDb250cmFjdC5Ub29sdGlwQ29udGV4dCB8IG51bGwsXG4gICAgYWxsb3dIb3ZlckFjdGlvbnM/OiBib29sZWFuLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgaW50ZXJhY3Rpb25Nb2RlbCA9IG5ldyBIb3ZlclR1cGxlSW50ZXJhY3Rpb25Nb2RlbChcbiAgICAgIHZpc3VhbElkLFxuICAgICAgdGhpcy5lbnN1cmVUdXBsZUlESXNOb25OZWdhdGl2ZShob3ZlcmVkVHVwbGUpLFxuICAgICAgdG9vbHRpcCxcbiAgICAgIGFsbG93SG92ZXJBY3Rpb25zLFxuICAgICk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnaG92ZXJUdXBsZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Ib3ZlclR1cGxlSW50ZXJhY3Rpb25dOiBpbnRlcmFjdGlvbk1vZGVsLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SYWlzZUhvdmVyVHVwbGVOb3RpZmljYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIG1vZGlmeSBzZWxlY3Rpb24sIGV4ZWN1dGUgc2VsZWN0IGFjdGlvbnMgYW5kIHJlbmRlciB0b29sdGlwIGZvciBhIGdpdmVuIGxpc3Qgb2YgdHVwbGVzIHJlcHJlc2VudGluZyBhIG1hcmsgb3IgbWFya3MgaW4gdGhlIHZpc3VhbGl6YXRpb24uXG4gICAqIElmIHRoZSB0b29sdGlwIHBhcmFtZXRlciBpcyBpbmNsdWRlZCBpdCB3aWxsIHNob3cgdGhlIHRvb2x0aXAgb24gc2VsZWN0LiBJZiBub3QsIG5vIHRvb2x0aXAgaXMgc2hvd24uXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcGFyYW0gc2VsZWN0ZWRUdXBsZXNcbiAgICogQHBhcmFtIHNlbGVjdE9wdGlvblxuICAgKiBAcGFyYW0gdG9vbHRpcFxuICAgKiBAcmV0dXJucyBlbXB0eSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZXh0ZW5zaW9uIGhvc3QgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGluZm9ybWVkIG9mIHRoZSByZXF1ZXN0IGFuZCByZWplY3RzIG9uIGVycm9yXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0VHVwbGVzQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHNlbGVjdGVkVHVwbGVzOiBBcnJheTxudW1iZXI+LFxuICAgIHNlbGVjdE9wdGlvbjogQ29udHJhY3QuU2VsZWN0T3B0aW9ucyxcbiAgICB0b29sdGlwPzogQ29udHJhY3QuVG9vbHRpcENvbnRleHQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpbnRlcmFjdGlvbk1vZGVsID0gbmV3IFNlbGVjdFR1cGxlc0ludGVyYWN0aW9uTW9kZWwodmlzdWFsSWQsIHNlbGVjdGVkVHVwbGVzLCBzZWxlY3RPcHRpb24sIHRvb2x0aXApO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NlbGVjdFR1cGxlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3RUdXBsZXNJbnRlcmFjdGlvbl06IGludGVyYWN0aW9uTW9kZWwsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJhaXNlU2VsZWN0VHVwbGVzTm90aWZpY2F0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcGlGaWx0ZXJIYW5kbGVyQ2hlY2tGb3JDb21tYW5kRXJyb3Ioc2VydmVyUG06IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICBpZiAoIXNlcnZlclBtW1BhcmFtZXRlcklkLlBhcmFtZXRlckVycm9yXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2VydmVyUG1bUGFyYW1ldGVySWQuSW52YWxpZEZpZWxkc10pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uRmllbGROYW1lLCBzZXJ2ZXJQbVtQYXJhbWV0ZXJJZC5JbnZhbGlkRmllbGRzXSk7XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJQbVtQYXJhbWV0ZXJJZC5JbnZhbGlkVmFsdWVzXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkludmFsaWRTZWxlY3Rpb25WYWx1ZSwgc2VydmVyUG1bUGFyYW1ldGVySWQuSW52YWxpZFZhbHVlc10pO1xuICAgIH1cbiAgICBpZiAoc2VydmVyUG1bUGFyYW1ldGVySWQuSW52YWxpZERhdGVzXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkludmFsaWRTZWxlY3Rpb25EYXRlLCBzZXJ2ZXJQbVtQYXJhbWV0ZXJJZC5JbnZhbGlkRGF0ZXNdKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHNlbGVjdCBtYXJrcyBmb3IgdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBNYXJrSW5mb1xuICAgKiBAcGFyYW0gc2VsZWN0aW9uVXBkYXRlVHlwZVxuICAgKi9cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlJZEFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBtYXJrczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+LFxuICAgIHNlbGVjdGlvblVwZGF0ZVR5cGU6IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChtYXJrcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnTWFya3MgaW5mbyBtaXNzaW5nIGZvciBzZWxlY3RpbmcgbWFya3MgYnkgSWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlOiBzdHJpbmcgPSB0aGlzLnZhbGlkYXRlU2VsZWN0aW9uVXBkYXRlVHlwZShzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gdGhpcy5wYXJzZVNlbGVjdGlvbklkcyhtYXJrcyk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2VsZWN0TWFya3NCeUlkQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0aW9uVXBkYXRlVHlwZV06IHNlbGVjdGlvblR5cGUsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0aW9uXTogc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2VsZWN0QnlWYWx1ZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIEV4cGVjdGluZyBhbiBlbXB0eSBtb2RlbCBhbmQgaGVuY2UgdGhlIHZvaWQgcmVzcG9uc2UuXG4gICAgICByZXR1cm47XG4gICAgICAvLyBUT0RPIEludmVzdGlnYXRlIHRoZSBlcnJvciByZXNwb25zZSB3aXRoIG11bHRpcGxlIG91dHB1dCBwYXJhbXMgYW5kIHRocm93IGVycm9yIGFjY29yZGluZ2x5LlxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBwcmVwYXJlIHRoZSBwcmVzIG1vZGVscyBmb3Igc2VsZWN0aW9uIGJ5IE1hcmtzSW5mb1xuICAgKiBAcGFyYW0gbWFya3NcbiAgICovXG4gIHByaXZhdGUgcGFyc2VTZWxlY3Rpb25JZHMobWFya3M6IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPik6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciB7XG4gICAgY29uc3QgaWRzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IG5ldyBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB0dXBsZUlkOiBudW1iZXIgfCB1bmRlZmluZWQgPSBtYXJrc1tpXS50dXBsZUlkO1xuICAgICAgaWYgKHR1cGxlSWQgIT09IHVuZGVmaW5lZCAmJiB0dXBsZUlkICE9PSBudWxsKSB7XG4gICAgICAgIC8vIElmIHR1cGxlIGlkIGlzIHByb3ZpZGVkIHVzZSB0aGF0IGluc3RlYWQgb2YgcGFpclxuICAgICAgICBpZHMucHVzaCh0dXBsZUlkLnRvU3RyaW5nKCkpOyAvLyBjb2xsZWN0IHRoZSB0dXBsZSBpZHNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAndHVwbGVJZCBwYXJzaW5nIGVycm9yJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpZHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAvLyB0dXBsZSBpZHMgYmFzZWQgc2VsZWN0aW9uXG4gICAgICBjb25zdCB0dXBsZVNlbGVjdGlvbk1vZGVsOiBUdXBsZVNlbGVjdGlvbk1vZGVsID0gbmV3IFR1cGxlU2VsZWN0aW9uTW9kZWwoKTtcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwuc2VsZWN0aW9uVHlwZSA9ICd0dXBsZXMnO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5vYmplY3RJZHMgPSBpZHM7XG4gICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5zZWxlY3Rpb24gPSB0dXBsZVNlbGVjdGlvbk1vZGVsO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0aW9uTW9kZWxDb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHByZXBhcmUgdGhlIHByZXMgbW9kZWxzIGZvciBzZWxlY3Rpb24gYnkgdmFsdWVzLlxuICAgKlxuICAgKiBTdXBwb3J0cyAzIHR5cGVzIGZvciBzZWxlY3Rpb246XG4gICAqIDEpIEhpZXJhcmNoaWNhbCB2YWx1ZSBiYXNlZCBzZWxlY3Rpb25cbiAgICogMikgUmFuZ2UgdmFsdWUgYmFzZWQgc2VsZWN0aW9uXG4gICAqIDMpIERpbWVuc2lvbiB2YWx1ZSBiYXNlZCBzZWxlY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlU2VsZWN0aW9uTWFya3Moc2VsZWN0aW9uQ3JpdGVyaWFzOiBBcnJheTxDb250cmFjdC5TZWxlY3Rpb25Dcml0ZXJpYT4pOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbkNyaXRlcmlhcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc3QgPSBzZWxlY3Rpb25Dcml0ZXJpYXNbaV07XG4gICAgICBpZiAoIShzdC5maWVsZE5hbWUgJiYgc3QudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBzdC52YWx1ZSAhPT0gbnVsbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdTZWxlY3Rpb24gQ3JpdGVyaWEgcGFyc2luZyBlcnJvcicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjYXRSZWdleCA9IG5ldyBSZWdFeHAoJyhbW0EtWmEtejAtOV0rXSkuKicsICdnJyk7XG4gICAgICBjb25zdCByYW5nZU9wdGlvbiA9IHN0LnZhbHVlIGFzIENvbnRyYWN0LlJhbmdlVmFsdWU7XG4gICAgICBpZiAoY2F0UmVnZXgudGVzdChzdC5maWVsZE5hbWUpKSB7XG4gICAgICAgIC8vIEhpZXJhcmNoaWNhbCB2YWx1ZSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3QgaGllck1vZGVsOiBIaWVyYXJjaGljYWxTZWxlY3Rpb25Nb2RlbCA9IHRoaXMuYWRkVG9QYXJhbXNMaXN0KHN0LmZpZWxkTmFtZSwgc3QudmFsdWUpIGFzIEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsO1xuICAgICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5oaWVyTW9kZWxBcnIucHVzaChoaWVyTW9kZWwpO1xuICAgICAgfSBlbHNlIGlmIChyYW5nZU9wdGlvbi5taW4gIT09IHVuZGVmaW5lZCAmJiByYW5nZU9wdGlvbi5tYXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBSYW5nZSB2YWx1ZSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3QgcXVhbnRNb2RlbDogUmFuZ2VTZWxlY3Rpb25Nb2RlbCA9IHRoaXMuYWRkVG9SYW5nZVBhcmFtc0xpc3Qoc3QuZmllbGROYW1lLCByYW5nZU9wdGlvbik7XG4gICAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnF1YW50TW9kZWxBcnIucHVzaChxdWFudE1vZGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpbWVuc2lvbiB2YWx1ZSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3QgZGltTW9kZWw6IERpbWVuc2lvblNlbGVjdGlvbk1vZGVsID0gdGhpcy5hZGRUb1BhcmFtc0xpc3Qoc3QuZmllbGROYW1lLCBzdC52YWx1ZSkgYXMgRGltZW5zaW9uU2VsZWN0aW9uTW9kZWw7XG4gICAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmRpbU1vZGVsQXJyLnB1c2goZGltTW9kZWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gdHJhbnNmb3JtIHRoZSBrZXkgdmFsdWUgcGFpciBpbnRvIHZhbHVlIGJhc2VkIHByZXMgbW9kZWwgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVTZWxlY3Rpb25Nb2RlbFxuICAgKiBAcGFyYW0gZmllbGROYW1lXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBhZGRUb1BhcmFtc0xpc3QoZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlOiBDb250cmFjdC5DYXRlZ29yaWNhbFZhbHVlIHwgQ29udHJhY3QuUmFuZ2VWYWx1ZSk6IFZhbHVlU2VsZWN0aW9uTW9kZWwge1xuICAgIGNvbnN0IHZhbHVlU2VsZWN0aW9uTW9kZWw6IFZhbHVlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVmFsdWVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgIGNvbnN0IG1hcmtWYWx1ZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBjb25zdCB2YWx1ZUFycjogQXJyYXk8c3RyaW5nPiA9IHZhbHVlO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZUFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBtYXJrVmFsdWVzLnB1c2goUGFyYW0uc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUodmFsdWVBcnJbaV0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbWFya1ZhbHVlcy5wdXNoKFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgdmFsdWVTZWxlY3Rpb25Nb2RlbC5xdWFsaWZpZWRGaWVsZENhcHRpb24gPSBmaWVsZE5hbWU7XG4gICAgdmFsdWVTZWxlY3Rpb25Nb2RlbC5zZWxlY3RWYWx1ZXMgPSBtYXJrVmFsdWVzO1xuICAgIHJldHVybiB2YWx1ZVNlbGVjdGlvbk1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB0cmFuc2Zvcm0gdGhlIGtleSB2YWx1ZSBwYWlyIGludG8gcmFuZ2UgYmFzZWQgc2VsZWN0aW9uIHByZXMgbW9kZWwuXG4gICAqXG4gICAqIFRPRE86IE5lZWQgdG8gaGFuZGxlIHRoZSBwYXJzaW5nIG9mIGRhdGUgdHlwZSB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZVNlbGVjdGlvbk1vZGVsXG4gICAqIEBwYXJhbSBmaWVsZE5hbWVcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGFkZFRvUmFuZ2VQYXJhbXNMaXN0KGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogQ29udHJhY3QuUmFuZ2VWYWx1ZSk6IFJhbmdlU2VsZWN0aW9uTW9kZWwge1xuICAgIGNvbnN0IHJhbmdlU2VsZWN0aW9uTW9kZWw6IFJhbmdlU2VsZWN0aW9uTW9kZWwgPSBuZXcgUmFuZ2VTZWxlY3Rpb25Nb2RlbCgpO1xuICAgIHJhbmdlU2VsZWN0aW9uTW9kZWwucXVhbGlmaWVkRmllbGRDYXB0aW9uID0gZmllbGROYW1lO1xuICAgIGlmICh2YWx1ZS5tYXggIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS5tYXggIT09IG51bGwpIHtcbiAgICAgIHJhbmdlU2VsZWN0aW9uTW9kZWwubWF4VmFsdWUgPSBQYXJhbS5zZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZSh2YWx1ZS5tYXgpO1xuICAgIH1cbiAgICBpZiAodmFsdWUubWluICE9PSB1bmRlZmluZWQgJiYgdmFsdWUubWluICE9PSBudWxsKSB7XG4gICAgICByYW5nZVNlbGVjdGlvbk1vZGVsLm1pblZhbHVlID0gUGFyYW0uc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUodmFsdWUubWluKTtcbiAgICB9XG4gICAgcmFuZ2VTZWxlY3Rpb25Nb2RlbC5pbmNsdWRlZCA9IHRoaXMudmFsaWRhdGVOdWxsT3B0aW9uVHlwZSh2YWx1ZS5udWxsT3B0aW9uKTtcbiAgICByZXR1cm4gcmFuZ2VTZWxlY3Rpb25Nb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gdmFsaWRhdGUgdGhlIHNlbGVjdGlvbiB1cGRhdGUgdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIHNlbGVjdGlvblVwZGF0ZVR5cGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTZWxlY3Rpb25VcGRhdGVUeXBlKHNlbGVjdGlvblVwZGF0ZVR5cGU6IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUpOiBzdHJpbmcge1xuICAgIGlmIChzZWxlY3Rpb25VcGRhdGVUeXBlID09PSBDb250cmFjdC5TZWxlY3Rpb25VcGRhdGVUeXBlLlJlcGxhY2UpIHtcbiAgICAgIHJldHVybiBTZWxlY3Rpb25VcGRhdGVUeXBlSW50ZXJuYWwuUmVwbGFjZTtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGlvblVwZGF0ZVR5cGUgPT09IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUuQWRkKSB7XG4gICAgICByZXR1cm4gU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLkFkZDtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGlvblVwZGF0ZVR5cGUgPT09IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUuUmVtb3ZlKSB7XG4gICAgICByZXR1cm4gU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLlJlbW92ZTtcbiAgICB9XG4gICAgcmV0dXJuIFNlbGVjdGlvblVwZGF0ZVR5cGVJbnRlcm5hbC5SZXBsYWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB2YWxpZGF0ZSB0aGUgaW5jbHVkZSB0eXBlIGZvciByYW5nZSBzZWxlY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBudWxsT3B0aW9uXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTnVsbE9wdGlvblR5cGUobnVsbE9wdGlvbjogQ29udHJhY3QuRmlsdGVyTnVsbE9wdGlvbiB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKG51bGxPcHRpb24pIHtcbiAgICAgIGlmIChudWxsT3B0aW9uID09PSBDb250cmFjdC5GaWx0ZXJOdWxsT3B0aW9uLk51bGxWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLkluY2x1ZGVOdWxsO1xuICAgICAgfSBlbHNlIGlmIChudWxsT3B0aW9uID09PSBDb250cmFjdC5GaWx0ZXJOdWxsT3B0aW9uLk5vbk51bGxWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLkluY2x1ZGVOb25OdWxsO1xuICAgICAgfSBlbHNlIGlmIChudWxsT3B0aW9uID09PSBDb250cmFjdC5GaWx0ZXJOdWxsT3B0aW9uLkFsbFZhbHVlcykge1xuICAgICAgICByZXR1cm4gUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMuSW5jbHVkZUFsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMuSW5jbHVkZUFsbDtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlVHVwbGVJRElzTm9uTmVnYXRpdmUodHVwbGVJZD86IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHR1cGxlSWQgJiYgdHVwbGVJZCA+IDApIHtcbiAgICAgIHJldHVybiB0dXBsZUlkO1xuICAgIH1cblxuICAgIC8vIDAgd2lsbCBub3QgcmVmZXIgdG8gYSB2YWxpZCB0dXBsZSAoc2luY2UgdHVwbGUgaWRzIGFyZSAxLWJhc2VkKSxcbiAgICAvLyBidXQgY2FuIGJlIHVzZWQgZm9yIGNsZWFyaW5nIHRoZSBjdXJyZW50IGhvdmVyIG9yIHNlbGVjdGlvblxuICAgIHJldHVybiAwO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIEludGVybmFsQXBpRGlzcGF0Y2hlciwgSW50ZXJuYWxUYWJsZWF1RXJyb3IsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBTaG91bGRUaHJvdyB9IGZyb20gJy4uLy4uL1V0aWxzL0VudW1Db252ZXJ0ZXInO1xuXG4vKipcbiAqIEVhY2ggU2VydmNlSW1wbCBzaG91bGQgZXh0ZW5kIHRoaXMgYmFzZSBjbGFzcyBmb3IgdGhlIHNha2Ugb2ZcbiAqIHByb3BlciBlcnJvciBoYW5kbGluZy4gIFRoaXMgYmFzZSBoYW5kbGVzIHRoZSBjb252ZXJzaW9uXG4gKiBmcm9tIGludGVybmFsIGVycm9ycyB0byBleHRlcm5hbCBlcnJvcnMgdGhhdCB3ZSB0aHJvdyB0byBkZXZlbG9wZXJzXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlSW1wbEJhc2Uge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyLCBwcm90ZWN0ZWQgX3JlZ2lzdHJ5SWQ6IG51bWJlcikge31cblxuICBwcm90ZWN0ZWQgZXhlY3V0ZSh2ZXJiOiBWZXJiSWQsIHBhcmFtczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaGVyLmV4ZWN1dGUodmVyYiwgcGFyYW1zKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIC8vIEFueSBpbnRlcm5hbCBlcnJvciB0aGF0IGNvbWVzIGZyb20gdGhlIGRpc3BhdGNoZXIgc2hvdWxkIGJlIGNvbnZlcnRlZFxuICAgICAgLy8gdG8gYW4gZXh0ZXJuYWwgZXJyb3IgdXNpbmcgdGhlIGVudW0gbWFwcGVyIGZvciBlcnJvciBjb2Rlcy5cbiAgICAgIGNvbnN0IGludGVybmFsRXJyb3IgPSBlcnJvciBhcyBJbnRlcm5hbFRhYmxlYXVFcnJvcjtcbiAgICAgIGNvbnN0IGV4dGVybmFsRXJyb3JDb2RlOiBFcnJvckNvZGVzID0gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmVycm9yQ29kZS5jb252ZXJ0KGludGVybmFsRXJyb3IuZXJyb3JDb2RlLCBTaG91bGRUaHJvdy5Obyk7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKGV4dGVybmFsRXJyb3JDb2RlLCBpbnRlcm5hbEVycm9yLm1lc3NhZ2UpO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTaGVldFNpemUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNpemVTZXJ2aWNlIH0gZnJvbSAnLi4vU2l6ZVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgU2l6ZVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgU2l6ZVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5TaXplO1xuICB9XG5cbiAgY2hhbmdlU2l6ZUFzeW5jKG5hbWU6IHN0cmluZywgbmV3U2l6ZTogU2hlZXRTaXplKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NoYW5nZVNpemVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU2hlZXROYW1lXTogbmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NaW5IZWlnaHRdOiBuZXdTaXplLm1pblNpemU/LmhlaWdodCB8fCAwLFxuICAgICAgW1BhcmFtZXRlcklkLk1pbldpZHRoXTogbmV3U2l6ZS5taW5TaXplPy53aWR0aCB8fCAwLFxuICAgICAgW1BhcmFtZXRlcklkLk1heEhlaWdodF06IG5ld1NpemUubWF4U2l6ZT8uaGVpZ2h0IHx8IDAsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4V2lkdGhdOiBuZXdTaXplLm1heFNpemU/LndpZHRoIHx8IDAsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNldFNoZWV0U2l6ZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigoX3Jlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJZCwgU3RvcnlQb2ludE1vZGVsLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFN0b3J5QWN0aXZhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TdG9yeUFjdGl2YXRpb25TZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIFN0b3J5QWN0aXZhdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgU3RvcnlBY3RpdmF0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlN0b3J5QWN0aXZhdGlvbjtcbiAgfVxuXG4gIGFjdGl2YXRlTmV4dFN0b3J5UG9pbnRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFjdGl2YXRlTmV4dFN0b3J5UG9pbnQ7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FjdGl2YXRlTmV4dFN0b3J5UG9pbnRBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIGFjdGl2YXRlUHJldmlvdXNTdG9yeVBvaW50QXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BY3RpdmF0ZVByZXZpb3VzU3RvcnlQb2ludDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnRBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIGFjdGl2YXRlU3RvcnlQb2ludEFzeW5jKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFjdGl2YXRlU3RvcnlQb2ludDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWN0aXZhdGVTdG9yeVBvaW50QXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5TdG9yeVBvaW50SW5kZXhdID0gaW5kZXg7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICByZXZlcnRTdG9yeVBvaW50QXN5bmMoaW5kZXg6IG51bWJlcik6IFByb21pc2U8U3RvcnlQb2ludE1vZGVsPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5SZXZlcnRTdG9yeVBvaW50O1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZXZlcnRTdG9yeVBvaW50QXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5TdG9yeVBvaW50SW5kZXhdID0gaW5kZXg7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48U3RvcnlQb2ludE1vZGVsPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgU3RvcnlQb2ludE1vZGVsO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQsIFZpc3VhbElkLCBWaXN1YWxTcGVjaWZpY2F0aW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBWaXN1YWxNb2RlbFNlcnZpY2UgfSBmcm9tICcuLi9WaXN1YWxNb2RlbFNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgVmlzdWFsTW9kZWxTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFZpc3VhbE1vZGVsU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlZpc3VhbE1vZGVsO1xuICB9XG5cbiAgcHVibGljIGdldFZpc3VhbFNwZWNpZmljYXRpb25Bc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPENvbnRyYWN0LlZpc3VhbFNwZWNpZmljYXRpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogdmlzdWFsSWQud29ya3NoZWV0LFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRWaXN1YWxTcGVjaWZpY2F0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0LlZpc3VhbFNwZWNpZmljYXRpb24+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIFZpc3VhbFNwZWNpZmljYXRpb247XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGVuY29kaW5nVHlwZTogQ29udHJhY3QuRW5jb2RpbmdUeXBlLFxuICAgIGNvbHVtbnM6IEFycmF5PENvbnRyYWN0LkNvbHVtbj4sXG4gICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWRkTWFya3NDYXJkRmllbGRzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiB2aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBbUGFyYW1ldGVySWQuTWFya3NDYXJkSW5kZXhdOiBtYXJrc0NhcmRJbmRleCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FbmNvZGluZ1R5cGVdOiBlbmNvZGluZ1R5cGUsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc106IGNvbHVtbnMsXG4gICAgICBbUGFyYW1ldGVySWQuU3RhcnRJbmRleF06IHN0YXJ0SW5kZXgsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5BZGRNYXJrc0NhcmRGaWVsZHMsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1vdmVNYXJrc0NhcmRGaWVsZEFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGZyb21JbmRleDogbnVtYmVyLFxuICAgIHRvSW5kZXg6IG51bWJlcixcbiAgICBmaWVsZENvdW50ID0gMSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogdmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgW1BhcmFtZXRlcklkLk1hcmtzQ2FyZEluZGV4XTogbWFya3NDYXJkSW5kZXgsXG4gICAgICBbUGFyYW1ldGVySWQuRnJvbUluZGV4XTogZnJvbUluZGV4LFxuICAgICAgW1BhcmFtZXRlcklkLlRvSW5kZXhdOiB0b0luZGV4LFxuICAgICAgW1BhcmFtZXRlcklkLkZpZWxkQ291bnRdOiBmaWVsZENvdW50LFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuTW92ZU1hcmtzQ2FyZEZpZWxkLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbWFya3NDYXJkSW5kZXg6IG51bWJlcixcbiAgICBlbmNvZGluZ1R5cGU6IENvbnRyYWN0LkVuY29kaW5nVHlwZSxcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICAgZGVsZXRlQ291bnQ6IG51bWJlcixcbiAgICBjb2x1bW5zOiBBcnJheTxDb250cmFjdC5Db2x1bW4+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc3BsaWNlTWFya3NDYXJkRmllbGRzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiB2aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBbUGFyYW1ldGVySWQuTWFya3NDYXJkSW5kZXhdOiBtYXJrc0NhcmRJbmRleCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FbmNvZGluZ1R5cGVdOiBlbmNvZGluZ1R5cGUsXG4gICAgICBbUGFyYW1ldGVySWQuU3RhcnRJbmRleF06IHN0YXJ0SW5kZXgsXG4gICAgICBbUGFyYW1ldGVySWQuRGVsZXRlQ291bnRdOiBkZWxldGVDb3VudCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zXTogY29sdW1ucyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNwbGljZU1hcmtzQ2FyZEZpZWxkcywgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBlZGl0QWxpYXNlc0RpYWxvZ0FzeW5jKGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2VkaXRBbGlhc2VzRGlhbG9nQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkZpZWxkSWRdOiBmaWVsZE5hbWUsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5FZGl0QWxpYXNlc0RpYWxvZywgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEN1c3RvbVZpZXdNb2RlbCwgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ3VzdG9tVmlld0ltcGwgfSBmcm9tICcuLi8uLi9JbXBsL0N1c3RvbVZpZXdJbXBsJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBWaXpTZXJ2aWNlIH0gZnJvbSAnLi4vVml6U2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBWaXpTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFZpelNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5WaXo7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NyZWF0ZVZpekltYWdlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpekFQSUlucHV0SnNvbl06IEpTT04uc3RyaW5naWZ5KGlucHV0U3BlYyksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlZpekFQSSwgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlU2hlZXRBc3luYyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWN0aXZhdGVTaGVldEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Td2l0Y2hUb1NoZWV0TmFtZV06IG5hbWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkFjdGl2YXRlU2hlZXQsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEN1c3RvbVZpZXdzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDdXN0b21WaWV3SW1wbD4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0Q3VzdG9tVmlld3NBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEN1c3RvbVZpZXdzLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PEN1c3RvbVZpZXdJbXBsPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3cyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxDdXN0b21WaWV3TW9kZWw+O1xuICAgICAgcmV0dXJuIGN1c3RvbVZpZXdzLm1hcCgoY3VzdG9tVmlldzogQ3VzdG9tVmlld01vZGVsKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgQ3VzdG9tVmlld0ltcGwoY3VzdG9tVmlldywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q3VzdG9tVmlld0FzeW5jKGN1c3RvbVZpZXdOYW1lPzogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGwgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2hvd0N1c3RvbVZpZXdBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld05hbWVdOiBjdXN0b21WaWV3TmFtZSB8fCAnJywgLy8gYSBmYWxzZXkgdmFsdWUgbWVhbnMgXCJzaG93IG9yaWdpbmFsIHZpZXdcIlxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TaG93Q3VzdG9tVmlldywgcGFyYW1ldGVycykudGhlbjxDdXN0b21WaWV3SW1wbCB8IHVuZGVmaW5lZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3ID0gcmVzcG9uc2UucmVzdWx0IGFzIEN1c3RvbVZpZXdNb2RlbDtcbiAgICAgIHJldHVybiBjdXN0b21WaWV3Py5sdWlkID8gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpIDogdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUN1c3RvbVZpZXdBc3luYyhjdXN0b21WaWV3TmFtZTogc3RyaW5nKTogUHJvbWlzZTxDdXN0b21WaWV3SW1wbD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZW1vdmVDdXN0b21WaWV3QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlld05hbWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlbW92ZUN1c3RvbVZpZXcsIHBhcmFtZXRlcnMpLnRoZW48Q3VzdG9tVmlld0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlldyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDdXN0b21WaWV3TW9kZWw7XG4gICAgICByZXR1cm4gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNhdmVDdXN0b21WaWV3QXN5bmMoY3VzdG9tVmlld05hbWU6IHN0cmluZyk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGw+IHtcbiAgICAvLyBDdXN0b21WaWV3SXNEZWZhdWx0IGlzIGEgcmVxdWlyZWQgcGFyYW1ldGVyLCBidXQgb3VyIEFQSSBoYXMgbm90IGJlZW4gdXBkYXRlZCB0byBhbGxvdyBpdCB0byBiZSBzcGVjaWZpZWQgeWV0LlxuICAgIC8vIFdlIHNob3VsZCBhZGQgYSAnZGVmYXVsdCcgcGFyYW1ldGVyIHRvIHRoZSBpbnRlcmZhY2UuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NhdmVDdXN0b21WaWV3QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlld05hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld0lzRGVmYXVsdF06IGZhbHNlLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TYXZlV29ya2Jvb2tBc0N1c3RvbVZpZXcsIHBhcmFtZXRlcnMpLnRoZW48Q3VzdG9tVmlld0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlldyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDdXN0b21WaWV3TW9kZWw7XG4gICAgICByZXR1cm4gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldEFjdGl2ZUN1c3RvbVZpZXdBc0RlZmF1bHRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2V0QWN0aXZlQ3VzdG9tVmlld0FzRGVmYXVsdEFzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2V0QWN0aXZlQ3VzdG9tVmlld0FzRGVmYXVsdCwgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUFzeW5jKGN1c3RvbVZpZXc6IEN1c3RvbVZpZXdJbXBsKTogUHJvbWlzZTxDdXN0b21WaWV3SW1wbD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzYXZlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdMdWlkXTogY3VzdG9tVmlldy5sdWlkLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlldy5uYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdJc0RlZmF1bHRdOiBjdXN0b21WaWV3LmlzRGVmYXVsdCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3SXNQdWJsaWNdOiBjdXN0b21WaWV3LnNoYXJlZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuVXBkYXRlQ3VzdG9tVmlldywgcGFyYW1ldGVycykudGhlbjxDdXN0b21WaWV3SW1wbD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3ID0gcmVzcG9uc2UucmVzdWx0IGFzIEN1c3RvbVZpZXdNb2RlbDtcbiAgICAgIHJldHVybiBuZXcgQ3VzdG9tVmlld0ltcGwoY3VzdG9tVmlldywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VycmVudFNyY0FzeW5jKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEN1cnJlbnRTcmNBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEN1cnJlbnRTcmMsIHBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIGFzIEV4dGVybmFsRW51bUNvbnZlcnRlciB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi8uLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuLi8uLi9VdGlscy9QYXJhbSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2UgfSBmcm9tICcuLi9ab25lU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBab25lU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBab25lU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlpvbmU7XG4gIH1cblxuICBwdWJsaWMgc2V0VmlzaWJpbGl0eUFzeW5jKFxuICAgIGRhc2hib2FyZDogc3RyaW5nLFxuICAgIGRhc2hib2FyZFpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+LFxuICAgIHpvbmVWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5ab25lVmlzaWJpbGl0eU1hcCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2V0VmlzaWJpbGl0eUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXNoYm9hcmRdOiBkYXNoYm9hcmQsXG4gICAgICBbUGFyYW1ldGVySWQuWm9uZUlkc1Zpc2liaWxpdHlNYXBdOiB7fSxcbiAgICB9O1xuXG4gICAgLy8gem9uZVZpc2liaWxpdHlNYXAgY2FuIGJlIGVpdGhlciBhbiBvYmplY3Qgb3IgYSBNYXAgLSBjb252ZXJ0IGl0IHRvIGEgTWFwXG4gICAgY29uc3QgcGFyYW1ldGVyQXNNYXAgPSBQYXJhbS5jb252ZXJ0UGFyYW1ldGVyVG9NYXAoem9uZVZpc2liaWxpdHlNYXAsICd6b25lVmlzaWJpbGl0eU1hcCcpO1xuXG4gICAgcGFyYW1ldGVyQXNNYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeVpvbmVJc1ZhbGlkKGRhc2hib2FyZFpvbmVNYXAsIE51bWJlci5wYXJzZUludChrZXksIDEwKSk7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlPih2YWx1ZSwgRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUsICdEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZScpO1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5ab25lSWRzVmlzaWJpbGl0eU1hcF1ba2V5XSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5zZXRWaXNpYmlsaXR5VHlwZS5jb252ZXJ0KHZhbHVlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNldFpvbmVWaXNpYmlsaXR5LCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1vdmVBbmRSZXNpemVBc3luYyhcbiAgICBkYXNoYm9hcmQ6IHN0cmluZyxcbiAgICBkYXNoYm9hcmRab25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPixcbiAgICBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheTogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXksXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRGFzaGJvYXJkXTogZGFzaGJvYXJkLFxuICAgICAgW1BhcmFtZXRlcklkLkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUxpc3RdOiBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSxcbiAgICB9O1xuXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXkuZm9yRWFjaCgoZGFzaGJvYXJkT2JqZWN0OiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUpID0+IHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlab25lSXNWYWxpZEFuZEZsb2F0aW5nKGRhc2hib2FyZFpvbmVNYXAsIGRhc2hib2FyZE9iamVjdC5kYXNoYm9hcmRPYmplY3RJRCk7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5V2lkdGhBbmRIZWlnaHRPZkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZShkYXNoYm9hcmRPYmplY3QpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuTW92ZUFuZFJlc2l6ZVpvbmVzLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIHRhYmxlIHN1bW1hcnkuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWJsZVN1bW1hcnkgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZVN1bW1hcnkge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfdGFibGVJbmZvOiBUYWJsZUluZm8pIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8uaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb25JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8uY29ubmVjdGlvbklkO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXN0b21TUUwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbmZvLmN1c3RvbVNRTDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRW1iZWRkaW5nRXJyb3JDb2RlcywgRXJyb3JDb2RlcywgU2hhcmVkRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogQ3VzdG9tIGVycm9yIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IEVycm9yIG9iamVjdC5cbiAqIFRoaXMgYWxsb3dzIHVzIHRvIHByb3ZpZGUgYSBmaWVsZCB3aXRoIGEgc3BlY2lmaWMgZXJyb3IgY29kZVxuICogc28gdGhhdCBkZXZlbG9wZXJzIGNhbiBtb3JlIGVhc2lseSBwcm9ncmFtbWF0aWNhbGx5IHJlc3BvbmRcbiAqIHRvIGVycm9yIHNjZW5hcmlvcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhYmxlYXVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Vycm9yQ29kZTogRXJyb3JDb2RlcyB8IEVtYmVkZGluZ0Vycm9yQ29kZXMgfCBTaGFyZWRFcnJvckNvZGVzLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgJHtfZXJyb3JDb2RlfTogJHttZXNzYWdlfWApO1xuXG4gICAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQtd2lraS9ibG9iL21hc3Rlci9CcmVha2luZy1DaGFuZ2VzLm1kI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29ya1xuICAgIC8vIEVycm9yIGluaGVyaXRhbmNlIGRvZXMgbm90IHdvcmsgcHJvcGVydGx5IHdoZW4gY29tcGlsaW5nIHRvIEVTNSwgdGhpcyBpcyBhIHdvcmthcm91bmQgdG8gZm9yY2VcbiAgICAvLyB0aGUgcHJvdG8gY2hhaW4gdG8gYmUgYnVpbHQgY29ycmVjdGx5LiAgU2VlIHRoZSBnaXRodWIgbGluayBhYm92ZSBmb3IgZGV0YWlscy5cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgVGFibGVhdUVycm9yLnByb3RvdHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVycm9yQ29kZSgpOiBFcnJvckNvZGVzIHwgRW1iZWRkaW5nRXJyb3JDb2RlcyB8IFNoYXJlZEVycm9yQ29kZXMge1xuICAgIHJldHVybiB0aGlzLl9lcnJvckNvZGU7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFWYWx1ZSB9IGZyb20gJy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcblxuLyoqXG4gKiBJbiB2ZXJzaW9uIDIgb2YgdGhlIGludGVyZmFjZSwgd2Ugc2hvdWxkIGNvbGxhcHNlIHZhbHVlIGludG8gbmF0aXZlVmFsdWUsIGFuZCBkbyBhbGwgdGhpcyB3b3JrIG92ZXJcbiAqIGluIHRoZSBwbGF0Zm9ybS5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFWYWx1ZUZhY3Rvcnkge1xuICBwdWJsaWMgc3RhdGljIE1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWU6IEludGVybmFsQ29udHJhY3QuRGF0YVZhbHVlLCBkYXRhVHlwZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZSk6IERhdGFWYWx1ZSB7XG4gICAgLy8gUGFyYW1ldGVyIHZhbHVlcyBhcmUgYWxsIHN0cmluZ3MsIGNvbnZlcnQgZnJvbSBzdHJpbmcgdG8gdmFsdWVcbiAgICByZXR1cm4gbmV3IERhdGFWYWx1ZShcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLnZhbHVlLFxuICAgICAgSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZUNvbnZlcnRlci5jb252ZXJ0U3RyaW5nVmFsdWVUb05hdGl2ZVZhbHVlKGludGVybmFsRGF0YVZhbHVlLnZhbHVlLCBkYXRhVHlwZSksXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS5mb3JtYXR0ZWRWYWx1ZSxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLmFsaWFzZWRWYWx1ZSxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLmhhc0FsaWFzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIE1ha2VGaWx0ZXJEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWU6IEludGVybmFsQ29udHJhY3QuRGF0YVZhbHVlKTogRGF0YVZhbHVlIHtcbiAgICAvLyBGaWx0ZXJzIGFscmVhZHkgaGF2ZSBuYXRpdmUgdHlwZSBpbiB2YWx1ZSwganVzdCB1c2UgdGhhdCBmb3IgbmF0aXZlVmFsdWUgYWxzb1xuICAgIHJldHVybiBuZXcgRGF0YVZhbHVlKGludGVybmFsRGF0YVZhbHVlLnZhbHVlLCBpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSwgaW50ZXJuYWxEYXRhVmFsdWUuZm9ybWF0dGVkVmFsdWUpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBNYWtlVGFibGVEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWU6IEludGVybmFsQ29udHJhY3QuRGF0YVZhbHVlLCBkYXRhVHlwZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZSk6IERhdGFWYWx1ZSB7XG4gICAgLy8gRGF0YVRhYmxlcyBjb250YWluIGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBkYXRlIGFzIHN0cmluZyB8ICclbnVsbCVcbiAgICAvLyBjb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlIGNvbnZlcnRzIGRhdGVzIGFzIHN0cmluZyB0byBkYXRlcywgYW5kIGFueSBzcGVjaWFsIHRvIG51bGxcbiAgICAvLyAoYm9vbGVhbiwgbnVtYmVycywgc3RyaW5ncyBhcmUgcGFzc2VkIHRocm91Z2gpXG4gICAgLy8gQmVjYXVzZSBvZiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiAtIHdlIGNhbiBoYXZlIHVuZGVmaW5lZCB2YWx1ZXMsIHdoaWNoIGFyZSBkaWZmZXJlbnQgdGhhbiBhbnkgc3BlY2lhbFxuICAgIHJldHVybiBuZXcgRGF0YVZhbHVlKFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZUNvbnZlcnRlci5jb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlKGludGVybmFsRGF0YVZhbHVlLnZhbHVlLCBkYXRhVHlwZSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS5mb3JtYXR0ZWRWYWx1ZSxcbiAgICApO1xuICB9XG59XG4iLCIvKipcbiAqIEEgUHJvbWlzZSB3cmFwcGVyIGNsYXNzIGFsbG93aW5nIGZvciByZXNvbHZpbmcvcmVqZWN0aW5nIHRoZSBQcm9taXNlIG91dHNpZGUgdGhlIGNvbnRleHQgb2YgaXRzIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBEZWZlcnJlZFxuICogQHRlbXBsYXRlIFRSZXNvbHZlIFRoZSB0eXBlIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZS5cbiAqIEB0ZW1wbGF0ZSBUUmVqZWN0IFRoZSB0eXBlIHVzZWQgdG8gcmVqZWN0IHRoZSBwcm9taXNlLiBEZWZhdWx0cyB0byBhbnkuXG4gKiBAbGluayBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzQ2Mzc0MzZcbiAqL1xuZXhwb3J0IGNsYXNzIERlZmVycmVkPFRSZXNvbHZlLCBUUmVqZWN0ID0gYW55PiB7XG4gIHByaXZhdGUgX3Byb21pc2U6IFByb21pc2U8VFJlc29sdmU+O1xuICBwcml2YXRlIF9yZXNvbHZlOiAocmVzcG9uc2U6IFRSZXNvbHZlIHwgUHJvbWlzZUxpa2U8VFJlc29sdmU+KSA9PiB2b2lkO1xuICBwcml2YXRlIF9yZWplY3Q6IChyZWFzb24/OiBUUmVqZWN0KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIERlZmVycmVkLlxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fcHJvbWlzZSA9IG5ldyBQcm9taXNlPFRSZXNvbHZlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLl9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIHRoaXMuX3JlamVjdCA9IHJlamVjdDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBQcm9taXNlLlxuICAgKlxuICAgKiBAcmVhZG9ubHlcbiAgICogQHR5cGUge1Byb21pc2U8VFJlc29sdmU+fVxuICAgKi9cbiAgZ2V0IHByb21pc2UoKTogUHJvbWlzZTxUUmVzb2x2ZT4ge1xuICAgIHJldHVybiB0aGlzLl9wcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSB3cmFwcGVkIFByb21pc2UuXG4gICAqXG4gICAqIEBwYXJhbSB7KFRSZXNvbHZlIHwgUHJvbWlzZUxpa2U8VFJlc29sdmU+KX0gcmVzcG9uc2UgVGhlIGFyZ3VtZW50IHRvIGJlIHJlc29sdmVkIGJ5IHRoZSBQcm9taXNlLlxuICAgKiBAcmV0dXJucyB7Kn0gIHt2b2lkfVxuICAgKi9cbiAgcmVzb2x2ZShyZXNwb25zZTogVFJlc29sdmUgfCBQcm9taXNlTGlrZTxUUmVzb2x2ZT4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3Jlc29sdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXNvbHZlKHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKlxuICAgKiBAcGFyYW0ge1RSZWplY3R9IFtyZWFzb25dIFRoZSByZWFzb24gd2h5IHRoZSBQcm9taXNlIHJlamVjdGVkLlxuICAgKiBAcmV0dXJucyB7Kn0gIHt2b2lkfVxuICAgKi9cbiAgcmVqZWN0KHJlYXNvbj86IFRSZWplY3QpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3JlamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JlamVjdChyZWFzb24pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBVbnJlZ2lzdGVyVGltZW91dEluTWlsbGlzZWNvbmRzID0gMzAwMDA7XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBjb252ZXJ0cyBmcm9tIGEgc291cmNlIGVudW0gdmFsdWUgdG8gZGVzdGluYXRpb24gZW51bVxuICogdmFsdWUgZ2l2ZW4gYSBtYXBwaW5nIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIHdoZW4gY29uc3RydWN0ZWQuXG4gKlxuICogTm90ZTogVGhpcyBleGFjdCBzYW1lIGNsYXNzIGlzIGRlZmluZWQgaW4gYXBpLWNvcmUuICBHaXZlbiBpdHMgc21hbGxcbiAqIG5hdHVyZSwgaXQgaXMgbm90IHdvcnRoIGhhdmluZyBpbiBhIHNlcGFyYXRlIHByb2plY3QgdG8gc2hhcmUgdGhpcyBiZXR3ZWVuXG4gKiBhcGktY29yZSBhbmQgYXBpLXNoYXJlZC4gIElmIG1vcmUgdXRpbGl0eSBmdW5jdGlvbmFsaXR5IGlzIGFkZGVkIHRoYXQgaXMgdXNlZCBieSBhcGktY29yZVxuICogYW5kIGFwaS1zaGFyZWQgYnV0IGhhcyBubyBvdGhlciBkZXBlbmRlY2llcywgYSB1dGlsdGl0eSBwcm9qZWN0IG1pZ2h0IGJlIG1lcml0ZWQsXG4gKiBhbmQgdGhpcyBjbGFzcyBjb3VsZCBiZSBtb3ZlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudW1Db252ZXJ0ZXI8VFNvdXJjZVR5cGUgZXh0ZW5kcyBzdHJpbmcsIFREZXN0aW5hdGlvblR5cGU+IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX21hcHBpbmdzOiB7IFtlbnVtVmFsOiBzdHJpbmddOiBURGVzdGluYXRpb25UeXBlIH0sIHByaXZhdGUgX2RlZmF1bHRWYWw/OiBURGVzdGluYXRpb25UeXBlKSB7fVxuXG4gIHB1YmxpYyBjb252ZXJ0KGVudW1WYWw6IFRTb3VyY2VUeXBlLCB0aHJvd0lmTWlzc2luZzogU2hvdWxkVGhyb3cgPSBTaG91bGRUaHJvdy5ZZXMpOiBURGVzdGluYXRpb25UeXBlIHtcbiAgICBpZiAodGhpcy5fbWFwcGluZ3MuaGFzT3duUHJvcGVydHkoZW51bVZhbCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXBwaW5nc1tlbnVtVmFsIGFzIHN0cmluZ107XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2RlZmF1bHRWYWwgIT09IHVuZGVmaW5lZCAmJiB0aHJvd0lmTWlzc2luZyAhPT0gU2hvdWxkVGhyb3cuWWVzKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbDtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYEVudW0gTWFwcGluZyBub3QgZm91bmQgZm9yOiAke2VudW1WYWx9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGVudW0gU2hvdWxkVGhyb3cge1xuICBZZXMgPSAneWVzJyxcbiAgTm8gPSAnbm8nLFxufVxuIiwiaW1wb3J0IHtcbiAgRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlLFxuICBFeHBvcnREYXRhT3B0aW9ucyxcbiAgRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIFByaW50T3JpZW50YXRpb24sXG4gIFByaW50UGFnZVNpemUsXG4gIFByaW50U2NhbGluZyxcbiAgUmFuZ2VGaWx0ZXJPcHRpb25zLFxuICBTaGFyZWRFcnJvckNvZGVzLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4uL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuL1BhcmFtJztcblxuaW50ZXJmYWNlIEVudW1MaWtlIHtcbiAgdG9TdHJpbmcoKTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjb25zdHJ1Y3QgY29tbW9uIGVycm9ycyB0aHJvdWdob3V0IHRoZSBleHRlcm5hbFxuICogcHJvamVjdHMgKGFwaS1zaGFyZWQsIGV4dGVuc2lvbnMtYXBpLCBldGMuKS4gIEl0IGhhcyBzb21lIGR1cGxpY2F0aW9uIHdpdGhcbiAqIHRoZSBFcnJvckhlbHBlcnMgY2xhc3MgaW4gYXBpLWNvcmUsIGJ1dCBpcyBzZXBhcmF0ZSBkdWUgdG8gdGhlIG5lZWQgdG8gdGhyb3dcbiAqIGFuIGV4dGVybmFsIFRhYmxlYXVFcnJvciB2cy4gYW4gSW50ZXJuYWxUYWJsZWF1RXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBFcnJvckhlbHBlcnMge1xuICAvKipcbiAgICogVGhyb3dzIHdpdGggY29kZSBJbnRlcm5hbEVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0gYXBpTmFtZSBuYW1lIG9mIGFwaSB0aGF0IHdhcyBjYWxsZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFwaU5vdEltcGxlbWVudGVkKGFwaU5hbWU6IHN0cmluZyk6IFRhYmxlYXVFcnJvciB7XG4gICAgcmV0dXJuIG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJHthcGlOYW1lfSBBUEkgbm90IHlldCBpbXBsZW1lbnRlZC5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gaW50ZXJuYWwgZXJyb3IgaWYgYXJndW1lbnQgaXMgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUludGVybmFsVmFsdWUoYXJndW1lbnRWYWx1ZTogYW55LCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmIChhcmd1bWVudFZhbHVlID09PSBudWxsIHx8IGFyZ3VtZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAke2FyZ3VtZW50VmFsdWV9IGlzIGludmFsaWQgdmFsdWUgZm9yOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgYXJndW1lbnQgaXMgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVBhcmFtZXRlcihhcmd1bWVudFZhbHVlOiBhbnksIGFyZ3VtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGFyZ3VtZW50VmFsdWUgPT09IG51bGwgfHwgYXJndW1lbnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7YXJndW1lbnRWYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgYXJndW1lbnQgaXMgbm90IHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAgICogRm9yIG9iamVjdHMsIGl0IGp1c3QgdGVzdHMgdGhhdCBpdCBpcyBhbiBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIGFyZ3VtZW50VmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBleHBlY3RlZFR5cGUgZXhwZWN0ZWQgcmVzdWx0IG9mIHR5cGVvZlxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVBhcmFtZXRlclR5cGUoYXJndW1lbnRWYWx1ZTogYW55LCBleHBlY3RlZFR5cGU6IHN0cmluZywgYXJndW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50VmFsdWUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2FyZ3VtZW50VmFsdWV9IGhhcyBpbnZhbGlkIHR5cGUgZm9yIHBhcmFtZXRlcjogJHthcmd1bWVudE5hbWV9LmApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiBhcmd1bWVudCBpcyBlbXB0eSBzdHJpbmcsIG51bGwgb3IgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0gYXJndW1lbnRWYWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGFyZ3VtZW50TmFtZSBuYW1lIG9mIGFyZ3VtZW50IHRvIHZlcmlmeVxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlTdHJpbmdQYXJhbWV0ZXIoYXJndW1lbnRWYWx1ZTogc3RyaW5nLCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmIChhcmd1bWVudFZhbHVlID09PSBudWxsIHx8IGFyZ3VtZW50VmFsdWUgPT09IHVuZGVmaW5lZCB8fCBhcmd1bWVudFZhbHVlID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2FyZ3VtZW50VmFsdWV9IGlzIGludmFsaWQgdmFsdWUgZm9yIHBhcmFtdGVyOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgcGFzc2VkIHZhbHVlIGlzIGEgdmFsaWQgdmFsdWUgZm9yIHRoYXQgZW51bS5cbiAgICpcbiAgICogU3RyaW5nIGVudW1zIGFyZSB7c3RyaW5nIDogc3RyaW5nfSBkaWN0aW9uYXJpZXMgd2hpY2ggYXJlIG5vdCByZXZlcnNlIG1hcHBhYmxlXG4gICAqIFRoaXMgaXMgYW4gdWdseSB3b3JrYXJvdW5kXG4gICAqXG4gICAqIEBwYXJhbSBlbnVtVmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBlbnVtVHlwZSBlbnVtIHRvIHZlcmlmeSBhZ2FpbnN0XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIGlzVmFsaWRFbnVtVmFsdWU8RW51bVR5cGUgZXh0ZW5kcyBFbnVtTGlrZT4oZW51bVZhbHVlOiBFbnVtVHlwZSwgZW51bVR5cGU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGxldCBpc1ZhbGlkID0gZmFsc2U7XG4gICAgT2JqZWN0LmtleXMoZW51bVR5cGUpLmZvckVhY2goKGVudW1LZXkpID0+IHtcbiAgICAgIGlmIChlbnVtVHlwZVtlbnVtS2V5XSA9PT0gZW51bVZhbHVlLnRvU3RyaW5nKCkpIHtcbiAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaXNWYWxpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBwYXNzZWQgdmFsdWUgaXMgYSB2YWxpZCB2YWx1ZSBmb3IgdGhhdCBlbnVtLlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiB0aGUgZW51bSB2YWx1ZSBpcyBub3QgdmFsaWQuXG4gICAqXG4gICAqIFN0cmluZyBlbnVtcyBhcmUge3N0cmluZyA6IHN0cmluZ30gZGljdGlvbmFyaWVzIHdoaWNoIGFyZSBub3QgcmV2ZXJzZSBtYXBwYWJsZVxuICAgKiBUaGlzIGlzIGFuIHVnbHkgd29ya2Fyb3VuZFxuICAgKlxuICAgKiBAcGFyYW0gZW51bVZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gZW51bVR5cGUgZW51bSB0byB2ZXJpZnkgYWdhaW5zdFxuICAgKiBAcGFyYW0gZW51bU5hbWUgZW51bSBuYW1lIGZvciBjbGVhciBlcnJvciBtZXNzYWdlXG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUVudW1WYWx1ZTxFbnVtVHlwZSBleHRlbmRzIEVudW1MaWtlPihlbnVtVmFsdWU6IEVudW1UeXBlLCBlbnVtVHlwZTogYW55LCBlbnVtTmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCFFcnJvckhlbHBlcnMuaXNWYWxpZEVudW1WYWx1ZShlbnVtVmFsdWUsIGVudW1UeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2VudW1WYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgZW51bTogJHtlbnVtTmFtZX0uYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHBhc3NlZCB2YWx1ZSBpcyBiZXR3ZWVuIFttaW4sIG1heCkgLi4uIG1pbiA8PSB2YWx1ZSA8IG1heFxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHZhbGlkLlxuICAgKlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBtaW4gICB2YWx1ZSBtdXN0IGJlID49IG1pblxuICAgKiBAcGFyYW0gbWF4ICAgdmFsdWUgbXVzdCBiZSA8IG1heFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlSYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcbiAgICBsZXQgaXNWYWxpZCA9IG1pbiA8PSB2YWx1ZSAmJiB2YWx1ZSA8IG1heDtcblxuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke3ZhbHVlfSBpcyBpbnZhbGlkIHZhbHVlIGZvciByYW5nZTogWyR7bWlufS4uJHttYXh9KWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgcGFyYW1zIG1pbiBhbmQgbWF4IGZvciBhcHBseWluZyByYW5nZSBmaWx0ZXIuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFBhcmFtZXRlciBpZiByYW5nZSBpcyBpbnZhbGlkLlxuICAgKlxuICAgKiBAcGFyYW0gbWluIHJhbmdlIG1pblxuICAgKiBAcGFyYW0gbWF4IHJhbmdlIG1heFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlSYW5nZVBhcmFtVHlwZShtaW46IFJhbmdlRmlsdGVyT3B0aW9uc1snbWluJ10sIG1heDogUmFuZ2VGaWx0ZXJPcHRpb25zWydtYXgnXSk6IHZvaWQge1xuICAgIGNvbnN0IGlzTWluRGVmaW5lZCA9IG1pbiAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGlzTWF4RGVmaW5lZCA9IG1heCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFpc01pbkRlZmluZWQgJiYgIWlzTWF4RGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIGF0IGxlYXN0IG9uZSBvZiBtaW4gb3IgbWF4IGlzIHJlcXVpcmVkLicpO1xuICAgIH1cblxuICAgIGlmIChpc01pbkRlZmluZWQgJiYgIVBhcmFtLmlzVHlwZU51bWJlcihtaW4pICYmICFQYXJhbS5pc1R5cGVEYXRlKG1pbikpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgJ1VuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgb25seSBEYXRlIGFuZCBudW1iZXIgYXJlIGFsbG93ZWQgZm9yIHBhcmFtZXRlciBtaW4uJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzTWF4RGVmaW5lZCAmJiAhUGFyYW0uaXNUeXBlTnVtYmVyKG1heCkgJiYgIVBhcmFtLmlzVHlwZURhdGUobWF4KSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAnVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBvbmx5IERhdGUgYW5kIG51bWJlciBhcmUgYWxsb3dlZCBmb3IgcGFyYW1ldGVyIG1heC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNNaW5EZWZpbmVkICYmIGlzTWF4RGVmaW5lZCAmJiB0eXBlb2YgbWluICE9PSB0eXBlb2YgbWF4KSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIHBhcmFtZXRlcnMgbWluIGFuZCBtYXggc2hvdWxkIGJlIG9mIHRoZSBzYW1lIHR5cGUuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHpvbmVJZCBpcyBwcmVzZW50IGluIHRoZSBjdXJyZW50IGRhc2hib2FyZC5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIGVpdGhlciBjb25kaXRpb24gaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBkYXNoYm9hcmRab25lTWFwIEEgbWFwIG9mIHpvbmVJZCdzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBwYXJhbSB6b25lSUQgWm9uZUlkIHRvIGJlIHZhbGlkYXRlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlab25lSXNWYWxpZChkYXNoYm9hcmRab25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPiwgem9uZUlEOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoZGFzaGJvYXJkWm9uZU1hcC5oYXMoem9uZUlEKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICBgVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBEYXNoYm9hcmQgT2JqZWN0IElkOiAke3pvbmVJRH0gaXMgbm90IHByZXNlbnQgaW4gZGFzaGJvYXJkLmAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHRoZSB6b25lIGlzIHByZXNlbnQgYW5kIGZsb2F0aW5nIGluIHRoZSBjdXJyZW50IGRhc2hib2FyZC5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIGVpdGhlciBjb25kaXRpb24gaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBkYXNoYm9hcmRab25lTWFwIEEgbWFwIG9mIHpvbmVJZCdzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBwYXJhbSB6b25lSUQgWm9uZUlkIHRvIGJlIHZhbGlkYXRlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlab25lSXNWYWxpZEFuZEZsb2F0aW5nKGRhc2hib2FyZFpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+LCB6b25lSUQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChkYXNoYm9hcmRab25lTWFwLmhhcyh6b25lSUQpICYmIGRhc2hib2FyZFpvbmVNYXAuZ2V0KHpvbmVJRCkhLmlzRmxvYXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgYFVuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgRGFzaGJvYXJkIE9iamVjdCBJZDogJHt6b25lSUR9IGlzIG5vdCBwcmVzZW50IG9yIGlzIGEgZml4ZWQgem9uZSBpbiB0aGUgZGFzaGJvYXJkLmAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHdpZHRoIGFuZCBoZWlnaHQgYXJlID4gMCBmb3IgZWFjaCBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgb2JqZWN0LlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgZWl0aGVyIGNvbmRpdGlvbiBpcyBmYWxzZS5cbiAgICpcbiAgICogQHBhcmFtIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgb2JqZWN0IGZvciB3aGljaCB3aWR0aCBhbmQgaGVpZ2h0IHdpbGwgYmUgdmFsaWRhdGVkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVdpZHRoQW5kSGVpZ2h0T2ZEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUoXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlOiBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUsXG4gICk6IHZvaWQge1xuICAgIGlmIChkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUud2lkdGggPCAwIHx8IGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZS5oZWlnaHQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgIGBVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUgZm9yIGRhc2hib2FyZCBvYmplY3QgSUQgJHtkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUuZGFzaGJvYXJkT2JqZWN0SUR9OmAgK1xuICAgICAgICAgIGAgbmVnYXRpdmUgd2lkdGhzIGFuZCBoZWlnaHRzIGFyZSBub3QgYWxsb3dlZC5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgaXMgdGhlIGdpdmVuIHNoZWV0IG5hbWUgaXMgaW4gdGhlIGxpc3Qgb2Ygc2hlZXRzIG5hbWVzIGFsbG93ZWQgZm9yIGV4cG9ydGluZy5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIHRoZSBjb25kaXRpb24gYWJvdmUgaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBleHBvcnRhYmxlU2hlZXROYW1lcyBBIGxpc3Qgb2Ygc2hlZXQgbmFtZXMgYWxsb3dlZCBmb3IgZXhwb3J0aW5nXG4gICAqIEBwYXJhbSBzaGVldE5hbWUgdGhlIG5hbWUgb2YgdGhlIHNoZWV0IHNlbGVjdGVkIGZvciBleHBvcnRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5U2hlZXROYW1lKGV4cG9ydGFibGVTaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LCBzaGVldE5hbWU6IHN0cmluZykge1xuICAgIGlmICghZXhwb3J0YWJsZVNoZWV0TmFtZXMuaW5jbHVkZXMoc2hlZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uU2hlZXQsXG4gICAgICAgICdzaGVldE5hbWUgcGFyYW1ldGVyIG11c3QgYmVsb25nIHRvIGEgd29ya3NoZWV0IHdpdGhpbiB0aGUgY3VycmVudCB2aWV3JyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBFeHBvcnREYXRhT3B0aW9ucyBvYmplY3RcbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IG9mIEV4cG9ydERhdGFPcHRpb25zIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBFeHBvcnREYXRhT3B0aW9ucyBvYmplY3QgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBDU1YgZmlsZSBmb3IgZXhwb3J0RGF0YUFzeW5jLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlFeHBvcnREYXRhT3B0aW9ucyhvcHRpb25zOiBFeHBvcnREYXRhT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICghUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQob3B0aW9ucy5pZ25vcmVBbGlhc2VzKSAmJiAhUGFyYW0uaXNUeXBlQm9vbChvcHRpb25zLmlnbm9yZUFsaWFzZXMpKSB8fFxuICAgICAgKCFQYXJhbS5pc051bGxPclVuZGVmaW5lZChvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkKSAmJiAhQXJyYXkuaXNBcnJheShvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkKSlcbiAgICApXG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ29wdGlvbnMgcGFyYW1hdGVyIG11c3QgYmUgb2YgdHlwZSBFeHBvcnREYXRhT3B0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGlmIHRoZSBzaGVldCBuYW1lcyBhcmUgaW5jbHVkZWQgaW4gYW55IG9mIHRoZSBleHBvcnQgc2NlbmFyaW9zLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgYW4gYXJyYXkuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFNlbGVjdGlvblNoZWV0IGlmIHRoZXJlIGFyZSBhcnJheSBlbnRyaWVzIHRoYXQgZG9udCBleGlzdCBvciBpZiB0aGVyZSBpcyBtaXhpbmcgYmV0d2VlbiBzaGVldHMgZnJvbSB0aGUgZGFzaGJvYXJkIGFuZCBzaGVldCBmcm9tIHRoZSB3b3JrYm9vay5cbiAgICpcbiAgICogQHBhcmFtIHNoZWV0TmFtZXMgTGlzdCBvZiBzaGVldCBuYW1lcyBzZWxlY3RlZCBmb3IgZXhwb3J0aW5nLlxuICAgKiBAcGFyYW0gZXhwb3J0U2NlbmFyaW9zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IHNoZWV0IG5hbWUsIGV4cG9ydGFibGUgc2hlZXRzIGZyb20gdGhlIGRhc2hib2FyZCwgYW5kIGV4cG9ydGFibGUgc2hlZXRzIGZyb20gdGhlIHdvcmtib29rLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlTaGVldE5hbWVzRm9yUERGQW5kUFBUKHNoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sIGV4cG9ydFNjZW5hcmlvczogRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCk6IHZvaWQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzaGVldE5hbWVzKSkgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdzaGVldE5hbWVzIHBhcmFtZXRlciBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgaWYgKHNoZWV0TmFtZXMubGVuZ3RoID09PSAwKSB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3NoZWV0TmFtZXMgc2hvdWxkIG5vdCBiZSBlbXB0eScpO1xuXG4gICAgY29uc3QgaXNJbmNsdWRlZEluRGFzaGJvYXJkID0gc2hlZXROYW1lcy5ldmVyeSgoc2hlZXROYW1lOiBzdHJpbmcpID0+XG4gICAgICBleHBvcnRTY2VuYXJpb3MuZXhwb3J0YWJsZVNoZWV0TmFtZXNGcm9tRGFzaGJvYXJkLmluY2x1ZGVzKHNoZWV0TmFtZSksXG4gICAgKTtcbiAgICBpZiAoaXNJbmNsdWRlZEluRGFzaGJvYXJkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlzSW5jbHVkZWRJbldvcmtib29rID0gc2hlZXROYW1lcy5ldmVyeSgoc2hlZXROYW1lOiBzdHJpbmcpID0+XG4gICAgICBleHBvcnRTY2VuYXJpb3MuZXhwb3J0YWJsZVNoZWV0TmFtZXNGcm9tV29ya2Jvb2suaW5jbHVkZXMoc2hlZXROYW1lKSxcbiAgICApO1xuICAgIGlmIChpc0luY2x1ZGVkSW5Xb3JrYm9vaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpc0N1cnJlbnRTaGVldCA9IHNoZWV0TmFtZXMubGVuZ3RoID09PSAxICYmIHNoZWV0TmFtZXNbMF0gPT09IGV4cG9ydFNjZW5hcmlvcy5jdXJyZW50U2hlZXROYW1lO1xuICAgIGlmIChpc0N1cnJlbnRTaGVldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEV4cG9ydCByZXF1aXJlbWVudDogYWxsIHNoZWV0IG5hbWVzIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3Qgb2YgZXhwb3J0YWJsZSBzaGVldHMgaW4gdGhlIGRhc2hib2FyZCBvclxuICAgIC8vIGFsbCBzaGVldCBuYW1lcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mIGV4cG9ydGFibGUgc2hlZXRzIGluIHRoZSB3b3JrYm9vaywgb3IgdGhlIHNoZWV0IG5hbWUgaXMgdGhlIGN1cnJlbnQgc2hlZXRcbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uU2hlZXQsXG4gICAgICAnc2hlZXROYW1lcyBwYXJhbWV0ZXIgbXVzdCBoYXZlIGFsbCBpdHMgZW50cmllcyBiZSBleHBvcnRhYmxlIHNoZWV0IG5hbWVzIGZyb20gdGhlIGRhc2hib2FyZCBvciBhbGwgaXRzIGVudHJpZXMgYmUgZXhwb3J0YWJsZSBzaGVldCBuYW1lcyBmcm9tIHRoZSB3b3JrYm9vaycsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBvYmplY3QncyBwcm9wZXJ0aWVzLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgb2YgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgZXh0ZXJuYWwgdXNlci1mYWNpbmcgRXhwb3J0UERGT3B0aW9ucyBvYmplY3QgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBQREYgZmlsZSBmb3IgZXhwb3J0UERGQXN5bmMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUV4cG9ydFBERk9wdGlvbnMob3B0aW9uczogRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudmVyaWZ5RW51bVZhbHVlPFByaW50T3JpZW50YXRpb24+KG9wdGlvbnMub3JpZW50YXRpb24sIFByaW50T3JpZW50YXRpb24sICdQcmludE9yaWVudGF0aW9uJyk7XG4gICAgICB0aGlzLnZlcmlmeUVudW1WYWx1ZTxQcmludFBhZ2VTaXplPihvcHRpb25zLnBhZ2VTaXplLCBQcmludFBhZ2VTaXplLCAnUHJpbnRQYWdlU2l6ZScpO1xuICAgICAgdGhpcy52ZXJpZnlFbnVtVmFsdWU8UHJpbnRTY2FsaW5nPihvcHRpb25zLnNjYWxpbmcsIFByaW50U2NhbGluZywgJ1ByaW50U2NhbGluZycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdvcHRpb25zIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgRXhwb3J0UERGT3B0aW9ucycpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgRXhwb3J0TGF5b3V0T3B0aW9ucyxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIEZpdFBhZ2VzLFxuICBQYWdlT3JpZW50YXRpb24sXG4gIFBhZ2VTY2FsaW5nT3B0aW9uLFxuICBQYWdlU2l6ZU9wdGlvbixcbiAgU2NhbGVNb2RlLFxuICBTY2FsaW5nU2VsZWN0aW9uLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRXhwb3J0RGF0YU9wdGlvbnMsXG4gIEV4cG9ydFBERk9wdGlvbnMgYXMgRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zLFxuICBQcmludE9yaWVudGF0aW9uLFxuICBQcmludFBhZ2VTaXplLFxuICBQcmludFNjYWxpbmcsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIEhlbHBlciBtZXRob2RzIGZvciBFeHBvcnQgQVBJcy5cbiAqXG4gKiBAY2xhc3MgRXhwb3J0SGVscGVyc1xuICovXG5leHBvcnQgY2xhc3MgRXhwb3J0SGVscGVycyB7XG4gIHB1YmxpYyBzdGF0aWMgRGVmYXVsdERhdGFPcHRpb25zOiBFeHBvcnREYXRhT3B0aW9ucyA9IHtcbiAgICBpZ25vcmVBbGlhc2VzOiBmYWxzZSxcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogW10sXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBEZWZhdWx0UERGT3B0aW9uczogRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zID0ge1xuICAgIHNjYWxpbmc6IFByaW50U2NhbGluZy5BdXRvbWF0aWMsXG4gICAgcGFnZVNpemU6IFByaW50UGFnZVNpemUuTGV0dGVyLFxuICAgIG9yaWVudGF0aW9uOiBQcmludE9yaWVudGF0aW9uLlBvcnRyYWl0LFxuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIERlZmF1bHRMYXlvdXRPcHRpb25zOiBFeHBvcnRMYXlvdXRPcHRpb25zID0ge1xuICAgIGltYWdlSGVpZ2h0OiAwLFxuICAgIGltYWdlV2lkdGg6IDAsXG4gICAgcGFnZUZpdEhvcml6b250YWw6IDEsXG4gICAgcGFnZUZpdFZlcnRpY2FsOiAxLFxuICAgIHBhZ2VPcmllbnRhdGlvbk9wdGlvbjogUGFnZU9yaWVudGF0aW9uLlBvcnRyYWl0LFxuICAgIHBhZ2VTY2FsZU1vZGU6IFNjYWxlTW9kZS5TY2FsZUF1dG8sXG4gICAgcGFnZVNjYWxlUGVyY2VudDogMTAwLFxuICAgIHBhZ2VTaXplT3B0aW9uOiBQYWdlU2l6ZU9wdGlvbi5MZXR0ZXIsXG4gIH07XG5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIHRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zJyBwcm9wZXJ0aWVzIGJhc2VkIG9uIHRoZSBnaXZlbiBQREYgZXhwb3J0IGNvbmZpZ3VyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgY29uc3RydWN0IHRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zIGlkZW50aWNhbGx5IHRvIGhvdyB0aGUgJ0V4cG9ydCBQREYnIGRpYWxvZyBjb25zdHJ1Y3RzIHRoZSBFeHBvcnRQZGZPcHRpb25zUHJlc01vZGVsLlxuICAgKiBTZWUgdGhlIGhhbmRsZUV4cG9ydENsaWNrIG1ldGhvZCBpbiBAYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1wZGYtb3B0aW9ucy1kaWFsb2cgZm9yIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGludGVybmFsRXhwb3J0UGRmT3B0aW9ucyBUaGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsIHVzZWQgdG8gY29uZmlndXJlIHRoZSBvdXRwdXQgUERGIGZpbGUuXG4gICAqIEBwYXJhbSBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMgVGhlIGV4dGVybmFsIEV4cG9ydFBERk9wdGlvbnMgdXNlci1mYWNpbmcgb2JqZWN0IHBhc3NlZCB0byBleHBvcnRQREZBc3luYy5cbiAgICogQHBhcmFtIHNoZWV0TmFtZXMgVGhlIGxpc3Qgb2Ygc2hlZXRzIHNlbGVjdGVkIGZvciBleHBvcnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVwZGF0ZUludGVybmFsRXhwb3J0UERGT3B0aW9ucyhcbiAgICBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBzaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LFxuICApOiB2b2lkIHtcbiAgICBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMuY3VycmVudFNoZWV0ID0gc2hlZXROYW1lc1swXTtcbiAgICB0aGlzLnVwZGF0ZUV4cG9ydExheW91dE9wdGlvbnMoaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zLCBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMpO1xuICAgIHRoaXMudXBkYXRlU2hlZXRPcHRpb25zKGludGVybmFsRXhwb3J0UGRmT3B0aW9ucywgc2hlZXROYW1lcyk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCBmb3IgdXBkYXRlSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zLlxuICAgKiBNb2RpZmllcyB0aGUgZXhwb3J0TGF5b3V0T3B0aW9ucyBwcm9wZXJ0eSBvZiB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBiYXNlZCBvbiB0aGUgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucy5cbiAgICogU2VlIHRoZSBnZXRFeHBvcnRMYXlvdXRPcHRpb25zIG1ldGhvZCBpbiBAYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1wZGYtb3B0aW9ucy1kaWFsb2cgZm9yIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGludGVybmFsRXhwb3J0UGRmT3B0aW9ucyBUaGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsIHVzZWQgdG8gY29uZmlndXJlIHRoZSBvdXRwdXQgUERGIGZpbGUuXG4gICAqIEBwYXJhbSBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMgVGhlIGV4dGVybmFsIEV4cG9ydFBERk9wdGlvbnMgdXNlci1mYWNpbmcgb2JqZWN0IHBhc3NlZCB0byBleHBvcnRQREZBc3luYy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdXBkYXRlRXhwb3J0TGF5b3V0T3B0aW9ucyhcbiAgICBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZXhwb3J0TGF5b3V0T3B0aW9ucyA9IGludGVybmFsRXhwb3J0UGRmT3B0aW9ucy5leHBvcnRMYXlvdXRPcHRpb25zO1xuXG4gICAgLy8gc2V0dGluZyB0aGUgaW1hZ2UgaGVpZ2h0IGFuZCB3aWR0aCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzXG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5pbWFnZUhlaWdodCA9IHRoaXMuRGVmYXVsdExheW91dE9wdGlvbnMuaW1hZ2VIZWlnaHQ7XG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5pbWFnZVdpZHRoID0gdGhpcy5EZWZhdWx0TGF5b3V0T3B0aW9ucy5pbWFnZVdpZHRoO1xuXG4gICAgLy8gIHNldHRpbmcgdGhlIG9yaWVudGF0aW9uIHZhbHVlIGZvciB0aGUgZXhwb3J0TGF5b3V0T3B0aW9uc1xuICAgIHN3aXRjaCAoZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zLm9yaWVudGF0aW9uKSB7XG4gICAgICBjYXNlIFByaW50T3JpZW50YXRpb24uTGFuZHNjYXBlOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VPcmllbnRhdGlvbk9wdGlvbiA9IFBhZ2VPcmllbnRhdGlvbi5MYW5kc2NhcGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludE9yaWVudGF0aW9uLlBvcnRyYWl0OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VPcmllbnRhdGlvbk9wdGlvbiA9IFBhZ2VPcmllbnRhdGlvbi5Qb3J0cmFpdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2ludmFsaWQgb3JpZW50YXRpb24gZm9yIEV4cG9ydFBERk9wdGlvbicpO1xuICAgIH1cblxuICAgIC8vIHNldHRpbmcgdGhlIHBhZ2Ugc2l6ZSB2YWx1ZSBmb3IgdGhlIGV4cG9ydExheW91dE9wdGlvbnNcbiAgICBzd2l0Y2ggKGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucy5wYWdlU2l6ZSkge1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkEzOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQTM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkE0OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQTQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkE1OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQTU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkI0OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQjQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkI1OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQjU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkV4ZWN1dGl2ZTpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkV4ZWN1dGl2ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuRm9saW86XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5Gb2xpbztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuTGVkZ2VyOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uTGVkZ2VyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5MZWdhbDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkxlZ2FsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5MZXR0ZXI6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5MZXR0ZXI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLk5vdGU6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5Ob3RlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5RdWFydG86XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5RdWFydG87XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLlN0YXRlbWVudDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLlN0YXRlbWVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuVGFibG9pZDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLlRhYmxvaWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLlVuc3BlY2lmaWVkOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uVW5zcGVjaWZpZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdpbnZhbGlkIHBhZ2VTaXplIGZvciBFeHBvcnRQREZPcHRpb24nKTtcbiAgICB9XG5cbiAgICAvLyBzZXR0aW5nIHRoZSBzY2FsaW5nIHZhbHVlcyBmb3IgdGhlIGV4cG9ydExheW91dE9wdGlvbnNcbiAgICBzd2l0Y2ggKGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucy5zY2FsaW5nKSB7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5BdE1vc3QxUGFnZUhpZ2g6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgRml0UGFnZXMuRml0T25lSGlnaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuQXRNb3N0MVBhZ2VXaWRlOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIEZpdFBhZ2VzLkZpdE9uZVdpZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLkF0TW9zdDJQYWdlc0hpZ2g6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgRml0UGFnZXMuRml0VHdvSGlnaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuQXRNb3N0MlBhZ2VzV2lkZTpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBGaXRQYWdlcy5GaXRUd29XaWRlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5BdXRvbWF0aWM6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3RBdXRvKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjMTAwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0MTAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjMjAwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0MjAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjMjU6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3QyNSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzQwMDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDQwMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzUwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0NTApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLlBlcmM2MDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDYwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjNzU6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3Q3NSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzgwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0ODApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLlBlcmM5MDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDkwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2ludmFsaWQgc2NhbGluZyBmb3IgRXhwb3J0UERGT3B0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgZm9yIHVwZGF0ZUludGVybmFsRXhwb3J0UERGT3B0aW9ucy5cbiAgICogTW9kaWZpZXMgdGhlIHNoZWV0T3B0aW9ucyBwcm9wZXJ0eSBvZiB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBiYXNlZCBvbiB0aGUgc2hlZXRzIHNlbGVjdGVkIGZvciBleHBvcnQuXG4gICAqIFNlZSB0aGUgaGFuZGxlRXhwb3J0Q2xpY2sgbWV0aG9kIGluIEBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBkZi1vcHRpb25zLWRpYWxvZyBmb3IgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zIFRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zIHByZXMgbW9kZWwgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBQREYgZmlsZS5cbiAgICogQHBhcmFtIHNoZWV0TmFtZXMgVGhlIGxpc3Qgb2Ygc2hlZXRzIHNlbGVjdGVkIGZvciBleHBvcnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVwZGF0ZVNoZWV0T3B0aW9ucyhpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucywgc2hlZXROYW1lczogQXJyYXk8c3RyaW5nPik6IHZvaWQge1xuICAgIGNvbnN0IHsgZXhwb3J0TGF5b3V0T3B0aW9ucywgc2hlZXRPcHRpb25zIH0gPSBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM7XG4gICAgLy8gdXBkYXRpbmcgdGhlIGV4cG9ydCBsYXlvdXRzIG9wdGlvbnMgZm9yIGVhY2ggc2hlZXQgYW5kIHNlbGVjdGluZyBzaGVldCBmb3IgZXhwb3J0IGlmIGluY2x1ZGVkIGluIGxpc3RcbiAgICBmb3IgKGNvbnN0IHNoZWV0T3B0aW9uIG9mIHNoZWV0T3B0aW9ucykge1xuICAgICAgc2hlZXRPcHRpb24uZXhwb3J0TGF5b3V0T3B0aW9ucyA9IGV4cG9ydExheW91dE9wdGlvbnM7XG4gICAgICBzaGVldE9wdGlvbi5pc1NlbGVjdGVkID0gc2hlZXROYW1lcy5pbmNsdWRlcyhzaGVldE9wdGlvbi5zaGVldCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgZm9yIHVwZGF0ZUV4cG9ydExheW91dE9wdG9ucy5cbiAgICogVGhpcyBtZXRob2QgaXMgYSBzcG9vZiBvZiB0aGUgZ2V0Rml0QW5kU2NhbGVWYWx1ZXMgbWV0aG9kIHVzZWQgaW4gQGJyb3dzZXItY2xpZW50cy9leHBvcnQtcGRmLW9wdGlvbnMgdG8gc2V0IHRoZSBleHBvcnRMYXlvdXRPcHRpb25zJyBzY2FsaW5nIHByb3BlcnRpZXMuXG4gICAqIEluIHRoZSBmdXR1cmUsIHRoaXMgZmlsZSBzaG91bGQgYmUgcmVmYWN0b3JlZCB0byBpbXBvcnQgdGhlIG1ldGhvZCBkaXJlY3RseSBmcm9tIEBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBkZi1vcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gc2NhbGluZ1NlbGVjdGlvbiBzdHJpbmcgdXNlZCBmb3Igc2V0dGluZyB0aGUgZXhwb3J0TGF5b3V0T3B0aW9ucyBiYXNlZCBvbiB0aGUgUHJpbnRTY2FsaW5nIHByb3BlcnR5IGZyb20gdGhlIEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucy5cbiAgICogQHBhcmFtIGV4cG9ydExheW91dE9wdGlvbnMgdGhlIEV4cG9ydExheW91dE9wdGlvbnMgdXNlZCBieSB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zOiBFeHBvcnRMYXlvdXRPcHRpb25zLCBzY2FsaW5nU2VsZWN0aW9uOiBTY2FsaW5nU2VsZWN0aW9uKTogdm9pZCB7XG4gICAgbGV0IHsgcGFnZUZpdEhvcml6b250YWwsIHBhZ2VGaXRWZXJ0aWNhbCwgcGFnZVNjYWxlTW9kZSwgcGFnZVNjYWxlUGVyY2VudCB9ID0gdGhpcy5EZWZhdWx0TGF5b3V0T3B0aW9ucztcblxuICAgIGNvbnN0IGZpdE1hdGNoID0gdGhpcy5maXRSZWdleC5leGVjKHNjYWxpbmdTZWxlY3Rpb24pO1xuICAgIGNvbnN0IHBlcmNlbnRNYXRjaCA9IHRoaXMucGN0UmVnZXguZXhlYyhzY2FsaW5nU2VsZWN0aW9uKTtcblxuICAgIGlmIChmaXRNYXRjaCkge1xuICAgICAgW3BhZ2VGaXRIb3Jpem9udGFsLCBwYWdlRml0VmVydGljYWxdID0gZml0TWF0Y2guc2xpY2UoMSkubWFwKCh2YWx1ZSkgPT4gTnVtYmVyKHZhbHVlKSk7XG4gICAgICBwYWdlU2NhbGVNb2RlID0gU2NhbGVNb2RlLlNjYWxlRml0UGFnZXM7XG4gICAgfSBlbHNlIGlmIChwZXJjZW50TWF0Y2gpIHtcbiAgICAgIFtwYWdlU2NhbGVQZXJjZW50XSA9IHBlcmNlbnRNYXRjaC5zbGljZSgxKS5tYXAoKHZhbHVlKSA9PiBOdW1iZXIodmFsdWUpKTtcbiAgICAgIHBhZ2VTY2FsZU1vZGUgPSBTY2FsZU1vZGUuU2NhbGVQZXJjZW50YWdlO1xuICAgIH1cblxuICAgIC8vIGdldEZpdEFuZFNjYWxlVmFsdWVzIHJldHVybnMgdGhlIHByb3BlcnRpZXMgYmVsb3csIGJ1dCBpbnN0ZWFkIHRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZW0uXG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlRml0SG9yaXpvbnRhbCA9IHBhZ2VGaXRIb3Jpem9udGFsO1xuICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZUZpdFZlcnRpY2FsID0gcGFnZUZpdFZlcnRpY2FsO1xuICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNjYWxlTW9kZSA9IHBhZ2VTY2FsZU1vZGU7XG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2NhbGVQZXJjZW50ID0gcGFnZVNjYWxlUGVyY2VudDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGZpdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnZml0KFswLTldKyl4KFswLTldKyknKTtcbiAgcHJpdmF0ZSBzdGF0aWMgcGN0UmVnZXggPSBuZXcgUmVnRXhwKCdwY3QoWzAtOV0rKScpO1xufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi9FcnJvckhlbHBlcnMnO1xuXG5leHBvcnQgY2xhc3MgUGFyYW0ge1xuICAvKipcbiAgICogc2VyaWFsaXplcyB0aGUgZGF0ZSBpbnRvIHRoZSBmb3JtYXQgdGhhdCB0aGUgc2VydmVyIGV4cGVjdHMuXG4gICAqIEBwYXJhbSBkYXRlIHRoZSBkYXRlIHRvIHNlcmlhbGl6ZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVEYXRlRm9yUGxhdGZvcm0oZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgeWVhcjogbnVtYmVyID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1vbnRoOiBudW1iZXIgPSBkYXRlLmdldFVUQ01vbnRoKCkgKyAxO1xuICAgIGNvbnN0IGRheTogbnVtYmVyID0gZGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgY29uc3QgaGg6IG51bWJlciA9IGRhdGUuZ2V0VVRDSG91cnMoKTtcbiAgICBjb25zdCBtbTogbnVtYmVyID0gZGF0ZS5nZXRVVENNaW51dGVzKCk7XG4gICAgY29uc3Qgc2VjOiBudW1iZXIgPSBkYXRlLmdldFVUQ1NlY29uZHMoKTtcbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9ICR7aGh9OiR7bW19OiR7c2VjfWA7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZUJvb2xlYW5Gb3JQbGF0Zm9ybShib29sOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYm9vbCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZU51bWJlckZvclBsYXRmb3JtKG51bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbnVtLnRvU3RyaW5nKDEwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgaW5wdXQgaXMgYSBudW1iZXJcbiAgICovXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVOdW1iZXIoaW5wdXQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInIHx8IGlucHV0IGluc3RhbmNlb2YgTnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBpbnB1dCBpcyBhIERhdGVcbiAgICovXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVEYXRlKGlucHV0OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaW5wdXQgaW5zdGFuY2VvZiBEYXRlO1xuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIGlzVHlwZVN0cmluZyhpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHwgaW5wdXQgaW5zdGFuY2VvZiBTdHJpbmc7XG4gIH1cblxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55ICovXG4gIHB1YmxpYyBzdGF0aWMgaXNUeXBlQm9vbChpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ2Jvb2xlYW4nIHx8IGlucHV0IGluc3RhbmNlb2YgQm9vbGVhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBpbnB1dCBpcyBudWxsIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIGlzTnVsbE9yVW5kZWZpbmVkKGlucHV0OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoUGFyYW0uaXNUeXBlTnVtYmVyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFBhcmFtLnNlcmlhbGl6ZU51bWJlckZvclBsYXRmb3JtKHZhbHVlIGFzIG51bWJlcik7XG4gICAgfSBlbHNlIGlmIChQYXJhbS5pc1R5cGVEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFBhcmFtLnNlcmlhbGl6ZURhdGVGb3JQbGF0Zm9ybSh2YWx1ZSBhcyBEYXRlKTtcbiAgICB9IGVsc2UgaWYgKFBhcmFtLmlzVHlwZUJvb2wodmFsdWUpKSB7XG4gICAgICByZXR1cm4gUGFyYW0uc2VyaWFsaXplQm9vbGVhbkZvclBsYXRmb3JtKHZhbHVlIGFzIGJvb2xlYW4pO1xuICAgIH0gZWxzZSBpZiAoUGFyYW0uaXNUeXBlU3RyaW5nKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFVuZXhwZWN0ZWQgaW52YWxpZCB2YWx1ZSBmb3I6ICR7dmFsdWV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHBhcmFtZXRlciBpcyBhbHJlYWR5IGEgTWFwLCBvciBjb252ZXJ0cyBhbiBvYmplY3QgdG8gYSBNYXAuXG4gICAqIElmIHRoZSBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0LCB3ZSBjb252ZXJ0IGl0IHRvIGEgTWFwIHVzaW5nIE9iamVjdC5lbnRyaWVzLlxuICAgKiBAdGhyb3dzIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdCBvciBNYXBcbiAgICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0UGFyYW1ldGVyVG9NYXAocGFyYW06IG9iamVjdCwgcGFyYW1OYW1lOiBzdHJpbmcpOiBNYXA8YW55LCBhbnk+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyVHlwZShwYXJhbSwgJ29iamVjdCcsIHBhcmFtTmFtZSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW0pKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYEV4cGVjdGluZyBvYmplY3Qgb3IgTWFwIGZvcjogJHtwYXJhbU5hbWV9LmApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbSBpbnN0YW5jZW9mIE1hcCA/IHBhcmFtIDogbmV3IE1hcChPYmplY3QuZW50cmllcyhwYXJhbSkpO1xuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIHRyeVBhcnNlTnVtYmVyKHZhbHVlOiBhbnkpOiB7IHBhcnNlZD86IG51bWJlcjsgc3VjY2VzczogYm9vbGVhbiB9IHtcbiAgICBpZiAoUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmIChQYXJhbS5pc1R5cGVOdW1iZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBwYXJzZWQ6IHZhbHVlIGFzIG51bWJlciwgc3VjY2VzczogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlU3RyaW5nID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICBpZiAodmFsdWVTdHJpbmcgPT09ICdOYU4nKSB7XG4gICAgICAvLyAnTmFOJyBwYXJzZXMgYXMgTmFOIHdoaWNoIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYSBmYWlsZWQgcGFyc2UuXG4gICAgICByZXR1cm4geyBwYXJzZWQ6IE5hTiwgc3VjY2VzczogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmxvYXQodmFsdWVTdHJpbmcpO1xuICAgIGlmIChpc05hTihwYXJzZWQpKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHBhcnNlZCwgc3VjY2VzczogdHJ1ZSB9O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2hlZXRJbmZvLCBTaGVldFR5cGUsIFNpemVDb25zdHJhaW50IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5cbmV4cG9ydCBjbGFzcyBTaGVldFV0aWxzIHtcbiAgLy8gVGhpcyBpcyBhIGRpcmVjdCBwb3J0IGZyb20gU2hlZXRTaXplLmNzIC0gU2hlZXRTaXplRmFjdG9yeVxuICBwdWJsaWMgc3RhdGljIGdldFNoZWV0U2l6ZUZyb21TaXplQ29uc3RyYWludHMoc2l6ZUNvbnN0cmFpbnQ6IFNpemVDb25zdHJhaW50KTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBjb25zdCB7IG1pbldpZHRoLCBtaW5IZWlnaHQsIG1heFdpZHRoLCBtYXhIZWlnaHQgfSA9IHNpemVDb25zdHJhaW50O1xuXG4gICAgaWYgKG1pbkhlaWdodCA9PT0gMCAmJiBtaW5XaWR0aCA9PT0gMCkge1xuICAgICAgaWYgKG1heEhlaWdodCA9PT0gMCAmJiBtYXhXaWR0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGJlaGF2aW9yOiBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWMsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJlaGF2aW9yOiBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdE1vc3QsXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG1heFdpZHRoLCBoZWlnaHQ6IG1heEhlaWdodCB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAobWF4SGVpZ2h0ID09PSAwICYmIG1heFdpZHRoID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuQXRMZWFzdCxcbiAgICAgICAgbWluU2l6ZTogeyB3aWR0aDogbWluV2lkdGgsIGhlaWdodDogbWluSGVpZ2h0IH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChtYXhIZWlnaHQgPT09IG1pbkhlaWdodCAmJiBtYXhXaWR0aCA9PT0gbWluV2lkdGggJiYgbWluV2lkdGggPiAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuRXhhY3RseSxcbiAgICAgICAgbWluU2l6ZTogeyB3aWR0aDogbWluV2lkdGgsIGhlaWdodDogbWluSGVpZ2h0IH0sXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG1pbldpZHRoLCBoZWlnaHQ6IG1pbkhlaWdodCB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyAnRml0IFdpZHRoJyBmb3IgYSBEU0QgbGF5b3V0XG4gICAgY29uc3QgaXNEc2RMYXlvdXQgPSBtaW5XaWR0aCA9PT0gMCAmJiBtYXhXaWR0aCA9PT0gMDtcblxuICAgIHJldHVybiB7XG4gICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2UsXG4gICAgICBtaW5TaXplOiB7IHdpZHRoOiBtaW5XaWR0aCwgaGVpZ2h0OiBtaW5IZWlnaHQgfSxcbiAgICAgIG1heFNpemU6IHsgd2lkdGg6IGlzRHNkTGF5b3V0ID8gMjE0NzQ4MzY0NyA6IG1heFdpZHRoLCBoZWlnaHQ6IG1heEhlaWdodCB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUF1dG9tYXRpY1NpemUoKTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBsZXQgYmVoYXZpb3IgPSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWM7XG4gICAgbGV0IG1pblNpemUgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcbiAgICBsZXQgbWF4U2l6ZSA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplLCBtYXhTaXplIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFB1Ymxpc2hlZFNoZWV0SW5mb0J5TmFtZShuYW1lOiBzdHJpbmcsIHNoZWV0SW5mb3M6IEFycmF5PFNoZWV0SW5mbz4pOiBTaGVldEluZm8gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNoZWV0SW5mbyA9IHNoZWV0SW5mb3MuZmluZCgoc2hlZXQpID0+IHNoZWV0Lm5hbWUgPT09IG5hbWUpO1xuICAgIHJldHVybiBzaGVldEluZm87XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFNoZWV0VHlwZUVudW0oaW50ZXJuYWxTaGVldFR5cGU6IFNoZWV0VHlwZSk6IENvbnRyYWN0LlNoZWV0VHlwZSB7XG4gICAgbGV0IHNoZWV0VHlwZTogQ29udHJhY3QuU2hlZXRUeXBlO1xuICAgIHN3aXRjaCAoaW50ZXJuYWxTaGVldFR5cGUpIHtcbiAgICAgIGNhc2UgU2hlZXRUeXBlLldvcmtzaGVldDoge1xuICAgICAgICBzaGVldFR5cGUgPSBDb250cmFjdC5TaGVldFR5cGUuV29ya3NoZWV0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgU2hlZXRUeXBlLkRhc2hib2FyZDoge1xuICAgICAgICBzaGVldFR5cGUgPSBDb250cmFjdC5TaGVldFR5cGUuRGFzaGJvYXJkO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgU2hlZXRUeXBlLlN0b3J5OiB7XG4gICAgICAgIHNoZWV0VHlwZSA9IENvbnRyYWN0LlNoZWV0VHlwZS5TdG9yeTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5TZXJ2ZXJFcnJvciwgJ0ludmFsaWQgU2hlZXRUeXBlJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaGVldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzVmFsaWRTaGVldFNpemUoc2l6ZU9iamVjdDogQ29udHJhY3QuU2l6ZSB8IENvbnRyYWN0LlNoZWV0U2l6ZSk6IHNpemVPYmplY3QgaXMgQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICByZXR1cm4gKDxDb250cmFjdC5TaGVldFNpemU+c2l6ZU9iamVjdCkuYmVoYXZpb3IgIT09IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBEZWZlcnJlZCwgVW5yZWdpc3RlclRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9IGZyb20gJy4vRGVmZXJyZWQnO1xuXG4vKipcbiAqIEEgRGVmZXJyZWQgd3JhcHBlciBjbGFzcyBhZGRpbmcgZnVuY3Rpb25hbGl0eSB0byByZWplY3QgdW5yZXNwb25zaXZlIHByb21pc2VzIGFmdGVyIHRpbWVvdXRcbiAqXG4gKiB0aGlzIGNsYXNzIGhhbmRsZXMgdHdvIHRoaW5nczpcblxuICogICAgMS4gQWRkcyB0aW1lb3V0IGxvZ2ljIGZvciBkZWZlcnJlZFxuICogICAgMi4gSXQgYmxvY2tzIG11bHRpcGxlIGNhbGxzIGZyb20gZXhlY3V0aW5nIGF0IHRoZSBzYW1lIHRpbWUuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFNob3J0TGl2ZWREZWZlcnJlZFxuICogQHRlbXBsYXRlIFRSZXNvbHZlIFRoZSB0eXBlIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZS5cbiAqIEB0ZW1wbGF0ZSBUUmVqZWN0IFRoZSB0eXBlIHVzZWQgdG8gcmVqZWN0IHRoZSBwcm9taXNlLiBEZWZhdWx0cyB0byBhbnkuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgU2hvcnRMaXZlZERlZmVycmVkPFRSZXNvbHZlLCBUUmVqZWN0ID0gYW55PiB7XG4gIHByaXZhdGUgX2RlZmVycmVkOiBEZWZlcnJlZDxUUmVzb2x2ZSwgVFJlamVjdD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3RpbWVvdXRJZDtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfdGltZW91dEluTWlsbGlzZWNvbmRzID0gVW5yZWdpc3RlclRpbWVvdXRJbk1pbGxpc2Vjb25kcykge31cblxuICBwdWJsaWMgZ2V0TmV3UHJvbWlzZU9yVGhyb3dJZkJ1c3koKTogUHJvbWlzZTxUUmVzb2x2ZT4ge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkFwaUV4ZWN1dGlvbkVycm9yLCAnVGhpcyBhcGkgY2Fubm90IGJlIGV4ZWN1dGVkIHRpbGwgcHJldmlvdXMgY2FsbCBpcyByZXNvbHZlZC4nKTtcbiAgICB9XG4gICAgdGhpcy5fZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTtcblxuICAgIHRoaXMuX3RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLlRpbWVvdXQsXG4gICAgICAgIGBBcGkgZmFpbGVkIHRvIGNvbXBsZXRlIGluICR7dGhpcy5fdGltZW91dEluTWlsbGlzZWNvbmRzIC8gMTAwMH0gc2Vjb25kc2AsXG4gICAgICApO1xuICAgICAgdGhpcy5yZWplY3QoZXJyb3IpO1xuICAgIH0sIHRoaXMuX3RpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG5cbiAgICByZXR1cm4gdGhpcy5fZGVmZXJyZWQucHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlKHJlc3BvbnNlOiBUUmVzb2x2ZSB8IFByb21pc2VMaWtlPFRSZXNvbHZlPik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZCk7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgIHRoaXMuX2RlZmVycmVkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWplY3QoZXJyb3I6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZCk7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xuICAgICAgdGhpcy5fZGVmZXJyZWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXJDb250cmFjdCB9IGZyb20gJy4vVmVyc2lvbk51bWJlckNvbnRyYWN0JztcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGV4dGVuc2lvbnMsIGVtYmVkZGluZ1xuICogYW5kIGV4dGVuc2lvbnMtYXBpLXR5cGVzIGxpYnJhcnlcbiAqL1xuZXhwb3J0IGNsYXNzIFZlcnNpb25OdW1iZXIgaW1wbGVtZW50cyBWZXJzaW9uTnVtYmVyQ29udHJhY3Qge1xuICBwdWJsaWMgbWFqb3I6IG51bWJlcjtcbiAgcHVibGljIG1pbm9yOiBudW1iZXI7XG4gIHB1YmxpYyBmaXg6IG51bWJlcjtcbiAgcHVibGljIGJ1aWxkOiBudW1iZXI7XG4gIHB1YmxpYyBpc0FscGhhOiBib29sZWFuO1xuXG4gIC8vIHByaXZhdGUgY29uc3RydWN0b3Igc28gZXZlcnlvbmUgdXNlcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gIC8vIGJ1aWxkIG51bWJlcnMgaGF2ZSB0aGlzIGZvcm06IE0ubS5mLXByZS5OXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih2ZXJzaW9uU3RyaW5nOiBzdHJpbmcsIGlzQWxwaGE6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBwYXJ0U3RyID0gdmVyc2lvblN0cmluZy5zcGxpdCgnLScpO1xuICAgIHRoaXMuYnVpbGQgPSB0aGlzLmdldEJ1aWxkTnVtYmVyKHBhcnRTdHJbMV0pO1xuICAgIHZlcnNpb25TdHJpbmcgPSBwYXJ0U3RyWzBdO1xuXG4gICAgY29uc3QgcGFydHMgPSB2ZXJzaW9uU3RyaW5nLnNwbGl0KCcuJykubWFwKChwKSA9PiBwYXJzZUludChwLCAxMCkpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgSW52YWxpZCB2ZXJzaW9uIG51bWJlcjogJHt2ZXJzaW9uU3RyaW5nfWApO1xuICAgIH1cblxuICAgIHRoaXMubWFqb3IgPSBwYXJ0c1swXTtcbiAgICB0aGlzLm1pbm9yID0gcGFydHNbMV07XG4gICAgdGhpcy5maXggPSBwYXJ0c1syXTtcbiAgICB0aGlzLmlzQWxwaGEgPSBpc0FscGhhO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCdWlsZE51bWJlcihwcmVSZWxlYXNlU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IG5vQnVpbGROdW1iZXIgPSAtMTtcbiAgICBpZiAoIXByZVJlbGVhc2VTdHJpbmcpIHtcbiAgICAgIHJldHVybiBub0J1aWxkTnVtYmVyO1xuICAgIH1cblxuICAgIC8vIFRoZSBwcmVSZWxlYXNlIHN0cmluZyBoYXMgdGhpcyBmb3JtOiBwcmUuTiwgYnV0IHdlIGRvbid0IGRlcGVuZCBvbiB0aGUgYWN0dWFsIHN0cmluZyBiZWluZyAncHJlJ1xuICAgIGNvbnN0IHBhcnRTdHIgPSBwcmVSZWxlYXNlU3RyaW5nLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIHBhcnRTdHJbMV0gPyBwYXJzZUludChwYXJ0U3RyWzFdLCAxMCkgOiBub0J1aWxkTnVtYmVyO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JtYXR0ZWRWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLm1ham9yfS4ke3RoaXMubWlub3J9LiR7dGhpcy5maXh9YDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZnVsbEZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMubWFqb3J9LiR7dGhpcy5taW5vcn0uJHt0aGlzLmZpeH0tcHJlLiR7dGhpcy5idWlsZH1gO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXhlY3V0ZVJlc3BvbnNlLFxuICBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcixcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLFxuICBOb3RpZmljYXRpb24sXG4gIE5vdGlmaWNhdGlvbkhhbmRsZXIsXG4gIFZlcmJJZCxcbiAgVmVyc2lvbkxlc3NUaGFuLFxuICBWZXJzaW9uTnVtYmVyLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBJbnRlcm5hbEFwaURpc3BhdGNoZXIgd2hpY2ggc3VwcG9ydHMgdXBncmFkaW5nIGFuZCBkb3duZ3JhZGluZyB0aGUgaW5wdXRcbiAqIGludGVybmFsIGNvbnRyYWN0IHRvIHRoZSB2ZXJzaW9uIHRoYXQgdGhpcyBtb2R1bGUgaXMgYnVpbHQgYWdhaW5zdFxuICpcbiAqIEBjbGFzcyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXJcbiAqIEBpbXBsZW1lbnRzIHtJbnRlcm5hbEFwaURpc3BhdGNoZXJ9XG4gKi9cbmV4cG9ydCBjbGFzcyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgaW1wbGVtZW50cyBJbnRlcm5hbEFwaURpc3BhdGNoZXIge1xuICBwcml2YXRlIF92ZXJzaW9uQ29udmVydGVyOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcjtcbiAgcHJpdmF0ZSBfbm90aWZpY2F0aW9uSGFuZGxlcnM6IEFycmF5PE5vdGlmaWNhdGlvbkhhbmRsZXI+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXJcbiAgICogV2UgaGF2ZSBtdWx0aXBsZSB2ZXJzaW9uIGNvbnZlcnRpbmcgZGlzcGF0Y2hlcnMgdGhhdCB3b3JrIHRvZ2V0aGVyLlxuICAgKiBJZiBuZWVkZWQsIHRoZSBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgd3JhcHMgZWl0aGVyIHRoZSBJbnRlcm5hbEFwaURpc3BhdGNoZXIgKGRlc2t0b3ApXG4gICAqIG9yIHRoZSBDcm9zc0ZyYW1lRGlzcGF0Y2hlciAoc2VydmVyKS5cbiAgICogVGhlIEludGVybmFsL0Nyb3NzRnJhbWUgZGlzcGF0Y2hlcnMgaGFuZGxlIGFuIHVwZGF0ZWQgcGxhdGZvcm0gd2l0aCBhbiBvbGRlciBleHRlcm5hbCBsaWJyYXJ5LlxuICAgKiAoVGhlIENyb3NzRnJhbWVEaXNwYXRjaGVyIHNlbmRzIG1lc3NhZ2VzIGFjcm9zcyB0aGUgZnJhbWUsIGFuZCBpdCBpcyBoYW5kbGVkIGJ5IHRoZSBQcmVzTGF5ZXJIYW5kbGVyLilcbiAgICogTWVhbndoaWxlLCB0aGUgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyIGhhbmRsZXMgYW4gdXBkYXRlZCBleHRlcm5hbCBsaWJyYXJ5IHdpdGggYW4gb2xkZXIgcGxhdGZvcm0uXG5cbiAgICogQHBhcmFtIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXIgVGhlIGRlbGVnYXRlIHRoYXQgZG9lcyB0aGUgYWN0dWFsIHdvcmsuXG4gICAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb25OdW1iZXIgVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHdoaWNoIHRoZSBwbGF0Zm9ybSBtb2R1bGUgaXMgdXNpbmcuXG4gICAqIFRoaXMgbnVtYmVyIHdpbGwgYmUgdXNlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBkb3duZ3JhZGUgaW5jb21pbmcgY29tbWFuZHMgYW5kIHVwZ3JhZGUgdGhlIHJlc3VsdHNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgcGxhdGZvcm1WZXJzaW9uTnVtYmVyOiBWZXJzaW9uTnVtYmVyKSB7XG4gICAgdGhpcy5fdmVyc2lvbkNvbnZlcnRlciA9IENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXIoSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiwgcGxhdGZvcm1WZXJzaW9uTnVtYmVyKTtcblxuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzID0gW107XG4gICAgX2FwaURlbGVnYXRlRGlzcGF0Y2hlci5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCA9PiB7XG4gICAgICBpZiAodGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZ3JhZGVkTm90aWZpY2F0aW9uID0gdGhpcy5fdmVyc2lvbkNvbnZlcnRlci51cGdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7XG4gICAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgIGhhbmRsZXIodXBncmFkZWROb3RpZmljYXRpb24pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIG5lZWRzVmVyc2lvbkNvbnZlcnRlcihwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIpOiBib29sZWFuIHtcbiAgICAvLyBJZiBvdXIgcGxhdGZvcm0gaXMgbGVzcyB0aGFuIGV4dGVybmFsIGxpYnJhcnkgdmVyc2lvbiwgdGhlbiB3ZSBuZWVkIGEgY29udmVydGVyXG4gICAgcmV0dXJuIFZlcnNpb25MZXNzVGhhbihwbGF0Zm9ybVZlcnNpb24sIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04pO1xuICB9XG5cbiAgcHVibGljIGV4ZWN1dGUodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRvd25ncmFkZVBhcmFtZXRlcnMgPSB0aGlzLl92ZXJzaW9uQ29udmVydGVyLmRvd25ncmFkZUV4ZWN1dGVDYWxsKHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgICAgcmV0dXJuIHRoaXMuX2FwaURlbGVnYXRlRGlzcGF0Y2hlci5leGVjdXRlKGRvd25ncmFkZVBhcmFtZXRlcnMudmVyYiwgZG93bmdyYWRlUGFyYW1ldGVycy5wYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCB1cGdyYWRlUmVzcG9uc2UgPSB0aGlzLl92ZXJzaW9uQ29udmVydGVyLnVwZ3JhZGVFeGVjdXRlUmV0dXJuKHJlc3BvbnNlLCB2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgcmV0dXJuIHVwZ3JhZGVSZXNwb25zZTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKGhhbmRsZXI6IE5vdGlmaWNhdGlvbkhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xuICB9XG5cbiAgcHVibGljIHVucmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKGhhbmRsZXI6IE5vdGlmaWNhdGlvbkhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycyA9IHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLmZpbHRlcigoaCkgPT4gaCAhPT0gaGFuZGxlcik7XG4gIH1cbn1cbiIsImV4cG9ydCB7IGRlZmF1bHQgYXMgdjEgfSBmcm9tICcuL3YxLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjMgfSBmcm9tICcuL3YzLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjQgfSBmcm9tICcuL3Y0LmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjUgfSBmcm9tICcuL3Y1LmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTklMIH0gZnJvbSAnLi9uaWwuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdmFsaWRhdGUgfSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc3RyaW5naWZ5IH0gZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJzZSB9IGZyb20gJy4vcGFyc2UuanMnOyIsIi8qXG4gKiBCcm93c2VyLWNvbXBhdGlibGUgSmF2YVNjcmlwdCBNRDVcbiAqXG4gKiBNb2RpZmljYXRpb24gb2YgSmF2YVNjcmlwdCBNRDVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL0phdmFTY3JpcHQtTUQ1XG4gKlxuICogQ29weXJpZ2h0IDIwMTEsIFNlYmFzdGlhbiBUc2NoYW5cbiAqIGh0dHBzOi8vYmx1ZWltcC5uZXRcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxuICpcbiAqIEJhc2VkIG9uXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlXG4gKiBEaWdlc3QgQWxnb3JpdGhtLCBhcyBkZWZpbmVkIGluIFJGQyAxMzIxLlxuICogVmVyc2lvbiAyLjIgQ29weXJpZ2h0IChDKSBQYXVsIEpvaG5zdG9uIDE5OTkgLSAyMDA5XG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2VcbiAqIFNlZSBodHRwOi8vcGFqaG9tZS5vcmcudWsvY3J5cHQvbWQ1IGZvciBtb3JlIGluZm8uXG4gKi9cbmZ1bmN0aW9uIG1kNShieXRlcykge1xuICBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgIHZhciBtc2cgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoYnl0ZXMpKTsgLy8gVVRGOCBlc2NhcGVcblxuICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobXNnLmxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7ICsraSkge1xuICAgICAgYnl0ZXNbaV0gPSBtc2cuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWQ1VG9IZXhFbmNvZGVkQXJyYXkod29yZHNUb01kNShieXRlc1RvV29yZHMoYnl0ZXMpLCBieXRlcy5sZW5ndGggKiA4KSk7XG59XG4vKlxuICogQ29udmVydCBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzIHRvIGFuIGFycmF5IG9mIGJ5dGVzXG4gKi9cblxuXG5mdW5jdGlvbiBtZDVUb0hleEVuY29kZWRBcnJheShpbnB1dCkge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIHZhciBsZW5ndGgzMiA9IGlucHV0Lmxlbmd0aCAqIDMyO1xuICB2YXIgaGV4VGFiID0gJzAxMjM0NTY3ODlhYmNkZWYnO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoMzI7IGkgKz0gOCkge1xuICAgIHZhciB4ID0gaW5wdXRbaSA+PiA1XSA+Pj4gaSAlIDMyICYgMHhmZjtcbiAgICB2YXIgaGV4ID0gcGFyc2VJbnQoaGV4VGFiLmNoYXJBdCh4ID4+PiA0ICYgMHgwZikgKyBoZXhUYWIuY2hhckF0KHggJiAweDBmKSwgMTYpO1xuICAgIG91dHB1dC5wdXNoKGhleCk7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGUgb3V0cHV0IGxlbmd0aCB3aXRoIHBhZGRpbmcgYW5kIGJpdCBsZW5ndGhcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aDgpIHtcbiAgcmV0dXJuIChpbnB1dExlbmd0aDggKyA2NCA+Pj4gOSA8PCA0KSArIDE0ICsgMTtcbn1cbi8qXG4gKiBDYWxjdWxhdGUgdGhlIE1ENSBvZiBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzLCBhbmQgYSBiaXQgbGVuZ3RoLlxuICovXG5cblxuZnVuY3Rpb24gd29yZHNUb01kNSh4LCBsZW4pIHtcbiAgLyogYXBwZW5kIHBhZGRpbmcgKi9cbiAgeFtsZW4gPj4gNV0gfD0gMHg4MCA8PCBsZW4gJSAzMjtcbiAgeFtnZXRPdXRwdXRMZW5ndGgobGVuKSAtIDFdID0gbGVuO1xuICB2YXIgYSA9IDE3MzI1ODQxOTM7XG4gIHZhciBiID0gLTI3MTczMzg3OTtcbiAgdmFyIGMgPSAtMTczMjU4NDE5NDtcbiAgdmFyIGQgPSAyNzE3MzM4Nzg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSArPSAxNikge1xuICAgIHZhciBvbGRhID0gYTtcbiAgICB2YXIgb2xkYiA9IGI7XG4gICAgdmFyIG9sZGMgPSBjO1xuICAgIHZhciBvbGRkID0gZDtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpXSwgNywgLTY4MDg3NjkzNik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDFdLCAxMiwgLTM4OTU2NDU4Nik7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNywgNjA2MTA1ODE5KTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgM10sIDIyLCAtMTA0NDUyNTMzMCk7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA3LCAtMTc2NDE4ODk3KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgNV0sIDEyLCAxMjAwMDgwNDI2KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgNl0sIDE3LCAtMTQ3MzIzMTM0MSk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDddLCAyMiwgLTQ1NzA1OTgzKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgOF0sIDcsIDE3NzAwMzU0MTYpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyA5XSwgMTIsIC0xOTU4NDE0NDE3KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNywgLTQyMDYzKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgMTFdLCAyMiwgLTE5OTA0MDQxNjIpO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDcsIDE4MDQ2MDM2ODIpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyAxM10sIDEyLCAtNDAzNDExMDEpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAxNF0sIDE3LCAtMTUwMjAwMjI5MCk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDE1XSwgMjIsIDEyMzY1MzUzMjkpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNSwgLTE2NTc5NjUxMCk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDZdLCA5LCAtMTA2OTUwMTYzMik7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDExXSwgMTQsIDY0MzcxNzcxMyk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaV0sIDIwLCAtMzczODk3MzAyKTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgNV0sIDUsIC03MDE1NTg2OTEpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAxMF0sIDksIDM4MDE2MDgzKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgMTVdLCAxNCwgLTY2MDQ3ODMzNSk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDRdLCAyMCwgLTQwNTUzNzg0OCk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDldLCA1LCA1Njg0NDY0MzgpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAxNF0sIDksIC0xMDE5ODAzNjkwKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgM10sIDE0LCAtMTg3MzYzOTYxKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgOF0sIDIwLCAxMTYzNTMxNTAxKTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgMTNdLCA1LCAtMTQ0NDY4MTQ2Nyk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDJdLCA5LCAtNTE0MDM3ODQpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTQsIDE3MzUzMjg0NzMpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyAxMl0sIDIwLCAtMTkyNjYwNzczNCk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDVdLCA0LCAtMzc4NTU4KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgOF0sIDExLCAtMjAyMjU3NDQ2Myk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDExXSwgMTYsIDE4MzkwMzA1NjIpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAxNF0sIDIzLCAtMzUzMDk1NTYpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNCwgLTE1MzA5OTIwNjApO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyA0XSwgMTEsIDEyNzI4OTMzNTMpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTYsIC0xNTU0OTc2MzIpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAxMF0sIDIzLCAtMTA5NDczMDY0MCk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDEzXSwgNCwgNjgxMjc5MTc0KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpXSwgMTEsIC0zNTg1MzcyMjIpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTYsIC03MjI1MjE5NzkpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyA2XSwgMjMsIDc2MDI5MTg5KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgOV0sIDQsIC02NDAzNjQ0ODcpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyAxMl0sIDExLCAtNDIxODE1ODM1KTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgMTVdLCAxNiwgNTMwNzQyNTIwKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMl0sIDIzLCAtOTk1MzM4NjUxKTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpXSwgNiwgLTE5ODYzMDg0NCk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDddLCAxMCwgMTEyNjg5MTQxNSk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTUsIC0xNDE2MzU0OTA1KTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgNV0sIDIxLCAtNTc0MzQwNTUpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDYsIDE3MDA0ODU1NzEpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAzXSwgMTAsIC0xODk0OTg2NjA2KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNSwgLTEwNTE1MjMpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyAxXSwgMjEsIC0yMDU0OTIyNzk5KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgOF0sIDYsIDE4NzMzMTMzNTkpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAxNV0sIDEwLCAtMzA2MTE3NDQpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTUsIC0xNTYwMTk4MzgwKTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgMTNdLCAyMSwgMTMwOTE1MTY0OSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA2LCAtMTQ1NTIzMDcwKTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgMTFdLCAxMCwgLTExMjAyMTAzNzkpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAyXSwgMTUsIDcxODc4NzI1OSk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDldLCAyMSwgLTM0MzQ4NTU1MSk7XG4gICAgYSA9IHNhZmVBZGQoYSwgb2xkYSk7XG4gICAgYiA9IHNhZmVBZGQoYiwgb2xkYik7XG4gICAgYyA9IHNhZmVBZGQoYywgb2xkYyk7XG4gICAgZCA9IHNhZmVBZGQoZCwgb2xkZCk7XG4gIH1cblxuICByZXR1cm4gW2EsIGIsIGMsIGRdO1xufVxuLypcbiAqIENvbnZlcnQgYW4gYXJyYXkgYnl0ZXMgdG8gYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3Jkc1xuICogQ2hhcmFjdGVycyA+MjU1IGhhdmUgdGhlaXIgaGlnaC1ieXRlIHNpbGVudGx5IGlnbm9yZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBieXRlc1RvV29yZHMoaW5wdXQpIHtcbiAgaWYgKGlucHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHZhciBsZW5ndGg4ID0gaW5wdXQubGVuZ3RoICogODtcbiAgdmFyIG91dHB1dCA9IG5ldyBVaW50MzJBcnJheShnZXRPdXRwdXRMZW5ndGgobGVuZ3RoOCkpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoODsgaSArPSA4KSB7XG4gICAgb3V0cHV0W2kgPj4gNV0gfD0gKGlucHV0W2kgLyA4XSAmIDB4ZmYpIDw8IGkgJSAzMjtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG4vKlxuICogQWRkIGludGVnZXJzLCB3cmFwcGluZyBhdCAyXjMyLiBUaGlzIHVzZXMgMTYtYml0IG9wZXJhdGlvbnMgaW50ZXJuYWxseVxuICogdG8gd29yayBhcm91bmQgYnVncyBpbiBzb21lIEpTIGludGVycHJldGVycy5cbiAqL1xuXG5cbmZ1bmN0aW9uIHNhZmVBZGQoeCwgeSkge1xuICB2YXIgbHN3ID0gKHggJiAweGZmZmYpICsgKHkgJiAweGZmZmYpO1xuICB2YXIgbXN3ID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGxzdyA+PiAxNik7XG4gIHJldHVybiBtc3cgPDwgMTYgfCBsc3cgJiAweGZmZmY7XG59XG4vKlxuICogQml0d2lzZSByb3RhdGUgYSAzMi1iaXQgbnVtYmVyIHRvIHRoZSBsZWZ0LlxuICovXG5cblxuZnVuY3Rpb24gYml0Um90YXRlTGVmdChudW0sIGNudCkge1xuICByZXR1cm4gbnVtIDw8IGNudCB8IG51bSA+Pj4gMzIgLSBjbnQ7XG59XG4vKlxuICogVGhlc2UgZnVuY3Rpb25zIGltcGxlbWVudCB0aGUgZm91ciBiYXNpYyBvcGVyYXRpb25zIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIG1kNWNtbihxLCBhLCBiLCB4LCBzLCB0KSB7XG4gIHJldHVybiBzYWZlQWRkKGJpdFJvdGF0ZUxlZnQoc2FmZUFkZChzYWZlQWRkKGEsIHEpLCBzYWZlQWRkKHgsIHQpKSwgcyksIGIpO1xufVxuXG5mdW5jdGlvbiBtZDVmZihhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiAmIGMgfCB+YiAmIGQsIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5mdW5jdGlvbiBtZDVnZyhhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiAmIGQgfCBjICYgfmQsIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5mdW5jdGlvbiBtZDVoaChhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiBeIGMgXiBkLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZnVuY3Rpb24gbWQ1aWkoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGMgXiAoYiB8IH5kKSwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1kNTsiLCJleHBvcnQgZGVmYXVsdCAnMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwJzsiLCJpbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmZ1bmN0aW9uIHBhcnNlKHV1aWQpIHtcbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBVVUlEJyk7XG4gIH1cblxuICB2YXIgdjtcbiAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDE2KTsgLy8gUGFyc2UgIyMjIyMjIyMtLi4uLi0uLi4uLS4uLi4tLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDAsIDgpLCAxNikpID4+PiAyNDtcbiAgYXJyWzFdID0gdiA+Pj4gMTYgJiAweGZmO1xuICBhcnJbMl0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzNdID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLSMjIyMtLi4uLi0uLi4uLS4uLi4uLi4uLi4uLlxuXG4gIGFycls0XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSg5LCAxMyksIDE2KSkgPj4+IDg7XG4gIGFycls1XSA9IHYgJiAweGZmOyAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLSMjIyMtLi4uLi0uLi4uLi4uLi4uLi5cblxuICBhcnJbNl0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMTQsIDE4KSwgMTYpKSA+Pj4gODtcbiAgYXJyWzddID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tLi4uLi0jIyMjLS4uLi4uLi4uLi4uLlxuXG4gIGFycls4XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxOSwgMjMpLCAxNikpID4+PiA4O1xuICBhcnJbOV0gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0uLi4uLS4uLi4tIyMjIyMjIyMjIyMjXG4gIC8vIChVc2UgXCIvXCIgdG8gYXZvaWQgMzItYml0IHRydW5jYXRpb24gd2hlbiBiaXQtc2hpZnRpbmcgaGlnaC1vcmRlciBieXRlcylcblxuICBhcnJbMTBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDI0LCAzNiksIDE2KSkgLyAweDEwMDAwMDAwMDAwICYgMHhmZjtcbiAgYXJyWzExXSA9IHYgLyAweDEwMDAwMDAwMCAmIDB4ZmY7XG4gIGFyclsxMl0gPSB2ID4+PiAyNCAmIDB4ZmY7XG4gIGFyclsxM10gPSB2ID4+PiAxNiAmIDB4ZmY7XG4gIGFyclsxNF0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzE1XSA9IHYgJiAweGZmO1xuICByZXR1cm4gYXJyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBwYXJzZTsiLCJleHBvcnQgZGVmYXVsdCAvXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7IiwiLy8gVW5pcXVlIElEIGNyZWF0aW9uIHJlcXVpcmVzIGEgaGlnaCBxdWFsaXR5IHJhbmRvbSAjIGdlbmVyYXRvci4gSW4gdGhlIGJyb3dzZXIgd2UgdGhlcmVmb3JlXG4vLyByZXF1aXJlIHRoZSBjcnlwdG8gQVBJIGFuZCBkbyBub3Qgc3VwcG9ydCBidWlsdC1pbiBmYWxsYmFjayB0byBsb3dlciBxdWFsaXR5IHJhbmRvbSBudW1iZXJcbi8vIGdlbmVyYXRvcnMgKGxpa2UgTWF0aC5yYW5kb20oKSkuXG52YXIgZ2V0UmFuZG9tVmFsdWVzO1xudmFyIHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm5nKCkge1xuICAvLyBsYXp5IGxvYWQgc28gdGhhdCBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIHBvbHlmaWxsIGhhdmUgYSBjaGFuY2UgdG8gZG8gc29cbiAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBnZXRSYW5kb21WYWx1ZXMgbmVlZHMgdG8gYmUgaW52b2tlZCBpbiBhIGNvbnRleHQgd2hlcmUgXCJ0aGlzXCIgaXMgYSBDcnlwdG8gaW1wbGVtZW50YXRpb24uIEFsc28sXG4gICAgLy8gZmluZCB0aGUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgY3J5cHRvIChtc0NyeXB0bykgb24gSUUxMS5cbiAgICBnZXRSYW5kb21WYWx1ZXMgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pIHx8IHR5cGVvZiBtc0NyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byk7XG5cbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsIi8vIEFkYXB0ZWQgZnJvbSBDaHJpcyBWZW5lc3MnIFNIQTEgY29kZSBhdFxuLy8gaHR0cDovL3d3dy5tb3ZhYmxlLXR5cGUuY28udWsvc2NyaXB0cy9zaGExLmh0bWxcbmZ1bmN0aW9uIGYocywgeCwgeSwgeikge1xuICBzd2l0Y2ggKHMpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4geCAmIHkgXiB+eCAmIHo7XG5cbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4geCBeIHkgXiB6O1xuXG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHggJiB5IF4geCAmIHogXiB5ICYgejtcblxuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiB4IF4geSBeIHo7XG4gIH1cbn1cblxuZnVuY3Rpb24gUk9UTCh4LCBuKSB7XG4gIHJldHVybiB4IDw8IG4gfCB4ID4+PiAzMiAtIG47XG59XG5cbmZ1bmN0aW9uIHNoYTEoYnl0ZXMpIHtcbiAgdmFyIEsgPSBbMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNl07XG4gIHZhciBIID0gWzB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjBdO1xuXG4gIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG1zZyA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChieXRlcykpOyAvLyBVVEY4IGVzY2FwZVxuXG4gICAgYnl0ZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgKytpKSB7XG4gICAgICBieXRlcy5wdXNoKG1zZy5jaGFyQ29kZUF0KGkpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoYnl0ZXMpKSB7XG4gICAgLy8gQ29udmVydCBBcnJheS1saWtlIHRvIEFycmF5XG4gICAgYnl0ZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChieXRlcyk7XG4gIH1cblxuICBieXRlcy5wdXNoKDB4ODApO1xuICB2YXIgbCA9IGJ5dGVzLmxlbmd0aCAvIDQgKyAyO1xuICB2YXIgTiA9IE1hdGguY2VpbChsIC8gMTYpO1xuICB2YXIgTSA9IG5ldyBBcnJheShOKTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgTjsgKytfaSkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDMyQXJyYXkoMTYpO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICBhcnJbal0gPSBieXRlc1tfaSAqIDY0ICsgaiAqIDRdIDw8IDI0IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgMV0gPDwgMTYgfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAyXSA8PCA4IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgM107XG4gICAgfVxuXG4gICAgTVtfaV0gPSBhcnI7XG4gIH1cblxuICBNW04gLSAxXVsxNF0gPSAoYnl0ZXMubGVuZ3RoIC0gMSkgKiA4IC8gTWF0aC5wb3coMiwgMzIpO1xuICBNW04gLSAxXVsxNF0gPSBNYXRoLmZsb29yKE1bTiAtIDFdWzE0XSk7XG4gIE1bTiAtIDFdWzE1XSA9IChieXRlcy5sZW5ndGggLSAxKSAqIDggJiAweGZmZmZmZmZmO1xuXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IE47ICsrX2kyKSB7XG4gICAgdmFyIFcgPSBuZXcgVWludDMyQXJyYXkoODApO1xuXG4gICAgZm9yICh2YXIgdCA9IDA7IHQgPCAxNjsgKyt0KSB7XG4gICAgICBXW3RdID0gTVtfaTJdW3RdO1xuICAgIH1cblxuICAgIGZvciAodmFyIF90ID0gMTY7IF90IDwgODA7ICsrX3QpIHtcbiAgICAgIFdbX3RdID0gUk9UTChXW190IC0gM10gXiBXW190IC0gOF0gXiBXW190IC0gMTRdIF4gV1tfdCAtIDE2XSwgMSk7XG4gICAgfVxuXG4gICAgdmFyIGEgPSBIWzBdO1xuICAgIHZhciBiID0gSFsxXTtcbiAgICB2YXIgYyA9IEhbMl07XG4gICAgdmFyIGQgPSBIWzNdO1xuICAgIHZhciBlID0gSFs0XTtcblxuICAgIGZvciAodmFyIF90MiA9IDA7IF90MiA8IDgwOyArK190Mikge1xuICAgICAgdmFyIHMgPSBNYXRoLmZsb29yKF90MiAvIDIwKTtcbiAgICAgIHZhciBUID0gUk9UTChhLCA1KSArIGYocywgYiwgYywgZCkgKyBlICsgS1tzXSArIFdbX3QyXSA+Pj4gMDtcbiAgICAgIGUgPSBkO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gUk9UTChiLCAzMCkgPj4+IDA7XG4gICAgICBiID0gYTtcbiAgICAgIGEgPSBUO1xuICAgIH1cblxuICAgIEhbMF0gPSBIWzBdICsgYSA+Pj4gMDtcbiAgICBIWzFdID0gSFsxXSArIGIgPj4+IDA7XG4gICAgSFsyXSA9IEhbMl0gKyBjID4+PiAwO1xuICAgIEhbM10gPSBIWzNdICsgZCA+Pj4gMDtcbiAgICBIWzRdID0gSFs0XSArIGUgPj4+IDA7XG4gIH1cblxuICByZXR1cm4gW0hbMF0gPj4gMjQgJiAweGZmLCBIWzBdID4+IDE2ICYgMHhmZiwgSFswXSA+PiA4ICYgMHhmZiwgSFswXSAmIDB4ZmYsIEhbMV0gPj4gMjQgJiAweGZmLCBIWzFdID4+IDE2ICYgMHhmZiwgSFsxXSA+PiA4ICYgMHhmZiwgSFsxXSAmIDB4ZmYsIEhbMl0gPj4gMjQgJiAweGZmLCBIWzJdID4+IDE2ICYgMHhmZiwgSFsyXSA+PiA4ICYgMHhmZiwgSFsyXSAmIDB4ZmYsIEhbM10gPj4gMjQgJiAweGZmLCBIWzNdID4+IDE2ICYgMHhmZiwgSFszXSA+PiA4ICYgMHhmZiwgSFszXSAmIDB4ZmYsIEhbNF0gPj4gMjQgJiAweGZmLCBIWzRdID4+IDE2ICYgMHhmZiwgSFs0XSA+PiA4ICYgMHhmZiwgSFs0XSAmIDB4ZmZdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzaGExOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbi8qKlxuICogQ29udmVydCBhcnJheSBvZiAxNiBieXRlIHZhbHVlcyB0byBVVUlEIHN0cmluZyBmb3JtYXQgb2YgdGhlIGZvcm06XG4gKiBYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFhcbiAqL1xuXG52YXIgYnl0ZVRvSGV4ID0gW107XG5cbmZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgYnl0ZVRvSGV4LnB1c2goKGkgKyAweDEwMCkudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeShhcnIpIHtcbiAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgLy8gTm90ZTogQmUgY2FyZWZ1bCBlZGl0aW5nIHRoaXMgY29kZSEgIEl0J3MgYmVlbiB0dW5lZCBmb3IgcGVyZm9ybWFuY2VcbiAgLy8gYW5kIHdvcmtzIGluIHdheXMgeW91IG1heSBub3QgZXhwZWN0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkL3B1bGwvNDM0XG4gIHZhciB1dWlkID0gKGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgM11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDVdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA3XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDhdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxM11dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNV1dKS50b0xvd2VyQ2FzZSgpOyAvLyBDb25zaXN0ZW5jeSBjaGVjayBmb3IgdmFsaWQgVVVJRC4gIElmIHRoaXMgdGhyb3dzLCBpdCdzIGxpa2VseSBkdWUgdG8gb25lXG4gIC8vIG9mIHRoZSBmb2xsb3dpbmc6XG4gIC8vIC0gT25lIG9yIG1vcmUgaW5wdXQgYXJyYXkgdmFsdWVzIGRvbid0IG1hcCB0byBhIGhleCBvY3RldCAobGVhZGluZyB0b1xuICAvLyBcInVuZGVmaW5lZFwiIGluIHRoZSB1dWlkKVxuICAvLyAtIEludmFsaWQgaW5wdXQgdmFsdWVzIGZvciB0aGUgUkZDIGB2ZXJzaW9uYCBvciBgdmFyaWFudGAgZmllbGRzXG5cbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkJyk7XG4gIH1cblxuICByZXR1cm4gdXVpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RyaW5naWZ5OyIsImltcG9ydCBybmcgZnJvbSAnLi9ybmcuanMnO1xuaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7IC8vICoqYHYxKClgIC0gR2VuZXJhdGUgdGltZS1iYXNlZCBVVUlEKipcbi8vXG4vLyBJbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vTGlvc0svVVVJRC5qc1xuLy8gYW5kIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS91dWlkLmh0bWxcblxudmFyIF9ub2RlSWQ7XG5cbnZhciBfY2xvY2tzZXE7IC8vIFByZXZpb3VzIHV1aWQgY3JlYXRpb24gdGltZVxuXG5cbnZhciBfbGFzdE1TZWNzID0gMDtcbnZhciBfbGFzdE5TZWNzID0gMDsgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCBmb3IgQVBJIGRldGFpbHNcblxuZnVuY3Rpb24gdjEob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgdmFyIGkgPSBidWYgJiYgb2Zmc2V0IHx8IDA7XG4gIHZhciBiID0gYnVmIHx8IG5ldyBBcnJheSgxNik7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgbm9kZSA9IG9wdGlvbnMubm9kZSB8fCBfbm9kZUlkO1xuICB2YXIgY2xvY2tzZXEgPSBvcHRpb25zLmNsb2Nrc2VxICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmNsb2Nrc2VxIDogX2Nsb2Nrc2VxOyAvLyBub2RlIGFuZCBjbG9ja3NlcSBuZWVkIHRvIGJlIGluaXRpYWxpemVkIHRvIHJhbmRvbSB2YWx1ZXMgaWYgdGhleSdyZSBub3RcbiAgLy8gc3BlY2lmaWVkLiAgV2UgZG8gdGhpcyBsYXppbHkgdG8gbWluaW1pemUgaXNzdWVzIHJlbGF0ZWQgdG8gaW5zdWZmaWNpZW50XG4gIC8vIHN5c3RlbSBlbnRyb3B5LiAgU2VlICMxODlcblxuICBpZiAobm9kZSA9PSBudWxsIHx8IGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICB2YXIgc2VlZEJ5dGVzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IHJuZykoKTtcblxuICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgIC8vIFBlciA0LjUsIGNyZWF0ZSBhbmQgNDgtYml0IG5vZGUgaWQsICg0NyByYW5kb20gYml0cyArIG11bHRpY2FzdCBiaXQgPSAxKVxuICAgICAgbm9kZSA9IF9ub2RlSWQgPSBbc2VlZEJ5dGVzWzBdIHwgMHgwMSwgc2VlZEJ5dGVzWzFdLCBzZWVkQnl0ZXNbMl0sIHNlZWRCeXRlc1szXSwgc2VlZEJ5dGVzWzRdLCBzZWVkQnl0ZXNbNV1dO1xuICAgIH1cblxuICAgIGlmIChjbG9ja3NlcSA9PSBudWxsKSB7XG4gICAgICAvLyBQZXIgNC4yLjIsIHJhbmRvbWl6ZSAoMTQgYml0KSBjbG9ja3NlcVxuICAgICAgY2xvY2tzZXEgPSBfY2xvY2tzZXEgPSAoc2VlZEJ5dGVzWzZdIDw8IDggfCBzZWVkQnl0ZXNbN10pICYgMHgzZmZmO1xuICAgIH1cbiAgfSAvLyBVVUlEIHRpbWVzdGFtcHMgYXJlIDEwMCBuYW5vLXNlY29uZCB1bml0cyBzaW5jZSB0aGUgR3JlZ29yaWFuIGVwb2NoLFxuICAvLyAoMTU4Mi0xMC0xNSAwMDowMCkuICBKU051bWJlcnMgYXJlbid0IHByZWNpc2UgZW5vdWdoIGZvciB0aGlzLCBzb1xuICAvLyB0aW1lIGlzIGhhbmRsZWQgaW50ZXJuYWxseSBhcyAnbXNlY3MnIChpbnRlZ2VyIG1pbGxpc2Vjb25kcykgYW5kICduc2VjcydcbiAgLy8gKDEwMC1uYW5vc2Vjb25kcyBvZmZzZXQgZnJvbSBtc2Vjcykgc2luY2UgdW5peCBlcG9jaCwgMTk3MC0wMS0wMSAwMDowMC5cblxuXG4gIHZhciBtc2VjcyA9IG9wdGlvbnMubXNlY3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubXNlY3MgOiBEYXRlLm5vdygpOyAvLyBQZXIgNC4yLjEuMiwgdXNlIGNvdW50IG9mIHV1aWQncyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBjdXJyZW50IGNsb2NrXG4gIC8vIGN5Y2xlIHRvIHNpbXVsYXRlIGhpZ2hlciByZXNvbHV0aW9uIGNsb2NrXG5cbiAgdmFyIG5zZWNzID0gb3B0aW9ucy5uc2VjcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5uc2VjcyA6IF9sYXN0TlNlY3MgKyAxOyAvLyBUaW1lIHNpbmNlIGxhc3QgdXVpZCBjcmVhdGlvbiAoaW4gbXNlY3MpXG5cbiAgdmFyIGR0ID0gbXNlY3MgLSBfbGFzdE1TZWNzICsgKG5zZWNzIC0gX2xhc3ROU2VjcykgLyAxMDAwMDsgLy8gUGVyIDQuMi4xLjIsIEJ1bXAgY2xvY2tzZXEgb24gY2xvY2sgcmVncmVzc2lvblxuXG4gIGlmIChkdCA8IDAgJiYgb3B0aW9ucy5jbG9ja3NlcSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2xvY2tzZXEgPSBjbG9ja3NlcSArIDEgJiAweDNmZmY7XG4gIH0gLy8gUmVzZXQgbnNlY3MgaWYgY2xvY2sgcmVncmVzc2VzIChuZXcgY2xvY2tzZXEpIG9yIHdlJ3ZlIG1vdmVkIG9udG8gYSBuZXdcbiAgLy8gdGltZSBpbnRlcnZhbFxuXG5cbiAgaWYgKChkdCA8IDAgfHwgbXNlY3MgPiBfbGFzdE1TZWNzKSAmJiBvcHRpb25zLm5zZWNzID09PSB1bmRlZmluZWQpIHtcbiAgICBuc2VjcyA9IDA7XG4gIH0gLy8gUGVyIDQuMi4xLjIgVGhyb3cgZXJyb3IgaWYgdG9vIG1hbnkgdXVpZHMgYXJlIHJlcXVlc3RlZFxuXG5cbiAgaWYgKG5zZWNzID49IDEwMDAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXVpZC52MSgpOiBDYW4ndCBjcmVhdGUgbW9yZSB0aGFuIDEwTSB1dWlkcy9zZWNcIik7XG4gIH1cblxuICBfbGFzdE1TZWNzID0gbXNlY3M7XG4gIF9sYXN0TlNlY3MgPSBuc2VjcztcbiAgX2Nsb2Nrc2VxID0gY2xvY2tzZXE7IC8vIFBlciA0LjEuNCAtIENvbnZlcnQgZnJvbSB1bml4IGVwb2NoIHRvIEdyZWdvcmlhbiBlcG9jaFxuXG4gIG1zZWNzICs9IDEyMjE5MjkyODAwMDAwOyAvLyBgdGltZV9sb3dgXG5cbiAgdmFyIHRsID0gKChtc2VjcyAmIDB4ZmZmZmZmZikgKiAxMDAwMCArIG5zZWNzKSAlIDB4MTAwMDAwMDAwO1xuICBiW2krK10gPSB0bCA+Pj4gMjQgJiAweGZmO1xuICBiW2krK10gPSB0bCA+Pj4gMTYgJiAweGZmO1xuICBiW2krK10gPSB0bCA+Pj4gOCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsICYgMHhmZjsgLy8gYHRpbWVfbWlkYFxuXG4gIHZhciB0bWggPSBtc2VjcyAvIDB4MTAwMDAwMDAwICogMTAwMDAgJiAweGZmZmZmZmY7XG4gIGJbaSsrXSA9IHRtaCA+Pj4gOCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRtaCAmIDB4ZmY7IC8vIGB0aW1lX2hpZ2hfYW5kX3ZlcnNpb25gXG5cbiAgYltpKytdID0gdG1oID4+PiAyNCAmIDB4ZiB8IDB4MTA7IC8vIGluY2x1ZGUgdmVyc2lvblxuXG4gIGJbaSsrXSA9IHRtaCA+Pj4gMTYgJiAweGZmOyAvLyBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGAgKFBlciA0LjIuMiAtIGluY2x1ZGUgdmFyaWFudClcblxuICBiW2krK10gPSBjbG9ja3NlcSA+Pj4gOCB8IDB4ODA7IC8vIGBjbG9ja19zZXFfbG93YFxuXG4gIGJbaSsrXSA9IGNsb2Nrc2VxICYgMHhmZjsgLy8gYG5vZGVgXG5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCA2OyArK24pIHtcbiAgICBiW2kgKyBuXSA9IG5vZGVbbl07XG4gIH1cblxuICByZXR1cm4gYnVmIHx8IHN0cmluZ2lmeShiKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdjE7IiwiaW1wb3J0IHYzNSBmcm9tICcuL3YzNS5qcyc7XG5pbXBvcnQgbWQ1IGZyb20gJy4vbWQ1LmpzJztcbnZhciB2MyA9IHYzNSgndjMnLCAweDMwLCBtZDUpO1xuZXhwb3J0IGRlZmF1bHQgdjM7IiwiaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5pbXBvcnQgcGFyc2UgZnJvbSAnLi9wYXJzZS5qcyc7XG5cbmZ1bmN0aW9uIHN0cmluZ1RvQnl0ZXMoc3RyKSB7XG4gIHN0ciA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTsgLy8gVVRGOCBlc2NhcGVcblxuICB2YXIgYnl0ZXMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGJ5dGVzLnB1c2goc3RyLmNoYXJDb2RlQXQoaSkpO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG5leHBvcnQgdmFyIEROUyA9ICc2YmE3YjgxMC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xuZXhwb3J0IHZhciBVUkwgPSAnNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChuYW1lLCB2ZXJzaW9uLCBoYXNoZnVuYykge1xuICBmdW5jdGlvbiBnZW5lcmF0ZVVVSUQodmFsdWUsIG5hbWVzcGFjZSwgYnVmLCBvZmZzZXQpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgdmFsdWUgPSBzdHJpbmdUb0J5dGVzKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5hbWVzcGFjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5hbWVzcGFjZSA9IHBhcnNlKG5hbWVzcGFjZSk7XG4gICAgfVxuXG4gICAgaWYgKG5hbWVzcGFjZS5sZW5ndGggIT09IDE2KSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ05hbWVzcGFjZSBtdXN0IGJlIGFycmF5LWxpa2UgKDE2IGl0ZXJhYmxlIGludGVnZXIgdmFsdWVzLCAwLTI1NSknKTtcbiAgICB9IC8vIENvbXB1dGUgaGFzaCBvZiBuYW1lc3BhY2UgYW5kIHZhbHVlLCBQZXIgNC4zXG4gICAgLy8gRnV0dXJlOiBVc2Ugc3ByZWFkIHN5bnRheCB3aGVuIHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLCBlLmcuIGBieXRlcyA9XG4gICAgLy8gaGFzaGZ1bmMoWy4uLm5hbWVzcGFjZSwgLi4uIHZhbHVlXSlgXG5cblxuICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KDE2ICsgdmFsdWUubGVuZ3RoKTtcbiAgICBieXRlcy5zZXQobmFtZXNwYWNlKTtcbiAgICBieXRlcy5zZXQodmFsdWUsIG5hbWVzcGFjZS5sZW5ndGgpO1xuICAgIGJ5dGVzID0gaGFzaGZ1bmMoYnl0ZXMpO1xuICAgIGJ5dGVzWzZdID0gYnl0ZXNbNl0gJiAweDBmIHwgdmVyc2lvbjtcbiAgICBieXRlc1s4XSA9IGJ5dGVzWzhdICYgMHgzZiB8IDB4ODA7XG5cbiAgICBpZiAoYnVmKSB7XG4gICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IGJ5dGVzW2ldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYnVmO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJpbmdpZnkoYnl0ZXMpO1xuICB9IC8vIEZ1bmN0aW9uI25hbWUgaXMgbm90IHNldHRhYmxlIG9uIHNvbWUgcGxhdGZvcm1zICgjMjcwKVxuXG5cbiAgdHJ5IHtcbiAgICBnZW5lcmF0ZVVVSUQubmFtZSA9IG5hbWU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eVxuICB9IGNhdGNoIChlcnIpIHt9IC8vIEZvciBDb21tb25KUyBkZWZhdWx0IGV4cG9ydCBzdXBwb3J0XG5cblxuICBnZW5lcmF0ZVVVSUQuRE5TID0gRE5TO1xuICBnZW5lcmF0ZVVVSUQuVVJMID0gVVJMO1xuICByZXR1cm4gZ2VuZXJhdGVVVUlEO1xufSIsImltcG9ydCBybmcgZnJvbSAnLi9ybmcuanMnO1xuaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5cbmZ1bmN0aW9uIHY0KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBybmcpKCk7IC8vIFBlciA0LjQsIHNldCBiaXRzIGZvciB2ZXJzaW9uIGFuZCBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGBcblxuICBybmRzWzZdID0gcm5kc1s2XSAmIDB4MGYgfCAweDQwO1xuICBybmRzWzhdID0gcm5kc1s4XSAmIDB4M2YgfCAweDgwOyAvLyBDb3B5IGJ5dGVzIHRvIGJ1ZmZlciwgaWYgcHJvdmlkZWRcblxuICBpZiAoYnVmKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHJuZHNbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIHJldHVybiBzdHJpbmdpZnkocm5kcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHY0OyIsImltcG9ydCB2MzUgZnJvbSAnLi92MzUuanMnO1xuaW1wb3J0IHNoYTEgZnJvbSAnLi9zaGExLmpzJztcbnZhciB2NSA9IHYzNSgndjUnLCAweDUwLCBzaGExKTtcbmV4cG9ydCBkZWZhdWx0IHY1OyIsImltcG9ydCBSRUdFWCBmcm9tICcuL3JlZ2V4LmpzJztcblxuZnVuY3Rpb24gdmFsaWRhdGUodXVpZCkge1xuICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnICYmIFJFR0VYLnRlc3QodXVpZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRlOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZnVuY3Rpb24gdmVyc2lvbih1dWlkKSB7XG4gIGlmICghdmFsaWRhdGUodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0ludmFsaWQgVVVJRCcpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlSW50KHV1aWQuc3Vic3RyKDE0LCAxKSwgMTYpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2ZXJzaW9uOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiLyoqXG4gKiBUaGlzIGlzIHlvdXIgbWFpbi4gVGhpcyBpcyB3aGVyZSB5b3UgcmUtZXhwb3J0IGV2ZXJ5dGhpbmcgeW91IHdhbnQgdG8gYmUgcHVibGljbHkgYXZhaWxhYmxlLlxuICpcbiAqIFRoZSBidWlsZCBlbmZvcmNlcyB0aGF0IHRoZSBmaWxlIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnbG9iYWwgdmFyaWFibGUgdGhhdCBpcyBleHBvcnRlZC5cbiAqL1xuXG5pbXBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbi8vIER1ZSB0byB0aGUgd2F5IHdlIGNvbmZpZ3VyZWQgd2VicGFjaywgd2Ugc2hvdWxkIGJlIGV4cG9ydGluZyB0aGluZ3Mgd2hpY2ggd2lsbCBiZSB1bmRlclxuLy8gYSBnbG9iYWwgdmFyaWFibGUgY2FsbGVkIFwidGFibGVhdVwiLiBFeHBvcnQgZXZlcnl0aGluZyB3ZSB3YW50IHRvIGJlIHZpc2libGUgdW5kZXIgdGFibGVhdVxuLy8gZnJvbSB0aGlzIGZpbGUuXG5pbXBvcnQgeyBFeHRlbnNpb25zSW1wbCB9IGZyb20gJy4vRXh0ZW5zaW9uc0FwaS9JbXBsL0V4dGVuc2lvbnNJbXBsJztcbmltcG9ydCB7IEV4dGVuc2lvbnMgfSBmcm9tICcuL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9FeHRlbnNpb25zJztcblxuZGVjbGFyZSBsZXQgVkVSU0lPTl9JU19BTFBIQTogYm9vbGVhbjtcbmNvbnN0IGlzQWxwaGE6IGJvb2xlYW4gPSB0eXBlb2YgVkVSU0lPTl9JU19BTFBIQSAhPT0gJ3VuZGVmaW5lZCcgPyBWRVJTSU9OX0lTX0FMUEhBIDogZmFsc2U7XG5cbmRlY2xhcmUgbGV0IEFQSV9WRVJTSU9OX05VTUJFUjogc3RyaW5nO1xuQXBpVmVyc2lvbi5TZXRWZXJzaW9uTnVtYmVyKHR5cGVvZiBBUElfVkVSU0lPTl9OVU1CRVIgIT09ICd1bmRlZmluZWQnID8gQVBJX1ZFUlNJT05fTlVNQkVSIDogJzAuMC4wJywgaXNBbHBoYSk7XG5cbmNvbnN0IGV4dGVuc2lvbkltcGwgPSBuZXcgRXh0ZW5zaW9uc0ltcGwoKTtcbmV4cG9ydCBjb25zdCBleHRlbnNpb25zID0gbmV3IEV4dGVuc2lvbnMoZXh0ZW5zaW9uSW1wbCk7XG5cbi8vIEV4cG9ydCBFbnVtc1xuLy8gVGhlc2Ugc2hvdyB1cCB1bmRlciB0aGUgdGFibGVhdSBvYmplY3QuIEkuZS4gdGFibGVhdS5FeHRlbnNpb25Db250ZXh0LlNlcnZlclxuZXhwb3J0IHtcbiAgQW5hbHl0aWNzT2JqZWN0VHlwZSxcbiAgQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSxcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLFxuICBEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZSxcbiAgRGF0YVR5cGUsXG4gIERhdGVSYW5nZVR5cGUsXG4gIERpYWxvZ1N0eWxlLFxuICBFbmNvZGluZ1R5cGUsXG4gIEVycm9yQ29kZXMsXG4gIEV4dGVuc2lvbkNvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlLFxuICBGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJEb21haW5UeXBlLFxuICBGaWx0ZXJOdWxsT3B0aW9uLFxuICBGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlLFxuICBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgTWFya1R5cGUsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgUGVyaW9kVHlwZSxcbiAgUXVpY2tUYWJsZUNhbGNUeXBlLFxuICBSZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zLFxuICBSZXBsYXlTcGVlZFR5cGUsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gIFNlbGVjdE9wdGlvbnMsXG4gIFNoZWV0VHlwZSxcbiAgU29ydERpcmVjdGlvbixcbiAgVGFibGVhdUV2ZW50VHlwZSxcbiAgVHJlbmRMaW5lTW9kZWxUeXBlLFxuICBWaXpJbWFnZUVuY29kaW5nVHlwZSxcbiAgVml6SW1hZ2VQYWxldHRlVHlwZSxcbiAgVml6SW1hZ2VTaXplU2V0dGluZ0FsaWdubWVudFR5cGUsXG4gIFZpekltYWdlU2l6ZVNldHRpbmdUeXBlLFxuICBWaXpJbWFnZVNvcnREaXJlY3Rpb25UeXBlLFxuICBab25lVmlzaWJpbGl0eVR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/lib/beta/tableau.extensions.1.latest.beta.min.js b/lib/beta/tableau.extensions.1.latest.beta.min.js new file mode 100644 index 00000000..698b2a75 --- /dev/null +++ b/lib/beta/tableau.extensions.1.latest.beta.min.js @@ -0,0 +1,2 @@ +(()=>{var e={1808:e=>{!function(){var t=new RegExp("^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$","i");function r(e){for(var t="",r=0;r{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7112);class n extends i.TableauEvent{constructor(e){super(a.TableauEventType.DashboardLayoutChanged),this._dashboardLayoutChangeDetails=e}get dashboardLayoutChangeDetails(){return this._dashboardLayoutChangeDetails}}t.DashboardLayoutChangedEvent=n},1672:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(5136),n=r(4144);class s extends n.TableauWorksheetEvent{constructor(e,t,r){super(a.TableauEventType.FilterChanged,e),this._fieldName=t,this._fieldId=r}get fieldName(){return this._fieldName}get fieldId(){return this._fieldId}getFilterAsync(){return this._worksheet.getFiltersAsync().then((e=>{const t=this.fieldId?e.find((e=>e.fieldId===this.fieldId),this):e.find((e=>e.fieldName===this.fieldName),this);if(!t)throw new i.TableauError(a.ErrorCodes.MissingFilter,`cannot find filter: ${this._fieldName}`);return t}))}}t.FilterChangedEvent=s},5572:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(4144);class n extends i.TableauWorksheetEvent{constructor(e){super(a.TableauEventType.MarkSelectionChanged,e)}getMarksAsync(){return this.worksheet.getSelectedMarksAsync()}}t.MarksSelectedEvent=n},864:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(5136),n=r(4592),s=r(3848),o=r(3248);class l extends o.TableauSheetEvent{constructor(e,t){super(a.TableauEventType.ParameterChanged,t),this._globalFieldName=e}getParameterAsync(){return i.ApiServiceRegistry.get(s.ExtensionsRegistryId).getService("parameters-service").findParameterByGlobalFieldNameAsync(this._globalFieldName).then((e=>{if(void 0===e)throw new i.TableauError(a.ErrorCodes.MissingParameter,`Cannot find parameter: ${this._globalFieldName}`);return new n.Parameter(e,this.sheet)}))}}t.ParameterChangedEvent=l},3464:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(4144);class n extends i.TableauWorksheetEvent{constructor(e){super(a.TableauEventType.SummaryDataChanged,e)}}t.SummaryDataChangedEvent=n},7112:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableauEvent=class{constructor(e){this._type=e}get type(){return this._type}}},3248:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7112);class i extends a.TableauEvent{constructor(e,t){super(e),this._sheet=t}get sheet(){return this._sheet}}t.TableauSheetEvent=i},4144:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3248);class i extends a.TableauSheetEvent{constructor(e,t){super(e,t),this._worksheet=t}get worksheet(){return this._worksheet}}t.TableauWorksheetEvent=i},4164:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7112);class n extends i.TableauEvent{constructor(e){super(a.TableauEventType.WorkbookFormattingChanged),this._formatting=e}get formatting(){return this._formatting}}t.WorkbookFormattingChangedEvent=n},4712:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(4144);class n extends i.TableauWorksheetEvent{constructor(e,t){super(a.TableauEventType.WorksheetFormattingChanged,e),this._formatting=t}get formatting(){return this._formatting}}t.WorksheetFormattingChangedEvent=n},92:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.BentonSansFontFamilyName="Benton Sans",t.BentonSansLowDPIFontFamilyName="Benton Sans Low-DPI",t.BentonSansBookFontFaceName="Benton Sans Book",t.BentonSansBookItalicFontFaceName="Benton Sans Book Italic",t.BentonSansSemiDemiFontFaceName="Benton Sans SemiDemi",t.BentonSansSemiDemiItalicFontFaceName="Benton Sans SemiDemi Italic",t.BentonSansLightFontFaceName="Benton Sans Light",t.BentonSansMediumFontFaceName="Benton Sans Medium",t.SupportedBentonSansFontFaces=[t.BentonSansBookFontFaceName,t.BentonSansBookItalicFontFaceName,t.BentonSansSemiDemiFontFaceName,t.BentonSansSemiDemiItalicFontFaceName,t.BentonSansLightFontFaceName,t.BentonSansMediumFontFaceName]},8396:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ConnectedServer=class{constructor(e,t,r,a){this._userId=e,this._siteId=t,this._siteNamespace=r,this._workbookId=a}get userId(){return this._userId}get siteId(){return this._siteId}get siteNamespace(){return this._siteNamespace}get workbookId(){return this._workbookId}}},5920:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136),i=r(3848);class n extends a.WorkbookImpl{getAllDataSourcesAsync(){return a.ApiServiceRegistry.get(i.ExtensionsRegistryId).getService("data-source-service").getAllDataSourcesAsync().then((e=>{const t=e,r=[];return Object.values(t.dataSources).forEach((e=>{r.push(this.createDataSourceFromInfo(e))})),r}))}createDataSourceFromInfo(e){const t=new a.DataSourceImpl(e,i.ExtensionsRegistryId),r=new a.DataSource(t);return t.initializeWithPublicInterfaces(r),r}}t.ExtensionWorkbookImpl=n},976:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136),s=r(4252),o=r(9224),l=r(5548),d=r(893),c=r(520),u=r(3032),h=r(1964),p=r(8012),m=r(7e3),g=r(6616),y=r(3848),I=r(92),v=r(5920),S=r(7269),T=r(5436),b=r(2200),f=r(1024);t.ExtensionsImpl=class{initializeAsync(e,t){return this._initializationPromise||(this._initializationPromise=new Promise(((r,a)=>{var s;const o={isAlpha:n.ApiVersion.Instance.isAlpha};if(S.LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise(o))null===(s=S.LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise(o))||void 0===s||s.then((r=>this.onDispatcherReceived(r,e,t))).then((e=>{r(e)})).catch((e=>{a(e)}));else{const s=this.onDispatcherReceived.bind(this);n.doCrossFrameBootstrap(window,i.INTERNAL_CONTRACT_VERSION,o).then((r=>s(r,e,t))).then((e=>{r(e)})).catch((e=>{a(e)}))}}))),this._initializationPromise}createVizImageAsync(e){return n.ApiServiceRegistry.get(y.ExtensionsRegistryId).getService("viz-service").createVizImageAsync(e)}setClickThroughAsync(e){return n.ApiServiceRegistry.get(y.ExtensionsRegistryId).getService("UIService").setClickThroughAsync(e,this.extensionZoneId)}isDashboardExtensionLocator(e){if(!e.dashboardPath)throw new n.TableauError(a.ErrorCodes.InternalError,"Unexpected error during initialization.");return!0}onDispatcherReceived(e,t,r){let a=e(i.INTERNAL_CONTRACT_VERSION);g.registerInitializationExtensionsServices(a);const s=n.ApiServiceRegistry.get(y.ExtensionsRegistryId).getService("InitializationService"),l=r?Object.keys(r):[];return s.initializeDashboardExtensionsAsync(t,l).then((e=>{const t=e.extensionEnvironment.platformVersion?e.extensionEnvironment.platformVersion:{major:1,minor:9,fix:0};return n.VersionedExternalApiDispatcher.needsVersionConverter(t)&&(a=new n.VersionedExternalApiDispatcher(a,t)),n.registerAllSharedServices(a,y.ExtensionsRegistryId),g.registerAllExtensionsServices(a),e.extensionDashboardInfo&&this.isDashboardExtensionLocator(e.extensionInstance.locator)&&(this.dashboardContent=this.initializeDashboardContent(e.extensionDashboardInfo,e.extensionInstance.locator.dashboardPath),this.extensionZoneId=e.extensionDashboardInfo.extensionZoneId),e.extensionWorksheetInfo&&(this.worksheetContent=this.initializeWorksheetContent(e.extensionWorksheetInfo)),this.environment=new c.Environment(e.extensionEnvironment),this.settings=this.initializeSettings(e.extensionSettingsInfo),this.ui=new h.UI(new f.UIImpl),this.workbook=new o.Workbook(new v.ExtensionWorkbookImpl),e.extensionEnvironment.workbookFormatting&&(this.initializeTableauFonts(a,e.extensionEnvironment.workbookFormatting),this.applyAllFormatting(e.extensionEnvironment.workbookFormatting)),this.initializeContextMenuCallbacks(r),this.initializeWorkbookFormattingChangedEventCallback(a),e.extensionDialogPayload}))}applyAllFormatting(e){if(this._styleElement||(this._styleElement=document.createElement("style"),this._styleElement.id="Tableau-Extension-Formatting",document.head.appendChild(this._styleElement)),!this._styleElement.sheet||!e)return;const t=this._styleElement.sheet;for(;t.cssRules.length>0;)t.deleteRule(t.cssRules.length-1);e.formattingSheets.map((e=>{this.applyFormattingSheetToStyleSheet(e,t)}))}applyFormattingSheetToStyleSheet(e,t){let r="";const a=e.cssProperties;a.fontFamily&&(r+="font-family: "+a.fontFamily.toString()+"; "),a.fontSize&&(r+="font-size: "+a.fontSize.toString()+"; "),a.fontWeight&&(r+="font-weight: "+a.fontWeight.toString()+"; "),a.fontStyle&&(r+="font-style: "+a.fontStyle.toString()+"; "),a.textDecoration&&(r+="text-decoration: "+a.textDecoration.toString()+"; "),a.color&&(r+="color: "+a.color+"; ");const i="."+e.classNameKey+" { "+r+" }";t.insertRule(i,t.cssRules.length)}initializeWorkbookFormattingChangedEventCallback(e){n.ApiServiceRegistry.get(y.ExtensionsRegistryId).getService("notification-service").registerHandler(i.NotificationId.WorkbookFormattingChanged,(()=>!0),(t=>{t&&(this.initializeTableauFonts(e,t),this.applyAllFormatting(t))}))}initializeTableauFonts(e,t){const r=[...I.SupportedBentonSansFontFaces,...b.SupportedTableauFontFaces];if(t.formattingSheets.forEach((e=>{e.cssProperties.fontFamily&&r.push(e.cssProperties.fontFamily)})),r.length>0){const t={[i.ParameterId.FontNameListItems]:r};e.execute(i.VerbId.GetFonts,t).then((e=>{this.loadFonts(e.result)})).catch()}}loadFonts(e){e.forEach((e=>{b.SupportedTableauFontFaces.includes(e.fontName)?this.loadTableauFonts(e):I.SupportedBentonSansFontFaces.includes(e.fontName)?this.loadBentonSansFonts(e):document.fonts.add(new FontFace(e.fontName,e.fontBinaryInfo))}))}initializeDashboardContent(e,t){const r=new n.SheetInfoImpl(e.name,a.SheetType.Dashboard,{width:e.size.w,height:e.size.h},void 0,!0),i=new n.DashboardImpl(r,e.zones,t,y.ExtensionsRegistryId,null,e.activeDashboardObjectId),o=new s.Dashboard(i);return new d.DashboardContent(o)}initializeWorksheetContent(e){const t=new n.SheetInfoImpl(e.visualId.worksheet,a.SheetType.Worksheet,{width:e.size.w,height:e.size.h},void 0,!0),r=new n.WorksheetImpl(t,y.ExtensionsRegistryId,e.visualId,null,null,e.backgroundColor,p.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(e.formatting)),i=new l.Worksheet(r);return new m.WorksheetContent(i)}initializeSettings(e){const t=new T.SettingsImpl(e);return new u.Settings(t)}initializeContextMenuCallbacks(e){n.ApiServiceRegistry.get(y.ExtensionsRegistryId).getService("notification-service").registerHandler(i.NotificationId.ContextMenuClick,(()=>!0),(t=>{if(e){if(!e[t.id])throw new n.TableauError(a.ErrorCodes.InternalError,`Received unexpected context menu Id from event: ${t.id}`);e[t.id]()}}))}loadTableauFonts(e){switch(e.fontName){case b.TableauBookFontFaceName:document.fonts.add(new FontFace(b.TableauBookFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case b.TableauLightFontFaceName:document.fonts.add(new FontFace(b.TableauLightFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case b.TableauRegularFontFaceName:document.fonts.add(new FontFace(b.TableauRegularFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case b.TableauSemiBoldFontFaceName:document.fonts.add(new FontFace(b.TableauSemiboldFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(b.TableauRegularFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case b.TableauBoldFontFaceName:document.fonts.add(new FontFace(b.TableauBoldFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(b.TableauBoldFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(b.TableauMediumFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(b.TableauSemiboldFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case b.TableauMediumFontFaceName:document.fonts.add(new FontFace(b.TableauMediumFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(b.TableauLightFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(b.TableauBookFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;default:throw new n.TableauError(a.ErrorCodes.InternalError,`'attempted to load unsupported font: ${e.fontName}.'`)}}loadBentonSansFonts(e){switch(e.fontName){case I.BentonSansBookFontFaceName:document.fonts.add(new FontFace(I.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(I.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"100",style:"normal"}));break;case I.BentonSansLightFontFaceName:document.fonts.add(new FontFace(I.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"100",style:"normal"}));break;case I.BentonSansMediumFontFaceName:document.fonts.add(new FontFace(I.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(I.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case I.BentonSansSemiDemiFontFaceName:document.fonts.add(new FontFace(I.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case I.BentonSansBookItalicFontFaceName:document.fonts.add(new FontFace(I.BentonSansFontFamilyName,e.fontBinaryInfo,{style:"italic"}));break;case I.BentonSansSemiDemiItalicFontFaceName:document.fonts.add(new FontFace(I.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{style:"italic"}));break;default:throw new n.TableauError(a.ErrorCodes.InternalError,`'attempted to load unsupported font: ${e.fontName}.'`)}}}},7269:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448);!function(e){function t(e){var t;return e&&void 0!==e.isAlpha||window.__warningIssued?(null===(t=e)||void 0===t?void 0:t.isAlpha)&&window.__platformIsOfficialRelease&&window.__tableauDesktopDispatcher.then((e=>{e(a.INTERNAL_CONTRACT_VERSION).execute(a.VerbId.BlockExtension,{}).catch()})).catch():(console.warn("This is a beta version of the Extensions API. Please upgrade to an official release."),window.__warningIssued=!0),window.__tableauDesktopDispatcher}e.getDesktopDispatcherPromise=t,e.hasDesktopApiDispatcherPromise=function(e){return!!t(e)}}(t.LegacyInternalApiDispatcherHolder||(t.LegacyInternalApiDispatcherHolder={}))},5436:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136),s=r(7112),o=r(3848);class l extends s.TableauEvent{constructor(e){super(a.TableauEventType.SettingsChanged),this._newSettings=e}get newSettings(){return this._newSettings}}class d{constructor(e){this._saveInProgress=!1,this.initializeSettings(e)}erase(e){n.ErrorHelpers.verifyParameter(e,"key"),this._currentSettings[e]&&(this.verifySettingsAreUnlocked(),delete this._currentSettings[e],this._isModified=!0)}get(e){return n.ErrorHelpers.verifyParameter(e,"key"),this._currentSettings[e]}getAll(){return Object.assign({},this._currentSettings)}get isModified(){return this._isModified}saveAsync(){return this.verifySettingsAreUnlocked(),this._isModified?(this._saveInProgress=!0,n.ApiServiceRegistry.get(o.ExtensionsRegistryId).getService("SettingsService").saveSettingsAsync(this._currentSettings).then((e=>(this._saveInProgress=!1,this._isModified=!1,void 0===this._currentSettings?this._currentSettings=e:Object.assign(this._currentSettings,e),e)),(e=>(this._saveInProgress=!1,Promise.reject(e))))):Promise.resolve(this._currentSettings)}set(e,t){n.ErrorHelpers.verifyStringParameter(e,"key"),n.ErrorHelpers.verifyParameter(t,"value"),this.verifySettingsAreUnlocked(),this._currentSettings[e]=t,this._isModified=!0}initializeEvents(){const e=new Array;let t;try{t=n.ApiServiceRegistry.get(o.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new n.SingleEventManagerImpl(a.TableauEventType.SettingsChanged);return t.registerHandler(i.NotificationId.SettingsChanged,(()=>!0),(e=>{this._currentSettings=e.newSettings,r.triggerEvent((()=>new l(e.newSettings)))})),e.push(r),e}initializeSettings(e){n.ErrorHelpers.verifyParameter(e,"settingsInfo"),n.ErrorHelpers.verifyParameter(e.settingsValues,"settingsInfo.SettingsValues"),this._currentSettings=e.settingsValues,this._isModified=!1}verifySettingsAreUnlocked(){if(this._saveInProgress)throw new n.TableauError(a.ErrorCodes.SettingSaveInProgress,d.ASYNC_SAVE_IN_PROGRESS)}}t.SettingsImpl=d,d.ASYNC_SAVE_IN_PROGRESS="Async Save is in progress, updating settings is not allowed."},2200:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableauBookFontFamilyName="Tableau Book",t.TableauLightFontFamilyName="Tableau Light",t.TableauRegularFontFamilyName="Tableau Regular",t.TableauMediumFontFamilyName="Tableau Medium",t.TableauSemiboldFontFamilyName="Tableau Semibold",t.TableauBoldFontFamilyName="Tableau Bold",t.TableauBookFontFaceName="Tableau Book",t.TableauBoldFontFaceName="Tableau Bold",t.TableauLightFontFaceName="Tableau Light",t.TableauMediumFontFaceName="Tableau Medium",t.TableauRegularFontFaceName="Tableau Regular",t.TableauSemiBoldFontFaceName="Tableau Semi Bold",t.SupportedTableauFontFaces=[t.TableauBookFontFaceName,t.TableauBoldFontFaceName,t.TableauLightFontFaceName,t.TableauMediumFontFaceName,t.TableauRegularFontFaceName,t.TableauSemiBoldFontFaceName]},1024:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7419),n=r(3448),s=r(5136),o=r(7112),l=r(3848);class d extends o.TableauEvent{constructor(e){super(a.TableauEventType.DialogMessageReceived),this.message=e}}t.DialogMessageEvent=d,t.UIImpl=class{constructor(){}displayDialogAsync(e,t,r){const o=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService"),d=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service");return new Promise(((l,c)=>{o.displayDialogAsync(e,t||"",r).then((()=>{const e=d.registerHandler(n.NotificationId.ExtensionDialogUpdate,(()=>!0),(t=>{if(t.isCloseEvent){if(void 0===t.closePayload)throw new s.TableauError(a.ErrorCodes.InternalError,"closePayload is undefined");l(t.closePayload)}else c(new s.TableauError(i.ErrorCodes.DialogClosedByUser,"Extension dialog closed by user."));e()}))})).catch((e=>{c(e)}))}))}sendDialogMessageAsync(e,t){s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService").sendDialogMessageAsync(e,t)}closeDialog(e){s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService").closeDialog(e)}initializeEvents(){const e=new Array;let t;try{t=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new s.SingleEventManagerImpl(a.TableauEventType.DialogMessageReceived);return t.registerHandler(n.NotificationId.ExtensionDialogMessage,(()=>!0),(e=>{r.triggerEvent((()=>new d(e.message)))})),e.push(r),e}}},4252:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136),s=r(6416),o=r(4164),l=r(3848),d=r(3192),c=r(8512),u=r(5548);class h extends c.Sheet{constructor(e){super(e),this._dashboardImpl=e,e.initializeWithPublicInterfaces(),this.initializeEvents().forEach((e=>this.addNewEventType(e)))}get worksheets(){return this._dashboardImpl.worksheetsImpl.map((e=>new u.Worksheet(e)))}get objects(){return this._dashboardImpl.objects.map((e=>new d.DashboardObject(e)))}get activeDashboardObjectId(){return this._dashboardImpl.activeDashboardObjectId}get activeDashboardName(){return this._dashboardImpl.activeDashboardName}setZoneVisibilityAsync(e){return this._dashboardImpl.setDashboardObjectVisibilityAsync(e)}setDashboardObjectVisibilityAsync(e){return this._dashboardImpl.setDashboardObjectVisibilityAsync(e)}getDashboardObjectById(e){const t=this._dashboardImpl.getDashboardObjectById(e);return t&&new d.DashboardObject(t)}initializeEvents(){const e=new Array;let t;try{t=n.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new n.SingleEventManagerImpl(a.TableauEventType.DashboardLayoutChanged);t.registerHandler(i.NotificationId.DashboardLayoutChanged,(()=>!0),(e=>{const t=this._dashboardImpl.updateZones(e.zones,e.activeZoneId,e.activeDashboardName);r.triggerEvent((()=>new s.DashboardLayoutChangedEvent(t)))})),e.push(r);const d=new n.SingleEventManagerImpl(a.TableauEventType.WorkbookFormattingChanged);return t.registerHandler(i.NotificationId.WorkbookFormattingChanged,(()=>!0),(e=>{d.triggerEvent((()=>new o.WorkbookFormattingChangedEvent(e)))})),e.push(d),e}moveAndResizeDashboardObjectsAsync(e){return this._dashboardImpl.moveAndResizeDashboardObjectsAsync(e)}replayAnimationAsync(e){return this._dashboardImpl.replayAnimationAsync(e)}getFiltersAsync(){return this._dashboardImpl.getFiltersAsync()}applyFilterAsync(e,t,r,a){return this._dashboardImpl.applyFilterAsync(e,t,r,a)}}t.Dashboard=h},3192:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(4252),i=r(5548);t.DashboardObject=class{constructor(e){this._dashboardObjectImpl=e}get dashboard(){return new a.Dashboard(this._dashboardObjectImpl.dashboardImpl)}get type(){return this._dashboardObjectImpl.type}get position(){return this._dashboardObjectImpl.position}get size(){return this._dashboardObjectImpl.size}get worksheet(){if(this._dashboardObjectImpl.worksheetImpl)return new i.Worksheet(this._dashboardObjectImpl.worksheetImpl)}get name(){return this._dashboardObjectImpl.name}get isFloating(){return this._dashboardObjectImpl.isFloating}get isVisible(){return this._dashboardObjectImpl.isVisible}get id(){return this._dashboardObjectImpl.id}get fieldId(){return this._dashboardObjectImpl.fieldId}}},4592:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136),s=r(864),o=r(3848);class l extends n.EventListenerManager{constructor(e,t){super(),this.parameterImpl=e,this.initializeEvents(t).forEach((e=>this.addNewEventType(e)))}get name(){return this.parameterImpl.name}get currentValue(){return this.parameterImpl.currentValue}get dataType(){return this.parameterImpl.dataType}get allowableValues(){return this.parameterImpl.allowableValues}get id(){return this.parameterImpl.id}changeValueAsync(e){return this.parameterImpl.changeValueAsync(e)}initializeEvents(e){n.ErrorHelpers.verifyInternalValue(e,"sheet");const t=new Array;let r;try{r=n.ApiServiceRegistry.get(o.ExtensionsRegistryId).getService("notification-service")}catch(e){return t}const l=new n.SingleEventManagerImpl(a.TableauEventType.ParameterChanged);return r.registerHandler(i.NotificationId.ParameterChanged,(e=>e===this.parameterImpl.id),(t=>{l.triggerEvent((()=>new s.ParameterChangedEvent(t,e)))})),t.push(l),t}}t.Parameter=l},8512:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(5136),n=r(4592);class s extends i.EventListenerManager{constructor(e){super(),this._sheetImpl=e}get name(){return this._sheetImpl.name}get sheetType(){return this._sheetImpl.sheetType}get size(){if(this.isValidSize(this._sheetImpl.size))return this._sheetImpl.size;throw new i.TableauError(a.EmbeddingErrorCodes.ImplementationError,"Size not implemented")}isValidSize(e){const t=e;return void 0!==t.width&&void 0!==t.height}findParameterAsync(e){return this._sheetImpl.findParameterAsync(e).then((e=>new Promise(e?t=>t(new n.Parameter(e,this)):e=>e(void 0))))}getParametersAsync(){return this._sheetImpl.getParametersAsync().then((e=>e.map((e=>new n.Parameter(e,this)))))}}t.Sheet=s},9224:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Workbook=class{constructor(e){this._workbookImpl=e}getAllDataSourcesAsync(){return this._workbookImpl.getAllDataSourcesAsync()}}},5548:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7419),n=r(3448),s=r(5136),o=r(1672),l=r(5572),d=r(3464),c=r(4712),u=r(3848),h=r(4252),p=r(8512);class m extends p.Sheet{constructor(e){super(e),this._worksheetImpl=e,this.initializeEvents().forEach((e=>this.addNewEventType(e)))}get parentDashboard(){if(null==this._worksheetImpl.parentDashboard)throw new s.TableauError(a.SharedErrorCodes.ImplementationError,"Parent dashboard not implemented");return new h.Dashboard(this._worksheetImpl.parentDashboard)}get backgroundColor(){if(null==this._worksheetImpl.backgroundColor)throw new s.TableauError(a.SharedErrorCodes.ImplementationError,"Worksheet background color is not available");return this._worksheetImpl.backgroundColor}get formatting(){if(null==this._worksheetImpl.formatting)throw new s.TableauError(a.SharedErrorCodes.ImplementationError,"Worksheet formatting information is not available");return this._worksheetImpl.formatting}initializeEvents(){const e=new Array;let t;try{t=s.ApiServiceRegistry.get(u.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new s.SingleEventManagerImpl(i.TableauEventType.MarkSelectionChanged);t.registerHandler(n.NotificationId.SelectedMarksChanged,(e=>{const t=e;return this.visualIdsAreEqual(t,this._worksheetImpl.visualId)}),(()=>r.triggerEvent((()=>new l.MarksSelectedEvent(this)))));const a=new s.SingleEventManagerImpl(i.TableauEventType.FilterChanged);t.registerHandler(n.NotificationId.FilterChanged,(e=>{const t=e;return this._worksheetImpl.visualId.worksheet===t.visualId.worksheet}),(e=>{a.triggerEvent((()=>new o.FilterChangedEvent(this,e.fieldName,e.fieldId)))}));const h=new s.SingleEventManagerImpl(i.TableauEventType.SummaryDataChanged);t.registerHandler(n.NotificationId.SummaryDataChanged,(e=>{const t=e;return this._worksheetImpl.visualId.worksheet===t.visualId.worksheet}),(e=>{h.triggerEvent((()=>new d.SummaryDataChangedEvent(this)))}));const p=new s.SingleEventManagerImpl(i.TableauEventType.WorksheetFormattingChanged);return t.registerHandler(n.NotificationId.WorksheetFormattingChanged,(e=>{const t=e;return this._worksheetImpl.visualId.worksheet===t.visualId.worksheet}),(e=>{p.triggerEvent((()=>new c.WorksheetFormattingChangedEvent(this,e)))})),e.push(r),e.push(a),e.push(h),e.push(p),e}applyFilterAsync(e,t,r,a){return this._worksheetImpl.applyFilterAsync(e,t,r,a)}applyRangeFilterAsync(e,t){return this._worksheetImpl.applyRangeFilterAsync(e,t)}applyHierarchicalFilterAsync(e,t,r,a){return this._worksheetImpl.applyHierarchicalFilterAsync(e,t,r,a)}applyRelativeDateFilterAsync(e,t){return this._worksheetImpl.applyRelativeDateFilterAsync(e,t)}clearFilterAsync(e){return this._worksheetImpl.clearFilterAsync(e)}getDataSourcesAsync(){return this._worksheetImpl.getDataSourcesAsync()}getFiltersAsync(){return this._worksheetImpl.getFiltersAsync()}getSelectedMarksAsync(){return this._worksheetImpl.getSelectedMarksAsync()}getHighlightedMarksAsync(){return this._worksheetImpl.getHighlightedMarksAsync()}getSummaryDataAsync(e){return this._worksheetImpl.getSummaryDataAsync(e)}getSummaryDataReaderAsync(e,t){return this._worksheetImpl.getSummaryDataReaderAsync(e,t)}getSummaryColumnsInfoAsync(){return this._worksheetImpl.getSummaryColumnsInfoAsync()}getUnderlyingDataAsync(e){return console.warn("Worksheet.getUnderlyingDataAsync is deprecated. Please use Worksheet.getUnderlyingTablesAsync and Worksheet.getUnderlyingTableDataAsync"),this._worksheetImpl.getUnderlyingDataAsync(e)}getUnderlyingTablesAsync(){return this._worksheetImpl.getUnderlyingTablesAsync()}getUnderlyingTableDataAsync(e,t){return this._worksheetImpl.getUnderlyingTableDataAsync(e,t)}getUnderlyingTableDataReaderAsync(e,t,r){return this._worksheetImpl.getUnderlyingTableDataReaderAsync(e,t,r)}getVisualSpecificationAsync(){return this._worksheetImpl.getVisualSpecificationAsync()}addMarksCardFieldsAsync(e,t,r,a){return this._worksheetImpl.addMarksCardFieldsAsync(e,t,r,a)}moveMarksCardFieldAsync(e,t,r,a=1){return this._worksheetImpl.moveMarksCardFieldAsync(e,t,r,a)}spliceMarksCardFieldsAsync(e,t,r,a,i){return this._worksheetImpl.spliceMarksCardFieldsAsync(e,t,r,a,i)}clearSelectedMarksAsync(){return this._worksheetImpl.clearSelectedMarksAsync()}selectMarksByIDAsync(e,t){return this._worksheetImpl.selectMarksByIdAsync(e,t)}selectMarksByValueAsync(e,t){return this._worksheetImpl.selectMarksByValueAsync(e,t)}selectMarksByIdAsync(e,t){return this._worksheetImpl.selectMarksByIdAsync(e,t)}annotateMarkAsync(e,t){return this._worksheetImpl.annotateMarkAsync(e,t)}getAnnotationsAsync(){return this._worksheetImpl.getAnnotationsAsync()}removeAnnotationAsync(e){return this._worksheetImpl.removeAnnotationAsync(e)}hoverTupleAsync(e,t,r=!0){return this._worksheetImpl.hoverTupleAsync(e,t,r)}selectTuplesAsync(e,t,r){return this._worksheetImpl.selectTuplesAsync(e,t,r)}getTooltipTextAsync(e){return this._worksheetImpl.getTooltipTextAsync(e)}leaveMarkNavigationAsync(){return this._worksheetImpl.leaveMarkNavigationAsync()}editAliasesDialogAsync(e){return this._worksheetImpl.editAliasesDialogAsync(e)}visualIdsAreEqual(e,t){return e&&t&&e.worksheet===t.worksheet&&e.dashboard===t.dashboard&&e.storyboard===t.storyboard&&e.storyPointID===t.storyPointID}}t.Worksheet=m},893:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DashboardContent=class{constructor(e){this._dashboard=e}get dashboard(){return this._dashboard}}},520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136),i=r(8396),n=r(8012);t.Environment=class{constructor(e){this._apiVersion=a.ApiVersion.Instance&&a.ApiVersion.Instance.formattedValue,this._context=a.InternalToExternalEnumMappings.extensionContext.convert(e.extensionContext),this._formatting=n.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(e.workbookFormatting),this._language=e.extensionLanguage,this._country=e.extensionCountry,this._locale=e.extensionLocale,this._mode=a.InternalToExternalEnumMappings.extensionMode.convert(e.extensionMode),this._operatingSystem=e.operatingSystem,this._tableauVersion=e.tableauVersion,this._uniqueUserId=e.uniqueUserId,e.userId&&(this.connectedServer=new i.ConnectedServer(e.userId,e.siteId,e.siteNamespace,e.workbookId),this.featureFlags=e.featureFlags)}get apiVersion(){return this._apiVersion}get context(){return this._context}get workbookFormatting(){return this._formatting}get language(){return this._language}get country(){return this._country}get locale(){return this._locale}get mode(){return this._mode}get operatingSystem(){return this._operatingSystem}get tableauVersion(){return this._tableauVersion}get uniqueUserId(){return this._uniqueUserId}}},5408:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Extensions=class{constructor(e){this.extensionImpl=e,this.extensionImpl=e}get dashboardContent(){return this.extensionImpl.dashboardContent}get worksheetContent(){return this.extensionImpl.worksheetContent}get environment(){return this.extensionImpl.environment}get settings(){return this.extensionImpl.settings}get ui(){return this.extensionImpl.ui}get workbook(){return this.extensionImpl.workbook}get dashboardObjectId(){return this.extensionImpl.extensionZoneId}initializeAsync(e){return this.extensionImpl.initializeAsync(!1,e).then()}initializeDialogAsync(){return this.extensionImpl.initializeAsync(!0)}createVizImageAsync(e){return this.extensionImpl.createVizImageAsync(e)}setClickThroughAsync(e){return this.extensionImpl.setClickThroughAsync(e)}}},3032:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136);class i extends a.EventListenerManager{constructor(e){super(),this._settingsImpl=e,this._settingsImpl.initializeEvents().forEach((e=>this.addNewEventType(e)))}erase(e){this._settingsImpl.erase(e)}get(e){return this._settingsImpl.get(e)}getAll(){return this._settingsImpl.getAll()}get isModified(){return this._settingsImpl.isModified}saveAsync(){return this._settingsImpl.saveAsync()}set(e,t){this._settingsImpl.set(e,t)}}t.Settings=i},1964:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136);class i extends a.EventListenerManager{constructor(e){super(),this._impl=e,this._impl.initializeEvents().forEach((e=>this.addNewEventType(e)))}displayDialogAsync(e,t,r){return this._impl.displayDialogAsync(e,t,r)}sendDialogMessageAsync(e,t){return this._impl.sendDialogMessageAsync(e,t)}closeDialog(e){this._impl.closeDialog(e)}}t.UI=i},8012:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136);t.WorkbookFormattingEnvUtil=class{static convertToWorkbookFormatting(e){if(e)return{formattingSheets:e.formattingSheets.map((e=>{return{classNameKey:a.InternalToExternalEnumMappings.classNameKey.convert(e.classNameKey),cssProperties:(t=e.classNameKey,r=e.cssProperties,"tableau-row-dividers"===t||"tableau-column-dividers"===t?{borderColor:r.borderColor,borderStyle:r.borderStyle,borderWidth:r.borderWidth}:{fontFamily:r.fontFamily,fontSize:r.fontSize,fontWeight:r.fontWeight,fontStyle:r.fontStyle,textDecoration:r.textDecoration,color:r.color})};var t,r}))}}}},7e3:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorksheetContent=class{constructor(e){this._worksheet=e}get worksheet(){return this._worksheet}}},6336:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(5136);class n extends i.ServiceImplBase{get serviceName(){return"InitializationService"}initializeDashboardExtensionsAsync(e,t){const r={[a.ParameterId.FunctionName]:"initializeDashboardExtensionsAsync",[a.ParameterId.ExtensionContextMenuIds]:t,[a.ParameterId.IsExtensionDialog]:e};return this.execute(a.VerbId.InitializeExtension,r).then((e=>e.result))}}t.InitializationServiceImpl=n},5432:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136);class s extends n.ServiceImplBase{get serviceName(){return"SettingsService"}saveSettingsAsync(e){const t={[i.ParameterId.FunctionName]:"saveSettingsAsync",[i.ParameterId.SettingsValues]:e};return this.execute(i.VerbId.SaveExtensionSettings,t).then((e=>{const t=e.result;if(!t||!t.settingsValues)throw new n.TableauError(a.ErrorCodes.InternalError,"Unexpected error savings settings.");return t.settingsValues}))}}t.SettingsServiceImpl=s},752:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136),s=a.DialogStyle.Window;class o extends n.ServiceImplBase{get serviceName(){return"UIService"}displayDialogAsync(e,t,r){const o={[i.ParameterId.FunctionName]:"displayDialogAsync",[i.ParameterId.ExtensionDialogUrl]:e,[i.ParameterId.ExtensionDialogPayload]:t},l=r&&r.height?r.height:400,d=r&&r.width?r.width:600,c=r&&r.dialogStyle?r.dialogStyle:s;if(l<=0||d<=0)throw new n.TableauError(a.ErrorCodes.InvalidParameter,"Size parameters for displayDialogAsync must be positive");return o[i.ParameterId.ExtensionDialogH]=l,o[i.ParameterId.ExtensionDialogW]=d,n.ErrorHelpers.verifyEnumValue(c,a.DialogStyle,"DialogStyle"),o[i.ParameterId.ExtensionDialogStyle]=n.ExternalToInternalEnumMappings.dialogStyles.convert(c),this.execute(i.VerbId.DisplayDialog,o).then((e=>{switch(e.result){case i.ExtensionDialogResult.DialogAlreadyOpen:throw new n.TableauError(a.ErrorCodes.DialogAlreadyOpen,"There already exists an open dialog for this extension.");case i.ExtensionDialogResult.InvalidDomain:throw new n.TableauError(a.ErrorCodes.InvalidDomainDialog,"The url of an extension dialog must match the domain of the parent extension.");default:return}}))}closeDialog(e){const t={[i.ParameterId.FunctionName]:"closeDialog"};return e&&(t[i.ParameterId.ExtensionDialogPayload]=e),this.execute(i.VerbId.CloseDialog,t).then((()=>{}))}sendDialogMessageAsync(e,t){const r={[i.ParameterId.FunctionName]:"sendDialogMessage",[i.ParameterId.ExtensionDialogMessage]:e};return t&&(r[i.ParameterId.ExtensionDialogUrl]=t),this.execute(i.VerbId.SendDialogMessage,r).then((()=>{}))}setClickThroughAsync(e,t){if(n.ErrorHelpers.verifyParameterType(e,"boolean","clickThroughEnabled"),void 0===t||t<=0)throw new n.TableauError(a.ErrorCodes.InternalError,"Extension Id is invalid.");const r={[i.ParameterId.ExtensionZoneId]:t,[i.ParameterId.ClickThroughEnabled]:e};return this.execute(i.VerbId.SetClickThrough,r).then((()=>{}))}}t.UIServiceImpl=o},6616:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136),i=r(6336),n=r(5432),s=r(752),o=r(3848);t.registerAllExtensionsServices=function(e){a.ApiServiceRegistry.get(o.ExtensionsRegistryId).registerService(new n.SettingsServiceImpl(e,o.ExtensionsRegistryId)),a.ApiServiceRegistry.get(o.ExtensionsRegistryId).registerService(new s.UIServiceImpl(e,o.ExtensionsRegistryId))},t.registerInitializationExtensionsServices=function(e){a.ApiServiceRegistry.get(o.ExtensionsRegistryId).registerService(new i.InitializationServiceImpl(e,o.ExtensionsRegistryId))}},3848:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExtensionsRegistryId=0},268:(e,t,r)=>{"use strict";function a(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),a(r(4171));var i=r(3536);t.ApiMenuType=i.ApiMenuType,t.CrosstabFileFormat=i.CrosstabFileFormat,t.DeviceType=i.DeviceType,t.EmbeddingErrorCodes=i.EmbeddingErrorCodes,t.EmbeddingTableauEventType=i.TableauEventType,t.FileFormats=i.FileFormats,t.PrintOrientation=i.PrintOrientation,t.PrintPageSize=i.PrintPageSize,t.PrintScaling=i.PrintScaling,t.PulseErrorMessageVisibility=i.PulseErrorMessageVisibility,t.PulseLayout=i.PulseLayout,t.PulseTimeDimension=i.PulseTimeDimension,t.SheetSizeBehavior=i.SheetSizeBehavior,t.TableauDialogType=i.TableauDialogType,t.Toolbar=i.Toolbar,a(r(828)),a(r(3432)),a(r(1480)),a(r(5488))},5840:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=r(4744);t.ErrorCodes=a.ErrorCodes,t.ExtensionContext=a.ExtensionContext,t.ExtensionMode=a.ExtensionMode,t.TableauEventType=a.TableauEventType,t.VizImageEncodingType=a.VizImageEncodingType,t.VizImagePaletteType=a.VizImagePaletteType,t.VizImageSizeSettingAlignmentType=a.VizImageSizeSettingAlignmentType,t.VizImageSizeSettingType=a.VizImageSizeSettingType,t.VizImageSortDirectionType=a.VizImageSortDirectionType,function(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}(r(5488))},7419:(e,t,r)=>{"use strict";function a(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),a(r(268)),a(r(5840))},4171:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.AskDataAttributes||(t.AskDataAttributes={})).Origin="origin",r.ShowEmbed="show-embed",r.ShowPin="show-pin",r.ShowSave="show-save",r.ShowShare="show-share"},3536:(e,t)=>{"use strict";var r,a,i,n,s,o,l,d,c,u,h,p,m,g,y,I;Object.defineProperty(t,"__esModule",{value:!0}),(I=t.CrosstabFileFormat||(t.CrosstabFileFormat={})).CSV="csv",I.Excel="xlsx",(y=t.DeviceType||(t.DeviceType={})).Default="default",y.Desktop="desktop",y.Tablet="tablet",y.Phone="phone",(g=t.EmbeddingErrorCodes||(t.EmbeddingErrorCodes={})).AuthFailed="auth-failed",g.BrowserNotCapable="browser-not-capable",g.DownloadWorkbookNotAllowed="download-workbook-not-allowed",g.FilterCannotBePerformed="filter-cannot-be-performed",g.IndexOutOfRange="index-out-of-range",g.InternalError="internal-error",g.InvalidCustomViewName="invalid-custom-view-name",g.InvalidDateParameter="invalid-date-parameter",g.invalidFilterFieldNameOrValue="invalid-filter-field-name",g.InvalidParameter="invalid-parameter",g.InvalidTimeDimension="invalid-time-dimension",g.InvalidSize="invalid-size",g.InvalidSheetType="invalid-sheet-type",g.InvalidSizeBehavior="invalid-size-behavior",g.InvalidSizeBehaviorOnWorksheet="invalid-size-behavior-on-worksheet",g.InvalidUrl="invalid-url",g.MissingMaxSize="missing-max-size",g.MissingMinSize="missing-min-size",g.MissingMinMaxSize="missing-min-max-size",g.MissingParameter="missing-parameter",g.MissingRangeNForRelativeDateFilters="missing-range-n-for-relative-date-filters",g.NoUrlForHiddenWorksheet="no-url-for-hidden-worksheet",g.NoUrlOrParentElementNotFound="no-url-or-parent-element-not-found",g.NotActiveSheet="not-active-sheet",g.NullOrEmptyParameter="null-or-empty-parameter",g.SheetNotInWorkbook="sheet-not-in-workbook",g.StaleDataReference="stale-data-reference",g.UnknownAuthError="unknown-auth-error",g.UnsupportedEventName="unsupported-event-name",g.VizAlreadyInManager="viz-already-in-manager",g.ImplementationError="wrong-implementation",g.NotImplemented="not-implemented",g.EventInitializationError="event-initialization-error",g.IncompatibleVersionError="incompatible-version-error",g.UnknownDialogType="unknown-dialog-type",g.FilterMissingOrNotImplemented="filter-missing-not-implemented",g.StoryPointIdMismatch="storypoint-id-mismatch",(m=t.FileFormats||(t.FileFormats={})).PDF="pdf",m.PNG="png",(p=t.PrintOrientation||(t.PrintOrientation={})).Portrait="portrait",p.Landscape="landscape",(h=t.PrintPageSize||(t.PrintPageSize={})).Letter="letter",h.Legal="legal",h.Note="note",h.Folio="folio",h.Tabloid="tabloid",h.Ledger="ledger",h.Statement="statement",h.Executive="executive",h.A3="A3",h.A4="A4",h.A5="A5",h.B4="B4",h.B5="B5",h.Quarto="quarto",h.Unspecified="unspecified",(u=t.PrintScaling||(t.PrintScaling={})).Automatic="automatic",u.Perc25="25%",u.Perc50="50%",u.Perc60="60%",u.Perc75="75%",u.Perc80="80%",u.Perc90="90%",u.Perc100="100%",u.Perc200="200%",u.Perc400="400%",u.AtMost1PageHigh="at-most-1-page-high",u.AtMost2PagesHigh="at-most-2-pages-high",u.AtMost1PageWide="at-most-1-page-wide",u.AtMost2PagesWide="at-most-2-pages-wide",(c=t.RevertVizSelection||(t.RevertVizSelection={})).All="all",c.Axes="axes",c.Filters="filters",c.Sorts="sorts",c.Shelves="shelves",(d=t.ToolbarButtons||(t.ToolbarButtons={})).Alerts="alerts",d.AskData="askData",d.CustomViews="customViews",d.DataDetails="dataDetails",d.Share="share",d.Subscribe="subscribe",(l=t.Toolbar||(t.Toolbar={})).Top="top",l.Bottom="bottom",l.Hidden="hidden",(o=t.SheetSizeBehavior||(t.SheetSizeBehavior={})).Automatic="automatic",o.Exactly="exactly",o.Range="range",o.AtLeast="atleast",o.AtMost="atmost",(s=t.PulseLayout||(t.PulseLayout={})).Default="default",s.Card="card",s.Ban="ban",(n=t.PulseTimeDimension||(t.PulseTimeDimension={})).Today="Today",n.Yesterday="Yesterday",n.WeekToDate="WeekToDate",n.LastWeek="LastWeek",n.MonthToDate="MonthToDate",n.LastMonth="LastMonth",n.QuarterToDate="QuarterToDate",n.LastQuarter="LastQuarter",n.YearToDate="YearToDate",n.LastYear="LastYear",(i=t.PulseErrorMessageVisibility||(t.PulseErrorMessageVisibility={})).Visible="visible",i.Hidden="hidden",i.Suppressed="suppressed",(a=t.TableauEventType||(t.TableauEventType={})).CustomViewLoaded="customviewloaded",a.CustomViewRemoved="customviewremoved",a.CustomViewSaved="customviewsaved",a.CustomViewSetDefault="customviewsetdefault",a.EditButtonClicked="editbuttonclicked",a.EditInDesktopButtonClicked="editindesktopbuttonclicked",a.FilterChanged="filterchanged",a.FirstVizSizeKnown="firstvizsizeknown",a.FirstInteractive="firstinteractive",a.CustomMarkContextMenuEvent="custommarkcontextmenu",a.MarkSelectionChanged="markselectionchanged",a.ParameterChanged="parameterchanged",a.ToolbarStateChanged="toolbarstatechanged",a.WorkbookReadyToClose="workbookreadytoclose",a.WorkbookPublished="workbookpublished",a.WorkbookPublishedAs="workbookpublishedas",a.UrlAction="urlaction",a.TabSwitched="tabswitched",a.StoryPointSwitched="storypointswitched",a.VizLoadError="vizloaderror",a.IframeSrcUpdated="iframesrcupdated",a.SummaryDataChanged="summarydatachanged",a.ReadyToReceiveAuthToken="readytoreceiveauthtoken",a.FirstPulseMetricSizeKnown="firstpulsemetricsizeknown",a.PulseError="pulseerror",a.PulseFiltersChanged="pulsefilterschanged",a.PulseInsightDiscovered="pulseinsightdiscovered",a.PulseMetricSizeChanged="pulsemetricsizechanged",a.PulseTimeDimensionChanged="pulsetimedimensionchanged",a.PulseUrlChanged="pulseurlchanged",(t.ApiMenuType||(t.ApiMenuType={})).Ubertip="ubertip",(r=t.TableauDialogType||(t.TableauDialogType={})).ExportPDF="export-pdf",r.ExportPowerPoint="export-powerpoint",r.ExportData="export-data",r.ExportCrossTab="export-cross-tab",r.ExportWorkbook="export-workbook",r.Share="share"},828:(e,t)=>{"use strict";var r,a,i;Object.defineProperty(t,"__esModule",{value:!0}),(i=t.PulseAttributes||(t.PulseAttributes={})).DisableExploreFilter="disable-explore-filter",i.Layout="layout",i.OnFirstInteractive="onFirstInteractive",i.OnFirstPulseMetricSizeKnown="onFirstPulseMetricSizeKnown",i.OnPulseUrlError="onPulseError",i.OnPulseFiltersChanged="onPulseFiltersChanged",i.OnPulseInsightDiscovered="onPulseInsightDiscovered",i.OnPulseMetricSizeChanged="onPulseMetricSizeChanged",i.OnPulseTimeDimensionChanged="onPulseTimeDimensionChanged",i.OnPulseUrlChanged="onPulseUrlChanged",i.TimeDimension="time-dimension",i.TokenOptional="token-optional",(a=t.PulseChildElements||(t.PulseChildElements={})).IframeStyle="iframe-style",a.ThemeParameter="theme-parameter",a.PulseFilter="pulse-filter",(r=t.PulseChildElementAttributes||(t.PulseChildElementAttributes={})).Name="name",r.Field="field",r.Value="value",r.Type="type"},3432:(e,t)=>{"use strict";var r,a,i,n,s;Object.defineProperty(t,"__esModule",{value:!0}),(s=t.VizSharedAttributes||(t.VizSharedAttributes={})).TouchOptimize="touch-optimize",s.HideEditInDesktopButton="hide-edit-in-desktop-button",s.SuppressDefaultEditBehavior="suppress-default-edit-behavior",s.DisableVersionCheck="disable-version-check",s.OnEditInDesktopButtonClicked="onEditInDesktopButtonClicked",s.OnFirstVizSizeKnown="onFirstVizSizeKnown",s.OnFirstInteractive="onFirstInteractive",(n=t.VizAttributes||(t.VizAttributes={})).DisableUrlActionsPopups="disable-url-actions",n.HideTabs="hide-tabs",n.Toolbar="toolbar",n.InstanceIdToClone="instance-id-to-clone",n.Device="device",n.HideEditButton="hide-edit-button",n.OnEditButtonClicked="onEditButtonClicked",n.OnFilterChanged="onFilterChanged",n.OnCustomMarkContextMenuEvent="onCustomMarkContextMenuEvent",n.OnMarkSelectionChanged="onMarkSelectionChanged",n.OnParameterChanged="onParameterChanged",n.OnToolbarStateChanged="onToolbarStateChanged",n.OnUrlAction="onUrlAction",n.OnTabSwitched="onTabSwitched",n.OnCustomViewLoaded="onCustomViewLoaded",n.OnCustomViewRemoved="onCustomViewRemoved",n.OnCustomViewSaved="onCustomViewSaved",n.OnCustomViewSetDefault="onCustomViewSetDefault",n.OnStoryPointSwitched="onStoryPointSwitched",n.OnSummaryDataChanged="onSummaryDataChanged",n.OnReadyToReceiveAuthToken="onReadyToReceiveAuthToken",(i=t.VizAuthoringAttributes||(t.VizAuthoringAttributes={})).OnWorkbookPublished="onWorkbookPublished",i.OnWorkbookPublishedAs="onWorkbookPublishedAs",i.OnWorkbookReadyToClose="onWorkbookReadyToClose",i.HideCloseButton="hide-close-button",(a=t.VizChildElements||(t.VizChildElements={})).VizFilter="viz-filter",a.VizParameter="viz-parameter",a.CustomParameter="custom-parameter",a.IframeStyle="iframe-style",(r=t.VizChildElementAttributes||(t.VizChildElementAttributes={})).Field="field",r.Value="value",r.Name="name"},1480:(e,t)=>{"use strict";var r,a,i,n;Object.defineProperty(t,"__esModule",{value:!0}),(n=t.WebComponentAttributes||(t.WebComponentAttributes={})).Src="src",n.Width="width",n.Height="height",n.Token="token",n.Debug="debug",n.IframeAuth="iframe-auth",n.OnVizLoadError="onvizloaderror",n.ForceTokenSync="force-token-sync",(i=t.EmbeddedIframeAttributes||(t.EmbeddedIframeAttributes={})).Loading="iframe-attr-loading",i.Style="iframe-attr-style",i.Class="iframe-attr-class",(a=t.WebComponentChildElements||(t.WebComponentChildElements={})).CustomParameter="custom-parameter",a.IframeStyle="iframe-style",(r=t.WebComponentChildElementAttributes||(t.WebComponentChildElementAttributes={})).Field="field",r.Value="value",r.Name="name"},4744:e=>{"use strict";var t;!function(e){let t,r,a,i,n,s,o,l,d;!function(e){e.APINotInitialized="api-not-initialized",e.VisibilityError="visibility-error",e.DialogAlreadyOpen="dialog-already-open",e.DialogClosedByUser="dialog-closed-by-user",e.InternalError="internal-error",e.InvalidDomainDialog="invalid-dialog-domain",e.InvalidParameter="invalid-parameter",e.MissingFilter="missing-filter",e.MissingParameter="missing-parameter",e.ServerError="server-error",e.SettingSaveInProgress="setting-save-in-progress",e.UnsupportedEventName="unsupported-event-name",e.UnsupportedMethodForDataSourceType="unsupported-method-for-data-source-type"}(t=e.ErrorCodes||(e.ErrorCodes={})),function(e){e.Desktop="desktop",e.Server="server",e.Cloud="cloud",e.PublicWeb="public-web",e.PublicDesktop="public-desktop"}(r=e.ExtensionContext||(e.ExtensionContext={})),function(e){e.Authoring="authoring",e.Viewing="viewing"}(a=e.ExtensionMode||(e.ExtensionMode={})),function(e){e.DialogMessageReceived="dialog-message-received",e.FilterChanged="filter-changed",e.MarkSelectionChanged="mark-selection-changed",e.SummaryDataChanged="summary-data-changed",e.ParameterChanged="parameter-changed",e.SettingsChanged="settings-changed",e.DashboardLayoutChanged="dashboard-layout-changed",e.WorkbookFormattingChanged="workbook-formatting-changed",e.WorksheetFormattingChanged="worksheet-formatting-changed"}(i=e.TableauEventType||(e.TableauEventType={})),function(e){e.Discrete="discrete",e.Continuous="continuous"}(n=e.VizImageEncodingType||(e.VizImageEncodingType={})),function(e){e.Ascending="ascending",e.Descending="descending"}(s=e.VizImageSortDirectionType||(e.VizImageSortDirectionType={})),function(e){e.CustomDiverging="custom-diverging",e.CustomSequential="custom-sequential"}(o=e.VizImagePaletteType||(e.VizImagePaletteType={})),function(e){e.Fixed="fixed",e.Manual="manual"}(l=e.VizImageSizeSettingType||(e.VizImageSizeSettingType={})),function(e){e.Right="right",e.Left="left",e.Center="center"}(d=e.VizImageSizeSettingAlignmentType||(e.VizImageSizeSettingAlignmentType={}))}(t||(t={})),e.exports=t},4912:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.SharedErrorCodes||(t.SharedErrorCodes={})).CrosstabCreationError="crosstab-creation-error",r.DataCreationError="data-creation-error",r.InvalidAggregationFieldName="invalid-aggregation-field-name",r.InvalidFilterFieldName="invalid-filter-name",r.InvalidFilterFieldValue="invalid-filter-fieldValue",r.InvalidSelectionDate="invalid-selection-date",r.InvalidSelectionFieldName="invalid-selection-fieldName",r.InvalidSelectionValue="invalid-selection-value",r.InvalidSelectionSheet="invalid-selection-sheet",r.InternalError="internal-error",r.InvalidParameter="invalid-parameter",r.PDFCreationError="pdf-creation-error",r.PowerPointCreationError="powerpoint-creation-error",r.NotActiveSheet="not-active-sheet",r.ImplementationError="wrong-implementation",r.ApiExecutionError="api-execution-error",r.ServerError="server-error",r.Timeout="timeout"},808:e=>{"use strict";var t;!function(e){let t,r,a,i,n,s,o,l,d,c,u,h,p,m,g,y,I,v,S,T,b,f,E,A,P,_,w,D,C;!function(e){e.Cluster="cluster",e.Forecast="forecast",e.TrendLine="trend-line"}(t=e.AnalyticsObjectType||(e.AnalyticsObjectType={})),function(e){e.Mark="mark",e.Point="point",e.Area="area"}(r=e.AnnotationType||(e.AnnotationType={})),function(e){e.Discrete="discrete",e.Continuous="continuous",e.Unknown="unknown"}(a=e.ColumnType||(e.ColumnType={})),function(e){e.WorksheetTitle="tableau-worksheet-title",e.Worksheet="tableau-worksheet",e.Tooltip="tableau-tooltip",e.StoryTitle="tableau-story-title",e.DashboardTitle="tableau-dashboard-title",e.Pane="tableau-pane",e.RowDividers="tableau-row-dividers",e.ColumnDividers="tableau-column-dividers"}(i=e.ClassNameKey||(e.ClassNameKey={})),function(e){e.Blank="blank",e.Worksheet="worksheet",e.QuickFilter="quick-filter",e.ParameterControl="parameter-control",e.PageFilter="page-filter",e.Legend="legend",e.Title="title",e.Text="text",e.Image="image",e.WebPage="web-page",e.Extension="extension"}(n=e.DashboardObjectType||(e.DashboardObjectType={})),function(e){e.Show="show",e.Hide="hide"}(s=e.DashboardObjectVisibilityType||(e.DashboardObjectVisibilityType={})),function(e){e.String="string",e.Int="int",e.Float="float",e.Bool="bool",e.Date="date",e.DateTime="date-time",e.Spatial="spatial",e.Unknown="unknown"}(o=e.DataType||(e.DataType={})),function(e){e.Added="added",e.Removed="removed",e.IsFloatingChanged="is-floating-changed",e.IsVisibleChanged="is-visible-changed",e.PositionChanged="position-changed",e.SizeChanged="size-changed",e.NameChanged="name-changed",e.Selected="selected",e.Deselected="deselected",e.DashboardChanged="dashboard-changed"}(l=e.DashboardLayoutChange||(e.DashboardLayoutChange={})),function(e){e.Last="last",e.LastN="last-n",e.Next="next",e.NextN="next-n",e.Current="current",e.ToDate="to-date"}(d=e.DateRangeType||(e.DateRangeType={})),function(e){e.Window="window",e.Modal="modal",e.Modeless="modeless"}(c=e.DialogStyle||(e.DialogStyle={})),function(e){e.Column="column",e.Row="row",e.Page="page",e.Filter="filter",e.MarksType="marks-type",e.MeasureValues="measure-values",e.Color="color",e.Size="size",e.Label="label",e.Detail="detail",e.Tooltip="tooltip",e.Shape="shape",e.Path="path",e.Angle="angle",e.Geometry="geometry",e.Custom="custom"}(u=e.EncodingType||(e.EncodingType={})),function(e){e.Sum="sum",e.Avg="avg",e.Min="min",e.Max="max",e.Stdev="stdev",e.Stdevp="stdevp",e.Var="var",e.Varp="varp",e.Collect="collect",e.Count="count",e.Countd="countd",e.Median="median",e.Attr="attr",e.None="none",e.Year="year",e.Qtr="qtr",e.Month="month",e.Day="day",e.Hour="hour",e.Minute="minute",e.Second="second",e.Week="week",e.Weekday="weekday",e.MonthYear="month-year",e.Mdy="mdy",e.End="end",e.TruncYear="trunc-year",e.TruncQtr="trunc-qtr",e.TruncMonth="trunc-month",e.TruncWeek="trunc-week",e.TruncDay="trunc-day",e.TruncHour="trunc-hour",e.TruncMinute="trunc-minute",e.TruncSecond="trunc-second",e.Quart1="quart1",e.Quart3="quart3",e.Skewness="skewness",e.Kurtosis="kurtosis",e.InOut="in-out",e.User="user"}(h=e.FieldAggregationType||(e.FieldAggregationType={})),function(e){e.Dimension="dimension",e.Measure="measure",e.Unknown="unknown"}(p=e.FieldRoleType||(e.FieldRoleType={})),function(e){e.Categorical="categorical",e.Range="range",e.Hierarchical="hierarchical",e.RelativeDate="relative-date"}(m=e.FilterType||(e.FilterType={})),function(e){e.Add="add",e.All="all",e.Replace="replace",e.Remove="remove"}(g=e.FilterUpdateType||(e.FilterUpdateType={})),function(e){e.Relevant="relevant",e.Database="database"}(y=e.FilterDomainType||(e.FilterDomainType={})),function(e){e.NullValues="null-values",e.NonNullValues="non-null-values",e.AllValues="all-values"}(I=e.FilterNullOption||(e.FilterNullOption={})),function(e){e.AllValues="all-values",e.OnlyNativeValues="only-native-values",e.OnlyFormattedValues="only-formatted-values"}(v=e.IncludeDataValuesOption||(e.IncludeDataValuesOption={})),function(e){e.Bar="bar",e.Line="line",e.Area="area",e.Square="square",e.Circle="circle",e.Shape="shape",e.Text="text",e.Map="map",e.Pie="pie",e.GanttBar="gantt-bar",e.Polygon="polygon",e.Heatmap="heatmap",e.VizExtension="viz-extension"}(S=e.MarkType||(e.MarkType={})),function(e){e.All="all",e.List="list",e.Range="range"}(T=e.ParameterValueType||(e.ParameterValueType={})),function(e){e.Years="years",e.Quarters="quarters",e.Months="months",e.Weeks="weeks",e.Days="days",e.Hours="hours",e.Minutes="minutes",e.Seconds="seconds"}(b=e.PeriodType||(e.PeriodType={})),function(e){e.RunningTotal="running-total",e.Difference="difference",e.PercentDifference="percent-difference",e.PercentOfTotal="percent-of-total",e.Rank="rank",e.Percentile="percentile",e.MovingAverage="moving-average",e.YTDTotal="ytd-total",e.CompoundGrowthRate="compound-growth-rate",e.YearOverYearGrowth="year-over-year-growth",e.YTDGrowth="ytd-growth",e.Undefined="undefined"}(f=e.QuickTableCalcType||(e.QuickTableCalcType={})),function(e){e.Replace="select-replace",e.Add="select-add",e.Remove="select-remove"}(E=e.SelectionUpdateType||(e.SelectionUpdateType={})),function(e){e.Simple="select-options-simple",e.Toggle="select-options-toggle"}(A=e.SelectOptions||(e.SelectOptions={})),function(e){e.Dashboard="dashboard",e.Story="story",e.Worksheet="worksheet"}(P=e.SheetType||(e.SheetType={})),function(e){e.Increasing="increasing",e.Decreasing="decreasing"}(_=e.SortDirection||(e.SortDirection={})),function(e){e.Linear="linear",e.Logarithmic="logarithmic",e.Exponential="exponential",e.Polynomial="polynomial"}(w=e.TrendLineModelType||(e.TrendLineModelType={})),function(e){e.Slow="slow",e.Normal="normal",e.Fast="fast"}(D=e.ReplaySpeedType||(e.ReplaySpeedType={})),function(e){e.AllSelected="all-selected",e.NoneSelected="none-selected",e.SomeSelected="some-selected",e.UnknownSelected="unknown-selected"}(C=e.HierarchicalLevelSelectionState||(e.HierarchicalLevelSelectionState={})),e.ZoneVisibilityType=Object.assign({},s)}(t||(t={})),e.exports=t},5488:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}(r(4912));var a=r(808);t.AnalyticsObjectType=a.AnalyticsObjectType,t.AnnotationType=a.AnnotationType,t.ClassNameKey=a.ClassNameKey,t.ColumnType=a.ColumnType,t.DashboardLayoutChange=a.DashboardLayoutChange,t.DashboardObjectType=a.DashboardObjectType,t.DashboardObjectVisibilityType=a.DashboardObjectVisibilityType,t.DataType=a.DataType,t.DateRangeType=a.DateRangeType,t.DialogStyle=a.DialogStyle,t.EncodingType=a.EncodingType,t.FieldAggregationType=a.FieldAggregationType,t.FieldRoleType=a.FieldRoleType,t.FilterDomainType=a.FilterDomainType,t.FilterNullOption=a.FilterNullOption,t.FilterType=a.FilterType,t.FilterUpdateType=a.FilterUpdateType,t.HierarchicalLevelSelectionState=a.HierarchicalLevelSelectionState,t.IncludeDataValuesOption=a.IncludeDataValuesOption,t.MarkType=a.MarkType,t.ParameterValueType=a.ParameterValueType,t.PeriodType=a.PeriodType,t.QuickTableCalcType=a.QuickTableCalcType,t.ReplaySpeedType=a.ReplaySpeedType,t.SelectOptions=a.SelectOptions,t.SelectionUpdateType=a.SelectionUpdateType,t.SheetType=a.SheetType,t.SortDirection=a.SortDirection,t.TrendLineModelType=a.TrendLineModelType,t.ZoneVisibilityType=a.ZoneVisibilityType},3448:(e,t,r)=>{"use strict";function a(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});const i=r(5892);t.INTERNAL_CONTRACT_VERSION=i,a(r(6716)),a(r(1080)),a(r(5824)),a(r(4547)),a(r(2400)),a(r(2496)),a(r(2472)),a(r(552)),a(r(3256)),a(r(7204)),a(r(4528)),a(r(3388)),a(r(3760)),t.MESSAGING_VERSION={major:1,minor:0,fix:0}},6716:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(1080);class i{static isSpecial(e){return e.length>2&&"%"===e[0]&&"%"===e[e.length-1]}static parseBoolean(e){const t=e.toLowerCase();return"true"!==t&&"false"!==t?this.specialValueIndicator:"true"===t}static parseNumber(e){const t=Number(e);return isNaN(t)?this.specialValueIndicator:t}static parseDate(e){const t=new Date(e);return Number.isNaN(t.getTime())?null:t}static parseDateTime(e){const t=e.replace(" ","T").concat("Z"),r=new Date(t);return Number.isNaN(r.getTime())?null:r}static convertValueAsStringToValue(e,t){if(null!=e){if(this.isSpecial(e))return e;switch(t){case a.DataType.Bool:return this.parseBoolean(e);case a.DataType.Int:case a.DataType.Float:return this.parseNumber(e);case a.DataType.Date:return null===this.parseDate(e)?this.specialValueIndicator:e;case a.DataType.DateTime:return null===this.parseDateTime(e)?this.specialValueIndicator:e;case a.DataType.Spatial:case a.DataType.String:default:return e}}}static convertValueToNativeValue(e,t){if(null==e)return null;switch(t){case a.DataType.Bool:case a.DataType.Int:case a.DataType.Float:return"string"==typeof e?null:e;case a.DataType.Date:return this.parseDate(e);case a.DataType.DateTime:return this.parseDateTime(e);case a.DataType.String:return this.isSpecial(e)?null:e;case a.DataType.Spatial:default:return e}}static convertStringValueToNativeValue(e,t){return this.convertValueToNativeValue(this.convertValueAsStringToValue(e,t),t)}}t.DataTypeConverter=i,i.specialValueIndicator="%null%"},1080:(e,t)=>{"use strict";var r,a,i,n,s,o,l,d,c,u,h,p,m,g,y,I,v,S,T,b,f,E,A,P,_,w,D,C,F,x,M,k,N,R;Object.defineProperty(t,"__esModule",{value:!0}),(R=t.ExtensionContext||(t.ExtensionContext={})).Desktop="desktop",R.Server="server",R.Unknown="unknown",R.Cloud="cloud",R.PublicWeb="public-web",R.PublicDesktop="public-desktop",(N=t.ExtensionMode||(t.ExtensionMode={})).Authoring="authoring",N.Viewing="viewing",N.Unknown="unknown",(k=t.AnnotateEnum||(t.AnnotateEnum={})).Mark="mark",k.Point="point",k.Area="area",(M=t.ColumnType||(t.ColumnType={})).Discrete="discrete",M.Continuous="continuous",M.Unknown="unknown",(x=t.DashboardObjectType||(t.DashboardObjectType={})).Blank="blank",x.Worksheet="worksheet",x.QuickFilter="quick-filter",x.ParameterControl="parameter-control",x.PageFilter="page-filter",x.Legend="legend",x.Title="title",x.Text="text",x.Image="image",x.WebPage="web-page",x.Extension="extension",(F=t.DataType||(t.DataType={})).String="string",F.Int="int",F.Float="float",F.Bool="bool",F.Date="date",F.DateTime="date-time",F.Spatial="spatial",F.Unknown="unknown",(C=t.DialogStyle||(t.DialogStyle={})).Window="window",C.Modal="modal",C.Modeless="modeless",(D=t.EncodedDataType||(t.EncodedDataType={})).Number="number",D.String="string",D.Date="date",D.Boolean="boolean",(w=t.ErrorCodes||(t.ErrorCodes={})).INITIALIZATION_ERROR="initialization-error",w.INTERNAL_ERROR="internal-error",w.MISSING_ENUM_MAPPING="missing-enum-mapping",w.MISSING_PARAMETER="missing-parameter",w.PERMISSION_DENIED="permission-denied",w.PRES_MODEL_PARSING_ERROR="pres-model-parsing-error",w.VERSION_NOT_CONFIGURED="version-not-configured",w.VISIBILITY_ERROR="visibility-error",w.UNKNOWN_VERB_ID="unknown-verb-id",(_=t.FieldAggregationType||(t.FieldAggregationType={})).Sum="sum",_.Avg="avg",_.Min="min",_.Max="max",_.Stdev="stdev",_.Stdevp="stdevp",_.Var="var",_.Varp="varp",_.Collect="collect",_.Count="count",_.Countd="countd",_.Median="median",_.Attr="attr",_.None="none",_.Year="year",_.Qtr="qtr",_.Month="month",_.Day="day",_.Hour="hour",_.Minute="minute",_.Second="second",_.Week="week",_.Weekday="weekday",_.MonthYear="month-year",_.Mdy="mdy",_.End="end",_.TruncYear="trunc-year",_.TruncQtr="trunc-qtr",_.TruncMonth="trunc-month",_.TruncWeek="trunc-week",_.TruncDay="trunc-day",_.TruncHour="trunc-hour",_.TruncMinute="trunc-minute",_.TruncSecond="trunc-second",_.Quart1="quart1",_.Quart3="quart3",_.Skewness="skewness",_.Kurtosis="kurtosis",_.InOut="in-out",_.User="user",(P=t.FieldRoleType||(t.FieldRoleType={})).Dimension="dimension",P.Measure="measure",P.Unknown="unknown",(A=t.FilterUpdateType||(t.FilterUpdateType={})).Add="add",A.All="all",A.Replace="replace",A.Remove="remove",(E=t.SheetType||(t.SheetType={})).Dashboard="dashboard",E.Story="story",E.Worksheet="worksheet",(f=t.DomainRestrictionType||(t.DomainRestrictionType={})).All="all",f.List="list",f.Range="range",(b=t.DateStepPeriod||(t.DateStepPeriod={})).Years="years",b.Quarters="quarters",b.Months="months",b.Weeks="weeks",b.Days="days",b.Hours="hours",b.Minutes="minutes",b.Seconds="seconds",(T=t.FilterNullOption||(t.FilterNullOption={})).NullValues="nullvalues",T.NonNullValues="nonnullvalues",T.AllValues="allvalues",(S=t.FilterDomainType||(t.FilterDomainType={})).Relevant="relevant",S.Database="database",(v=t.SelectionUpdateType||(t.SelectionUpdateType={})).Replace="select-replace",v.Add="select-add",v.Remove="select-remove",(I=t.SelectOptions||(t.SelectOptions={})).Simple="select-options-simple",I.Toggle="select-options-toggle",I.Menu="select-options-menu",I.Range="select-options-range",I.Search="select-options-search",(y=t.QuantitativeIncludedValues||(t.QuantitativeIncludedValues={})).IncludeNull="include-null",y.IncludeNonNull="include-non-null",y.IncludeAll="include-all",(g=t.HierarchicalLevelSelectionState||(t.HierarchicalLevelSelectionState={})).AllSelected="all-selected",g.NoneSelected="none-selected",g.SomeSelected="some-selected",g.UnknownSelected="unknown-selected",(m=t.MarkType||(t.MarkType={})).Bar="bar",m.Line="line",m.Area="area",m.Square="square",m.Circle="circle",m.Shape="shape",m.Text="text",m.Map="map",m.Pie="pie",m.GanttBar="gantt-bar",m.Polygon="polygon",m.Heatmap="heatmap",m.VizExtension="viz-extension",(p=t.FilterType||(t.FilterType={})).Categorical="categorical",p.Range="range",p.RelativeDate="relativeDate",p.Hierarchical="hierarchical",(h=t.DateRangeType||(t.DateRangeType={})).Last="last",h.LastN="lastN",h.Next="next",h.NextN="nextN",h.Current="current",h.ToDate="toDate",(u=t.ExtensionDialogResult||(t.ExtensionDialogResult={})).DialogAlreadyOpen="dialog-already-open",u.InvalidDomain="invalid-domain",u.Success="success",(c=t.ApiShowDataTableFormat||(t.ApiShowDataTableFormat={})).NativeValuesOnly="native-values-only",c.FormattedValuesOnly="formatted-values-only",c.NativeAndFormattedValues="native-and-formatted-values",(d=t.PageSizeOption||(t.PageSizeOption={})).Letter="letter",d.Legal="legal",d.Note="note",d.Folio="folio",d.Tabloid="tabloid",d.Ledger="ledger",d.Statement="statement",d.Executive="executive",d.A3="a3",d.A4="a4",d.A5="a5",d.B4="b4",d.B5="b5",d.Quarto="quarto",d.Unspecified="unspecified",(l=t.PageOrientation||(t.PageOrientation={})).Printer="printer",l.Portrait="portrait",l.Landscape="landscape",(o=t.ScaleMode||(t.ScaleMode={})).ScaleAuto="auto",o.ScalePercentage="percent",o.ScaleFitPages="fit-pages",(s=t.PageScalingOption||(t.PageScalingOption={})).ScalePctAuto="auto",s.ScalePct400="pct400",s.ScalePct200="pct200",s.ScalePct100="pct100",s.ScalePct90="pct90",s.ScalePct80="pct80",s.ScalePct75="pct75",s.ScalePct60="pct60",s.ScalePct50="pct50",s.ScalePct25="pct25",(n=t.FitPages||(t.FitPages={})).FitOneHigh="fit0x1",n.FitTwoHigh="fit0x2",n.FitOneWide="fit1x0",n.FitTwoWide="fit2x0",(i=t.EncodingType||(t.EncodingType={})).Color="color",i.Size="size",i.Label="label",i.Detail="detail",i.Tooltip="tooltip",i.Shape="shape",i.Path="path",i.Angle="angle",i.Geometry="geometry",i.Custom="custom",(a=t.PulseTimeDimension||(t.PulseTimeDimension={})).Today="Today",a.Yesterday="Yesterday",a.WeekToDate="WeekToDate",a.LastWeek="LastWeek",a.MonthToDate="MonthToDate",a.LastMonth="LastMonth",a.QuarterToDate="QuarterToDate",a.LastQuarter="LastQuarter",a.YearToDate="YearToDate",a.LastYear="LastYear",(r=t.PulseErrorMessageVisibility||(t.PulseErrorMessageVisibility={})).Visible="visible",r.Hidden="hidden",r.Suppressed="suppressed"},5824:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.NotificationId||(t.NotificationId={})).CustomMarkContextMenuClicked="custom-mark-context-menu-clicked",r.ContextMenuClick="context-menu-click",r.CustomViewRemoved="custom-view-removed",r.CustomViewSaved="custom-view-saved",r.CustomViewSetDefault="custom-view-set-default",r.CustomViewsLoaded="custom-views-loaded",r.DashboardLayoutChanged="dashboard-layout-changed",r.EditButtonClicked="edit-button-clicked",r.EditInDesktopButtonClicked="edit-in-desktop-button-clicked",r.ExtensionDialogUpdate="extension-dialog-update",r.ExtensionDialogMessage="extension-dialog-message",r.FilterChanged="filter-changed",r.FirstVizSizeKnown="first-viz-size-known",r.FirstPulseMetricSizeKnown="first-pulse-metric-size-known",r.ParameterChanged="parameter-changed",r.PulseError="pulse-error",r.PulseFiltersChanged="pulse-filters-changed",r.PulseMetricSizeChanged="pulse-metric-size-changed",r.PulseInsightDiscovered="pulse-insight-discovered",r.PulseInteractive="pulse-interactive",r.PulseTimeDimensionChanged="pulse-time-dimension-changed",r.PulseUrlChanged="pulse-url-changed",r.SelectedMarksChanged="selected-marks-changed",r.SettingsChanged="settings-changed",r.SummaryDataChanged="summary-data-changed",r.TestConversionNotification="test-conversion-notification",r.ToolbarStateChanged="toolbar-state-changed",r.VizInteractive="viz-interactive",r.AskDataInteractive="ask-data-interactive",r.WorkbookReadyToClose="workbook-ready-to-close",r.WorkbookFormattingChanged="workbook-formatting-changed",r.WorkbookPublished="workbook-published",r.WorkbookPublishedAs="workbook-published-as",r.WorksheetFormattingChanged="worksheet-formatting-changed",r.UrlAction="url-action",r.TabSwitched="tab-switched",r.StoryPointSwitched="story-point-switched",r.ReadyToReceiveAuthToken="ready-to-receive-auth-token"},4547:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.ParameterId||(t.ParameterId={})).ActiveTablesInfo="active-tables-info",r.AnchorDate="anchor-date",r.AnnotateEnum="annotate-enum",r.AnnotationList="annotation-list",r.ApplyWorksheetFormatting="apply-worksheet-formatting",r.CategoricalDomain="categorical-domain",r.ClickThroughEnabled="click-through-enabled",r.Columns="columns",r.ColumnsToInclude="columns-to-include",r.ColumnsToIncludeById="columns-to-include-by-id",r.ConnectionDescriptionSummaries="connection-description-summaries",r.CurrentSheetType="current-sheet-type",r.CustomView="custom-view",r.CustomViewIsDefault="custom-view-is-default",r.CustomViewIsPublic="custom-view-is-public",r.CustomViewLuid="custom-view-luid",r.CustomViewName="custom-view-name",r.CustomViews="custom-views",r.Dashboard="dashboard",r.DashboardFilters="dashboard-filters",r.DashboardName="dashboard",r.DashboardObjectPositionAndSizeUpdate="dashboard-object-position-and-size-update",r.DashboardObjectPositionAndSizeUpdateList="dashboard-object-position-and-size-update-list",r.DataRowIndex="data-row-index",r.DataSchema="data-schema",r.DataSource="data-source",r.DataSourceDataTable="data-source-data-table",r.DataSourceId="data-source-id",r.DataSourceName="data-source-name",r.DataTable="data-table",r.DataTableReader="data-table-reader",r.DateRangeType="date-range-type",r.DeleteCount="delete-count",r.DeltaTimeMs="delta-time-ms",r.DimValSelectionModels="dimensionValueSelectionModels",r.DomainType="domain-type",r.EmbeddingAbstractQuery="embedding-abstract-query",r.EmbeddingBootstrapInfo="embedding-bootstrap-info",r.EncodingType="encoding-type",r.ExportCrosstabSheetMap="export-crosstab-sheet-map",r.ExportFile="export-file",r.ExportOriginUrl="export-origin-url",r.ExportPdfOptions="export-pdf-options",r.ExtensionBootstrapInfo="extension-bootstrap-info",r.ExtensionContextMenuIds="extension-context-menu-ids",r.ExtensionDialogH="extension-dialog-height",r.ExtensionDialogMessage="extension-dialog-message",r.ExtensionDialogPayload="extension-dialog-payload",r.ExtensionDialogResult="extension-dialog-result",r.ExtensionDialogStyle="extension-dialog-style",r.ExtensionDialogUrl="extension-dialog-url",r.ExtensionDialogW="extension-dialog-width",r.ExtensionLocator="extension-locator",r.ExtensionSettingsInfo="extension-settings-info",r.ExtensionZoneId="extension-zone-id",r.ExternalMenuDescription="external-menu-description",r.ExternalMenuHeader="external-menu-header",r.ExternalMenuItemDisplayName="external-menu-item-display-name",r.ExternalMenuItemId="external-menu-item-id",r.Field="field",r.FieldCount="field-count",r.FieldId="field-id",r.FieldName="field-name",r.FilterLevels="filter-levels",r.FilterRangeMax="filter-range-max",r.FilterRangeMin="filter-range-min",r.FilterRangeNullOption="filter-range-null-option",r.FilterUpdateType="filter-update-type",r.FilterValues="filter-values",r.FontNameListItems="font-name-list-items",r.FormattedText="formatted-text",r.FunctionName="function-name",r.FromIndex="from-index",r.HierValSelectionModels="hierarchicalValueSelectionModels",r.HighlightedData="highlighted-data",r.HoverTupleInteraction="hover-tuple-interaction",r.IgnoreAliases="ignore-aliases",r.IgnoreSelection="ignore-selection",r.IncludeAllColumns="include-all-columns",r.InvalidAggFieldName="invalid-agg-field-name",r.InvalidDates="invalid-dates",r.InvalidFieldCaption="invalid-field-caption",r.InvalidFields="invalid-fields",r.InvalidValues="invalid-values",r.IsAnalyticsAssistantAvailable="is-analytics-assistant-available",r.IsExcludeMode="is-exclude",r.IsExtensionDialog="is-extension-dialog",r.IsFromCalcDialog="is-from-calc-dialog",r.JoinDescription="join-description",r.LogicalTableId="logical-table-id",r.LogicalTableInfoList="logical-table-info-list",r.MarksCardIndex="marks-card-index",r.MaxHeight="max-height",r.MaxRows="max-rows",r.MaxWidth="max-width",r.MinHeight="min-height",r.MinWidth="min-width",r.PageRowCount="page-row-count",r.ParameterCaption="paremeter-caption",r.ParameterError="parameter-error",r.ParameterFieldName="parameter-field-name",r.ParameterInfo="parameter-info",r.ParameterInfos="parameter-infos",r.ParameterValue="parameter-value",r.PeriodType="period-type",r.PulseFieldName="fieldName",r.PulseFieldNames="fieldNames",r.PulseFilterDomainType="domainType",r.PulseFilterDomainSearchTerm="searchTerm",r.PulsePageSize="pageSize",r.PulseNextPageToken="nextPageToken",r.PulseFilters="filters",r.PulseTimeDimension="timeDimension",r.QuantitativeDomain="quantitative-dmain",r.QuantRangeSelectionModels="quantativeRangeSelectionModels",r.RangeN="range-n",r.ReplaySpeed="replay-speed",r.SelectedData="selected-data",r.SelectedSheetNames="selected-sheet-names",r.Selection="selection",r.SelectionList="selection-list",r.SelectionUpdateType="selectionUpdateType",r.SelectTuplesInteraction="select-tuples-interaction",r.SendNotifications="send-notifications",r.SettingsValues="settings-values",r.SharedFilterSheets="shared-filter-sheets",r.SharedFiltersInfo="shared-filters-info",r.SheetIdentifier="sheet-identifier",r.SheetName="sheet-name",r.SheetPath="sheet-path",r.ShouldRefreshDS="should-refresh-ds",r.ShowDataTableFormat="show-data-table-format",r.StartIndex="start-index",r.State="state",r.StoryPointIndex="story-point-index",r.StoryPointInfo="story-point-info",r.SwitchToSheetName="switch-to-sheet-name",r.TargetPoint="target-point",r.TestConversionParameter="test-conversion-parameter",r.Text="formatted-text",r.ToIndex="to-index",r.TooltipContext="tooltip-context",r.TooltipTextRequest="tooltip-text-request",r.TooltipText="tooltip-text",r.UnderlyingDataTable="underlying-data-table",r.UnderlyingSummaryDataTable="underlying-summary-data-table",r.Url="url",r.UseTabDelimiters="use-tab-delimiters",r.ViewDataTableCacheId="view-data-table-cache-id",r.ViewDataTableId="view-data-table-id",r.VisualId="visual-id",r.VisualSpecification="visual-specification",r.VizAPIInputJson="vizapi-input-json",r.VizAPIStateWithDataModel="vizapi-state-with-data-model",r.VizAPIStateWarningMsg="vizapi-state-warning-msg",r.VizAPISVG="vizapi-svg",r.WorksheetName="worksheet-name",r.WorksheetFilters="worksheet-filters",r.ZoneIdsVisibilityMap="zone-ids-visibility-map"},2400:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.VerbId||(t.VerbId={})).ActivateNextStoryPoint="activate-next-story-point",r.ActivatePreviousStoryPoint="activate-previous-story-point",r.ActivateSheet="activateSheet",r.ActivateStoryPoint="activate-story-point",r.AddMarksCardFields="add-marks-card-fields",r.AppendExternalMenuItem="append-external-menu-item",r.ApplyCategoricalFilter="categorical-filter",r.ApplyPulseFilters="apply-pulse-filters",r.ApplyPulseTimeDimension="apply-pulse-time-dimension",r.ApplyRangeFilter="range-filter",r.ApplyRelativeDateFilter="apply-relative-date-Filter",r.Authenticate="authenticate",r.BlockExtension="block-extension",r.ChangeParameterValue="change-parameter-value",r.ChangeSharedFilter="change-shared-filter",r.ClearAllPulseFilters="clear-all-pulse-filters",r.ClearFilter="clear-filter",r.ClearPulseFilters="clear-pulse-filters",r.ClearSelectedMarks="clear-selected-marks",r.CloseDialog="close-dialog",r.CreateAnnotation="create-annotation",r.DashboardCategoricalFilter="dashboard-categorical-filter",r.DisplayDialog="display-dialog",r.DownloadWorkbook="download-workbook",r.EditAliasesDialog="edit-aliases-dialog",r.ExecuteExternalMenuItem="execute-external-menu-item",r.ExportCrosstab="export-crosstab",r.ExportCrosstabCsvDownload="export-crosstab-csv-download",r.ExportCrosstabExcelDownload="export-crosstab-excel-download",r.ExportData="export-data",r.ExportDataDownload="export-data-download",r.ExportImage="export-image",r.ExportPdf="export-pdf",r.ExportPdfDownload="export-pdf-download",r.ExportPowerpoint="export-powerpoint",r.ExportPowerpointDownload="export-powerpoint-download",r.FindParameter="find-parameter",r.GetActiveTables="get-active-tables",r.GetAllDataSources="get-all-data-sources",r.GetAnnotations="get-annotations",r.GetCategoricalDomain="get-categorical-domain",r.GetConnectionDescriptionSummaries="get-connection-description-summaries",r.GetCurrentSrc="get-current-src",r.GetCustomViews="get-custom-views",r.GetDashboardFilters="get-dashboard-filters",r.GetDataSource="get-datasource",r.GetDataSourceData="get-datasource-data",r.GetDataSources="get-data-sources",r.GetDataSummaryData="get-summary-data",r.GetDataSummaryDataReader="get-summary-data-reader",r.GetDataTableReaderPage="get-data-table-reader-page",r.GetEmbeddingAbstractQueryWithDataModel="get-embedding-abstract-query-with-data-model",r.GetEmbeddingClientInfo="get-embedding-client-info",r.GetVizStateWithDataModel="get-viz-state-with-data-model",r.GetExportCrosstabSheetMap="get-export-crosstab-sheet-map",r.GetExportPdfOptions="get-export-pdf-options",r.GetField="get-field",r.GetFieldAndDataSource="get-field-and-datasource",r.GetVisualSpecification="get-visual-specification",r.GetFilters="get-filters",r.GetFonts="get-fonts",r.GetHighlightedMarks="get-highlighted-marks",r.GetJoinDescription="get-join-description",r.GetLogicalTableData="get-logical-table-data",r.GetLogicalTableDataReader="get-logical-table-data-reader",r.GetLogicalTables="get-logical-tables",r.GetParametersForSheet="get-parameters-for-sheet",r.GetPulseCategoricalDomain="get-pulse-categorical-domain",r.GetPulseFilters="get-pulse-filters",r.GetPulseTimeDimension="get-pulse-time-dimension",r.GetRangeDomain="get-range-domain",r.GetSelectedMarks="get-selected-marks",r.GetSharedFilter="get-shared-filter",r.GetTooltipText="get-tooltip-text",r.GetUnderlyingData="get-underlying-data",r.GetUnderlyingTableData="get-underlying-table-data",r.GetUnderlyingTableDataReader="get-underlying-table-data-reader",r.GetUnderlyingTables="get-underlying-tables",r.HierarchicalFilter="hierachical-filter",r.InitializeExtension="initialize-extension",r.IsAnalyticsAssistantAvailable="is-analytics-assistant-available",r.LaunchAnalyticsAssistant="launch-analytics-assistant",r.MoveAndResizeZones="move-and-resize-zones",r.MoveMarksCardField="move-marks-card-field",r.RaiseLeaveMarkNavNotification="raise-leave-mark-nav-notification",r.RaiseHoverTupleNotification="raise-hover-tuple-notification",r.RaiseSelectTuplesNotification="raise-select-tuples-notification",r.Redo="redo",r.RefreshDataSource="refresh-data-source",r.ReleaseDataTableReader="release-data-table-reader",r.RemoveAnnotation="remove-annotation",r.RemoveCustomView="remove-custom-view",r.RemoveExternalMenuItem="remove-external-menu-item",r.RenameExternalMenu="rename-external-menu",r.ReplayAnimation="replay-animation",r.RevertStoryPoint="revert-story-point",r.RevertWorkbook="revert-workbook",r.SaveExtensionSettings="save-extension-settings",r.SaveWorkbookAsCustomView="save-workbook-as-custom-view",r.SelectByValue="select-by-value",r.SetActiveCustomViewAsDefault="set-active-custom-view-as-default",r.SetAutoUpdate="set-auto-update",r.SetClickThrough="set-click-through",r.SendDialogMessage="send-dialog-message",r.SetVizStateWithDataModel="set-viz-state-with-data-model",r.SetSheetSize="set-sheet-size",r.SetZoneVisibility="set-zone-visibility",r.Share="share",r.ShowCustomView="show-custom-view",r.SpliceMarksCardFields="splice-marks-card-fields",r.TestConversionVerb="test-conversion-verb",r.Undo="undo",r.UpdateCustomView="update-custom-view",r.VizAPI="viz-api"},2496:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.AskDataOptionNames||(t.AskDataOptionNames={})).token="token",r.origin="origin",r.showEmbed="showEmbed",r.showPin="showPin",r.showSave="showSave",r.showShare="showShare",r.debug=":jsdebug",r.ApiID=":apiID",r.ApiExternalVersion=":apiExternalVersion",r.ApiInternalVersion=":apiInternalVersion",r.AskDataWebComponent=":askDataWebComponent"},2472:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.PulseOptionNames||(t.PulseOptionNames={})).embed="embed",r.token="token",r.disableExploreFilter="disableExploreFilter",r.layout="embed_layout",r.theme="embed_theme",r.ApiExternalVersion=":apiExternalVersion",r.ApiInternalVersion=":apiInternalVersion",r.PulseWebComponent=":pulseWebComponent"},552:(e,t)=>{"use strict";var r,a,i;Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.ONE="1",e.ALERTS=":alerts",e.ALIAS="alias",e.ALLOW_DEFERRED_BOOTSTRAP=":allowDeferredBootstrap",e.ALLOW_AUTOGEN_WORKSHEET_PHONE_LAYOUTS="allowAutogenWorksheetPhoneLayouts",e.API_ID=":apiID",e.APP=":app",e.ATTACHMENT="attachment",e.IS_IPAD_APP="app",e.ANIMATE_TRANSITION=":animate_transition",e.ASCENDING="ascending",e.AUTHENTICATION="authentication",e.ATTRIBUTES="attributes",e.AUTHORING_SHEET=":authSheet",e.AXIS="axis",e.BOOTSTRAP_WHEN_NOTIFIED=":bootstrapWhenNotified",e.BROWSER_BACK_BUTTON_UNDO=":browserBackButtonUndo",e.BROWSER_RENDERING_ON="isBrowserRendering",e.BROWSER_RENDERING_THRESHOLD="browserRenderingThreshold",e.CHARSET="charset",e.CLIENT_DIMENSION="clientDimension",e.CLIENT_IP="client_ip",e.CLIENT_NUM="clientNum",e.COLON_EMBEDDED=":embedded",e.COLON_MOBILE=":mobile",e.COLON_DEEP_LINKING_DISABLED=":deepLinkingDisabled",e.COLON_WATERMARK=":watermark",e.COMMENTS=":comments",e.COMMENTING_ENABLED=":commentingEnabled",e.COMMENTING_MENTIONS_ENABLED=":commentingMentions",e.CONNECTION="connection",e.CREATED_BY_FEATURE="createdByFeature",e.CRYPTED_PASSWORD="crypted",e.CSSDEBUG=":cssdebug",e.CSV="csv",e.CUSTOM_VIEWS=":customViews",e.CV=":cv",e.CV_ID="cvId",e.DASHBOARD_PORT_SIZE="dashboardPortSize",e.DATA_DETAILS=":dataDetails",e.DATASOURCE="datasource",e.DEBUG=":debug",e.DELAY=":delay",e.DEPTH="depth",e.DEVICE_TYPE=":device",e.DEVICE_PIXEL_RATIO="devicePixelRatio",e.DEVICE_PREVIEW_MODE=":devicepreviewmode",e.DIMENSIONS=":dimensions",e.DISABLE_SHARED_SESSIONS=":disable_shared_sessions",e.DISABLE_URL_ACTIONS_POPUPS=":disableUrlActionsPopups",e.DIRECTION="direction",e.DISPLAY_OVERLAY=":display_overlay",e.DISPLAY_SHARE=":display_share",e.DISPLAY_SPINNER=":display_spinner",e.DISPLAY_STATIC_IMAGE=":display_static_image",e.DISPLAY_TABS="display_tabs",e.DISPLAY_VIEW_COUNT=":display_count",e.IGNORE_STICKY_SESSION=":ignore_sticky_session",e.INCREMENT_VIEW_COUNT=":increment_view_count",e.DOCMODE="docmode",e.DOMAIN="domain",e.DO_WORK="do_work",e.DX="dx",e.DY="dy",e.EDIT_DATA_ALERT=":editDataAlert",e.EMBED=":embed",e.EMBEDDED="embedded",e.ENCRYPTED="encrypted",e.API_EXTERNAL_VERSION=":apiExternalVersion",e.API_INTERNAL_VERSION=":apiInternalVersion",e.EXCLUDE="exclude",e.EXPORT_FORMAT=":export_format",e.FIELDNAME="fieldname",e.FIELD_NAME="field_name",e.FIELD_SEP="field_sep",e.FILE="file",e.FILTER_TILE_SIZE="filterTileSize",e.FN="fn",e.FOCUS="focus",e.FORCE_CACHE="force_cache",e.FORMAT="format",e.FORMAT_DATA_VALUE_LOCALLY="formatDataValueLocally",e.FROM_WG=":from_wg",e.GRAPHQL_DATABASE_ID=":graphQLDatabaseId",e.GRAPHQL_TABLE_ID=":graphQLTableId",e.GUID=":guid",e.H="h",e.HIDDEN="hidden",e.HIDE_CLOSE_BUTTON=":hideCloseButton",e.HIDE_EDIT_BUTTON=":hideEditButton",e.HIDE_EDIT_IN_DESKTOP_BUTTON=":hideEditInDesktopButton",e.HIGH_DPI=":highdpi",e.IMAGE_SIZE_LIMIT="imageSizeLimit",e.TRANSPARENT_LINE_MARKS_LIMIT="transparentLineMarkLimit",e.CLIENT_RENDER_PIXEL_LIMIT="clientRenderPixelLimit",e.IN="in",e.INSTANCE_ID=":iid",e.IS_GUEST_REDIRECT_FROM_VIZPORTAL=":isGuestRedirectFromVizportal",e.IS_MARK_ANIMATION_ENABLED="isMarkAnimationEnabled",e.IS_VIZPORTAL=":isVizPortal",e.INPUT_="input_string",e.JSDEBUG=":jsdebug",e.JSON="json",e.JSON_ONLY=":jsonOnly",e.KEEPFILE="keepfile",e.KEY="key",e.LANGUAGE="language",e.LANGUAGE_REQUESTED=":language",e.LINKTARGET=":linktarget",e.LOAD_ORDER_ID=":loadOrderID",e.LOAD_NEWEST_REVISION=":loadNewestRevision",e.LOCAL_PATHS=":localPaths",e.LOCALE="locale",e.LOCATION_ID="locationid",e.LOCATION_TYPE="locationtype",e.WORKBOOK_LOCALE="workbookLocale",e.MAXROWS="maxrows",e.MAX_AGE="maxAge",e.MAX_ROWS="maxRows",e.METHOD="method",e.MOBILE="mobile",e.MODIFIER="modifier",e.NAME="name",e.NAV_TYPE="navType",e.NAV_SRC="navSrc",e.NOATTACHMENT="no-attachment",e.NO_OVERWRITE="no_overwrite",e.OPEN_AUTHORING_IN_TOP_WINDOW=":openAuthoringInTopWindow",e.OPENID_HD=":openid_hd",e.OPENID_LOGIN_HINT=":openid_login_hint",e.OAUTHREQUEST="oauthrequest",e.OAUTH_CREDENTIAL_IDS="oauth_credential_ids",e.OFFLINE_MODE=":offlinemode",e.ORIGIN=":origin",e.OVERLAY=":overlay",e.P="p",e.PATH="path",e.PANE_RESOLVER_X="paneResolverX",e.PANE_RESOLVER_Y="paneResolverY",e.PARAM="param",e.PARENT_ID="parent_id",e.PASSWORD="password",e.PATTERN="pattern",e.PIXEL_RATIO=":pixelratio",e.PREFIX=":prefix",e.PREVIEW=":preview",e.PRIMARY_CONTENT_URL="primary_content_url",e.PROJECT="project",e.PROTOCOL="protocol",e.PSEUDO=":pseudo",e.QUERY="query",e.R="r",e.RANGE_TYPE="range_type",e.RECORD_SEP="record_sep",e.RECORD_CLIENT_PERFORMANCE=":record_client_performance",e.RECORD_PERFORMANCE=":record_performance",e.RECOVER_OLD_SESSION_ID=":recover_old_session_id",e.RECOVER_SESSION_STATE_TICKETS=":recover_session_state_tickets",e.REFRESH=":refresh",e.REFRESHUNMODIFIED=":refreshunmodified",e.REGION="region",e.RELOAD_ON_CUSTOM_VIEW_SAVE=":reloadOnCustomViewSave",e.RENDER=":render",e.RENDER_MAPS_CLIENT_SIDE="renderMapsClientSide",e.RETRY=":retry",e.REUSE="reuse",e.REUSE_FOREVER="reuse_forever",e.REVERT=":revert",e.SAVE_DB_PASSWORDS="save_db_passwords",e.SELECT_X="select_x",e.SELECT_Y="select_y",e.SESSION_FEATURE_PREFIX=":ff_",e.SESSION_FLAGS=":session_feature_flags",e.SHARE_BUTTON="share_button",e.SHEET_ID="sheet_id",e.SHARED="shared",e.SHOWALL="showall",e.SHOW_APP_BANNER=":showAppBanner",e.SHOW_ASK_DATA=":showAskData",e.SHOW_PARAMS="showParams",e.SHOW_SHARE_OPTIONS=":showShareOptions",e.SIZE=":size",e.SOURCE="source",e.STATE="state",e.STICKY_SESSION_KEY="stickySessionKey",e.SUBSCRIPTIONS=":subscriptions",e.SUMMARY="summary",e.SUPPRESS_DEFAULT_EDIT_BEHAVIOR=":suppressDefaultEditBehavior",e.SYNC_SESSION=":sync_session",e.SYNC_SESSION_STATE="sync_session_state",e.TABS=":tabs",e.TARGET="target",e.TARGET_SITE="target_site",e.TOOLBAR=":toolbar",e.TOOLTIP=":tooltip",e.TS="ts",e.UNDERLYING_TABLE_ID="underlying_table_id",e.UNDERLYING_TABLE_CAPTION="underlying_table_caption",e.UPDATE_TYPE="update_type",e.USE_GUEST=":useGuest",e.USE_INLINE_IMAGES="use_inline_images",e.USERAGENT="useragent",e.USERNAME="username",e.VALUE="value",e.VERBOSE_MODE="verboseMode",e.VIEW_ID="views_id",e.VIZ_SNAPSHOT_ID="viz_snapshot_id",e.VW=":vw",e.W="w",e.WORKSHEET_PORT_SIZE="worksheetPortSize",e.WATERMARK="watermark",e.WATERMARK_MARGIN=":watermark_margin",e.WB=":wb",e.WHICH="which",e.X="x",e.Y="y",e.ZID="zid",e.ZONE_ID="zone_id",e.KEYCHAIN_VERSION="keychain_version",e.DATASOURCE_ID="datasource_id",e.DATASOURCE_NAME="datasource_name",e.LENS_ID="lens_id",e.WIDTH="width",e.HEIGHT="height",e.LAYOUT_VIEWS="views",e.LAYOUT_MENUS="menus",e.LAYOUT_GEOMETRY="geometry",e.LAYOUT_PAGES="pages",e.LAYOUT_CACHEURL="cacheurl",e.LAYOUT_SHEET="sheet",e.LAYOUT_DEPTH="depth"}(r||(r={})),function(e){e.SHOW_VIZ_HOME=":showVizHome"}(a||(a={})),(i=t.VizOptionNames||(t.VizOptionNames={})).Size=":size",i.Embed=":embed",i.ApiInternalVersion=":apiInternalVersion",i.ApiExternalVersion=":apiExternalVersion",i.ShowVizHome=":showVizHome",i.Jsdebug=":jsdebug",i.BootstrapWhenNotified=":bootstrapWhenNotified",i.NavType="navType",i.NavSrc="navSrc",i.debug=":jsdebug",i.ApiID=":apiID",i.disableUrlActionsPopups=":disableUrlActionsPopups",i.hideTabs=":tabs",i.toolbar=":toolbar",i.device=":device",i.instanceIdToClone=":iid",i.touchOptimize="mobile",i.hideEditButton=":hideEditButton",i.hideEditInDesktopButton=":hideEditInDesktopButton",i.suppressDefaultEditBehavior=":suppressDefaultEditBehavior",i.hideCloseButton=":hideCloseButton"},3256:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(1808),i=r(3448),n=r(1680),s=r(4020),o=r(7204);t.CrossFrameMessenger=class{constructor(e,t,r){this.thisWindow=e,this.otherWindow=t,this.otherWindowOrigin=r}startListening(){if(!this.unregisterFunction){const e=this.onMessageReceived.bind(this);this.thisWindow.addEventListener("message",e,!0),this.unregisterFunction=()=>this.thisWindow.removeEventListener("message",e,!0)}}stopListening(){this.unregisterFunction&&(this.unregisterFunction(),this.unregisterFunction=void 0)}setInitializeMessageHandler(e){this.initializeMessageHandler=e}setCommandResponseMessageHandler(e){this.commandResponseMessageHandler=e}setCommandMessageHandler(e){this.commandMessageHandler=e}setNotificationMessageHandler(e){this.notificationMessageHandler=e}setHandshakeMessageHandler(e){this.handshakeMessageHandler=e}prepareInitializationMessage(e,t,r){const i={msgGuid:a.raw(),msgType:o.MessageType.Initialize,crossFrameVersion:t,apiVersion:e,options:r};return this.prepareMessage(i)}prepareCommandMessage(e,t){const r={msgGuid:a.raw(),msgType:o.MessageType.Command,verbId:e,parameters:t};return this.prepareMessage(r)}prepareCommandResponseMessage(e,t,r){const i={msgGuid:a.raw(),msgType:o.MessageType.CommandResponse,commandGuid:e,data:t,error:r};return r&&(i.error=JSON.parse(JSON.stringify(r))),this.prepareMessage(i)}prepareNotificationMessage(e,t){const r={msgGuid:a.raw(),msgType:o.MessageType.Notification,notificationId:e,data:t};return this.prepareMessage(r)}prepareAckMessage(){const e={msgGuid:a.raw(),msgType:o.MessageType.Ack,platformVersion:i.INTERNAL_CONTRACT_VERSION};return this.prepareMessage(e)}prepareMessage(e){if(!this.otherWindow||!this.otherWindowOrigin)throw"Other window not initialized, cannot dispatch messages";return new n.CrossFramePreparedMessage(e,this.otherWindow,this.otherWindowOrigin)}onMessageReceived(e){if(this.otherWindow&&e.source!==this.otherWindow)return;if(!e.data)return;const t=e.data;if(s.isMessage(t))switch(t.msgType){case o.MessageType.Initialize:if(!s.isInitMessage(t)||!this.initializeMessageHandler)return;this.initializeMessageHandler(t,e.source);break;case o.MessageType.CommandResponse:if(!s.isCommandResponseMessage(t)||!this.commandResponseMessageHandler)return;this.commandResponseMessageHandler(t,e.source);break;case o.MessageType.Command:if(!s.isCommandMessage(t)||!this.commandMessageHandler)return;this.commandMessageHandler(t,e.source);break;case o.MessageType.Notification:if(!s.isNotificationMessage(t)||!this.notificationMessageHandler)return;this.notificationMessageHandler(t,e.source);break;case o.MessageType.Handshake:if(!s.isHandshakeMessage(t)||!this.handshakeMessageHandler)return;this.handshakeMessageHandler(t,e.source)}}setOtherWindow(e){this.otherWindow=e}setOtherWindowOrigin(e){this.otherWindowOrigin=e}}},1680:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CrossFramePreparedMessage=class{constructor(e,t,r){this._message=e,this._target=t,this._origin=r}get messageGuid(){return this._message.msgGuid}send(){return this._target.postMessage(this._message,this._origin),this}}},4020:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(1808),i=r(5824),n=r(7204),s=new Set([i.NotificationId.EditButtonClicked,i.NotificationId.EditInDesktopButtonClicked,i.NotificationId.WorkbookPublished,i.NotificationId.WorkbookReadyToClose,i.NotificationId.ReadyToReceiveAuthToken]);function o(e){if(!e)return!1;const t=e;return!!(t&&t.msgGuid&&t.msgType)&&(!!a.isGuid(t.msgGuid)&&("string"==typeof t.msgType&&!([n.MessageType.Command,n.MessageType.CommandResponse,n.MessageType.Initialize,n.MessageType.Notification,n.MessageType.Handshake].indexOf(t.msgType)<0)))}function l(e){if(!e)return!1;const t=e;return"object"==typeof t&&"number"==typeof t.fix&&"number"==typeof t.minor&&"number"==typeof t.major}t.isMessage=o,t.isVersion=l,t.isInitMessage=function(e){if(!o(e))return!1;const t=e;return!!(t.msgType===n.MessageType.Initialize&&t.apiVersion&&l(t.apiVersion)&&t.crossFrameVersion&&l(t.crossFrameVersion))},t.isCommandResponseMessage=function(e){if(!o(e))return!1;const t=e;return!(t.msgType!==n.MessageType.CommandResponse||!a.isGuid(t.commandGuid)||!t.data&&!t.error)},t.isCommandMessage=function(e){if(!o(e))return!1;const t=e;return!(t.msgType!==n.MessageType.Command||!t.parameters||"object"!=typeof t.parameters||!t.verbId||"string"!=typeof t.verbId)},t.isNotificationMessage=function(e){if(!o(e))return!1;const t=e;return!(t.msgType!==n.MessageType.Notification||!t.data&&!s.has(t.notificationId)||!t.notificationId||"string"!=typeof t.notificationId)},t.isHandshakeMessage=function(e){return!!o(e)&&e.msgType===n.MessageType.Handshake}},7204:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.MessageType||(t.MessageType={})).Initialize="initialize",r.Notification="notification",r.Command="command",r.CommandResponse="command-response",r.Handshake="v-handshake",r.Ack="v-ack"},1600:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.IdentityVersionConverter=class{upgradeExecuteCall(e,t){return{verb:e,parameters:t}}downgradeExecuteReturn(e){return e}downgradeNotification(e){return e}}},2320:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StackingVersionConverter=class{constructor(e,t,r,a,i){if(this._externalMajorVersion=e,this._platformMajorVersion=t,this._upgradeExecuteTranslations=r,this._downgradeExecuteTranslations=a,this._downgradeNotificationTranslations=i,this._externalMajorVersion>this._platformMajorVersion)throw new Error(`Cannot convert between external version ${this._externalMajorVersion} and ${this._platformMajorVersion}`)}static fromData(e,t,r,a,i){return new this(e.major,t.major,r,a,i)}upgradeExecuteCall(e,t){let r={verb:e,parameters:t};for(const e of this._upgradeExecuteTranslations)r=e(r.verb,r.parameters);return r}downgradeExecuteReturn(e){let t=e;for(const e of this._downgradeExecuteTranslations)t=e(t);return t}downgradeNotification(e){let t=e;for(const e of this._downgradeNotificationTranslations)t=e(t);return t}}},3760:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(1600),i=r(2320),n=r(720);function s(e,t){return e.major===t.major&&e.minor===t.minor}function o(e,t,r,n,o){const d=e.major,c=e.minor,u=t.major;if(d>u)throw new Error(`External version must be less than or equal to platform version.\n externalMajorVersion=${d} platformMajorVersion=${u}`);if(s(e,t))return new a.IdentityVersionConverter;const h=l(d,u,c,r),p=l(d,u,c,n),m=l(d,u,c,o);return p.reverse(),m.reverse(),i.StackingVersionConverter.fromData(e,t,h,p,m)}function l(e,t,r,a){const i=[];for(let n=e;n<=t;n++)if(n in a){const t=n===e?r:0,s=d(Object.keys(a[n]));for(let e=t;e<=s;e++)e in a[n]&&i.push(...a[n][e])}return i}function d(e){return e.map((e=>Number(e))).reduce(((e,t)=>e>t?e:t))}t.VersionLessThan=function(e,t){return!(e.major>t.major)&&(e.major{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(5824);t.DowngradeWorksheetNames=function(e){const t=e.result;return void 0!==t.extensionDashboardInfo&&t.extensionDashboardInfo.zones.forEach((e=>{e.sheetInfo&&(e.name=e.sheetInfo.name)})),e},t.DowngradeFlipboardZoneID=function(e){if(e.notificationId===i.NotificationId.SelectedMarksChanged){const t=e.data;void 0===t.flipboardZoneID&&(t.flipboardZoneID=0)}return e};const n=["tableau-row-dividers","tableau-column-dividers","tableau-pane"];t.DowngradeWorksheetFomatting175=e=>function(e,t){var r,a;const i=e.result;return(null===(a=null===(r=i)||void 0===r?void 0:r.extensionWorksheetInfo)||void 0===a?void 0:a.formatting)&&(i.extensionWorksheetInfo.formatting.formattingSheets=i.extensionWorksheetInfo.formatting.formattingSheets.filter((e=>!t.includes(e.classNameKey)))),e}(e,n),t.DowngradeWorksheetFomattingNotification175=e=>function(e,t){if(e.notificationId===i.NotificationId.WorksheetFormattingChanged){const r=e.data;e.data=r.formattingSheets.filter((e=>!t.includes(e.classNameKey)))}return e}(e,n),t.DowngradeExtensionEnvironmentContext=function(e){const t=e.result;if(void 0!==t.extensionEnvironment){const e=t.extensionEnvironment.extensionContext;e===a.ExtensionContext.PublicWeb||e===a.ExtensionContext.Cloud?t.extensionEnvironment.extensionContext=a.ExtensionContext.Server:e===a.ExtensionContext.PublicDesktop&&(t.extensionEnvironment.extensionContext=a.ExtensionContext.Desktop)}return e}},4528:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExternalIdentityVersionConverter=class{downgradeExecuteCall(e,t){return{verb:e,parameters:t}}upgradeExecuteReturn(e,t,r){return e}upgradeNotification(e){return e}}},5768:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExternalStackingVersionConverter=class{constructor(e,t,r,a,i){if(this._externalVersion=e,this._platformVersion=t,this._downgradeExecuteCallTranslations=r,this._upgradeExecuteReturnTranslations=a,this._upgradeNotificationTranslations=i,this._externalVersion.major>this._platformVersion.major)throw new Error(`Cannot convert between external version ${this._externalVersion.major}\n and ${this._platformVersion.major}`)}downgradeExecuteCall(e,t){let r={verb:e,parameters:t};for(const e of this._downgradeExecuteCallTranslations)r=e(r.verb,r.parameters);return r}upgradeExecuteReturn(e,t,r){let a=e;for(const e of this._upgradeExecuteReturnTranslations)a=e(a,t,r);return a}upgradeNotification(e){let t=e;for(const e of this._upgradeNotificationTranslations)t=e(t);return t}}},3388:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3760),i=r(4528),n=r(5768);function s(e,t,r,s,l){const d=e.major,c=t.major,u=t.minor;if(d>c)throw new Error(`External version must be less than or equal to platform version.\n externalMajorVersion=${d} platformMajorVersion=${c}`);if(d{"use strict";function a(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});var i=r(2808);t.ApiVersion=i.ApiVersion,a(r(5184));var n=r(8540);t.CrossFrameDispatcher=n.CrossFrameDispatcher;var s=r(8340);t.DataSource=s.DataSource;var o=r(1044);t.ExternalToInternalEnumMappings=o.ExternalToInternalEnumMappings;var l=r(6557);t.InternalToExternalEnumMappings=l.InternalToExternalEnumMappings;var d=r(2680);t.EventListenerManager=d.EventListenerManager;var c=r(1072);t.Field=c.Field;var u=r(2520);t.CustomViewImpl=u.CustomViewImpl;var h=r(1940);t.DashboardImpl=h.DashboardImpl;var p=r(6488);t.DashboardObjectImpl=p.DashboardObjectImpl;var m=r(2180);t.DataSourceImpl=m.DataSourceImpl;var g=r(8552);t.ParameterImpl=g.ParameterImpl;var y=r(8332);t.SheetImpl=y.SheetImpl;var I=r(8736);t.SheetInfoImpl=I.SheetInfoImpl;var v=r(5144);t.SingleEventManagerImpl=v.SingleEventManagerImpl;var S=r(6804);t.StoryImpl=S.StoryImpl;var T=r(2608);t.StoryPointImpl=T.StoryPointImpl;var b=r(6068);t.StoryPointInfoImpl=b.StoryPointInfoImpl;var f=r(3044);t.WorkbookImpl=f.WorkbookImpl;var E=r(6500);t.WorksheetImpl=E.WorksheetImpl;var A=r(6368);t.Point=A.Point,a(r(8672)),a(r(3008));var P=r(1832);t.ClientInfoServiceImpl=P.ClientInfoServiceImpl;var _=r(1288);t.NotificationServiceImpl=_.NotificationServiceImpl;var w=r(8808);t.NotificationServiceImplBase=w.NotificationServiceImplBase,t.Registration=w.Registration;var D=r(1776);t.ServiceImplBase=D.ServiceImplBase;var C=r(4109);t.SizeServiceImpl=C.SizeServiceImpl;var F=r(2248);t.StoryActivationServiceImpl=F.StoryActivationServiceImpl;var x=r(6664);t.TableauError=x.TableauError;var M=r(1724);t.Deferred=M.Deferred;var k=r(7480);t.ErrorHelpers=k.ErrorHelpers;var N=r(5044);t.ExportHelpers=N.ExportHelpers;var R=r(2780);t.SheetUtils=R.SheetUtils;var V=r(1576);t.VersionNumber=V.VersionNumber;var O=r(8648);t.VersionedExternalApiDispatcher=O.VersionedExternalApiDispatcher},2808:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(1576);class i{static get Instance(){return i._instance}static SetVersionNumber(e,t){i._instance=new a.VersionNumber(e,t)}}t.ApiVersion=i},716:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ConnectionSummary=class{constructor(e){this._connectionInfo=e}get name(){return this._connectionInfo.name}get id(){return this._connectionInfo.id}get serverURI(){return this._connectionInfo.serverURI}get type(){return this._connectionInfo.type}}},5184:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(8540);t.doCrossFrameBootstrap=function(e,t,r){return new Promise(((n,s)=>{let o;o=function(e){try{return e.self!==e.parent}catch(e){return!0}}(e)?e.parent:e.opener,o||s("This extension is not running inside an iframe, desktop, or popup window. Initialization failed.");const l=new a.CrossFrameMessenger(e,o,"*"),d=l.prepareInitializationMessage(t,a.MESSAGING_VERSION,r);l.setCommandResponseMessageHandler((function(e){e.commandGuid===d.messageGuid&&n((()=>new i.CrossFrameDispatcher(l)))})),l.startListening(),d.send()}))}},8540:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419);t.CrossFrameDispatcher=class{constructor(e){if(this._messenger=e,this._pendingPromises={},this._notificationHandlers=[],!this._messenger)throw"Missing messenger object";this._messenger.setCommandResponseMessageHandler(this.onCommandResponse.bind(this)),this._messenger.setNotificationMessageHandler(this.onNotification.bind(this))}execute(e,t){const r=this._messenger.prepareCommandMessage(e,t),a=new Promise(((e,t)=>{this._pendingPromises[r.messageGuid]={resolve:e,reject:t}}));return r.send(),a}registerNotificationHandler(e){this._notificationHandlers.push(e)}unregisterNotificationHandler(e){this._notificationHandlers=this._notificationHandlers.filter((t=>t!==e))}onCommandResponse(e){if(Object.keys(this._pendingPromises).indexOf(e.commandGuid)<0)return;const t=this._pendingPromises[e.commandGuid];e.error&&t.reject(e.error),e.data&&t.resolve({result:e.data}),delete this._pendingPromises[e.commandGuid]}onNotification(e){for(const t of this._notificationHandlers)try{t({notificationId:e.notificationId,data:e.data})}catch(e){if(e.errorCode===a.EmbeddingErrorCodes.IncompatibleVersionError)throw e}}}},8340:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataSource=class{constructor(e){this._dataSourceImpl=e}get name(){return this._dataSourceImpl.name}get id(){return this._dataSourceImpl.id}get fields(){return this._dataSourceImpl.fields}get extractUpdateTime(){return this._dataSourceImpl.extractUpdateTime}get isExtract(){return this._dataSourceImpl.isExtract}get isPublished(){return this._dataSourceImpl.isPublished}publishedUrl(){return this._dataSourceImpl.publishedUrl()}refreshAsync(){return this._dataSourceImpl.refreshAsync()}getActiveTablesAsync(){return console.warn("DataSource.getActiveTablesAsync is deprecated. Please use DataSource.getLogicalTablesAsync."),this._dataSourceImpl.getActiveTablesAsync()}getConnectionSummariesAsync(){return this._dataSourceImpl.getConnectionSummariesAsync()}getUnderlyingDataAsync(e){return console.warn("DataSource.getUnderlyingDataAsync is deprecated. Please use DataSource.getLogicalTablesAsync and DataSource.getLogicalTableDataAsync."),this._dataSourceImpl.getUnderlyingDataAsync(e)}getLogicalTablesAsync(){return this._dataSourceImpl.getLogicalTablesAsync()}getLogicalTableDataAsync(e,t){return this._dataSourceImpl.getLogicalTableDataAsync(e,t)}getLogicalTableDataReaderAsync(e,t,r){return this._dataSourceImpl.getLogicalTableDataReaderAsync(e,t,r)}}},1044:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5520);class s{}t.ExternalToInternalEnumMappings=s,s.filterDomainType=new n.EnumConverter({[a.FilterDomainType.Relevant]:i.FilterDomainType.Relevant,[a.FilterDomainType.Database]:i.FilterDomainType.Database}),s.nullOptions=new n.EnumConverter({[a.FilterNullOption.AllValues]:i.FilterNullOption.AllValues,[a.FilterNullOption.NonNullValues]:i.FilterNullOption.NonNullValues,[a.FilterNullOption.NullValues]:i.FilterNullOption.NullValues}),s.filterUpdateType=new n.EnumConverter({[a.FilterUpdateType.Add]:i.FilterUpdateType.Add,[a.FilterUpdateType.All]:i.FilterUpdateType.All,[a.FilterUpdateType.Remove]:i.FilterUpdateType.Remove,[a.FilterUpdateType.Replace]:i.FilterUpdateType.Replace}),s.setVisibilityType=new n.EnumConverter({[a.ZoneVisibilityType.Show]:!0,[a.ZoneVisibilityType.Hide]:!1}),s.setReplaySpeedType=new n.EnumConverter({[a.ReplaySpeedType.Slow]:2,[a.ReplaySpeedType.Normal]:1,[a.ReplaySpeedType.Fast]:.5}),s.sheetType=new n.EnumConverter({[a.SheetType.Dashboard]:i.SheetType.Dashboard,[a.SheetType.Worksheet]:i.SheetType.Worksheet,[a.SheetType.Story]:i.SheetType.Story}),s.showDataTableFormatType=new n.EnumConverter({[a.IncludeDataValuesOption.AllValues]:i.ApiShowDataTableFormat.NativeAndFormattedValues,[a.IncludeDataValuesOption.OnlyNativeValues]:i.ApiShowDataTableFormat.NativeValuesOnly,[a.IncludeDataValuesOption.OnlyFormattedValues]:i.ApiShowDataTableFormat.FormattedValuesOnly}),s.periodType=new n.EnumConverter({[a.PeriodType.Years]:i.DateStepPeriod.Years,[a.PeriodType.Quarters]:i.DateStepPeriod.Quarters,[a.PeriodType.Months]:i.DateStepPeriod.Months,[a.PeriodType.Weeks]:i.DateStepPeriod.Weeks,[a.PeriodType.Days]:i.DateStepPeriod.Days,[a.PeriodType.Hours]:i.DateStepPeriod.Hours,[a.PeriodType.Minutes]:i.DateStepPeriod.Minutes,[a.PeriodType.Seconds]:i.DateStepPeriod.Seconds}),s.dateRangeType=new n.EnumConverter({[a.DateRangeType.Last]:i.DateRangeType.Last,[a.DateRangeType.LastN]:i.DateRangeType.LastN,[a.DateRangeType.Next]:i.DateRangeType.Next,[a.DateRangeType.NextN]:i.DateRangeType.NextN,[a.DateRangeType.Current]:i.DateRangeType.Current,[a.DateRangeType.ToDate]:i.DateRangeType.ToDate}),s.dialogStyles=new n.EnumConverter({[a.DialogStyle.Window]:i.DialogStyle.Window,[a.DialogStyle.Modal]:i.DialogStyle.Modal,[a.DialogStyle.Modeless]:i.DialogStyle.Modeless})},6557:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5520);class s{}t.InternalToExternalEnumMappings=s,s.extensionContext=new n.EnumConverter({[i.ExtensionContext.Desktop]:a.ExtensionContext.Desktop,[i.ExtensionContext.Server]:a.ExtensionContext.Server,[i.ExtensionContext.PublicWeb]:a.ExtensionContext.PublicWeb,[i.ExtensionContext.PublicDesktop]:a.ExtensionContext.PublicDesktop,[i.ExtensionContext.Cloud]:a.ExtensionContext.Cloud}),s.extensionMode=new n.EnumConverter({[i.ExtensionMode.Authoring]:a.ExtensionMode.Authoring,[i.ExtensionMode.Viewing]:a.ExtensionMode.Viewing}),s.columnType=new n.EnumConverter({[i.ColumnType.Continuous]:a.ColumnType.Continuous,[i.ColumnType.Discrete]:a.ColumnType.Discrete,[i.ColumnType.Unknown]:a.ColumnType.Unknown}),s.fieldAggregationType=new n.EnumConverter({[i.FieldAggregationType.Attr]:a.FieldAggregationType.Attr,[i.FieldAggregationType.Avg]:a.FieldAggregationType.Avg,[i.FieldAggregationType.Collect]:a.FieldAggregationType.Collect,[i.FieldAggregationType.Count]:a.FieldAggregationType.Count,[i.FieldAggregationType.Countd]:a.FieldAggregationType.Countd,[i.FieldAggregationType.Day]:a.FieldAggregationType.Day,[i.FieldAggregationType.End]:a.FieldAggregationType.End,[i.FieldAggregationType.Hour]:a.FieldAggregationType.Hour,[i.FieldAggregationType.InOut]:a.FieldAggregationType.InOut,[i.FieldAggregationType.Kurtosis]:a.FieldAggregationType.Kurtosis,[i.FieldAggregationType.Max]:a.FieldAggregationType.Max,[i.FieldAggregationType.Mdy]:a.FieldAggregationType.Mdy,[i.FieldAggregationType.Median]:a.FieldAggregationType.Median,[i.FieldAggregationType.Min]:a.FieldAggregationType.Min,[i.FieldAggregationType.Minute]:a.FieldAggregationType.Minute,[i.FieldAggregationType.MonthYear]:a.FieldAggregationType.MonthYear,[i.FieldAggregationType.None]:a.FieldAggregationType.None,[i.FieldAggregationType.Qtr]:a.FieldAggregationType.Qtr,[i.FieldAggregationType.Quart1]:a.FieldAggregationType.Quart1,[i.FieldAggregationType.Quart3]:a.FieldAggregationType.Quart3,[i.FieldAggregationType.Second]:a.FieldAggregationType.Second,[i.FieldAggregationType.Skewness]:a.FieldAggregationType.Skewness,[i.FieldAggregationType.Stdev]:a.FieldAggregationType.Stdev,[i.FieldAggregationType.Stdevp]:a.FieldAggregationType.Stdevp,[i.FieldAggregationType.Sum]:a.FieldAggregationType.Sum,[i.FieldAggregationType.TruncDay]:a.FieldAggregationType.TruncDay,[i.FieldAggregationType.TruncHour]:a.FieldAggregationType.TruncHour,[i.FieldAggregationType.TruncMinute]:a.FieldAggregationType.TruncMinute,[i.FieldAggregationType.TruncMonth]:a.FieldAggregationType.TruncMonth,[i.FieldAggregationType.TruncQtr]:a.FieldAggregationType.TruncQtr,[i.FieldAggregationType.TruncSecond]:a.FieldAggregationType.TruncSecond,[i.FieldAggregationType.TruncWeek]:a.FieldAggregationType.TruncWeek,[i.FieldAggregationType.TruncYear]:a.FieldAggregationType.TruncYear,[i.FieldAggregationType.User]:a.FieldAggregationType.User,[i.FieldAggregationType.Var]:a.FieldAggregationType.Var,[i.FieldAggregationType.Varp]:a.FieldAggregationType.Varp,[i.FieldAggregationType.Week]:a.FieldAggregationType.Week,[i.FieldAggregationType.Weekday]:a.FieldAggregationType.Weekday,[i.FieldAggregationType.Year]:a.FieldAggregationType.Year}),s.fieldRoleType=new n.EnumConverter({[i.FieldRoleType.Dimension]:a.FieldRoleType.Dimension,[i.FieldRoleType.Measure]:a.FieldRoleType.Measure,[i.FieldRoleType.Unknown]:a.FieldRoleType.Unknown}),s.sheetType=new n.EnumConverter({[i.SheetType.Dashboard]:a.SheetType.Dashboard,[i.SheetType.Story]:a.SheetType.Story,[i.SheetType.Worksheet]:a.SheetType.Worksheet}),s.dashboardObjectType=new n.EnumConverter({[i.DashboardObjectType.Extension]:a.DashboardObjectType.Extension,[i.DashboardObjectType.Blank]:a.DashboardObjectType.Blank,[i.DashboardObjectType.Image]:a.DashboardObjectType.Image,[i.DashboardObjectType.Legend]:a.DashboardObjectType.Legend,[i.DashboardObjectType.PageFilter]:a.DashboardObjectType.PageFilter,[i.DashboardObjectType.ParameterControl]:a.DashboardObjectType.ParameterControl,[i.DashboardObjectType.QuickFilter]:a.DashboardObjectType.QuickFilter,[i.DashboardObjectType.Text]:a.DashboardObjectType.Text,[i.DashboardObjectType.Title]:a.DashboardObjectType.Title,[i.DashboardObjectType.WebPage]:a.DashboardObjectType.WebPage,[i.DashboardObjectType.Worksheet]:a.DashboardObjectType.Worksheet}),s.dataType=new n.EnumConverter({[i.DataType.Bool]:a.DataType.Bool,[i.DataType.Date]:a.DataType.Date,[i.DataType.DateTime]:a.DataType.DateTime,[i.DataType.Float]:a.DataType.Float,[i.DataType.Int]:a.DataType.Int,[i.DataType.Spatial]:a.DataType.Spatial,[i.DataType.String]:a.DataType.String}),s.filterUpdateType=new n.EnumConverter({[i.FilterUpdateType.Add]:a.FilterUpdateType.Add,[i.FilterUpdateType.All]:a.FilterUpdateType.All,[i.FilterUpdateType.Remove]:a.FilterUpdateType.Remove,[i.FilterUpdateType.Replace]:a.FilterUpdateType.Replace}),s.allowableValues=new n.EnumConverter({[i.DomainRestrictionType.All]:a.ParameterValueType.All,[i.DomainRestrictionType.List]:a.ParameterValueType.List,[i.DomainRestrictionType.Range]:a.ParameterValueType.Range}),s.dateStepPeriod=new n.EnumConverter({[i.DateStepPeriod.Years]:a.PeriodType.Years,[i.DateStepPeriod.Quarters]:a.PeriodType.Quarters,[i.DateStepPeriod.Months]:a.PeriodType.Months,[i.DateStepPeriod.Weeks]:a.PeriodType.Weeks,[i.DateStepPeriod.Days]:a.PeriodType.Days,[i.DateStepPeriod.Hours]:a.PeriodType.Hours,[i.DateStepPeriod.Minutes]:a.PeriodType.Minutes,[i.DateStepPeriod.Seconds]:a.PeriodType.Seconds}),s.dateRangeType=new n.EnumConverter({[i.DateRangeType.Current]:a.DateRangeType.Current,[i.DateRangeType.Last]:a.DateRangeType.Last,[i.DateRangeType.LastN]:a.DateRangeType.LastN,[i.DateRangeType.Next]:a.DateRangeType.Next,[i.DateRangeType.NextN]:a.DateRangeType.NextN,[i.DateRangeType.ToDate]:a.DateRangeType.ToDate}),s.errorCode=new n.EnumConverter({[i.ErrorCodes.INITIALIZATION_ERROR]:a.ErrorCodes.InternalError,[i.ErrorCodes.INTERNAL_ERROR]:a.ErrorCodes.InternalError,[i.ErrorCodes.MISSING_ENUM_MAPPING]:a.ErrorCodes.InternalError,[i.ErrorCodes.MISSING_PARAMETER]:a.ErrorCodes.InternalError,[i.ErrorCodes.PERMISSION_DENIED]:a.ErrorCodes.InternalError,[i.ErrorCodes.PRES_MODEL_PARSING_ERROR]:a.ErrorCodes.InternalError,[i.ErrorCodes.UNKNOWN_VERB_ID]:a.ErrorCodes.InternalError,[i.ErrorCodes.VERSION_NOT_CONFIGURED]:a.ErrorCodes.APINotInitialized,[i.ErrorCodes.VISIBILITY_ERROR]:a.ErrorCodes.VisibilityError},a.ErrorCodes.InternalError),s.filterType=new n.EnumConverter({[i.FilterType.Categorical]:a.FilterType.Categorical,[i.FilterType.Range]:a.FilterType.Range,[i.FilterType.RelativeDate]:a.FilterType.RelativeDate,[i.FilterType.Hierarchical]:a.FilterType.Hierarchical}),s.classNameKey=new n.EnumConverter({"tableau-dashboard-title":a.ClassNameKey.DashboardTitle,"tableau-story-title":a.ClassNameKey.StoryTitle,"tableau-tooltip":a.ClassNameKey.Tooltip,"tableau-worksheet":a.ClassNameKey.Worksheet,"tableau-worksheet-title":a.ClassNameKey.WorksheetTitle,"tableau-pane":a.ClassNameKey.Pane,"tableau-row-dividers":a.ClassNameKey.RowDividers,"tableau-column-dividers":a.ClassNameKey.ColumnDividers,"dashboard-title":a.ClassNameKey.DashboardTitle,"story-title":a.ClassNameKey.StoryTitle,tooltip:a.ClassNameKey.Tooltip,worksheet:a.ClassNameKey.Worksheet,"worksheet-title":a.ClassNameKey.WorksheetTitle,pane:a.ClassNameKey.Pane,"row-dividers":a.ClassNameKey.RowDividers,"column-dividers":a.ClassNameKey.ColumnDividers}),s.hierarchicalLevelSelectionState=new n.EnumConverter({[i.HierarchicalLevelSelectionState.AllSelected]:a.HierarchicalLevelSelectionState.AllSelected,[i.HierarchicalLevelSelectionState.NoneSelected]:a.HierarchicalLevelSelectionState.NoneSelected,[i.HierarchicalLevelSelectionState.SomeSelected]:a.HierarchicalLevelSelectionState.SomeSelected,[i.HierarchicalLevelSelectionState.UnknownSelected]:a.HierarchicalLevelSelectionState.UnknownSelected}),s.annotationType=new n.EnumConverter({[i.AnnotateEnum.Area]:a.AnnotationType.Area,[i.AnnotateEnum.Mark]:a.AnnotationType.Mark,[i.AnnotateEnum.Point]:a.AnnotationType.Point}),s.markType=new n.EnumConverter({[i.MarkType.Area]:a.MarkType.Area,[i.MarkType.Bar]:a.MarkType.Bar,[i.MarkType.Circle]:a.MarkType.Circle,[i.MarkType.GanttBar]:a.MarkType.GanttBar,[i.MarkType.Heatmap]:a.MarkType.Heatmap,[i.MarkType.Line]:a.MarkType.Line,[i.MarkType.Map]:a.MarkType.Map,[i.MarkType.Pie]:a.MarkType.Pie,[i.MarkType.Polygon]:a.MarkType.Polygon,[i.MarkType.Shape]:a.MarkType.Shape,[i.MarkType.Square]:a.MarkType.Square,[i.MarkType.Text]:a.MarkType.Text,[i.MarkType.VizExtension]:a.MarkType.VizExtension})},2680:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664);t.EventListenerManager=class{constructor(){this._eventListenerManagers={}}addEventListener(e,t){if(!this._eventListenerManagers.hasOwnProperty(e))throw new i.TableauError(a.ErrorCodes.UnsupportedEventName,`Cannot add event, unsupported event type: ${e}`);return this._eventListenerManagers[e].addEventListener(t)}removeEventListener(e,t){if(!this._eventListenerManagers.hasOwnProperty(e))throw new i.TableauError(a.ErrorCodes.UnsupportedEventName,`Cannot remove event, unsupported event type: ${e}`);return this._eventListenerManagers[e].removeEventListener(t)}addNewEventType(e){this._eventListenerManagers[e.eventType]=e}}},1072:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Field=class{constructor(e){this._fieldImpl=e}get name(){return this._fieldImpl.name}get id(){return this._fieldImpl.id}get description(){return this._fieldImpl.description}get dataType(){return this._fieldImpl.dataType}get aggregation(){return this._fieldImpl.aggregation}get dataSource(){return this._fieldImpl.dataSource}get role(){return this._fieldImpl.role}get columnType(){return this._fieldImpl.columnType}get isCalculatedField(){return this._fieldImpl.isCalculatedField}get isCombinedField(){return this._fieldImpl.isCombinedField}get isGenerated(){return this._fieldImpl.isGenerated}get isGeospatial(){return this._fieldImpl.isGeospatial}get isHidden(){return this._fieldImpl.isHidden}get isPresentOnPublishedDatasource(){return this._fieldImpl.isPresentOnPublishedDatasource}}},2520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136);t.CustomViewImpl=class{constructor(e,t){this._registryId=t,this._luid=e.luid,this._name=e.name,this._shared=e.shared,this._isDefault=e.isDefault,this._ownerName=e.owner.userFriendlyName,this._url=e.url}get luid(){return this._luid}get name(){return this._name}set name(e){this._name=e}get shared(){return this._shared}set shared(e){this._shared=e}get isDefault(){return this._isDefault}set isDefault(e){this._isDefault=e}get ownerName(){return this._ownerName}get url(){return this._url}saveAsync(){return a.ApiServiceRegistry.get(this._registryId).getService("viz-service").saveAsync(this)}}},1940:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7419),n=r(3448),s=r(6557),o=r(6368),l=r(3008),d=r(6664),c=r(7480),u=r(6488),h=r(8332),p=r(8736),m=r(6500);class g extends h.SheetImpl{constructor(e,t,r,a,i,n=0){super(e,a),this._zones=t,this._sheetPath=r,this._parentStoryPointImpl=i,this._activeDashboardObjectId=n}get worksheetsImpl(){return this._worksheetsImpl}get objects(){return this._objects}get parentStoryPoint(){return this._parentStoryPointImpl}get activeDashboardObjectId(){return this._activeDashboardObjectId}get activeDashboardName(){return this._sheetPath.sheetName}initializeWithPublicInterfaces(){this._worksheetsImpl=new Array,this._objects=new Array,this.zoneMap=new Map;for(const e of this._zones){let t;const r={width:e.width,height:e.height},a=!1;if(e.zoneType===n.DashboardObjectType.Worksheet||e.zoneType===n.DashboardObjectType.QuickFilter){let s="",o="",l=!1;e.sheetInfo?(s=e.sheetInfo.name,o=e.sheetInfo.url||"",l=""===o):s=e.name;const d=new p.SheetInfoImpl(s,i.SheetType.Worksheet,r,this._worksheetsImpl.length,a,l,o),c={worksheet:s,dashboard:this._sheetInfoImpl.name,storyboard:this._sheetPath.storyboard,flipboardZoneID:this._sheetPath.flipboardZoneID,storyPointID:this._sheetPath.storyPointID};t=new m.WorksheetImpl(d,this._registryId,c,this,this._parentStoryPointImpl),e.zoneType===n.DashboardObjectType.Worksheet&&this._worksheetsImpl.push(t)}const l=new o.Point(e.x,e.y),d=new u.DashboardObjectImpl(this,s.InternalToExternalEnumMappings.dashboardObjectType.convert(e.zoneType),l,r,t,e.name,void 0!==e.isFloating&&e.isFloating,void 0===e.isVisible||e.isVisible,e.zoneId,e.fieldId);this._objects.push(d),this.zoneMap.set(e.zoneId,d)}}setDashboardObjectVisibilityAsync(e){return l.ApiServiceRegistry.get(this._registryId).getService("zone-service").setVisibilityAsync(this.name,this.zoneMap,e)}getDashboardObjectById(e){return this.zoneMap.get(e)}updateZones(e,t=0,r=""){const a=this._objects,n=this.zoneMap,s=this._activeDashboardObjectId,o=this._sheetPath.sheetName;this._zones=e,this._activeDashboardObjectId=t,r&&(this._sheetPath.sheetName=r,this._sheetInfoImpl.name=r),this.initializeWithPublicInterfaces();const l=this._objects,d=this.zoneMap,c=new Map;return a.forEach((e=>{const t=e.id;if(!d.has(t))return void this.addChange(t,c,i.DashboardLayoutChange.Removed);const r=d.get(t);e.isFloating!==r.isFloating&&this.addChange(t,c,i.DashboardLayoutChange.IsFloatingChanged),e.isVisible!==r.isVisible&&this.addChange(t,c,i.DashboardLayoutChange.IsVisibleChanged),e.name!==r.name&&this.addChange(t,c,i.DashboardLayoutChange.NameChanged),e.position.x===r.position.x&&e.position.y===r.position.y||this.addChange(t,c,i.DashboardLayoutChange.PositionChanged),e.size.width===r.size.width&&e.size.height===r.size.height||this.addChange(t,c,i.DashboardLayoutChange.SizeChanged)})),l.forEach((e=>{n.has(e.id)||this.addChange(e.id,c,i.DashboardLayoutChange.Added)})),s!==t&&(0!==t&&this.addChange(t,c,i.DashboardLayoutChange.Selected),0!==s&&this.addChange(s,c,i.DashboardLayoutChange.Deselected)),r&&o!==r&&this.addChange(0,c,i.DashboardLayoutChange.DashboardChanged),c}addChange(e,t,r){t.has(e)||t.set(e,[]),t.get(e).push(r)}moveAndResizeDashboardObjectsAsync(e){return l.ApiServiceRegistry.get(this._registryId).getService("zone-service").moveAndResizeAsync(this.name,this.zoneMap,e)}replayAnimationAsync(e){return l.ApiServiceRegistry.get(this._registryId).getService("animation-service").replayAsync(e)}getFiltersAsync(){return this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").getDashboardFiltersAsync()}applyFilterAsync(e,t,r,n){if(c.ErrorHelpers.verifyEnumValue(r,a.FilterUpdateType,"FilterUpdateType"),c.ErrorHelpers.verifyStringParameter(e,"fieldName"),!Array.isArray(t))throw new d.TableauError(i.ErrorCodes.InvalidParameter,"values parameter for applyDashboardFilterAsync must be an array");return this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyDashboardFilterAsync(e,t,r,n)}getWorksheetNamesFromZones(){const e=[];for(const t of this._zones){if(t.zoneType!==n.DashboardObjectType.Worksheet)continue;const r=t.sheetInfo?t.sheetInfo.name:t.name;e.push(r)}return e}verifyActiveSheetOrEmbeddedInActiveStoryPoint(){const e=this.active,t=null!=this.parentStoryPoint&&this.parentStoryPoint.active;if(!e&&!t)throw new d.TableauError(i.SharedErrorCodes.NotActiveSheet,"Operation not allowed on non-active sheet")}}t.DashboardImpl=g},6488:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DashboardObjectImpl=class{constructor(e,t,r,a,i,n,s,o,l,d){this._dashboardImpl=e,this._type=t,this._position=r,this._size=a,this._worksheetImpl=i,this._name=n,this._isFloating=s,this._isVisible=o,this._id=l,this._fieldId=d}get dashboardImpl(){return this._dashboardImpl}get type(){return this._type}get position(){return this._position}get size(){return this._size}get worksheetImpl(){return this._worksheetImpl}get name(){return this._name}get isFloating(){return this._isFloating}get isVisible(){return this._isVisible}get id(){return this._id}get fieldId(){return this._fieldId}}},2180:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(716),n=r(1072),s=r(624),o=r(3008),l=r(7603),d=r(7480),c=r(5288);t.DataSourceImpl=class{constructor(e,t){this._dataSourceInfo=e,this._registryId=t,this._fields=e.fields.map((e=>{const t=new c.FieldImpl(e,this);return new n.Field(t)}))}get name(){return this._dataSourceInfo.name}get id(){return this._dataSourceInfo.id}get extractUpdateTime(){return this._dataSourceInfo.extractUpdateTime}get fields(){return this._fields}get isExtract(){return this._dataSourceInfo.isExtract}get isPublished(){return this._dataSourceInfo.isPublished}publishedUrl(){return this._dataSourceInfo.publishedUrl}getMaxPageRowLimit(){return 1e4}refreshAsync(){return o.ApiServiceRegistry.get(this._registryId).getService("data-source-service").refreshAsync(this._dataSourceInfo.id)}getConnectionSummariesAsync(){return o.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getConnectionSummariesAsync(this._dataSourceInfo.id).then((e=>e.map((e=>new i.ConnectionSummary(e)))))}getActiveTablesAsync(){return o.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getActiveTablesAsync(this._dataSourceInfo.id).then((e=>e.map((e=>new l.TableSummary(e)))))}getUnderlyingDataAsync(e){return e=e||{},o.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getDataSourceDataAsync(this.id,!!e.ignoreAliases,e.maxRows||0,e.columnsToInclude||[],e.columnsToIncludeById||[],e.includeDataValuesOption||a.IncludeDataValuesOption.AllValues)}getLogicalTableDataAsync(e,t){return t=t||{},o.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getLogicalTableDataAsync(this.id,e,!!t.ignoreAliases,t.maxRows||0,t.columnsToInclude||[],t.columnsToIncludeById||[],t.includeDataValuesOption||a.IncludeDataValuesOption.AllValues)}getLogicalTableDataReaderAsync(e,t,r){return r=r||{},o.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getLogicalTableDataReaderAsync(this.id,e,t||this.getMaxPageRowLimit(),!!r.ignoreAliases,r.columnsToIncludeById||[],r.includeDataValuesOption||a.IncludeDataValuesOption.AllValues)}initializeWithPublicInterfaces(e){d.ErrorHelpers.verifyInternalValue(e,"dataSource"),this._fields=this._dataSourceInfo.fields.map((t=>{const r=new c.FieldImpl(t,e);return new n.Field(r)}))}getLogicalTablesAsync(){return o.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getLogicalTablesAsync(this.id).then((e=>e.map((e=>new s.LogicalTable(e)))))}}},5288:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(6557);t.FieldImpl=class{constructor(e,t){this._fieldInfo=e,this._parentDataSource=t}get name(){return this._fieldInfo.name}get id(){return this._fieldInfo.id}get description(){return this._fieldInfo.description}get dataType(){var e;return null!=(e=this._fieldInfo.dataType)?e:a.DataType.Unknown}get aggregation(){return n.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation)}get dataSource(){if(!this._parentDataSource)throw new Error("Data source information is not available for this field. Please use getFieldAsync method to get field's data source information");return this._parentDataSource}get role(){return n.InternalToExternalEnumMappings.fieldRoleType.convert(this._fieldInfo.role)}get columnType(){let e=this._fieldInfo.columnType||i.ColumnType.Unknown;return n.InternalToExternalEnumMappings.columnType.convert(e)}get isCalculatedField(){return this._fieldInfo.isCalculatedField}get isCombinedField(){return this._fieldInfo.isCombinedField}get isGenerated(){return this._fieldInfo.isGenerated}get isGeospatial(){return this._fieldInfo.isGeospatial}get isHidden(){return this._fieldInfo.isHidden}get isPresentOnPublishedDatasource(){return this._fieldInfo.isPresentOnPublishedDatasource}}},8552:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6557),n=r(3008),s=r(8052),o=r(7480),l=r(1172);t.ParameterImpl=class{constructor(e,t){this._registryId=t,this.setParameterInfo(e)}get name(){return this._parameterInfo.name}get currentValue(){return s.DataValueFactory.MakeParameterDataValue(this._parameterInfo.currentValue,this._parameterInfo.dataType)}get dataType(){return i.InternalToExternalEnumMappings.dataType.convert(this._parameterInfo.dataType)}get id(){return this._globalFieldName}get allowableValues(){return this._allowableValues}changeValueAsync(e){o.ErrorHelpers.verifyParameter(e,"newValue");const t=l.Param.serializeParameterValue(e);return n.ApiServiceRegistry.get(this._registryId).getService("parameters-service").changeParameterValueAsync(this._globalFieldName,t).then((e=>(this.setParameterInfo(e),this.currentValue)))}setParameterInfo(e){this._parameterInfo=e,this._globalFieldName=e.fieldName;const t=i.InternalToExternalEnumMappings.allowableValues.convert(e.allowableValuesType);let r,n,o,l,d;t===a.ParameterValueType.List?r=(e.allowableValues||[]).map((t=>s.DataValueFactory.MakeParameterDataValue(t,e.dataType))):t===a.ParameterValueType.Range&&(n=e.minValue&&s.DataValueFactory.MakeParameterDataValue(e.minValue,e.dataType),o=e.maxValue&&s.DataValueFactory.MakeParameterDataValue(e.maxValue,e.dataType),l=e.stepSize,d=e.dateStepPeriod&&i.InternalToExternalEnumMappings.dateStepPeriod.convert(e.dateStepPeriod)),this._allowableValues={type:t,allowableValues:r,minValue:n,maxValue:o,stepSize:l,dateStepPeriod:d}}}},8332:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3008),n=r(6664),s=r(7480),o=r(1172),l=r(2780);class d{constructor(e,t){this._sheetInfoImpl=e,this._registryId=t}get name(){return this._sheetInfoImpl.name}get sheetType(){return this._sheetInfoImpl.sheetType}get sheetPath(){return this._sheetInfoImpl.sheetPath}get size(){return this._sheetInfoImpl.sheetSize}get hidden(){if(void 0!==this._sheetInfoImpl.isHidden)return this._sheetInfoImpl.isHidden;throw new n.TableauError(a.EmbeddingErrorCodes.ImplementationError,"isHidden not implemented")}get active(){if(void 0!==this._sheetInfoImpl.isActive)return this._sheetInfoImpl.isActive;throw new n.TableauError(a.EmbeddingErrorCodes.ImplementationError,"active not implemented")}set active(e){void 0!==this._sheetInfoImpl.isActive&&(this._sheetInfoImpl.active=e)}get index(){if(void 0!==this._sheetInfoImpl.index)return this._sheetInfoImpl.index;throw new n.TableauError(a.EmbeddingErrorCodes.ImplementationError,"index not implemented")}get url(){if(void 0!==this._sheetInfoImpl.url)return this._sheetInfoImpl.url;throw new n.TableauError(a.EmbeddingErrorCodes.ImplementationError,"url not implemented")}getSheetSize(){if(!l.SheetUtils.isValidSheetSize(this.size))throw new n.TableauError(a.EmbeddingErrorCodes.InternalError,"size is not of type SheetSize");return this.size}findParameterAsync(e){return s.ErrorHelpers.verifyParameter(e,"parameterName"),i.ApiServiceRegistry.get(this._registryId).getService("parameters-service").findParameterByNameAsync(e)}getParametersAsync(){return i.ApiServiceRegistry.get(this._registryId).getService("parameters-service").getParametersForSheetAsync(this.sheetPath)}changeSizeAsync(e){const t=new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Invalid sheet size parameter");if(!e||!e.behavior)throw t;const r=this.normalizeSheetSize(e),s=r.behavior===a.SheetSizeBehavior.Automatic;if(!s&&!r.minSize&&!r.maxSize)throw t;if(!s&&this.sheetType===a.SheetType.Worksheet)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSizeBehaviorOnWorksheet,"Only SheetSizeBehavior.Automatic is allowed on Worksheets");if(s&&this.getSheetSize().behavior===r.behavior)return Promise.resolve(e);const o=this.processNewSize(r);return i.ApiServiceRegistry.get(this._registryId).getService("size-service").changeSizeAsync(this.name,o).then((()=>i.ApiServiceRegistry.get(this._registryId).getService("client-info-service").getClientInfoAsync().then((e=>{const t=e.publishedSheets.find((e=>e.name===this.name));if(!t)throw new n.TableauError(a.SharedErrorCodes.InternalError,`Can't find sheet with name ${this.name}`);const r=l.SheetUtils.getSheetSizeFromSizeConstraints(t.sizeConstraint);return this._sheetInfoImpl.sheetSize=r,r}))))}normalizeSheetSize(e){const{behavior:t}=e;return s.ErrorHelpers.verifyEnumValue(t,a.SheetSizeBehavior,"SheetSizeBehavior"),{behavior:t,minSize:d.parseDimensions(e.minSize),maxSize:d.parseDimensions(e.maxSize)}}processNewSize(e){var t,r,i,s;const{behavior:l,minSize:d,maxSize:c}=e,u=!o.Param.isNullOrUndefined(null===(t=d)||void 0===t?void 0:t.width),h=!o.Param.isNullOrUndefined(null===(r=d)||void 0===r?void 0:r.height),p=!o.Param.isNullOrUndefined(null===(i=c)||void 0===i?void 0:i.width),m=!o.Param.isNullOrUndefined(null===(s=c)||void 0===s?void 0:s.height),g=u&&h,y=p&&m;switch(l){case a.SheetSizeBehavior.Automatic:return{behavior:l};case a.SheetSizeBehavior.AtMost:{if(!c||!y)throw new n.TableauError(a.EmbeddingErrorCodes.MissingMaxSize,"Missing maxSize for SheetSizeBehavior.AtMost");const e={width:c.width,height:c.height};if(e.width<0||e.height<0)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:l,maxSize:e}}case a.SheetSizeBehavior.AtLeast:{if(!d||!g)throw new n.TableauError(a.EmbeddingErrorCodes.MissingMinSize,"Missing minSize for SheetSizeBehavior.AtLeast");const e={width:d.width,height:d.height};if(e.width<0||e.height<0)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:l,minSize:e}}case a.SheetSizeBehavior.Range:{if(!(d&&c&&g&&y))throw new n.TableauError(a.EmbeddingErrorCodes.MissingMinMaxSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");const e={width:d.width,height:d.height},t={width:c.width,height:c.height};if(e.width<0||e.height<0||t.width<0||t.height<0||e.width>t.width||e.height>t.height)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");return{behavior:l,minSize:e,maxSize:t}}case a.SheetSizeBehavior.Exactly:if(d&&c){if(g&&y){const e={width:d.width,height:d.height},t={width:c.width,height:c.height};if(e.width!==t.width||e.height!==t.height)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Conflicting size values for SheetSizeBehavior.Exactly");return{behavior:l,minSize:e,maxSize:t}}if(g){const e={width:d.width,height:d.height};return{behavior:l,minSize:e,maxSize:e}}if(y){const e={width:c.width,height:c.height};return{behavior:l,minSize:e,maxSize:e}}}throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Invalid sheet size parameter");default:throw new n.TableauError(a.SharedErrorCodes.InternalError,`Unsupported sheet size behavior: ${l}`)}}}t.SheetImpl=d,d.parseDimensions=e=>{const t={width:void 0,height:void 0};if(!e)return t;const{success:r,parsed:a}=o.Param.tryParseNumber(e.width),{success:i,parsed:n}=o.Param.tryParseNumber(e.height);return r&&i?{width:a,height:n}:r?{width:a}:i?{height:n}:t}},8736:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419);t.SheetInfoImpl=class{constructor(e,t,r,a,i,n,s){this._name=e,this._sheetType=t,this._sheetSize=r,this._index=a,this._isActive=i,this._isHidden=n,this._url=s}get name(){return this._name}set name(e){this._name=e}get sheetSize(){return this._sheetSize}set sheetSize(e){this._sheetSize=e}get sheetType(){return this._sheetType}get sheetPath(){return{sheetName:this.name,isDashboard:this.sheetType===a.SheetType.Dashboard}}get index(){return this._index}get isActive(){return this._isActive}set active(e){this._isActive=e}get isHidden(){return this._isHidden}get url(){return this._url}}},5144:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SingleEventManagerImpl=class{constructor(e){this._eventType=e,this._handlers=[]}get eventType(){return this._eventType}addEventListener(e){return this._handlers.push(e),()=>this.removeEventListener(e)}removeEventListener(e){const t=this._handlers.length;return this._handlers=this._handlers.filter((t=>t!==e)),t>this._handlers.length}triggerEvent(e){for(const t of this._handlers)try{t(e())}catch(e){continue}}}},6804:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3008),n=r(6664),s=r(7480),o=r(3036),l=r(8332),d=r(2608),c=r(6068);class u extends l.SheetImpl{constructor(e,t,r,a){super(e,a),this._sheetInfoImpl=e,this._publishedSheetInfos=r,this._registryId=a,this._storyPointInfoImpls=[],this._deferred=new o.ShortLivedDeferred,this.initializeStory(t)}initializeStory(e){e.storyPoints.forEach((t=>{const r=t.index===e.activeStoryPointIndex,a=new c.StoryPointInfoImpl(t.caption,t.index,t.storyPointId,r,t.updated,this);this._storyPointInfoImpls.push(a),r&&(this._activeStoryPointImpl=new d.StoryPointImpl(a,this._publishedSheetInfos,this._registryId,t.containedSheetInfo))}))}updateStoryInfo(e,t){if(!this._storyPointInfoImpls)return;let r=this._storyPointInfoImpls[e];if(r.storyPointId!==t.storyPointId)throw new n.TableauError(a.EmbeddingErrorCodes.StoryPointIdMismatch,`We should not be updating a story point when the IDs don't match. Existing storyPointID=${r.storyPointId}, newStoryPointID=${t.storyPointId}`);r.caption=t.caption,r.updated=t.updated,this._activeStoryPointImpl.storyPointId===t.storyPointId&&(this._activeStoryPointImpl.updated=r.updated)}updateStory(e){this._storyPointInfoImpls&&(this._storyPointInfoImpls.forEach((t=>{t.storyPointId===e.storyPointId?(t.caption=e.caption,t.index=e.index,t.active=!0,t.updated=e.updated,this._activeStoryPointImpl=new d.StoryPointImpl(t,this._publishedSheetInfos,this._registryId,e.containedSheetInfo)):t.active=!1})),this.activeStoryPoint&&this._deferred.resolve(this.activeStoryPoint))}get activeStoryPoint(){return this._activeStoryPointImpl}get storyPointsInfo(){return this._storyPointInfoImpls}get isActive(){return this._sheetInfoImpl.active}get isHidden(){return!!this._sheetInfoImpl.isHidden}activateNextStoryPointAsync(){if(this._activeStoryPointImpl.index===this._storyPointInfoImpls.length-1)return Promise.resolve(this._activeStoryPointImpl);let e=this._deferred.getNewPromiseOrThrowIfBusy();return i.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").activateNextStoryPointAsync(),e}activatePreviousStoryPointAsync(){if(0===this._activeStoryPointImpl.index)return Promise.resolve(this._activeStoryPointImpl);let e=this._deferred.getNewPromiseOrThrowIfBusy();return i.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").activatePreviousStoryPointAsync(),e}activateStoryPointAsync(e){if(s.ErrorHelpers.verifyParameter(e,"index"),s.ErrorHelpers.verifyParameterType(e,"number","index"),e<0||e>=this._storyPointInfoImpls.length)throw new n.TableauError(a.EmbeddingErrorCodes.IndexOutOfRange,"The index passed to this command is out of range.");if(e===this._activeStoryPointImpl.index)return Promise.resolve(this._activeStoryPointImpl);let t=this._deferred.getNewPromiseOrThrowIfBusy();return i.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").activateStoryPointAsync(e),t}revertStoryPointAsync(e){if(s.ErrorHelpers.verifyParameter(e,"index"),s.ErrorHelpers.verifyParameterType(e,"number","index"),e<0||e>=this._storyPointInfoImpls.length)throw new n.TableauError(a.EmbeddingErrorCodes.IndexOutOfRange,"The index passed to this command is out of range.");return i.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").revertStoryPointAsync(e).then((e=>(this.updateStoryInfo(e.index,e),new c.StoryPointInfoImpl(e.caption,e.index,e.storyPointId,!1,e.updated,this))))}clearPendingPromises(){this._deferred&&this._deferred.reject("All pending promises cleared")}}t.StoryImpl=u},2608:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664),n=r(2780),s=r(1940),o=r(8736),l=r(6500);t.StoryPointImpl=class{constructor(e,t,r,a){this._storyPointInfoImpl=e,a&&(this._containedSheetImpl=this.createContainedSheet(a,t,r))}get index(){return this._storyPointInfoImpl.index}get caption(){return this._storyPointInfoImpl.caption}get active(){return this._storyPointInfoImpl.active}get updated(){return this._storyPointInfoImpl.updated}set updated(e){this._storyPointInfoImpl.updated=e}get parentStory(){return this._storyPointInfoImpl.parentStory}get containedSheet(){return this._containedSheetImpl}get storyPointId(){return this._storyPointInfoImpl.storyPointId}createContainedSheet(e,t,r){const d=n.SheetUtils.getPublishedSheetInfoByName(e.name,t),c=n.SheetUtils.createAutomaticSize(),u=void 0===d,h=d?d.url:"",p=new o.SheetInfoImpl(e.name,n.SheetUtils.getSheetTypeEnum(e.sheetType),c,-1,!1,u,h);let m;switch(p.sheetType){case a.SheetType.Worksheet:{const e={worksheet:p.name};m=new l.WorksheetImpl(p,r,e,null,this);break}case a.SheetType.Dashboard:{const t={sheetName:p.name,isDashboard:!0};m=new s.DashboardImpl(p,e.dashboardZones,t,r,this);break}default:throw new i.TableauError(a.SharedErrorCodes.ServerError,"Invalid SheetType")}return m}}},6068:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StoryPointInfoImpl=class{constructor(e,t,r,a,i,n){this._caption=e,this._index=t,this._storyPointId=r,this._active=a,this._updated=i,this._parentStoryImpl=n}get caption(){return this._caption}set caption(e){this._caption=e}get index(){return this._index}set index(e){this._index=e}get storyPointId(){return this._storyPointId}get active(){return this._active}set active(e){this._active=e}get updated(){return this._updated}set updated(e){this._updated=e}get parentStory(){return this._parentStoryImpl}}},3044:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorkbookImpl=class{}},6500:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7419),n=r(8340),s=r(624),o=r(3483),l=r(3008),d=r(6664),c=r(7480),u=r(2180),h=r(8332);class p extends h.SheetImpl{constructor(e,t,r,a,i,n=null,s=null){super(e,t),this._visualId=r,this._parentDashboardImpl=a,this._parentStoryPointImpl=i,this._backgroundColor=n,this._formatting=s}get parentDashboard(){return this._parentDashboardImpl}get parentStoryPoint(){return this._parentStoryPointImpl}get visualId(){return this._visualId}getMaxPageRowLimit(){return 1e4}get backgroundColor(){return this._backgroundColor}get formatting(){return this._formatting}applyFilterAsync(e,t,r,i){return c.ErrorHelpers.verifyEnumValue(r,a.FilterUpdateType,"Contract.FilterUpdateType"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyFilterAsync(this.visualId,e,t,r,i)}applyRangeFilterAsync(e,t){return c.ErrorHelpers.verifyParameter(e,"fieldName"),c.ErrorHelpers.verifyParameter(t,"filterOptions"),t.nullOption?c.ErrorHelpers.verifyEnumValue(t.nullOption,i.FilterNullOption,"FilterNullOption"):c.ErrorHelpers.verifyRangeParamType(t.min,t.max),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyRangeFilterAsync(this.visualId,e,t)}applyHierarchicalFilterAsync(e,t,r,n){if(c.ErrorHelpers.verifyParameter(e,"fieldName"),c.ErrorHelpers.verifyParameter(t,"values"),c.ErrorHelpers.verifyEnumValue(r,a.FilterUpdateType,"Contract.FilterUpdateType"),!Array.isArray(t)&&!t.levels)throw new d.TableauError(i.ErrorCodes.InvalidParameter,"values parameter for applyHierarchicalFilterAsync must be an array or contain a levels key");return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyHierarchicalFilterAsync(this.visualId,e,t,r,n)}clearFilterAsync(e){return c.ErrorHelpers.verifyParameter(e,"fieldName"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").clearFilterAsync(this.visualId,e)}applyRelativeDateFilterAsync(e,t){return c.ErrorHelpers.verifyStringParameter(e,"fieldName"),c.ErrorHelpers.verifyParameter(t,"options"),c.ErrorHelpers.verifyEnumValue(t.periodType,i.PeriodType,"PeriodType"),c.ErrorHelpers.verifyEnumValue(t.rangeType,i.DateRangeType,"DateRangeType"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyRelativeDateFilterAsync(this.visualId,e,t)}getDataSourcesAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getDataSourcesAsync(this.visualId).then((e=>{const t=e,r=t.worksheetDataSchemaMap[this.name],a=[],i=r.primaryDataSource;a.push(this.createDataSourceFromInfo(t.dataSources[i]));for(const e of r.referencedDataSourceList)e!==i&&a.push(this.createDataSourceFromInfo(t.dataSources[e]));return a}))}getFiltersAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").getFiltersAsync(this.visualId)}getSelectedMarksAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getSelectedMarksAsync(this.visualId)}getHighlightedMarksAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getHighlightedMarksAsync(this.visualId)}getSummaryDataAsync(e){var t;return this.verifyActiveSheet(),e=e||{},l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getUnderlyingDataAsync(this.visualId,o.GetDataType.Summary,!!e.ignoreAliases,!!e.ignoreSelection,!0,e.columnsToIncludeById||[],e.maxRows||0,e.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!=(t=e.applyWorksheetFormatting)&&t)}getSummaryDataReaderAsync(e,t){var r;return this.verifyActiveSheet(),t=t||{},l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getSummaryDataReaderAsync(this.visualId,e||this.getMaxPageRowLimit(),!!t.ignoreAliases,!!t.ignoreSelection,!0,t.columnsToIncludeById||[],t.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!=(r=t.applyWorksheetFormatting)&&r)}getVisualSpecificationAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("visual-model-service").getVisualSpecificationAsync(this.visualId)}addMarksCardFieldsAsync(e,t,r,a){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("visual-model-service").addMarksCardFieldsAsync(this.visualId,e,t,r,a)}moveMarksCardFieldAsync(e,t,r,a){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("visual-model-service").moveMarksCardFieldAsync(this.visualId,e,t,r,a)}spliceMarksCardFieldsAsync(e,t,r,a,i){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("visual-model-service").spliceMarksCardFieldsAsync(this.visualId,e,t,r,a,i)}getSummaryColumnsInfoAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getSummaryColumnsInfoAsync(this.visualId)}getUnderlyingDataAsync(e){var t;return this.verifyActiveSheet(),e=e||{},l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getUnderlyingDataAsync(this.visualId,o.GetDataType.Underlying,!!e.ignoreAliases,!!e.ignoreSelection,!!e.includeAllColumns,e.columnsToIncludeById||[],e.maxRows||0,e.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!=(t=e.applyWorksheetFormatting)&&t)}getUnderlyingTablesAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getUnderlyingTablesAsync(this.visualId).then((e=>e.map((e=>new s.LogicalTable(e)))))}getUnderlyingTableDataAsync(e,t){var r;return this.verifyActiveSheet(),t=t||{},l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getUnderlyingTableDataAsync(this.visualId,e,!!t.ignoreAliases,!!t.ignoreSelection,!!t.includeAllColumns,t.columnsToIncludeById||[],t.maxRows||0,t.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!=(r=t.applyWorksheetFormatting)&&r)}getUnderlyingTableDataReaderAsync(e,t,r){var a;return this.verifyActiveSheet(),r=r||{},l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getUnderlyingTableDataReaderAsync(this.visualId,e,t||this.getMaxPageRowLimit(),!!r.ignoreAliases,!!r.ignoreSelection,!!r.includeAllColumns,r.columnsToIncludeById||[],r.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!=(a=r.applyWorksheetFormatting)&&a)}clearSelectedMarksAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("selection-service").clearSelectedMarksAsync(this.visualId)}selectMarksByValueAsync(e,t){return c.ErrorHelpers.verifyParameter(e,"fieldName"),c.ErrorHelpers.verifyEnumValue(t,i.SelectionUpdateType,"SelectionUpdateType"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("selection-service").selectMarksByValueAsync(this.visualId,e,t)}selectMarksByIdAsync(e,t){return c.ErrorHelpers.verifyParameter(e,"fieldName"),c.ErrorHelpers.verifyEnumValue(t,i.SelectionUpdateType,"SelectionUpdateType"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("selection-service").selectMarksByIdAsync(this.visualId,e,t)}annotateMarkAsync(e,t){return c.ErrorHelpers.verifyParameter(e,"mark"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("annotation-service").annotateMarkAsync(this.visualId,e,t)}getAnnotationsAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("annotation-service").getAnnotationsAsync(this.visualId)}removeAnnotationAsync(e){return c.ErrorHelpers.verifyParameter(e,"annotation"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("annotation-service").removeAnnotationAsync(this.visualId,e)}appendContextMenuAsync(e,t){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service").appendContextMenuAsync(this.visualId.worksheet,e,t)}removeContextMenuAsync(e,t){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service").removeContextMenuAsync(this.visualId.worksheet,e,t)}executeContextMenuAsync(e,t){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service").executeContextMenuAsync(this.visualId.worksheet,e,t)}renameContextMenuAsync(e,t,r){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service").renameContextMenuAsync(this.visualId.worksheet,e,t,r)}hoverTupleAsync(e,t,r){return this.isInsideDashboardExtension()?Promise.reject(new d.TableauError(a.SharedErrorCodes.ImplementationError,"hoverTupleAsync is not supported in dashboard extensions")):l.ApiServiceRegistry.get(this._registryId).getService("selection-service").hoverTupleAsync(this.visualId,e,t,r)}selectTuplesAsync(e,t,r){return this.isInsideDashboardExtension()?Promise.reject(new d.TableauError(a.SharedErrorCodes.ImplementationError,"selectTuplesAsync is not supported in dashboard extensions")):l.ApiServiceRegistry.get(this._registryId).getService("selection-service").selectTuplesAsync(this.visualId,e,t,r)}getTooltipTextAsync(e){return this.isInsideDashboardExtension()?Promise.reject(new d.TableauError(a.SharedErrorCodes.ImplementationError,"getTooltipTextAsync is not supported in dashboard extensions")):l.ApiServiceRegistry.get(this._registryId).getService("accessibility").getTooltipTextAsync(this.visualId,e)}leaveMarkNavigationAsync(){return this.isInsideDashboardExtension()?Promise.reject(new d.TableauError(a.SharedErrorCodes.ImplementationError,"leaveMarkNavigationAsync is not supported in dashboard extensions")):l.ApiServiceRegistry.get(this._registryId).getService("accessibility").leaveMarkNavigationAsync(this.visualId)}editAliasesDialogAsync(e){return l.ApiServiceRegistry.get(this._registryId).getService("visual-model-service").editAliasesDialogAsync(e)}createDataSourceFromInfo(e){const t=new u.DataSourceImpl(e,this._registryId),r=new n.DataSource(t);return t.initializeWithPublicInterfaces(r),r}verifyActiveSheet(){const e=this.active,t=this.isInsideActiveDashboard(),r=this.isInsideActiveStoryPoint();if(!e&&!t&&!r)throw new d.TableauError(i.SharedErrorCodes.NotActiveSheet,"Operation not allowed on non-active sheet")}isInsideActiveStoryPoint(){return this._parentStoryPointImpl&&this._parentStoryPointImpl.active}isInsideActiveDashboard(){return this._parentDashboardImpl&&this._parentDashboardImpl.active}isInsideDashboardExtension(){return null!==this._parentDashboardImpl}}t.WorksheetImpl=p},624:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LogicalTable=class{constructor(e){this._logicalTable=e}get id(){return this._logicalTable.id}get caption(){return this._logicalTable.caption}}},5064:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TooltipTextRequestModel=class{constructor(e,t){this.visualIdPresModel=e,this.tupleId=t}}},6296:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3008),n=r(7480);class s{constructor(e,t,r,a,i){this._worksheetName=e,this._fieldName=t,this._filterType=r,this._fieldId=a,this._registryId=i}get worksheetName(){return this._worksheetName}get fieldName(){return this._fieldName}get fieldId(){return this._fieldId}get filterType(){return this._filterType}getFieldAsync(){return i.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getFieldAsync(this._fieldId)}getAppliedWorksheetsAsync(){return i.ApiServiceRegistry.get(this._registryId).getService("filter-service").getAppliedWorksheetsAsync(this._worksheetName,this._fieldId)}setAppliedWorksheetsAsync(e){n.ErrorHelpers.verifyParameter(e,"applyToWorksheets");const t=new Set(e);return i.ApiServiceRegistry.get(this._registryId).getService("filter-service").setAppliedWorksheetsAsync(this._worksheetName,this._fieldName,this._fieldId,Array.from(t))}}t.Filter=s,t.CategoricalFilter=class extends s{constructor(e,t,r,a,i,n,s,o){super(e,t,a,r,i),this._appliedValues=n,this._isExcludeMode=s,this._isAllSelected=o}get isAllSelected(){return this._isAllSelected}get appliedValues(){return this._appliedValues}get isExcludeMode(){return this._isExcludeMode}getDomainAsync(e){return e||(e=a.FilterDomainType.Relevant),n.ErrorHelpers.verifyEnumValue(e,a.FilterDomainType,"FilterDomainType"),i.ApiServiceRegistry.get(this._registryId).getService("filter-service").getCategoricalDomainAsync(this._worksheetName,this._fieldId,e)}},t.HierarchicalDataValue=class{constructor(e,t,r){this._value=e,this._hierarchicalPath=t,this._level=r}get value(){return this._value}get hierarchicalPath(){return this._hierarchicalPath}get level(){return this._level}},t.HierarchicalLevelDetail=class{constructor(e,t){this._name=e,this._levelSelectionState=t}get name(){return this._name}get levelSelectionState(){return this._levelSelectionState}},t.HierarchicalFilter=class extends s{constructor(e,t,r,a,i,n,s,o,l,d,c){super(e,t,a,r,i),this._dimensionName=n,this._hierarchyCaption=s,this._numberOfLevels=o,this._levelDetails=l,this._appliedValues=d,this._isAllSelected=c}getDomainAsync(e){throw new Error("Method not implemented.")}get dimensionName(){return this._dimensionName}get hierarchyCaption(){return this._hierarchyCaption}get numberOfLevels(){return this._numberOfLevels}get levelDetails(){return this._levelDetails}get isAllSelected(){return this._isAllSelected}get appliedValues(){return this._appliedValues}},t.RangeFilter=class extends s{constructor(e,t,r,a,i,n,s,o){super(e,t,a,r,i),this._min=n,this._max=s,this._includeNullValues=o}get minValue(){return this._min}get maxValue(){return this._max}get includeNullValues(){return this._includeNullValues}getDomainAsync(e){const t=i.ApiServiceRegistry.get(this._registryId).getService("filter-service");return e||(e=a.FilterDomainType.Relevant),n.ErrorHelpers.verifyEnumValue(e,a.FilterDomainType,"FilterDomainType"),t.getRangeDomainAsync(this._worksheetName,this._fieldId,e)}},t.RelativeDateFilter=class extends s{constructor(e,t,r,a,i,n,s,o,l){super(e,t,a,r,i),this._anchorDate=n,this._periodType=s,this._rangeType=o,this._rangeN=l}get anchorDate(){return this._anchorDate}get periodType(){return this._periodType}get rangeType(){return this._rangeType}get rangeN(){return this._rangeN}},t.CategoricalDomain=class{constructor(e,t){this._values=e,this._domainType=t}get values(){return this._values}get type(){return this._domainType}},t.RangeDomain=class{constructor(e,t,r){this._min=e,this._max=t,this._domainType=r}get type(){return this._domainType}get min(){return this._min}get max(){return this._max}}},5068:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataTable=class{constructor(e,t,r,a,i,n){this._data=e,this._columns=t,this._totalRowCount=r,this._isTotalRowCountLimited=a,this._isSummaryData=i,this._marksInfo=n,this._name=i?"Summary Data Table":"Underlying Data Table"}get name(){return this._name}get data(){return this._data}get columns(){return this._columns}get marksInfo(){return this._marksInfo}get totalRowCount(){return this._totalRowCount}get isTotalRowCountLimited(){return this._isTotalRowCountLimited}get isSummaryData(){return this._isSummaryData}},t.MarkInfo=class{constructor(e,t,r){this._type=e,this._color=t,this._tupleId=r}get type(){return this._type}get color(){return this._color}get tupleId(){return this._tupleId}},t.Column=class{constructor(e,t,r,a,i){this._fieldName=e,this._fieldId=t,this._dataType=r,this._isReferenced=a,this._index=i}get fieldName(){return this._fieldName}get fieldId(){return this._fieldId}get dataType(){return this._dataType}get isReferenced(){return this._isReferenced}get index(){return this._index}},t.DataValue=class{constructor(e,t,r,a,i){this._value=e,this._nativeValue=t,this._formattedValue=r,this._aliasValue=a,this._hasAlias=i}get value(){return this._value}get nativeValue(){return this._nativeValue}get formattedValue(){return this._formattedValue}get aliasValue(){return this._aliasValue}get hasAlias(){return this._hasAlias}}},7968:function(e,t,r){"use strict";var a=this&&this.__awaiter||function(e,t,r,a){return new(r||(r=Promise))((function(i,n){function s(e){try{l(a.next(e))}catch(e){n(e)}}function o(e){try{l(a.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,o)}l((a=a.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=r(3008),n=r(7480);t.DataTableReader=class{constructor(e,t,r,a){this._id=e,this._totalRowCount=t,this._pageRowCount=r,this._registryId=a,this._pageCount=Math.ceil(t/r)}get totalRowCount(){return this._totalRowCount}get pageCount(){return this._pageCount}getPageAsync(e){return n.ErrorHelpers.verifyRange(e,0,this._pageCount),i.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getPageAsync(this._id,e,this._pageRowCount)}getAllPagesAsync(e){return a(this,void 0,void 0,(function*(){const t=yield this.getPageAsync(0);e=e||this.totalRowCount;const r=Math.min(e,this.totalRowCount),a=Math.ceil(r/this._pageRowCount),i=Math.min(a,400),n=i{"use strict";Object.defineProperty(t,"__esModule",{value:!0});class r{}t.SelectionModel=r;class a extends r{constructor(){super(...arguments),this.selectValues=[]}}t.ValueSelectionModel=a,t.HierarchicalSelectionModel=class extends a{},t.RangeSelectionModel=class extends r{},t.DimensionSelectionModel=class extends a{},t.TupleSelectionModel=class{constructor(){this.objectIds=[]}},t.SelectionModelsContainer=class{constructor(){this.hierModelArr=[],this.dimModelArr=[],this.quantModelArr=[]}},t.SelectTuplesInteractionModel=class{constructor(e,t=[],r,a){this.visualIdPresModel=e,this.tupleIds=t,this.selectOptions=r,this.tooltipContext=a}},t.HoverTupleInteractionModel=class{constructor(e,t,r,a){this.visualIdPresModel=e,this.tupleId=t,this.tooltipContext=r,this.allowHoverActions=a}}},6368:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Point=class{constructor(e,t){this._x=e,this._y=t}get x(){return this._x}get y(){return this._y}}},3483:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.GetDataType||(t.GetDataType={})).Summary="summary",r.Underlying="underlying"},8672:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3008),i=r(3964),n=r(8028),s=r(1384),o=r(9196),l=r(4924),d=r(3851),c=r(8864),u=r(7712),h=r(1288),p=r(7260),m=r(8784),g=r(4109),y=r(6096),I=r(744),v=r(8856);t.registerAllSharedServices=function(e,t){a.ApiServiceRegistry.get(t).registerService(new n.AnimationServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new o.DataSourceServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new l.ExportServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new u.GetDataServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new c.FilterServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new h.NotificationServiceImpl(e)),a.ApiServiceRegistry.get(t).registerService(new p.ParametersServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new m.SelectionServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new s.AnnotationServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new v.ZoneServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new g.SizeServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new y.VisualModelServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new I.VizServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new d.ExternalContextMenuServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new i.AccessibilityServiceImpl(e,t))}},3008:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664);"undefined"!=typeof window&&(window.__tableauApiServiceRegistry=window.__tableauApiServiceRegistry||{});class n{constructor(){this._services={}}registerService(e){this._services[e.serviceName]=e}getService(e){if(!this._services.hasOwnProperty(e))throw new i.TableauError(a.ErrorCodes.InternalError,`Service not registered: ${e}`);return this._services[e]}}class s{static get(e){if(window.__tableauApiServiceRegistry&&window.__tableauApiServiceRegistry[e]||s.setInstance(e,new n),!window.__tableauApiServiceRegistry[e])throw new i.TableauError(a.ErrorCodes.InternalError,"Service registry failed");return window.__tableauApiServiceRegistry[e]}static setInstance(e,t){window.__tableauApiServiceRegistry||(window.__tableauApiServiceRegistry={}),window.__tableauApiServiceRegistry[e]=t}static clearRegistry(){window.__tableauApiServiceRegistry={}}constructor(){}}t.ApiServiceRegistry=s},3964:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(5064),n=r(1776);class s extends n.ServiceImplBase{get serviceName(){return"accessibility"}getTooltipTextAsync(e,t){let r=new i.TooltipTextRequestModel(e,t);const n={[a.ParameterId.FunctionName]:"getTooltipTextAsync",[a.ParameterId.TooltipTextRequest]:r};return this.execute(a.VerbId.GetTooltipText,n).then((e=>e.result))}leaveMarkNavigationAsync(e){const t={[a.ParameterId.FunctionName]:"leaveMarkNavigationAsync",[a.ParameterId.VisualId]:e};return this.execute(a.VerbId.RaiseLeaveMarkNavNotification,t).then((e=>{}))}}t.AccessibilityServiceImpl=s},8028:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(1044),s=r(7480),o=r(1776);class l extends o.ServiceImplBase{get serviceName(){return"animation-service"}replayAsync(e){const t={[i.ParameterId.ReplaySpeed]:1};return s.ErrorHelpers.verifyEnumValue(e,a.ReplaySpeedType,"ReplaySpeedType"),t[i.ParameterId.ReplaySpeed]=n.ExternalToInternalEnumMappings.setReplaySpeedType.convert(e),this.execute(i.VerbId.ReplayAnimation,t).then((e=>{}))}}t.AnimationServiceImpl=l},1384:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(6557),s=r(7104),o=r(6664),l=r(1776);class d extends l.ServiceImplBase{get serviceName(){return"annotation-service"}annotateMarkAsync(e,t,r){const a=this.parseMarkSelectionIds([t]),n=`${r}`,s={[i.ParameterId.FunctionName]:"annotateMarkAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.AnnotateEnum]:i.AnnotateEnum.Mark,[i.ParameterId.TargetPoint]:{x:0,y:0},[i.ParameterId.SelectionList]:[a.selection],[i.ParameterId.FormattedText]:n};return this.execute(i.VerbId.CreateAnnotation,s).then((e=>{}))}getAnnotationsAsync(e){const t={[i.ParameterId.FunctionName]:"getAnnotationsAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.GetAnnotations,t).then((e=>{const t=e.result;return this.annotationFilterMap(t)}))}removeAnnotationAsync(e,t){const r=this.parseAnnotationSelectionIds([t]),a={[i.ParameterId.FunctionName]:"removeAnnotationAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.SelectionList]:[r.selection]};return this.execute(i.VerbId.RemoveAnnotation,a).then((e=>{}))}parseMarkSelectionIds(e){const t=[],r=new s.SelectionModelsContainer;if(e.forEach((e=>{const r=e.tupleId;if(!(null!=r&&r>0))throw new o.TableauError(a.ErrorCodes.InternalError,"invalid tupleId");t.push(r.toString())})),0!==t.length){const e=new s.TupleSelectionModel;e.selectionType="tuples",e.objectIds=t,r.selection=e}return r}parseAnnotationSelectionIds(e){const t=[],r=new s.SelectionModelsContainer;if(e.forEach((e=>{const r=e.annotationId;if(!(null!=r&&r>=0))throw new o.TableauError(a.ErrorCodes.InternalError,"invalid annotationId");t.push(r.toString())})),0!==t.length){const e=new s.TupleSelectionModel;e.selectionType="annotations",e.objectIds=t,r.selection=e}return r}mapAnnotation(e){return{annotationHTML:e.annotationText,annotationId:e.annotationId,annotationText:e.annotationPlainText,annotationType:n.InternalToExternalEnumMappings.annotationType.convert(e.annotateEnum),tupleId:e.tupleId}}annotationFilterMap(e){return e.map((e=>this.mapAnnotation(e)))}}t.AnnotationServiceImpl=d},1832:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(1776);class n extends i.ServiceImplBase{get serviceName(){return"client-info-service"}getClientInfoAsync(){const e=a.VerbId.GetEmbeddingClientInfo,t={[a.ParameterId.FunctionName]:"getClientInfoAsync"};return this.execute(e,t).then((e=>e.result))}}t.ClientInfoServiceImpl=n},9196:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(8340),s=r(1072),o=r(2180),l=r(5288),d=r(6664),c=r(1776);class u extends c.ServiceImplBase{constructor(e,t){super(e,t)}get serviceName(){return"data-source-service"}refreshAsync(e){const t={[i.ParameterId.FunctionName]:"refreshAsync",[i.ParameterId.DeltaTimeMs]:0,[i.ParameterId.ShouldRefreshDS]:!0};return e&&(t[i.ParameterId.DataSourceId]=e),this.execute(i.VerbId.RefreshDataSource,t).then((e=>{}))}getActiveTablesAsync(e){const t={[i.ParameterId.FunctionName]:"getActiveTablesAsync",[i.ParameterId.DataSourceId]:e};return this.execute(i.VerbId.GetActiveTables,t).then((t=>{const r=t.result;if(0===r.tables.length)throw new d.TableauError(a.ErrorCodes.UnsupportedMethodForDataSourceType,`getActiveTables is not supported for: ${e}`);return r.tables}))}getDataSourcesAsync(e){const t={[i.ParameterId.FunctionName]:"getDataSourcesAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.GetDataSources,t).then((e=>e.result))}getAllDataSourcesAsync(){const e={[i.ParameterId.FunctionName]:"getAllDataSourcesAsync"};return this.execute(i.VerbId.GetAllDataSources,e).then((e=>e.result))}getConnectionSummariesAsync(e){const t={[i.ParameterId.FunctionName]:"getConnectionSummariesAsync",[i.ParameterId.DataSourceId]:e};return this.execute(i.VerbId.GetConnectionDescriptionSummaries,t).then((e=>e.result))}getFieldAsync(e){const t=i.VerbId.GetFieldAndDataSource,r={[i.ParameterId.FunctionName]:"getFieldAsync",[i.ParameterId.FieldId]:e};return this.execute(t,r).then((e=>{const t=e.result[i.ParameterId.DataSource],r=e.result[i.ParameterId.Field];return this.convertField(r,this.convertDataSource(t))}))}getLogicalTablesAsync(e){const t={[i.ParameterId.FunctionName]:"getLogicalTablesAsync",[i.ParameterId.DataSourceId]:e};return this.execute(i.VerbId.GetLogicalTables,t).then((e=>e.result))}getUnderlyingTablesAsync(e){const t={[i.ParameterId.FunctionName]:"getUnderlyingTablesAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.GetUnderlyingTables,t).then((e=>e.result))}convertField(e,t){return new s.Field(new l.FieldImpl(e,t))}convertDataSource(e){return new n.DataSource(new o.DataSourceImpl(e,this._registryId))}}t.DataSourceServiceImpl=u},4924:function(e,t,r){"use strict";var a=this&&this.__awaiter||function(e,t,r,a){return new(r||(r=Promise))((function(i,n){function s(e){try{l(a.next(e))}catch(e){n(e)}}function o(e){try{l(a.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,o)}l((a=a.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=r(3448),n=r(7419),s=r(1044),o=r(5044),l=r(7480),d=r(6664),c=r(1776);class u extends c.ServiceImplBase{get serviceName(){return"export-service"}getExportCrosstabSheetMapAsync(e){const t=i.VerbId.GetExportCrosstabSheetMap,r={[i.ParameterId.FunctionName]:"getExportCrosstabSheetMapAsync",[i.ParameterId.CurrentSheetType]:s.ExternalToInternalEnumMappings.sheetType.convert(e)};return this.execute(t,r).then((e=>e.result))}exportCrosstabAsync(e,t,r,s){return a(this,void 0,void 0,(function*(){l.ErrorHelpers.verifySheetName(r,e),l.ErrorHelpers.verifyEnumValue(t,n.CrosstabFileFormat,"CrosstabFileFormat");const a=yield this.getExportCrosstabSheetMapAsync(s);if(!a[e])throw new d.TableauError(n.SharedErrorCodes.InternalError,"missing sheet doc id from sheetMap");const o={[i.ParameterId.FunctionName]:"exportCrosstabAsync",[i.ParameterId.SheetIdentifier]:a[e],[i.ParameterId.SendNotifications]:!0};let c;switch(t){case n.CrosstabFileFormat.CSV:c=i.VerbId.ExportCrosstabCsvDownload,o[i.ParameterId.UseTabDelimiters]=!0;break;case n.CrosstabFileFormat.Excel:c=i.VerbId.ExportCrosstabExcelDownload;break;default:throw new d.TableauError(n.SharedErrorCodes.InternalError,"unsupported Crosstab file format.")}return this.execute(c,o).then((e=>e.result)).catch((()=>{throw new d.TableauError(n.SharedErrorCodes.CrosstabCreationError,"An unexpected error occurred while generating the document.")}))}))}exportDataAsync(e,t){var r;l.ErrorHelpers.verifyExportDataOptions(t);const a=new Set(t.columnsToIncludeById),s=Array.from(a),o=i.VerbId.ExportDataDownload,c={[i.ParameterId.FunctionName]:"exportDataAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.IgnoreAliases]:(r=t.ignoreAliases,null!=r&&r),[i.ParameterId.ColumnsToIncludeById]:s};return this.execute(o,c).then((()=>{})).catch((()=>{throw new d.TableauError(n.SharedErrorCodes.DataCreationError,"An unexpected error occurred while generating the document.")}))}exportPowerPointAsync(e,t){l.ErrorHelpers.verifySheetNamesForPDFAndPPT(e,t);const r=i.VerbId.ExportPowerpointDownload,a={[i.ParameterId.FunctionName]:"exportPowerPointAsync",[i.ParameterId.ExportOriginUrl]:"",[i.ParameterId.SelectedSheetNames]:e};return this.execute(r,a).then((e=>e.result)).catch((()=>{throw new d.TableauError(n.SharedErrorCodes.PowerPointCreationError,"An error occured while attempting to generate the PowerPoint file.")}))}exportPDFAsync(e,t,r){return a(this,void 0,void 0,(function*(){l.ErrorHelpers.verifyExportPDFOptions(t),l.ErrorHelpers.verifySheetNamesForPDFAndPPT(e,r);const a=yield this.getExportPDFOptionsAsync();o.ExportHelpers.updateInternalExportPDFOptions(a,t,e);const s=i.VerbId.ExportPdfDownload,c={[i.ParameterId.FunctionName]:"exportPDFAsync",[i.ParameterId.ExportPdfOptions]:a};return this.execute(s,c).then((e=>e.result)).catch((()=>{throw new d.TableauError(n.SharedErrorCodes.PDFCreationError,"Unable to create PDF because something went wrong. Try again.")}))}))}getExportPDFOptionsAsync(){const e=i.VerbId.GetExportPdfOptions,t={[i.ParameterId.FunctionName]:"getExportPdfOptionsAsync"};return this.execute(e,t).then((e=>e.result))}}t.ExportServiceImpl=u},3851:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(1776);class n extends i.ServiceImplBase{get serviceName(){return"external-context-menu-service"}appendContextMenuAsync(e,t,r){const i=a.VerbId.AppendExternalMenuItem,n={[a.ParameterId.FunctionName]:"appendContextMenuAsync",[a.ParameterId.WorksheetName]:e,[a.ParameterId.ExternalMenuItemDisplayName]:r.displayName};return this.execute(i,n).then((e=>e.result))}removeContextMenuAsync(e,t,r){const i=a.VerbId.RemoveExternalMenuItem,n={[a.ParameterId.FunctionName]:"removeContextMenuAsync",[a.ParameterId.WorksheetName]:e,[a.ParameterId.ExternalMenuItemId]:r};return this.execute(i,n).then((e=>{}))}executeContextMenuAsync(e,t,r){const i=a.VerbId.ExecuteExternalMenuItem,n={[a.ParameterId.FunctionName]:"executeContextMenuAsync",[a.ParameterId.WorksheetName]:e,[a.ParameterId.ExternalMenuItemId]:r};return this.execute(i,n).then((e=>{}))}renameContextMenuAsync(e,t,r,i){const n=a.VerbId.RenameExternalMenu,s={[a.ParameterId.FunctionName]:"renameContextMenuAsync",[a.ParameterId.WorksheetName]:e,[a.ParameterId.ExternalMenuHeader]:r,[a.ParameterId.ExternalMenuDescription]:i};return this.execute(n,s).then((e=>{}))}}t.ExternalContextMenuServiceImpl=n},8864:function(e,t,r){"use strict";var a=this&&this.__awaiter||function(e,t,r,a){return new(r||(r=Promise))((function(i,n){function s(e){try{l(a.next(e))}catch(e){n(e)}}function o(e){try{l(a.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,o)}l((a=a.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=r(7419),n=r(3448),s=r(3448),o=r(5136),l=r(1044),d=r(6557),c=r(6296),u=r(8052),h=r(1172),p=r(1776);class m extends p.ServiceImplBase{get serviceName(){return"filter-service"}applyFilterAsync(e,t,r,a,n){const d=s.VerbId.ApplyCategoricalFilter,c={[s.ParameterId.FunctionName]:"applyFilterAsync"};if(c[s.ParameterId.VisualId]=e,c[s.ParameterId.FieldName]=t,!Array.isArray(r))throw new o.TableauError(i.ErrorCodes.InvalidParameter,"values parameter for applyFilterAsync must be an array");return c[s.ParameterId.FilterValues]=r,c[s.ParameterId.FilterUpdateType]=l.ExternalToInternalEnumMappings.filterUpdateType.convert(a),c[s.ParameterId.IsExcludeMode]=void 0!==n&&void 0!==n.isExcludeMode&&n.isExcludeMode,this.execute(d,c).then((e=>t))}applyRangeFilterAsync(e,t,r){const a=s.VerbId.ApplyRangeFilter,i={[s.ParameterId.FunctionName]:"applyRangeFilterAsync"};if(void 0!==r.min&&null!==r.min){let e;e=r.min instanceof Date?h.Param.serializeDateForPlatform(r.min):r.min,i[s.ParameterId.FilterRangeMin]=e}if(void 0!==r.max&&null!==r.max){let e;e=r.max instanceof Date?h.Param.serializeDateForPlatform(r.max):r.max,i[s.ParameterId.FilterRangeMax]=e}return r.nullOption&&(i[s.ParameterId.FilterRangeNullOption]=l.ExternalToInternalEnumMappings.nullOptions.convert(r.nullOption)),i[s.ParameterId.FieldName]=t,i[s.ParameterId.VisualId]=e,this.execute(a,i).then((e=>(this.apiFilterHandlerCheckForCommandError(e.result),t)))}applyHierarchicalFilterAsync(e,t,r,a,i){const n=s.VerbId.HierarchicalFilter,o={[s.ParameterId.FunctionName]:"applyHierarchicalFilterAsync"};o[s.ParameterId.VisualId]=e,o[s.ParameterId.FieldName]=t;const d=r.levels;return Array.isArray(d)&&d.length>0?o[s.ParameterId.FilterLevels]=d:r.length>0?o[s.ParameterId.FilterValues]=r:o[s.ParameterId.FilterLevels]=[],o[s.ParameterId.FilterUpdateType]=l.ExternalToInternalEnumMappings.filterUpdateType.convert(a),o[s.ParameterId.IsExcludeMode]=i&&!!i.isExcludeMode,this.execute(n,o).then((e=>t))}clearFilterAsync(e,t){const r=s.VerbId.ClearFilter,a={[s.ParameterId.FunctionName]:"clearFilterAsync"};return a[s.ParameterId.VisualId]=e,a[s.ParameterId.FieldName]=t,this.execute(r,a).then((e=>t))}applyRelativeDateFilterAsync(e,t,r){const a=s.VerbId.ApplyRelativeDateFilter,n={[s.ParameterId.FunctionName]:"applyRelativeDateFilterAsync"};if(n[s.ParameterId.VisualId]=e,n[s.ParameterId.FieldName]=t,n[s.ParameterId.PeriodType]=l.ExternalToInternalEnumMappings.periodType.convert(r.periodType),n[s.ParameterId.DateRangeType]=l.ExternalToInternalEnumMappings.dateRangeType.convert(r.rangeType),r.rangeType===i.DateRangeType.LastN||r.rangeType===i.DateRangeType.NextN){if(void 0===r.rangeN||null===r.rangeN)throw new o.TableauError(i.EmbeddingErrorCodes.MissingRangeNForRelativeDateFilters,"Missing rangeN field for a relative date filter of LASTN or NEXTN.");n[s.ParameterId.RangeN]=r.rangeN}return void 0!==r.anchorDate&&null!==r.anchorDate&&(n[s.ParameterId.AnchorDate]=this.convertAnchorDate(r.anchorDate)),this.execute(a,n).then((e=>e.result))}getFiltersAsync(e){const t=s.VerbId.GetFilters,r={[s.ParameterId.FunctionName]:"getFiltersAsync"};return r[s.ParameterId.VisualId]=e,this.execute(t,r).then((e=>{const t=e.result;return this.convertDomainFilters(t)}))}getCategoricalDomainAsync(e,t,r){const a=s.VerbId.GetCategoricalDomain,i={[s.ParameterId.FunctionName]:"getCategoricalDomainAsync"};return i[s.ParameterId.VisualId]={worksheet:e},i[s.ParameterId.FieldId]=t,i[s.ParameterId.DomainType]=l.ExternalToInternalEnumMappings.filterDomainType.convert(r),this.execute(a,i).then((e=>{const t=e.result;return this.convertCategoricalDomain(t,r)}))}getRangeDomainAsync(e,t,r){const a=s.VerbId.GetRangeDomain,i={[s.ParameterId.FunctionName]:"getRangeDomainAsync"};return i[s.ParameterId.VisualId]={worksheet:e},i[s.ParameterId.FieldId]=t,i[s.ParameterId.DomainType]=l.ExternalToInternalEnumMappings.filterDomainType.convert(r),this.execute(a,i).then((e=>{const t=e.result;return this.convertRangeDomain(t,r)}))}getDashboardFiltersAsync(){const e=s.VerbId.GetDashboardFilters,t={[s.ParameterId.FunctionName]:"getDashboardFiltersAsync"};return this.execute(e,t).then((e=>{const t=e.result;return this.convertDomainFilters(t)}))}applyDashboardFilterAsync(e,t,r,a){const i=s.VerbId.DashboardCategoricalFilter,n={[s.ParameterId.FunctionName]:"applyDashboardFilterAsync"};return n[s.ParameterId.FieldName]=e,n[s.ParameterId.FilterValues]=t,n[s.ParameterId.FilterUpdateType]=l.ExternalToInternalEnumMappings.filterUpdateType.convert(r),n[s.ParameterId.IsExcludeMode]=a&&!!a.isExcludeMode,this.execute(i,n).then((e=>e.result))}getAppliedWorksheetsAsync(e,t){var r;return a(this,void 0,void 0,(function*(){const a=yield this.executeGetAppliedWorksheets(e,t,"getAppliedWorksheetsAsync"),i=[];return null===(r=a.worksheets)||void 0===r||r.map((e=>{e.isSelected&&i.push(e.worksheetName)})),i}))}setAppliedWorksheetsAsync(e,t,r,n){return a(this,void 0,void 0,(function*(){const a=yield this.executeGetAppliedWorksheets(e,r,"getAppliedWorksheetsAsyncInternal");if(!a||!a.worksheets)throw new o.TableauError(i.SharedErrorCodes.InternalError,"This filter does not apply to multiple worksheets");const l=[];let d="";if(a.worksheets.forEach((e=>{e.isActive&&(d=e.worksheetName),(e.isSelected||e.isEnabled)&&l.push(e.worksheetName)})),""===d)throw new o.TableauError(i.SharedErrorCodes.InternalError,"No active worksheet");if(!n.includes(d))throw new o.TableauError(i.SharedErrorCodes.InternalError,`${d} must be included in the applied worksheets`);n.forEach((e=>{if(!l.includes(e))throw new o.TableauError(i.SharedErrorCodes.InternalError,`The field ${t} isn't applicable to the worksheet ${e}`)}));const c=s.VerbId.ChangeSharedFilter,u={};return u[s.ParameterId.FunctionName]="setAppliedWorksheetsAsync",u[s.ParameterId.VisualId]={worksheet:e},u[s.ParameterId.FieldId]=r,u[s.ParameterId.SharedFilterSheets]=n,this.execute(c,u).then((e=>n))}))}executeGetAppliedWorksheets(e,t,r){const a=s.VerbId.GetSharedFilter,i={};return i[s.ParameterId.FunctionName]=r,i[s.ParameterId.VisualId]={worksheet:e},i[s.ParameterId.FieldId]=t,this.execute(a,i).then((e=>e.result))}convertDomainFilters(e){const t=[];return e.forEach((e=>{switch(e.filterType){case s.FilterType.Categorical:{const r=e;if(!r)throw new Error("Invalid Categorical Filter");t.push(this.convertCategoricalFilter(r));break}case s.FilterType.Hierarchical:{const r=e;if(!r)throw new Error("Invalid Hierarchical Filter");t.push(this.convertHierarchicalFilter(r));break}case s.FilterType.Range:{const r=e;if(!r)throw new Error("Invalid Range Filter");t.push(this.convertRangeFilter(r));break}case s.FilterType.RelativeDate:{const r=e;if(!r)throw new Error("Invalid Relative Date Filter");t.push(this.convertRelativeDateFilter(r));break}}})),t}convertCategoricalFilter(e){const t=e.values.map((e=>u.DataValueFactory.MakeFilterDataValue(e)));return new c.CategoricalFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,s.FilterType.Categorical,this._registryId,t,e.isExclude,e.isAllSelected)}convertHierarchicalFilter(e){const t=e.values.map((e=>new c.HierarchicalDataValue(u.DataValueFactory.MakeFilterDataValue(e.value),e.hierarchicalPath,e.level))),r=e.levelInfo.map((e=>new c.HierarchicalLevelDetail(e.name,d.InternalToExternalEnumMappings.hierarchicalLevelSelectionState.convert(e.levelSelectionState))));return new c.HierarchicalFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,s.FilterType.Hierarchical,this._registryId,e.dimensionName,e.hierarchyCaption,e.levels,r,t,e.isAllSelected)}convertRangeFilter(e){const t=u.DataValueFactory.MakeFilterDataValue(e.min),r=u.DataValueFactory.MakeFilterDataValue(e.max);return new c.RangeFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,s.FilterType.Range,this._registryId,t,r,e.includeNullValues)}convertRelativeDateFilter(e){const t=u.DataValueFactory.MakeFilterDataValue(e.anchorDate);return new c.RelativeDateFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,i.FilterType.RelativeDate,this._registryId,t,d.InternalToExternalEnumMappings.dateStepPeriod.convert(e.periodType),d.InternalToExternalEnumMappings.dateRangeType.convert(e.rangeType),e.rangeN)}convertCategoricalDomain(e,t){const r=e.values.map((e=>u.DataValueFactory.MakeFilterDataValue(e)));return new c.CategoricalDomain(r,t)}convertRangeDomain(e,t){const r=u.DataValueFactory.MakeFilterDataValue(e.min),a=u.DataValueFactory.MakeFilterDataValue(e.max);return new c.RangeDomain(r,a,t)}convertAnchorDate(e){const t=e.getUTCFullYear(),r=e.getUTCMonth()+1,a=e.getUTCDate(),n=e.getUTCHours(),s=e.getUTCMinutes(),l=e.getUTCSeconds();if(isNaN(t)||isNaN(r)||isNaN(a)||isNaN(n)||isNaN(s)||isNaN(l))throw new o.TableauError(i.EmbeddingErrorCodes.InvalidDateParameter,"Invalid date parameter: anchorDate");return`${t}-${r}-${a} ${n}:${s}:${l}`}apiFilterHandlerCheckForCommandError(e){if(e[n.ParameterId.ParameterError]){if(e[n.ParameterId.InvalidFieldCaption])throw new o.TableauError(i.SharedErrorCodes.InvalidFilterFieldName,e[n.ParameterId.InvalidFieldCaption]);if(e[n.ParameterId.InvalidValues])throw new o.TableauError(i.SharedErrorCodes.InvalidFilterFieldValue,e[n.ParameterId.InvalidValues]);if(e[n.ParameterId.InvalidAggFieldName])throw new o.TableauError(i.SharedErrorCodes.InvalidAggregationFieldName,e[n.ParameterId.InvalidAggFieldName]);throw new o.TableauError(i.SharedErrorCodes.ServerError,"Server Error")}}}t.FilterServiceImpl=m},7712:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(6680),s=r(5136),o=r(1044),l=r(5068),d=r(7968),c=r(8052),u=r(3483),h=r(1776);class p extends h.ServiceImplBase{constructor(){super(...arguments),this.viewDataTableCacheId=n.v4()}get serviceName(){return"get-data-service"}getMaxRowLimit(){return 1e4}getViewDataTableCacheId(){return this.viewDataTableCacheId}getLimitedMaxRows(e,t){return e>0&&e{const t=e.result;return this.processResultsTable(t.data,t.isSummary)}))}getSummaryDataReaderAsync(e,t,r,a,n,s,l,c){const u={[i.ParameterId.FunctionName]:"getSummaryDataReaderAsync",[i.ParameterId.ViewDataTableCacheId]:this.getViewDataTableCacheId(),[i.ParameterId.VisualId]:e,[i.ParameterId.PageRowCount]:t,[i.ParameterId.IgnoreAliases]:r,[i.ParameterId.IgnoreSelection]:a,[i.ParameterId.IncludeAllColumns]:n,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(s),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(l),[i.ParameterId.ApplyWorksheetFormatting]:c};return this.execute(i.VerbId.GetDataSummaryDataReader,u).then((e=>{const r=e.result;return new d.DataTableReader(r.id,r.totalRowCount,t,this._registryId)}))}getSummaryColumnsInfoAsync(e){const t=i.VerbId.GetDataSummaryData,r={[i.ParameterId.FunctionName]:"getSummaryColumnsInfoAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.IgnoreAliases]:!0,[i.ParameterId.IgnoreSelection]:!0,[i.ParameterId.IncludeAllColumns]:!0,[i.ParameterId.MaxRows]:1,[i.ParameterId.ShowDataTableFormat]:i.ApiShowDataTableFormat.NativeValuesOnly};return this.execute(t,r).then((e=>e.result.data.headers.map((e=>new l.Column(e.fieldCaption,e.fieldName,e.dataType,e.isReferenced,e.index)))))}getSelectedMarksAsync(e){const t={[i.ParameterId.FunctionName]:"getSelectedMarksAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.GetSelectedMarks,t).then((e=>({data:e.result.data.map((e=>this.processResultsTable(e,!0)))})))}getHighlightedMarksAsync(e){const t={[i.ParameterId.FunctionName]:"getHighlightedMarksAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.GetHighlightedMarks,t).then((e=>({data:e.result.data.map((e=>this.processResultsTable(e,!0)))})))}getDataSourceDataAsync(e,t,r,a,n,s){const l={[i.ParameterId.FunctionName]:"getDataSourceDataAsync",[i.ParameterId.DataSourceId]:e,[i.ParameterId.IgnoreAliases]:t,[i.ParameterId.MaxRows]:this.getLimitedMaxRows(r,this.getMaxRowLimit()+1),[i.ParameterId.ColumnsToInclude]:this.verifyIncludeColumnArray(a),[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(n),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(s)};return this.execute(i.VerbId.GetDataSourceData,l).then((e=>{const t=e.result;return this.processResultsTable(t.data,!1)}))}getLogicalTableDataAsync(e,t,r,a,n,s,l){const d={[i.ParameterId.FunctionName]:"getLogicalTableDataAsync",[i.ParameterId.ColumnsToInclude]:n,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(s),[i.ParameterId.DataSourceId]:e,[i.ParameterId.IgnoreAliases]:r,[i.ParameterId.LogicalTableId]:t,[i.ParameterId.MaxRows]:this.getLimitedMaxRows(a,this.getMaxRowLimit()+1),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(l)};return this.execute(i.VerbId.GetLogicalTableData,d).then((e=>{const t=e.result;return this.processResultsTable(t.data,!1)}))}getLogicalTableDataReaderAsync(e,t,r,a,n,s){r=this.getLimitedMaxRows(r,this.getMaxRowLimit());const l={[i.ParameterId.FunctionName]:"getLogicalTableDataReaderAsync",[i.ParameterId.ViewDataTableCacheId]:this.getViewDataTableCacheId(),[i.ParameterId.DataSourceId]:e,[i.ParameterId.LogicalTableId]:t,[i.ParameterId.PageRowCount]:r,[i.ParameterId.IgnoreAliases]:a,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(n),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(s)};return this.execute(i.VerbId.GetLogicalTableDataReader,l).then((e=>{const t=e.result;return new d.DataTableReader(t.id,t.totalRowCount,r,this._registryId)}))}getUnderlyingTableDataAsync(e,t,r,a,n,s,l,d,c){const u={[i.ParameterId.FunctionName]:"getUnderlyingTableDataAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.LogicalTableId]:t,[i.ParameterId.IgnoreAliases]:r,[i.ParameterId.IgnoreSelection]:a,[i.ParameterId.IncludeAllColumns]:n,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(s),[i.ParameterId.MaxRows]:this.getLimitedMaxRows(l,this.getMaxRowLimit()+1),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(d),[i.ParameterId.ApplyWorksheetFormatting]:c};return this.execute(i.VerbId.GetUnderlyingTableData,u).then((e=>{const t=e.result;return this.processResultsTable(t.data,!1)}))}getUnderlyingTableDataReaderAsync(e,t,r,a,n,s,l,c,u){r=this.getLimitedMaxRows(r,this.getMaxRowLimit());const h={[i.ParameterId.FunctionName]:"getUnderlyingTableDataReaderAsync",[i.ParameterId.ViewDataTableCacheId]:this.getViewDataTableCacheId(),[i.ParameterId.VisualId]:e,[i.ParameterId.LogicalTableId]:t,[i.ParameterId.IgnoreAliases]:a,[i.ParameterId.IgnoreSelection]:n,[i.ParameterId.IncludeAllColumns]:s,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(l),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(c),[i.ParameterId.PageRowCount]:r,[i.ParameterId.ApplyWorksheetFormatting]:u};return this.execute(i.VerbId.GetUnderlyingTableDataReader,h).then((e=>{const t=e.result;return new d.DataTableReader(t.id,t.totalRowCount,r,this._registryId)}))}getPageAsync(e,t,r){const a={[i.ParameterId.FunctionName]:"getPageAsync",[i.ParameterId.ViewDataTableCacheId]:this.getViewDataTableCacheId(),[i.ParameterId.ViewDataTableId]:e,[i.ParameterId.DataRowIndex]:t*r};return this.execute(i.VerbId.GetDataTableReaderPage,a).then((t=>{const r=t.result;return this.processResultsPage(r,e===p.summaryTableId)}))}releaseAsync(e){const t={[i.ParameterId.FunctionName]:"release",[i.ParameterId.ViewDataTableCacheId]:this.getViewDataTableCacheId(),[i.ParameterId.ViewDataTableId]:e};return this.execute(i.VerbId.ReleaseDataTableReader,t).then((e=>{}))}verifyIncludeColumnArray(e){if(!Array.isArray(e))throw new s.TableauError(a.ErrorCodes.InvalidParameter,"columnsToInclude and columnsToIncludeById must be valid arrays");const t=new Set(e);return Array.from(t)}processResultsTable(e,t){const r=e.headers.map((e=>new l.Column(e.fieldCaption,e.fieldName,e.dataType,e.isReferenced,e.index)));let a;e.marks&&(a=e.marks.map((e=>new l.MarkInfo(e.type,e.color,e.tupleId))));const i=!1===t&&e.dataTable.length===this.getMaxRowLimit()+1;i&&(e.dataTable.length-=1);const n=e.dataTable.map((e=>e.map(((e,t)=>c.DataValueFactory.MakeTableDataValue(e,r[t].dataType)))));return a?new l.DataTable(n,r,n.length,i,t,a):new l.DataTable(n,r,n.length,i,t)}processResultsPage(e,t){const r=e.headers.map((e=>new l.Column(e.fieldCaption,e.fieldName,e.dataType,e.isReferenced,e.index)));let a;e.marks&&(a=e.marks.map((e=>new l.MarkInfo(e.type,e.color,e.tupleId))));const i=e.dataTable.map((e=>e.map(((e,t)=>c.DataValueFactory.MakeTableDataValue(e,r[t].dataType)))));return a?new l.DataTable(i,r,i.length,!1,t,a):new l.DataTable(i,r,i.length,!1,t)}}t.GetDataServiceImpl=p,p.summaryTableId=""},1288:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(8808);class i extends a.NotificationServiceImplBase{get serviceName(){return"notification-service"}}t.NotificationServiceImpl=i},8808:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});class r{constructor(e,t){this._filterFn=e,this._callbackFn=t}onNotification(e){this._filterFn(e)&&this._callbackFn(e)}}t.Registration=r,t.NotificationServiceImplBase=class{constructor(e){this.dispatcher=e,this._handlers={},this.dispatcher.registerNotificationHandler(this.onNotification.bind(this))}registerHandler(e,t,a){const i=this._handlers[e]||new Array,n=new r(t,a);return i.push(n),this._handlers[e]=i,()=>this.removeRegistration(e,n)}hasHandlersForNotificationType(e){return this._handlers.hasOwnProperty(e)}onNotification(e){this.hasHandlersForNotificationType(e.notificationId)&&this._handlers[e.notificationId].forEach((t=>t.onNotification(e.data)))}removeRegistration(e,t){this.hasHandlersForNotificationType(e)&&(this._handlers[e]=this._handlers[e].filter((e=>e!==t)))}}},7260:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(8552),s=r(6664),o=r(1776);class l extends o.ServiceImplBase{get serviceName(){return"parameters-service"}getParametersForSheetAsync(e){const t={[i.ParameterId.FunctionName]:"getParametersForSheetAsync",[i.ParameterId.SheetPath]:e};return this.getParametersAsync(t)}getAllParametersAsync(){const e={[i.ParameterId.FunctionName]:"getParametersForSheetAsync"};return this.getParametersAsync(e)}getParametersAsync(e){return this.execute(i.VerbId.GetParametersForSheet,e).then((e=>e.result.map((e=>new n.ParameterImpl(e,this._registryId)))))}changeParameterValueAsync(e,t){const r={[i.ParameterId.FunctionName]:"changeParameterValueAsync",[i.ParameterId.ParameterFieldName]:e,[i.ParameterId.ParameterValue]:t};return this.execute(i.VerbId.ChangeParameterValue,r).then((e=>e.result))}findParameterByNameAsync(e){return this.findParameterAsync(e,void 0)}findParameterByGlobalFieldNameAsync(e){return this.findParameterAsync(void 0,e)}findParameterAsync(e,t){const r={[i.ParameterId.FunctionName]:"findParameterAsync"};if(void 0!==e)r[i.ParameterId.ParameterCaption]=e;else{if(void 0===t)throw new s.TableauError(a.ErrorCodes.InvalidParameter,"name or fieldName must be provided to find parameter");r[i.ParameterId.ParameterFieldName]=t}return this.execute(i.VerbId.FindParameter,r).then((e=>{if("fieldName"in e.result){const t=e.result;return new n.ParameterImpl(t,this._registryId)}}))}}t.ParametersServiceImpl=l},8784:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(7104),s=r(6664),o=r(1172),l=r(1776);class d extends l.ServiceImplBase{get serviceName(){return"selection-service"}clearSelectedMarksAsync(e){const t={[i.ParameterId.FunctionName]:"clearSelectedMarksAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.ClearSelectedMarks,t).then((e=>{}))}selectMarksByValueAsync(e,t,r){if(0===t.length)throw new s.TableauError(a.ErrorCodes.InvalidParameter,"Selection criteria missing for selecting marks by value");const n=this.validateSelectionUpdateType(r),o=this.parseSelectionMarks(t),l={[i.ParameterId.FunctionName]:"selectMarksByValueAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.SelectionUpdateType]:n};return o.hierModelArr&&o.hierModelArr.length&&(l[i.ParameterId.HierValSelectionModels]=o.hierModelArr),o.quantModelArr&&o.quantModelArr.length&&(l[i.ParameterId.QuantRangeSelectionModels]=o.quantModelArr),o.dimModelArr&&o.dimModelArr.length&&(l[i.ParameterId.DimValSelectionModels]=o.dimModelArr),this.execute(i.VerbId.SelectByValue,l).then((e=>{this.apiFilterHandlerCheckForCommandError(e.result)}))}hoverTupleAsync(e,t,r,a){let s=new n.HoverTupleInteractionModel(e,this.ensureTupleIDIsNonNegative(t),r,a);const o={[i.ParameterId.FunctionName]:"hoverTupleAsync",[i.ParameterId.HoverTupleInteraction]:s};return this.execute(i.VerbId.RaiseHoverTupleNotification,o).then((e=>{}))}selectTuplesAsync(e,t,r,a){let s=new n.SelectTuplesInteractionModel(e,t,r,a);const o={[i.ParameterId.FunctionName]:"selectTuplesAsync",[i.ParameterId.SelectTuplesInteraction]:s};return this.execute(i.VerbId.RaiseSelectTuplesNotification,o).then((e=>{}))}apiFilterHandlerCheckForCommandError(e){if(e[i.ParameterId.ParameterError]){if(e[i.ParameterId.InvalidFields])throw new s.TableauError(a.SharedErrorCodes.InvalidSelectionFieldName,e[i.ParameterId.InvalidFields]);if(e[i.ParameterId.InvalidValues])throw new s.TableauError(a.SharedErrorCodes.InvalidSelectionValue,e[i.ParameterId.InvalidValues]);if(e[i.ParameterId.InvalidDates])throw new s.TableauError(a.SharedErrorCodes.InvalidSelectionDate,e[i.ParameterId.InvalidDates])}}selectMarksByIdAsync(e,t,r){if(0===t.length)throw new s.TableauError(a.ErrorCodes.InvalidParameter,"Marks info missing for selecting marks by Id");const n=this.validateSelectionUpdateType(r),o=this.parseSelectionIds(t),l={[i.ParameterId.FunctionName]:"selectMarksByIdAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.SelectionUpdateType]:n,[i.ParameterId.Selection]:o.selection};return this.execute(i.VerbId.SelectByValue,l).then((e=>{}))}parseSelectionIds(e){const t=[],r=new n.SelectionModelsContainer;for(let r=0;r0?e:0}}t.SelectionServiceImpl=d},1776:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(6557),i=r(6664),n=r(5520);t.ServiceImplBase=class{constructor(e,t){this._dispatcher=e,this._registryId=t}execute(e,t){return this._dispatcher.execute(e,t).catch((e=>{const t=e,r=a.InternalToExternalEnumMappings.errorCode.convert(t.errorCode,n.ShouldThrow.No);throw new i.TableauError(r,t.message)}))}}},4109:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(1776);class n extends i.ServiceImplBase{get serviceName(){return"size-service"}changeSizeAsync(e,t){var r,i,n,s;const o={[a.ParameterId.FunctionName]:"changeSizeAsync",[a.ParameterId.SheetName]:e,[a.ParameterId.MinHeight]:(null===(r=t.minSize)||void 0===r?void 0:r.height)||0,[a.ParameterId.MinWidth]:(null===(i=t.minSize)||void 0===i?void 0:i.width)||0,[a.ParameterId.MaxHeight]:(null===(n=t.maxSize)||void 0===n?void 0:n.height)||0,[a.ParameterId.MaxWidth]:(null===(s=t.maxSize)||void 0===s?void 0:s.width)||0};return this.execute(a.VerbId.SetSheetSize,o).then((e=>{}))}}t.SizeServiceImpl=n},2248:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(1776);class n extends i.ServiceImplBase{get serviceName(){return"story-activation-service"}activateNextStoryPointAsync(){const e=a.VerbId.ActivateNextStoryPoint,t={[a.ParameterId.FunctionName]:"activateNextStoryPointAsync"};return this.execute(e,t).then((e=>{}))}activatePreviousStoryPointAsync(){const e=a.VerbId.ActivatePreviousStoryPoint,t={[a.ParameterId.FunctionName]:"activatePreviousStoryPointAsync"};return this.execute(e,t).then((e=>{}))}activateStoryPointAsync(e){const t=a.VerbId.ActivateStoryPoint,r={[a.ParameterId.FunctionName]:"activateStoryPointAsync"};return r[a.ParameterId.StoryPointIndex]=e,this.execute(t,r).then((e=>{}))}revertStoryPointAsync(e){const t=a.VerbId.RevertStoryPoint,r={[a.ParameterId.FunctionName]:"revertStoryPointAsync"};return r[a.ParameterId.StoryPointIndex]=e,this.execute(t,r).then((e=>e.result))}}t.StoryActivationServiceImpl=n},6096:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(1776);class n extends i.ServiceImplBase{get serviceName(){return"visual-model-service"}getVisualSpecificationAsync(e){const t={[a.ParameterId.FunctionName]:"getVisualSpecificationAsync",[a.ParameterId.WorksheetName]:e.worksheet};return this.execute(a.VerbId.GetVisualSpecification,t).then((e=>e.result))}addMarksCardFieldsAsync(e,t,r,i,n){const s={[a.ParameterId.FunctionName]:"addMarksCardFieldsAsync",[a.ParameterId.WorksheetName]:e.worksheet,[a.ParameterId.MarksCardIndex]:t,[a.ParameterId.EncodingType]:r,[a.ParameterId.Columns]:i,[a.ParameterId.StartIndex]:n};return this.execute(a.VerbId.AddMarksCardFields,s).then((()=>{}))}moveMarksCardFieldAsync(e,t,r,i,n=1){const s={[a.ParameterId.FunctionName]:"addMarksCardFieldsAsync",[a.ParameterId.WorksheetName]:e.worksheet,[a.ParameterId.MarksCardIndex]:t,[a.ParameterId.FromIndex]:r,[a.ParameterId.ToIndex]:i,[a.ParameterId.FieldCount]:n};return this.execute(a.VerbId.MoveMarksCardField,s).then((()=>{}))}spliceMarksCardFieldsAsync(e,t,r,i,n,s){const o={[a.ParameterId.FunctionName]:"spliceMarksCardFieldsAsync",[a.ParameterId.WorksheetName]:e.worksheet,[a.ParameterId.MarksCardIndex]:t,[a.ParameterId.EncodingType]:r,[a.ParameterId.StartIndex]:i,[a.ParameterId.DeleteCount]:n,[a.ParameterId.Columns]:s};return this.execute(a.VerbId.SpliceMarksCardFields,o).then((()=>{}))}editAliasesDialogAsync(e){const t={[a.ParameterId.FunctionName]:"editAliasesDialogAsync",[a.ParameterId.FieldId]:e};return this.execute(a.VerbId.EditAliasesDialog,t).then((()=>{}))}}t.VisualModelServiceImpl=n},744:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(2520),n=r(1776);class s extends n.ServiceImplBase{get serviceName(){return"viz-service"}createVizImageAsync(e){const t={[a.ParameterId.FunctionName]:"createVizImageAsync",[a.ParameterId.VizAPIInputJson]:JSON.stringify(e)};return this.execute(a.VerbId.VizAPI,t).then((e=>e.result))}activateSheetAsync(e){const t={[a.ParameterId.FunctionName]:"activateSheetAsync",[a.ParameterId.SwitchToSheetName]:e};return this.execute(a.VerbId.ActivateSheet,t).then((()=>{}))}getCustomViewsAsync(){const e={[a.ParameterId.FunctionName]:"getCustomViewsAsync"};return this.execute(a.VerbId.GetCustomViews,e).then((e=>e.result.map((e=>new i.CustomViewImpl(e,this._registryId)))))}showCustomViewAsync(e){const t={[a.ParameterId.FunctionName]:"showCustomViewAsync",[a.ParameterId.CustomViewName]:e||""};return this.execute(a.VerbId.ShowCustomView,t).then((e=>{var t;const r=e.result;return(null===(t=r)||void 0===t?void 0:t.luid)?new i.CustomViewImpl(r,this._registryId):void 0}))}removeCustomViewAsync(e){const t={[a.ParameterId.FunctionName]:"removeCustomViewAsync",[a.ParameterId.CustomViewName]:e};return this.execute(a.VerbId.RemoveCustomView,t).then((e=>{const t=e.result;return new i.CustomViewImpl(t,this._registryId)}))}saveCustomViewAsync(e){const t={[a.ParameterId.FunctionName]:"saveCustomViewAsync",[a.ParameterId.CustomViewName]:e,[a.ParameterId.CustomViewIsDefault]:!1};return this.execute(a.VerbId.SaveWorkbookAsCustomView,t).then((e=>{const t=e.result;return new i.CustomViewImpl(t,this._registryId)}))}setActiveCustomViewAsDefaultAsync(){const e={[a.ParameterId.FunctionName]:"setActiveCustomViewAsDefaultAsync"};return this.execute(a.VerbId.SetActiveCustomViewAsDefault,e).then((()=>{}))}saveAsync(e){const t={[a.ParameterId.FunctionName]:"saveAsync",[a.ParameterId.CustomViewLuid]:e.luid,[a.ParameterId.CustomViewName]:e.name,[a.ParameterId.CustomViewIsDefault]:e.isDefault,[a.ParameterId.CustomViewIsPublic]:e.shared};return this.execute(a.VerbId.UpdateCustomView,t).then((e=>{const t=e.result;return new i.CustomViewImpl(t,this._registryId)}))}getCurrentSrcAsync(){const e={[a.ParameterId.FunctionName]:"getCurrentSrcAsync"};return this.execute(a.VerbId.GetCurrentSrc,e).then((e=>e.result))}}t.VizServiceImpl=s},8856:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(1044),s=r(7480),o=r(1172),l=r(1776);class d extends l.ServiceImplBase{get serviceName(){return"zone-service"}setVisibilityAsync(e,t,r){const l={[i.ParameterId.FunctionName]:"setVisibilityAsync",[i.ParameterId.Dashboard]:e,[i.ParameterId.ZoneIdsVisibilityMap]:{}};return o.Param.convertParameterToMap(r,"zoneVisibilityMap").forEach(((e,r)=>{s.ErrorHelpers.verifyZoneIsValid(t,Number.parseInt(r,10)),s.ErrorHelpers.verifyEnumValue(e,a.DashboardObjectVisibilityType,"DashboardObjectVisibilityType"),l[i.ParameterId.ZoneIdsVisibilityMap][r]=n.ExternalToInternalEnumMappings.setVisibilityType.convert(e)})),this.execute(i.VerbId.SetZoneVisibility,l).then((e=>{}))}moveAndResizeAsync(e,t,r){const a={[i.ParameterId.Dashboard]:e,[i.ParameterId.DashboardObjectPositionAndSizeUpdateList]:r};return r.forEach((e=>{s.ErrorHelpers.verifyZoneIsValidAndFloating(t,e.dashboardObjectID),s.ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(e)})),this.execute(i.VerbId.MoveAndResizeZones,a).then((e=>{}))}}t.ZoneServiceImpl=d},7603:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableSummary=class{constructor(e){this._tableInfo=e}get name(){return this._tableInfo.name}get id(){return this._tableInfo.id}get connectionId(){return this._tableInfo.connectionId}get customSQL(){return this._tableInfo.customSQL}}},6664:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});class r extends Error{constructor(e,t){super(`${e}: ${t}`),this._errorCode=e,Object.setPrototypeOf(this,r.prototype)}get errorCode(){return this._errorCode}}t.TableauError=r},8052:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(5068);t.DataValueFactory=class{static MakeParameterDataValue(e,t){return new i.DataValue(e.value,a.DataTypeConverter.convertStringValueToNativeValue(e.value,t),e.formattedValue,e.aliasedValue,e.hasAlias)}static MakeFilterDataValue(e){return new i.DataValue(e.value,e.value,e.formattedValue)}static MakeTableDataValue(e,t){return new i.DataValue(e.value,void 0!==e.value?a.DataTypeConverter.convertValueToNativeValue(e.value,t):void 0,e.formattedValue)}}},1724:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Deferred=class{constructor(){this._promise=new Promise(((e,t)=>{this._resolve=e,this._reject=t}))}get promise(){return this._promise}resolve(e){this._resolve&&this._resolve(e)}reject(e){this._reject&&this._reject(e)}},t.UnregisterTimeoutInMilliseconds=3e4},5520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664);var n;t.EnumConverter=class{constructor(e,t){this._mappings=e,this._defaultVal=t}convert(e,t=n.Yes){if(this._mappings.hasOwnProperty(e))return this._mappings[e];if(void 0!==this._defaultVal&&t!==n.Yes)return this._defaultVal;throw new i.TableauError(a.ErrorCodes.InternalError,`Enum Mapping not found for: ${e}`)}},function(e){e.Yes="yes",e.No="no"}(n=t.ShouldThrow||(t.ShouldThrow={}))},7480:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664),n=r(1172);class s{static apiNotImplemented(e){return new i.TableauError(a.SharedErrorCodes.InternalError,`${e} API not yet implemented.`)}static verifyInternalValue(e,t){if(null==e)throw new i.TableauError(a.SharedErrorCodes.InternalError,`${e} is invalid value for: ${t}`)}static verifyParameter(e,t){if(null==e)throw new i.TableauError(a.SharedErrorCodes.InvalidParameter,`${e} is invalid value for parameter: ${t}`)}static verifyParameterType(e,t,r){if(typeof e!==t)throw new i.TableauError(a.SharedErrorCodes.InvalidParameter,`${e} has invalid type for parameter: ${r}.`)}static verifyStringParameter(e,t){if(null==e||""===e)throw new i.TableauError(a.SharedErrorCodes.InvalidParameter,`${e} is invalid value for paramter: ${t}`)}static isValidEnumValue(e,t){let r=!1;return Object.keys(t).forEach((a=>{t[a]===e.toString()&&(r=!0)})),r}static verifyEnumValue(e,t,r){if(!s.isValidEnumValue(e,t))throw new i.TableauError(a.SharedErrorCodes.InvalidParameter,`${e} is invalid value for enum: ${r}.`)}static verifyRange(e,t,r){if(!(t<=e&&et.exportableSheetNamesFromDashboard.includes(e)))||e.every((e=>t.exportableSheetNamesFromWorkbook.includes(e)))||1===e.length&&e[0]===t.currentSheetName))throw new i.TableauError(a.SharedErrorCodes.InvalidSelectionSheet,"sheetNames parameter must have all its entries be exportable sheet names from the dashboard or all its entries be exportable sheet names from the workbook")}static verifyExportPDFOptions(e){try{this.verifyEnumValue(e.orientation,a.PrintOrientation,"PrintOrientation"),this.verifyEnumValue(e.pageSize,a.PrintPageSize,"PrintPageSize"),this.verifyEnumValue(e.scaling,a.PrintScaling,"PrintScaling")}catch(e){throw new i.TableauError(a.SharedErrorCodes.InvalidParameter,"options parameter must be of type ExportPDFOptions")}}}t.ErrorHelpers=s},5044:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(7419),n=r(6664);class s{static updateInternalExportPDFOptions(e,t,r){e.currentSheet=r[0],this.updateExportLayoutOptions(e,t),this.updateSheetOptions(e,r)}static updateExportLayoutOptions(e,t){const r=e.exportLayoutOptions;switch(r.imageHeight=this.DefaultLayoutOptions.imageHeight,r.imageWidth=this.DefaultLayoutOptions.imageWidth,t.orientation){case i.PrintOrientation.Landscape:r.pageOrientationOption=a.PageOrientation.Landscape;break;case i.PrintOrientation.Portrait:r.pageOrientationOption=a.PageOrientation.Portrait;break;default:throw new n.TableauError(i.SharedErrorCodes.InternalError,"invalid orientation for ExportPDFOption")}switch(t.pageSize){case i.PrintPageSize.A3:r.pageSizeOption=a.PageSizeOption.A3;break;case i.PrintPageSize.A4:r.pageSizeOption=a.PageSizeOption.A4;break;case i.PrintPageSize.A5:r.pageSizeOption=a.PageSizeOption.A5;break;case i.PrintPageSize.B4:r.pageSizeOption=a.PageSizeOption.B4;break;case i.PrintPageSize.B5:r.pageSizeOption=a.PageSizeOption.B5;break;case i.PrintPageSize.Executive:r.pageSizeOption=a.PageSizeOption.Executive;break;case i.PrintPageSize.Folio:r.pageSizeOption=a.PageSizeOption.Folio;break;case i.PrintPageSize.Ledger:r.pageSizeOption=a.PageSizeOption.Ledger;break;case i.PrintPageSize.Legal:r.pageSizeOption=a.PageSizeOption.Legal;break;case i.PrintPageSize.Letter:r.pageSizeOption=a.PageSizeOption.Letter;break;case i.PrintPageSize.Note:r.pageSizeOption=a.PageSizeOption.Note;break;case i.PrintPageSize.Quarto:r.pageSizeOption=a.PageSizeOption.Quarto;break;case i.PrintPageSize.Statement:r.pageSizeOption=a.PageSizeOption.Statement;break;case i.PrintPageSize.Tabloid:r.pageSizeOption=a.PageSizeOption.Tabloid;break;case i.PrintPageSize.Unspecified:r.pageSizeOption=a.PageSizeOption.Unspecified;break;default:throw new n.TableauError(i.SharedErrorCodes.InternalError,"invalid pageSize for ExportPDFOption")}switch(t.scaling){case i.PrintScaling.AtMost1PageHigh:this.setFitAndScaleValues(r,a.FitPages.FitOneHigh);break;case i.PrintScaling.AtMost1PageWide:this.setFitAndScaleValues(r,a.FitPages.FitOneWide);break;case i.PrintScaling.AtMost2PagesHigh:this.setFitAndScaleValues(r,a.FitPages.FitTwoHigh);break;case i.PrintScaling.AtMost2PagesWide:this.setFitAndScaleValues(r,a.FitPages.FitTwoWide);break;case i.PrintScaling.Automatic:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePctAuto);break;case i.PrintScaling.Perc100:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct100);break;case i.PrintScaling.Perc200:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct200);break;case i.PrintScaling.Perc25:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct25);break;case i.PrintScaling.Perc400:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct400);break;case i.PrintScaling.Perc50:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct50);break;case i.PrintScaling.Perc60:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct60);break;case i.PrintScaling.Perc75:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct75);break;case i.PrintScaling.Perc80:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct80);break;case i.PrintScaling.Perc90:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct90);break;default:throw new n.TableauError(i.SharedErrorCodes.InternalError,"invalid scaling for ExportPDFOption")}}static updateSheetOptions(e,t){const{exportLayoutOptions:r,sheetOptions:a}=e;for(const e of a)e.exportLayoutOptions=r,e.isSelected=t.includes(e.sheet)}static setFitAndScaleValues(e,t){let{pageFitHorizontal:r,pageFitVertical:i,pageScaleMode:n,pageScalePercent:s}=this.DefaultLayoutOptions;const o=this.fitRegex.exec(t),l=this.pctRegex.exec(t);o?([r,i]=o.slice(1).map((e=>Number(e))),n=a.ScaleMode.ScaleFitPages):l&&([s]=l.slice(1).map((e=>Number(e))),n=a.ScaleMode.ScalePercentage),e.pageFitHorizontal=r,e.pageFitVertical=i,e.pageScaleMode=n,e.pageScalePercent=s}}t.ExportHelpers=s,s.DefaultDataOptions={ignoreAliases:!1,columnsToIncludeById:[]},s.DefaultPDFOptions={scaling:i.PrintScaling.Automatic,pageSize:i.PrintPageSize.Letter,orientation:i.PrintOrientation.Portrait},s.DefaultLayoutOptions={imageHeight:0,imageWidth:0,pageFitHorizontal:1,pageFitVertical:1,pageOrientationOption:a.PageOrientation.Portrait,pageScaleMode:a.ScaleMode.ScaleAuto,pageScalePercent:100,pageSizeOption:a.PageSizeOption.Letter},s.fitRegex=new RegExp("fit([0-9]+)x([0-9]+)"),s.pctRegex=new RegExp("pct([0-9]+)")},1172:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664),n=r(7480);class s{static serializeDateForPlatform(e){return`${e.getUTCFullYear()}-${e.getUTCMonth()+1}-${e.getUTCDate()} ${e.getUTCHours()}:${e.getUTCMinutes()}:${e.getUTCSeconds()}`}static serializeBooleanForPlatform(e){return e?"true":"false"}static serializeNumberForPlatform(e){return e.toString(10)}static isTypeNumber(e){return"number"==typeof e||e instanceof Number}static isTypeDate(e){return e instanceof Date}static isTypeString(e){return"string"==typeof e||e instanceof String}static isTypeBool(e){return"boolean"==typeof e||e instanceof Boolean}static isNullOrUndefined(e){return null==e}static serializeParameterValue(e){if(s.isTypeNumber(e))return s.serializeNumberForPlatform(e);if(s.isTypeDate(e))return s.serializeDateForPlatform(e);if(s.isTypeBool(e))return s.serializeBooleanForPlatform(e);if(s.isTypeString(e))return e;throw new i.TableauError(a.ErrorCodes.InternalError,`Unexpected invalid value for: ${e}`)}static convertParameterToMap(e,t){if(n.ErrorHelpers.verifyParameterType(e,"object",t),Array.isArray(e))throw new i.TableauError(a.ErrorCodes.InvalidParameter,`Expecting object or Map for: ${t}.`);return e instanceof Map?e:new Map(Object.entries(e))}static tryParseNumber(e){if(s.isNullOrUndefined(e))return{success:!1};if(s.isTypeNumber(e))return{parsed:e,success:!0};const t=e.toString();if("NaN"===t)return{parsed:NaN,success:!0};const r=parseFloat(t);return isNaN(r)?{success:!1}:{parsed:r,success:!0}}}t.Param=s},2780:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(6664);t.SheetUtils=class{static getSheetSizeFromSizeConstraints(e){const{minWidth:t,minHeight:r,maxWidth:i,maxHeight:n}=e;if(0===r&&0===t)return 0===n&&0===i?{behavior:a.SheetSizeBehavior.Automatic}:{behavior:a.SheetSizeBehavior.AtMost,maxSize:{width:i,height:n}};if(0===n&&0===i)return{behavior:a.SheetSizeBehavior.AtLeast,minSize:{width:t,height:r}};if(n===r&&i===t&&t>0)return{behavior:a.SheetSizeBehavior.Exactly,minSize:{width:t,height:r},maxSize:{width:t,height:r}};const s=0===t&&0===i;return{behavior:a.SheetSizeBehavior.Range,minSize:{width:t,height:r},maxSize:{width:s?2147483647:i,height:n}}}static createAutomaticSize(){return{behavior:a.SheetSizeBehavior.Automatic,minSize:{width:0,height:0},maxSize:{width:0,height:0}}}static getPublishedSheetInfoByName(e,t){return t.find((t=>t.name===e))}static getSheetTypeEnum(e){let t;switch(e){case i.SheetType.Worksheet:t=a.SheetType.Worksheet;break;case i.SheetType.Dashboard:t=a.SheetType.Dashboard;break;case i.SheetType.Story:t=a.SheetType.Story;break;default:throw new n.TableauError(a.SharedErrorCodes.ServerError,"Invalid SheetType")}return t}static isValidSheetSize(e){return void 0!==e.behavior}}},3036:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664),n=r(1724);t.ShortLivedDeferred=class{constructor(e=n.UnregisterTimeoutInMilliseconds){this._timeoutInMilliseconds=e}getNewPromiseOrThrowIfBusy(){if(this._deferred)throw new i.TableauError(a.SharedErrorCodes.ApiExecutionError,"This api cannot be executed till previous call is resolved.");return this._deferred=new n.Deferred,this._timeoutId=setTimeout((()=>{const e=new i.TableauError(a.SharedErrorCodes.Timeout,`Api failed to complete in ${this._timeoutInMilliseconds/1e3} seconds`);this.reject(e)}),this._timeoutInMilliseconds),this._deferred.promise}resolve(e){this._deferred&&(clearTimeout(this._timeoutId),this._deferred.resolve(e),this._deferred=void 0)}reject(e){this._deferred&&(clearTimeout(this._timeoutId),this._deferred.reject(e),this._deferred=void 0)}}},1576:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664);t.VersionNumber=class{constructor(e,t){const r=e.split("-");this.build=this.getBuildNumber(r[1]);const n=(e=r[0]).split(".").map((e=>parseInt(e,10)));if(3!==n.length)throw new i.TableauError(a.ErrorCodes.InternalError,`Invalid version number: ${e}`);this.major=n[0],this.minor=n[1],this.fix=n[2],this.isAlpha=t}getBuildNumber(e){if(!e)return-1;const t=e.split(".");return t[1]?parseInt(t[1],10):-1}get formattedValue(){return`${this.major}.${this.minor}.${this.fix}`}get fullFormattedValue(){return`${this.major}.${this.minor}.${this.fix}-pre.${this.build}`}}},8648:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448);t.VersionedExternalApiDispatcher=class{constructor(e,t){this._apiDelegateDispatcher=e,this._versionConverter=a.CreateExternalCompatibleVersionConverter(a.INTERNAL_CONTRACT_VERSION,t),this._notificationHandlers=[],e.registerNotificationHandler((e=>{if(0===this._notificationHandlers.length)return;const t=this._versionConverter.upgradeNotification(e);this._notificationHandlers.forEach((e=>{e(t)}))}))}static needsVersionConverter(e){return a.VersionLessThan(e,a.INTERNAL_CONTRACT_VERSION)}execute(e,t){try{const r=this._versionConverter.downgradeExecuteCall(e,t);return this._apiDelegateDispatcher.execute(r.verb,r.parameters).then((r=>this._versionConverter.upgradeExecuteReturn(r,e,t)))}catch(e){return Promise.reject(e)}}registerNotificationHandler(e){this._notificationHandlers.push(e)}unregisterNotificationHandler(e){this._notificationHandlers=this._notificationHandlers.filter((t=>t!==e))}}},6680:(e,t,r)=>{"use strict";var a;r.r(t),r.d(t,{NIL:()=>F,parse:()=>y,stringify:()=>c,v1:()=>g,v3:()=>P,v4:()=>_,v5:()=>C,validate:()=>o,version:()=>x});var i=new Uint8Array(16);function n(){if(!a&&!(a="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return a(i)}const s=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,o=function(e){return"string"==typeof e&&s.test(e)};for(var l=[],d=0;d<256;++d)l.push((d+256).toString(16).substr(1));const c=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=(l[e[t+0]]+l[e[t+1]]+l[e[t+2]]+l[e[t+3]]+"-"+l[e[t+4]]+l[e[t+5]]+"-"+l[e[t+6]]+l[e[t+7]]+"-"+l[e[t+8]]+l[e[t+9]]+"-"+l[e[t+10]]+l[e[t+11]]+l[e[t+12]]+l[e[t+13]]+l[e[t+14]]+l[e[t+15]]).toLowerCase();if(!o(r))throw TypeError("Stringified UUID is invalid");return r};var u,h,p=0,m=0;const g=function(e,t,r){var a=t&&r||0,i=t||new Array(16),s=(e=e||{}).node||u,o=void 0!==e.clockseq?e.clockseq:h;if(null==s||null==o){var l=e.random||(e.rng||n)();null==s&&(s=u=[1|l[0],l[1],l[2],l[3],l[4],l[5]]),null==o&&(o=h=16383&(l[6]<<8|l[7]))}var d=void 0!==e.msecs?e.msecs:Date.now(),g=void 0!==e.nsecs?e.nsecs:m+1,y=d-p+(g-m)/1e4;if(y<0&&void 0===e.clockseq&&(o=o+1&16383),(y<0||d>p)&&void 0===e.nsecs&&(g=0),g>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");p=d,m=g,h=o;var I=(1e4*(268435455&(d+=122192928e5))+g)%4294967296;i[a++]=I>>>24&255,i[a++]=I>>>16&255,i[a++]=I>>>8&255,i[a++]=255&I;var v=d/4294967296*1e4&268435455;i[a++]=v>>>8&255,i[a++]=255&v,i[a++]=v>>>24&15|16,i[a++]=v>>>16&255,i[a++]=o>>>8|128,i[a++]=255&o;for(var S=0;S<6;++S)i[a+S]=s[S];return t||c(i)},y=function(e){if(!o(e))throw TypeError("Invalid UUID");var t,r=new Uint8Array(16);return r[0]=(t=parseInt(e.slice(0,8),16))>>>24,r[1]=t>>>16&255,r[2]=t>>>8&255,r[3]=255&t,r[4]=(t=parseInt(e.slice(9,13),16))>>>8,r[5]=255&t,r[6]=(t=parseInt(e.slice(14,18),16))>>>8,r[7]=255&t,r[8]=(t=parseInt(e.slice(19,23),16))>>>8,r[9]=255&t,r[10]=(t=parseInt(e.slice(24,36),16))/1099511627776&255,r[11]=t/4294967296&255,r[12]=t>>>24&255,r[13]=t>>>16&255,r[14]=t>>>8&255,r[15]=255&t,r};function I(e,t,r){function a(e,a,i,n){if("string"==typeof e&&(e=function(e){e=unescape(encodeURIComponent(e));for(var t=[],r=0;r>>9<<4)+1}function S(e,t){var r=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(r>>16)<<16|65535&r}function T(e,t,r,a,i,n){return S((s=S(S(t,e),S(a,n)))<<(o=i)|s>>>32-o,r);var s,o}function b(e,t,r,a,i,n,s){return T(t&r|~t&a,e,t,i,n,s)}function f(e,t,r,a,i,n,s){return T(t&a|r&~a,e,t,i,n,s)}function E(e,t,r,a,i,n,s){return T(t^r^a,e,t,i,n,s)}function A(e,t,r,a,i,n,s){return T(r^(t|~a),e,t,i,n,s)}const P=I("v3",48,(function(e){if("string"==typeof e){var t=unescape(encodeURIComponent(e));e=new Uint8Array(t.length);for(var r=0;r>5]>>>i%32&255,s=parseInt(a.charAt(n>>>4&15)+a.charAt(15&n),16);t.push(s)}return t}(function(e,t){e[t>>5]|=128<>5]|=(255&e[a/8])<>>32-t}const C=I("v5",80,(function(e){var t=[1518500249,1859775393,2400959708,3395469782],r=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof e){var a=unescape(encodeURIComponent(e));e=[];for(var i=0;i>>0;S=v,v=I,I=D(y,30)>>>0,y=g,g=f}r[0]=r[0]+g>>>0,r[1]=r[1]+y>>>0,r[2]=r[2]+I>>>0,r[3]=r[3]+v>>>0,r[4]=r[4]+S>>>0}return[r[0]>>24&255,r[0]>>16&255,r[0]>>8&255,255&r[0],r[1]>>24&255,r[1]>>16&255,r[1]>>8&255,255&r[1],r[2]>>24&255,r[2]>>16&255,r[2]>>8&255,255&r[2],r[3]>>24&255,r[3]>>16&255,r[3]>>8&255,255&r[3],r[4]>>24&255,r[4]>>16&255,r[4]>>8&255,255&r[4]]})),F="00000000-0000-0000-0000-000000000000",x=function(e){if(!o(e))throw TypeError("Invalid UUID");return parseInt(e.substr(14,1),16)}},5892:e=>{"use strict";e.exports=JSON.parse('{"major":1,"minor":188,"fix":0}')}},t={};function r(a){var i=t[a];if(void 0!==i)return i.exports;var n=t[a]={exports:{}};return e[a].call(n.exports,n,n.exports,r),n.exports}r.d=(e,t)=>{for(var a in t)r.o(t,a)&&!r.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var a={};(()=>{"use strict";var e=a;Object.defineProperty(e,"__esModule",{value:!0});const t=r(5136),i=r(976),n=r(5408);t.ApiVersion.SetVersionNumber("1.15.0-pre.15",!0);const s=new i.ExtensionsImpl;e.extensions=new n.Extensions(s);var o=r(7419);e.AnalyticsObjectType=o.AnalyticsObjectType,e.AnnotationType=o.AnnotationType,e.ClassNameKey=o.ClassNameKey,e.ColumnType=o.ColumnType,e.DashboardLayoutChange=o.DashboardLayoutChange,e.DashboardObjectType=o.DashboardObjectType,e.DashboardObjectVisibilityType=o.DashboardObjectVisibilityType,e.DataType=o.DataType,e.DateRangeType=o.DateRangeType,e.DialogStyle=o.DialogStyle,e.EncodingType=o.EncodingType,e.ErrorCodes=o.ErrorCodes,e.ExtensionContext=o.ExtensionContext,e.ExtensionMode=o.ExtensionMode,e.FieldAggregationType=o.FieldAggregationType,e.FieldRoleType=o.FieldRoleType,e.FilterDomainType=o.FilterDomainType,e.FilterNullOption=o.FilterNullOption,e.FilterType=o.FilterType,e.FilterUpdateType=o.FilterUpdateType,e.HierarchicalLevelSelectionState=o.HierarchicalLevelSelectionState,e.IncludeDataValuesOption=o.IncludeDataValuesOption,e.MarkType=o.MarkType,e.ParameterValueType=o.ParameterValueType,e.PeriodType=o.PeriodType,e.QuickTableCalcType=o.QuickTableCalcType,e.ReplaySpeedType=o.ReplaySpeedType,e.SelectionUpdateType=o.SelectionUpdateType,e.SelectOptions=o.SelectOptions,e.SheetType=o.SheetType,e.SortDirection=o.SortDirection,e.TableauEventType=o.TableauEventType,e.TrendLineModelType=o.TrendLineModelType,e.VizImageEncodingType=o.VizImageEncodingType,e.VizImagePaletteType=o.VizImagePaletteType,e.VizImageSizeSettingAlignmentType=o.VizImageSizeSettingAlignmentType,e.VizImageSizeSettingType=o.VizImageSizeSettingType,e.VizImageSortDirectionType=o.VizImageSortDirectionType,e.ZoneVisibilityType=o.ZoneVisibilityType})(),window.tableau=a})(); +//# sourceMappingURL=tableau.extensions.1.15.0-pre.15.beta.min.js.map \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 94842596..15fdeb1a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2692,10 +2692,11 @@ } }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -4749,9 +4750,9 @@ } }, "node_modules/form-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.3.tgz", - "integrity": "sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", + "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", "dev": true, "license": "MIT", "peer": true, @@ -4759,6 +4760,7 @@ "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.35" }, "engines": { @@ -7710,10 +7712,11 @@ } }, "node_modules/minimatch/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1"