@pipeline-builder/pipeline-core 4.4.12 → 4.4.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.d.ts CHANGED
@@ -38,7 +38,7 @@ export * from './core/security-group-types.js';
38
38
  export { replaceNonAlphanumeric, extractMetadataEnv, resolveFailureBehavior, wrapCommandsForFailureBehavior, STEP_BOOTSTRAP_CMD } from './core/metadata-helpers.js';
39
39
  export * from './core/step-manifest.js';
40
40
  export { type ContractValueType, type PluginContract, type ContractScope, type ContractIssue, type ContractScopeProps, pipelineScopeMetadata, pipelineContractScope, contractScopeFromTemplateScope, isContractValueOfType, checkPluginContract, type PluginStepRef, collectPluginSteps, pluginLookupFilter, pluginArtifactAlias, pluginStepLabel, type PluginRefIdentity, sanitizePublisher, } from './core/plugin-contract.js';
41
- export { unwrapLookup, summarizeLookupWarnings, LOOKUP_WARNING_SEVERITIES, type LookupWarning, type LookupWarningSeverity, lookupNotFoundState, exactPinNotFoundMessage, type LookupNotFoundState, parseLookupToolchain, TOOLCHAIN_RESOLVED_VIA, type ToolchainResolvedVia, type ToolchainVersions, type LookupToolchain, type ResolvedBootstrap, } from './core/plugin-lookup-envelope.js';
41
+ export { unwrapLookup, summarizeLookupWarnings, LOOKUP_WARNING_SEVERITIES, type LookupWarning, type LookupWarningSeverity, lookupNotFoundState, exactPinNotFoundMessage, type LookupNotFoundState, parseLookupToolchain, type ToolchainVersions, type LookupToolchain, type ResolvedBootstrap, } from './core/plugin-lookup-envelope.js';
42
42
  export * from './core/self-mutation.js';
43
43
  export * from './core/synth-failure.js';
44
44
  export * from './core/runtime-check.js';
package/lib/index.js CHANGED
@@ -42,7 +42,7 @@ export * from './core/security-group-types.js';
42
42
  export { replaceNonAlphanumeric, extractMetadataEnv, resolveFailureBehavior, wrapCommandsForFailureBehavior, STEP_BOOTSTRAP_CMD } from './core/metadata-helpers.js';
43
43
  export * from './core/step-manifest.js';
44
44
  export { pipelineScopeMetadata, pipelineContractScope, contractScopeFromTemplateScope, isContractValueOfType, checkPluginContract, collectPluginSteps, pluginLookupFilter, pluginArtifactAlias, pluginStepLabel, sanitizePublisher, } from './core/plugin-contract.js';
45
- export { unwrapLookup, summarizeLookupWarnings, LOOKUP_WARNING_SEVERITIES, lookupNotFoundState, exactPinNotFoundMessage, parseLookupToolchain, TOOLCHAIN_RESOLVED_VIA, } from './core/plugin-lookup-envelope.js';
45
+ export { unwrapLookup, summarizeLookupWarnings, LOOKUP_WARNING_SEVERITIES, lookupNotFoundState, exactPinNotFoundMessage, parseLookupToolchain, } from './core/plugin-lookup-envelope.js';
46
46
  export * from './core/self-mutation.js';
47
47
  export * from './core/synth-failure.js';
48
48
  export * from './core/runtime-check.js';
@@ -63,4 +63,4 @@ export * from './pipeline/plugin-spec.js';
63
63
  export { tokenize, hasTemplate, MAX_FIELD_SIZE_BYTES, MAX_PATH_DEPTH, resolve, dependencies, validateTemplates, detectCycles, allowedScopeRoots, resolveSelfReferencing, validateTemplateDraft, formatTemplateDraftProblems, } from './template/index.js';
64
64
  // A plugin's `{{ … }}` resolution against a pipeline scope (synth, `plugin test`)
65
65
  export { resolvePluginTemplates } from './template/plugin-resolver.js';
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUVILGdCQUFnQjtBQUNoQixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUV6RSw4QkFBOEI7QUFDOUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQXNDLFdBQVcsRUFBRSxZQUFZLEVBQW9CLE1BQU0sMEJBQTBCLENBQUM7QUFDcEosY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsRUFBRSw4QkFBOEIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BLLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsT0FBTyxFQU1MLHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIsOEJBQThCLEVBQzlCLHFCQUFxQixFQUNyQixtQkFBbUIsRUFFbkIsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsZUFBZSxFQUVmLGlCQUFpQixHQUNsQixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFDTCxZQUFZLEVBQ1osdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUd6QixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBRXZCLG9CQUFvQixFQUNwQixzQkFBc0IsR0FLdkIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsaUNBQWlDLENBQUM7QUFFaEQsK0VBQStFO0FBQy9FLDJFQUEyRTtBQUMzRSx3RUFBd0U7QUFDeEUsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxtRkFBbUY7QUFDbkYsd0VBQXdFO0FBQ3hFLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYywyQkFBMkIsQ0FBQztBQUUxQyw0RUFBNEU7QUFDNUUsT0FBTyxFQUNMLFFBQVEsRUFDUixXQUFXLEVBQ1gsb0JBQW9CLEVBQ3BCLGNBQWMsRUFLZCxPQUFPLEVBQ1AsWUFBWSxFQUdaLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osaUJBQWlCLEVBSWpCLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsMkJBQTJCLEdBTTVCLE1BQU0scUJBQXFCLENBQUM7QUFDN0Isa0ZBQWtGO0FBQ2xGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLCtCQUErQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogQG1vZHVsZSBAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlXG4gKlxuICogQXBwbGljYXRpb24gY29uZmlndXJhdGlvbiwgcGlwZWxpbmUgZG9tYWluIHR5cGVzLCBhbmQgdGhlIHRlbXBsYXRlIGVuZ2luZS5cbiAqXG4gKiBUaGlzIGVudHJ5IHBvaW50IGlzIGRlbGliZXJhdGVseSBGUkVFIG9mIGBhd3MtY2RrLWxpYmAuIFRoZSBDREsgY29uc3RydWN0cyBsaXZlXG4gKiBiZWhpbmQgYSBzZXBhcmF0ZSBzdWJwYXRoIOKAlCBgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZS9jZGtgIOKAlCBiZWNhdXNlIHRoZVxuICogQVBJIHNlcnZpY2VzIGNvbnN1bWUgdGhpcyBwYWNrYWdlIGZvciBjb25maWcgYW5kIGRvbWFpbiB0eXBlcyBvbmx5LCBhbmQgYW5cbiAqIGBleHBvcnQgKmAgb2YgdGhlIGNvbnN0cnVjdHMgZnJvbSBoZXJlIHB1dCB0aGUgd2hvbGUgb2YgYGF3cy1jZGstbGliYCBvbiB0aGVcbiAqIGltcG9ydCBncmFwaCBvZiBldmVyeSBzZXJ2aWNlIHRoYXQgcmVhZCBzbyBtdWNoIGFzIGEgcG9ydCBudW1iZXIuIEFueXRoaW5nIHRoYXRcbiAqIGltcG9ydHMgYGF3cy1jZGstbGliYCwgYXQgdHlwZSBsZXZlbCBvciB2YWx1ZSBsZXZlbCwgYmVsb25ncyBpbiBgY2RrLnRzYC5cbiAqXG4gKiAqKkNvbmZpZyoqXG4gKiAtIENvbmZpZyDigJQgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiBzaW5nbGV0b24gKGVudmlyb25tZW50LWRyaXZlbilcbiAqIC0gQ29uZmlnVHlwZXMg4oCUIHR5cGVkIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlc1xuICpcbiAqICoqVHlwZXMqKlxuICogLSBQaXBlbGluZVR5cGUsIENvbXB1dGVUeXBlLCBQbHVnaW5UeXBlLCBWaXNpYmlsaXR5IOKAlCBwaXBlbGluZSBkb21haW4gZW51bXNcbiAqIC0gUm9sZVR5cGVzLCBTZWN1cml0eUdyb3VwVHlwZXMg4oCUIGluZnJhc3RydWN0dXJlIHR5cGUgZGVmaW5pdGlvbnNcbiAqIC0gUGx1Z2luU3BlYyDigJQgYSBwbHVnaW4ncyBkZWNsYXJlZCBjb250cmFjdFxuICogLSBJZEdlbmVyYXRvciDigJQgZGV0ZXJtaW5pc3RpYyBJRCBnZW5lcmF0aW9uXG4gKlxuICogKipIZWxwZXJzKipcbiAqIC0gcmVwbGFjZU5vbkFscGhhbnVtZXJpYywgZXh0cmFjdE1ldGFkYXRhRW52IOKAlCBzdHJpbmcgYW5kIG1ldGFkYXRhIHV0aWxpdGllc1xuICogLSByZXNvbHZlRmFpbHVyZUJlaGF2aW9yLCB3cmFwQ29tbWFuZHNGb3JGYWlsdXJlQmVoYXZpb3Ig4oCUIGEgc3RlcCdzIGZhaWx1cmVCZWhhdmlvciwgYXMgQ29kZUJ1aWxkIHJ1bnMgaXRcbiAqXG4gKiBUaGUgUG9zdGdyZXMvRHJpenpsZSBkYXRhIGxheWVyIChkYiwgc2NoZW1hLCBDcnVkU2VydmljZSwgcXVlcnkgYnVpbGRlcnMsXG4gKiBmaWx0ZXIvY29tcGxpYW5jZSB0eXBlcywgZXRjLikgaXMgTk9UIHJlLWV4cG9ydGVkIGhlcmUg4oCUIGltcG9ydCB0aG9zZVxuICogZGlyZWN0bHkgZnJvbSBgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YWAuXG4gKi9cblxuLy8gQ29uZmlndXJhdGlvblxuZXhwb3J0ICogZnJvbSAnLi9jb25maWcvYXBwLWNvbmZpZy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbmZpZy9jb25maWctdHlwZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25maWcvc2VydmljZS1jbGllbnQuanMnO1xuZXhwb3J0IHsgcGFyc2VQbGF0Zm9ybUJhc2VVcmwgfSBmcm9tICcuL2NvbmZpZy9pbmZyYXN0cnVjdHVyZS1jb25maWcuanMnO1xuXG4vLyBDb3JlIHR5cGVzIChwdWJsaWMgc3VyZmFjZSlcbmV4cG9ydCB7IENvbXB1dGVUeXBlLCBQbHVnaW5UeXBlLCB0eXBlIE1ldGFEYXRhVHlwZSwgdHlwZSBWaXNpYmlsaXR5LCBUcmlnZ2VyVHlwZSwgTWV0YWRhdGFLZXlzLCB0eXBlIE1ldGFkYXRhS2V5IH0gZnJvbSAnLi9jb3JlL3BpcGVsaW5lLXR5cGVzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9yb2xlLXR5cGVzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9zZWN1cml0eS1ncm91cC10eXBlcy5qcyc7XG5leHBvcnQgeyByZXBsYWNlTm9uQWxwaGFudW1lcmljLCBleHRyYWN0TWV0YWRhdGFFbnYsIHJlc29sdmVGYWlsdXJlQmVoYXZpb3IsIHdyYXBDb21tYW5kc0ZvckZhaWx1cmVCZWhhdmlvciwgU1RFUF9CT09UU1RSQVBfQ01EIH0gZnJvbSAnLi9jb3JlL21ldGFkYXRhLWhlbHBlcnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3N0ZXAtbWFuaWZlc3QuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBDb250cmFjdFZhbHVlVHlwZSxcbiAgdHlwZSBQbHVnaW5Db250cmFjdCxcbiAgdHlwZSBDb250cmFjdFNjb3BlLFxuICB0eXBlIENvbnRyYWN0SXNzdWUsXG4gIHR5cGUgQ29udHJhY3RTY29wZVByb3BzLFxuICBwaXBlbGluZVNjb3BlTWV0YWRhdGEsXG4gIHBpcGVsaW5lQ29udHJhY3RTY29wZSxcbiAgY29udHJhY3RTY29wZUZyb21UZW1wbGF0ZVNjb3BlLFxuICBpc0NvbnRyYWN0VmFsdWVPZlR5cGUsXG4gIGNoZWNrUGx1Z2luQ29udHJhY3QsXG4gIHR5cGUgUGx1Z2luU3RlcFJlZixcbiAgY29sbGVjdFBsdWdpblN0ZXBzLFxuICBwbHVnaW5Mb29rdXBGaWx0ZXIsXG4gIHBsdWdpbkFydGlmYWN0QWxpYXMsXG4gIHBsdWdpblN0ZXBMYWJlbCxcbiAgdHlwZSBQbHVnaW5SZWZJZGVudGl0eSxcbiAgc2FuaXRpemVQdWJsaXNoZXIsXG59IGZyb20gJy4vY29yZS9wbHVnaW4tY29udHJhY3QuanMnO1xuZXhwb3J0IHtcbiAgdW53cmFwTG9va3VwLFxuICBzdW1tYXJpemVMb29rdXBXYXJuaW5ncyxcbiAgTE9PS1VQX1dBUk5JTkdfU0VWRVJJVElFUyxcbiAgdHlwZSBMb29rdXBXYXJuaW5nLFxuICB0eXBlIExvb2t1cFdhcm5pbmdTZXZlcml0eSxcbiAgbG9va3VwTm90Rm91bmRTdGF0ZSxcbiAgZXhhY3RQaW5Ob3RGb3VuZE1lc3NhZ2UsXG4gIHR5cGUgTG9va3VwTm90Rm91bmRTdGF0ZSxcbiAgcGFyc2VMb29rdXBUb29sY2hhaW4sXG4gIFRPT0xDSEFJTl9SRVNPTFZFRF9WSUEsXG4gIHR5cGUgVG9vbGNoYWluUmVzb2x2ZWRWaWEsXG4gIHR5cGUgVG9vbGNoYWluVmVyc2lvbnMsXG4gIHR5cGUgTG9va3VwVG9vbGNoYWluLFxuICB0eXBlIFJlc29sdmVkQm9vdHN0cmFwLFxufSBmcm9tICcuL2NvcmUvcGx1Z2luLWxvb2t1cC1lbnZlbG9wZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvc2VsZi1tdXRhdGlvbi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvc3ludGgtZmFpbHVyZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvcnVudGltZS1jaGVjay5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvcGxhdGZvcm0tdGxzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9hdWRpdC1jb3JyZWxhdGlvbi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvcXVvdGEtZXhjZWVkZWQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3NlY3VyaXR5LXJlcG9ydHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3BpcGVsaW5lLXJlZ2lzdHJhdGlvbi5qcyc7XG5cbi8vIFBsdWdpbiBkb21haW4gdHlwZSAodGhlIHN5bnRoLXRpbWUgYXV0aG9yaW5nIHR5cGVzIGxpdmUgaW4gdGhlIGAvY2RrYCBlbnRyeSlcbi8vIENESy1mcmVlOiB0aGUgRE9SQSBkZXBsb3kgYXR0cmlidXRpb24gdGhlIEFQSSByZXBvcnRzIGluIGNyZWF0ZS92YWxpZGF0ZVxuLy8gcmVzcG9uc2VzLiBUaGUgY29uc3RydWN0IHRoYXQgc3RhbXBzIHRoZSB0YWcgcmVhZHMgdGhlIHNhbWUgZnVuY3Rpb24uXG5leHBvcnQgKiBmcm9tICcuL3BpcGVsaW5lL2RlcGxveS1hdHRyaWJ1dGlvbi5qcyc7XG4vLyBDREstZnJlZTogdGhlIHN0YWdlL3BsdWdpbi9JQU0gcHJvamVjdGlvbiB0aGUgY3JlYXRlICsgdmFsaWRhdGUgcmVzcG9uc2VzIHJldHVyblxuLy8gc28gYSByZXZpZXdlciBhcHByb3ZlcyBzb21ldGhpbmcgY29uY3JldGUgcmF0aGVyIHRoYW4gcmF3IHByb3BzIEpTT04uXG5leHBvcnQgKiBmcm9tICcuL3BpcGVsaW5lL3N0cnVjdHVyZS1wcmV2aWV3LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcGlwZWxpbmUvcGx1Z2luLXNwZWMuanMnO1xuXG4vLyBUZW1wbGF0ZSBlbmdpbmUg4oCUIHN5bnRoLXRpbWUgc2NyaXB0aW5nIGZvciBwaXBlbGluZSBjb25maWcgKyBwbHVnaW4gc3BlY3NcbmV4cG9ydCB7XG4gIHRva2VuaXplLFxuICBoYXNUZW1wbGF0ZSxcbiAgTUFYX0ZJRUxEX1NJWkVfQllURVMsXG4gIE1BWF9QQVRIX0RFUFRILFxuICB0eXBlIFRva2VuLFxuICB0eXBlIExpdGVyYWxUb2tlbixcbiAgdHlwZSBFeHByVG9rZW4sXG4gIHR5cGUgU291cmNlUG9zaXRpb24sXG4gIHJlc29sdmUsXG4gIGRlcGVuZGVuY2llcyxcbiAgdHlwZSBTY29wZSxcbiAgdHlwZSBGaWVsZFByZWRpY2F0ZSxcbiAgdmFsaWRhdGVUZW1wbGF0ZXMsXG4gIGRldGVjdEN5Y2xlcyxcbiAgYWxsb3dlZFNjb3BlUm9vdHMsXG4gIHR5cGUgVGVtcGxhdGVFcnJvcixcbiAgdHlwZSBUZW1wbGF0ZVZhbGlkYXRpb25SZXN1bHQsXG4gIHR5cGUgUmVzb2x2ZVJlc3VsdCxcbiAgcmVzb2x2ZVNlbGZSZWZlcmVuY2luZyxcbiAgdmFsaWRhdGVUZW1wbGF0ZURyYWZ0LFxuICBmb3JtYXRUZW1wbGF0ZURyYWZ0UHJvYmxlbXMsXG4gIHR5cGUgVGVtcGxhdGVEcmFmdElucHV0LFxuICB0eXBlIFRlbXBsYXRlRHJhZnRMaWtlLFxuICB0eXBlIFRlbXBsYXRlRHJhZnRQcm9ibGVtLFxuICB0eXBlIFRlbXBsYXRlRHJhZnRQcm9ibGVtS2luZCxcbiAgdHlwZSBUZW1wbGF0ZURyYWZ0VmFsaWRhdGlvbixcbn0gZnJvbSAnLi90ZW1wbGF0ZS9pbmRleC5qcyc7XG4vLyBBIHBsdWdpbidzIGB7eyDigKYgfX1gIHJlc29sdXRpb24gYWdhaW5zdCBhIHBpcGVsaW5lIHNjb3BlIChzeW50aCwgYHBsdWdpbiB0ZXN0YClcbmV4cG9ydCB7IHJlc29sdmVQbHVnaW5UZW1wbGF0ZXMgfSBmcm9tICcuL3RlbXBsYXRlL3BsdWdpbi1yZXNvbHZlci5qcyc7XG4iXX0=
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUVILGdCQUFnQjtBQUNoQixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUV6RSw4QkFBOEI7QUFDOUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQXNDLFdBQVcsRUFBRSxZQUFZLEVBQW9CLE1BQU0sMEJBQTBCLENBQUM7QUFDcEosY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsRUFBRSw4QkFBOEIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BLLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsT0FBTyxFQU1MLHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIsOEJBQThCLEVBQzlCLHFCQUFxQixFQUNyQixtQkFBbUIsRUFFbkIsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsZUFBZSxFQUVmLGlCQUFpQixHQUNsQixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFDTCxZQUFZLEVBQ1osdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUd6QixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBRXZCLG9CQUFvQixHQUlyQixNQUFNLGtDQUFrQyxDQUFDO0FBQzFDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyxpQ0FBaUMsQ0FBQztBQUVoRCwrRUFBK0U7QUFDL0UsMkVBQTJFO0FBQzNFLHdFQUF3RTtBQUN4RSxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELG1GQUFtRjtBQUNuRix3RUFBd0U7QUFDeEUsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLDJCQUEyQixDQUFDO0FBRTFDLDRFQUE0RTtBQUM1RSxPQUFPLEVBQ0wsUUFBUSxFQUNSLFdBQVcsRUFDWCxvQkFBb0IsRUFDcEIsY0FBYyxFQUtkLE9BQU8sRUFDUCxZQUFZLEVBR1osaUJBQWlCLEVBQ2pCLFlBQVksRUFDWixpQkFBaUIsRUFJakIsc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUNyQiwyQkFBMkIsR0FNNUIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixrRkFBa0Y7QUFDbEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBAbW9kdWxlIEBwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmVcbiAqXG4gKiBBcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uLCBwaXBlbGluZSBkb21haW4gdHlwZXMsIGFuZCB0aGUgdGVtcGxhdGUgZW5naW5lLlxuICpcbiAqIFRoaXMgZW50cnkgcG9pbnQgaXMgZGVsaWJlcmF0ZWx5IEZSRUUgb2YgYGF3cy1jZGstbGliYC4gVGhlIENESyBjb25zdHJ1Y3RzIGxpdmVcbiAqIGJlaGluZCBhIHNlcGFyYXRlIHN1YnBhdGgg4oCUIGBAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlL2Nka2Ag4oCUIGJlY2F1c2UgdGhlXG4gKiBBUEkgc2VydmljZXMgY29uc3VtZSB0aGlzIHBhY2thZ2UgZm9yIGNvbmZpZyBhbmQgZG9tYWluIHR5cGVzIG9ubHksIGFuZCBhblxuICogYGV4cG9ydCAqYCBvZiB0aGUgY29uc3RydWN0cyBmcm9tIGhlcmUgcHV0IHRoZSB3aG9sZSBvZiBgYXdzLWNkay1saWJgIG9uIHRoZVxuICogaW1wb3J0IGdyYXBoIG9mIGV2ZXJ5IHNlcnZpY2UgdGhhdCByZWFkIHNvIG11Y2ggYXMgYSBwb3J0IG51bWJlci4gQW55dGhpbmcgdGhhdFxuICogaW1wb3J0cyBgYXdzLWNkay1saWJgLCBhdCB0eXBlIGxldmVsIG9yIHZhbHVlIGxldmVsLCBiZWxvbmdzIGluIGBjZGsudHNgLlxuICpcbiAqICoqQ29uZmlnKipcbiAqIC0gQ29uZmlnIOKAlCBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uIHNpbmdsZXRvbiAoZW52aXJvbm1lbnQtZHJpdmVuKVxuICogLSBDb25maWdUeXBlcyDigJQgdHlwZWQgY29uZmlndXJhdGlvbiBpbnRlcmZhY2VzXG4gKlxuICogKipUeXBlcyoqXG4gKiAtIFBpcGVsaW5lVHlwZSwgQ29tcHV0ZVR5cGUsIFBsdWdpblR5cGUsIFZpc2liaWxpdHkg4oCUIHBpcGVsaW5lIGRvbWFpbiBlbnVtc1xuICogLSBSb2xlVHlwZXMsIFNlY3VyaXR5R3JvdXBUeXBlcyDigJQgaW5mcmFzdHJ1Y3R1cmUgdHlwZSBkZWZpbml0aW9uc1xuICogLSBQbHVnaW5TcGVjIOKAlCBhIHBsdWdpbidzIGRlY2xhcmVkIGNvbnRyYWN0XG4gKiAtIElkR2VuZXJhdG9yIOKAlCBkZXRlcm1pbmlzdGljIElEIGdlbmVyYXRpb25cbiAqXG4gKiAqKkhlbHBlcnMqKlxuICogLSByZXBsYWNlTm9uQWxwaGFudW1lcmljLCBleHRyYWN0TWV0YWRhdGFFbnYg4oCUIHN0cmluZyBhbmQgbWV0YWRhdGEgdXRpbGl0aWVzXG4gKiAtIHJlc29sdmVGYWlsdXJlQmVoYXZpb3IsIHdyYXBDb21tYW5kc0ZvckZhaWx1cmVCZWhhdmlvciDigJQgYSBzdGVwJ3MgZmFpbHVyZUJlaGF2aW9yLCBhcyBDb2RlQnVpbGQgcnVucyBpdFxuICpcbiAqIFRoZSBQb3N0Z3Jlcy9Ecml6emxlIGRhdGEgbGF5ZXIgKGRiLCBzY2hlbWEsIENydWRTZXJ2aWNlLCBxdWVyeSBidWlsZGVycyxcbiAqIGZpbHRlci9jb21wbGlhbmNlIHR5cGVzLCBldGMuKSBpcyBOT1QgcmUtZXhwb3J0ZWQgaGVyZSDigJQgaW1wb3J0IHRob3NlXG4gKiBkaXJlY3RseSBmcm9tIGBAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1kYXRhYC5cbiAqL1xuXG4vLyBDb25maWd1cmF0aW9uXG5leHBvcnQgKiBmcm9tICcuL2NvbmZpZy9hcHAtY29uZmlnLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29uZmlnL2NvbmZpZy10eXBlcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbmZpZy9zZXJ2aWNlLWNsaWVudC5qcyc7XG5leHBvcnQgeyBwYXJzZVBsYXRmb3JtQmFzZVVybCB9IGZyb20gJy4vY29uZmlnL2luZnJhc3RydWN0dXJlLWNvbmZpZy5qcyc7XG5cbi8vIENvcmUgdHlwZXMgKHB1YmxpYyBzdXJmYWNlKVxuZXhwb3J0IHsgQ29tcHV0ZVR5cGUsIFBsdWdpblR5cGUsIHR5cGUgTWV0YURhdGFUeXBlLCB0eXBlIFZpc2liaWxpdHksIFRyaWdnZXJUeXBlLCBNZXRhZGF0YUtleXMsIHR5cGUgTWV0YWRhdGFLZXkgfSBmcm9tICcuL2NvcmUvcGlwZWxpbmUtdHlwZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3JvbGUtdHlwZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3NlY3VyaXR5LWdyb3VwLXR5cGVzLmpzJztcbmV4cG9ydCB7IHJlcGxhY2VOb25BbHBoYW51bWVyaWMsIGV4dHJhY3RNZXRhZGF0YUVudiwgcmVzb2x2ZUZhaWx1cmVCZWhhdmlvciwgd3JhcENvbW1hbmRzRm9yRmFpbHVyZUJlaGF2aW9yLCBTVEVQX0JPT1RTVFJBUF9DTUQgfSBmcm9tICcuL2NvcmUvbWV0YWRhdGEtaGVscGVycy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvc3RlcC1tYW5pZmVzdC5qcyc7XG5leHBvcnQge1xuICB0eXBlIENvbnRyYWN0VmFsdWVUeXBlLFxuICB0eXBlIFBsdWdpbkNvbnRyYWN0LFxuICB0eXBlIENvbnRyYWN0U2NvcGUsXG4gIHR5cGUgQ29udHJhY3RJc3N1ZSxcbiAgdHlwZSBDb250cmFjdFNjb3BlUHJvcHMsXG4gIHBpcGVsaW5lU2NvcGVNZXRhZGF0YSxcbiAgcGlwZWxpbmVDb250cmFjdFNjb3BlLFxuICBjb250cmFjdFNjb3BlRnJvbVRlbXBsYXRlU2NvcGUsXG4gIGlzQ29udHJhY3RWYWx1ZU9mVHlwZSxcbiAgY2hlY2tQbHVnaW5Db250cmFjdCxcbiAgdHlwZSBQbHVnaW5TdGVwUmVmLFxuICBjb2xsZWN0UGx1Z2luU3RlcHMsXG4gIHBsdWdpbkxvb2t1cEZpbHRlcixcbiAgcGx1Z2luQXJ0aWZhY3RBbGlhcyxcbiAgcGx1Z2luU3RlcExhYmVsLFxuICB0eXBlIFBsdWdpblJlZklkZW50aXR5LFxuICBzYW5pdGl6ZVB1Ymxpc2hlcixcbn0gZnJvbSAnLi9jb3JlL3BsdWdpbi1jb250cmFjdC5qcyc7XG5leHBvcnQge1xuICB1bndyYXBMb29rdXAsXG4gIHN1bW1hcml6ZUxvb2t1cFdhcm5pbmdzLFxuICBMT09LVVBfV0FSTklOR19TRVZFUklUSUVTLFxuICB0eXBlIExvb2t1cFdhcm5pbmcsXG4gIHR5cGUgTG9va3VwV2FybmluZ1NldmVyaXR5LFxuICBsb29rdXBOb3RGb3VuZFN0YXRlLFxuICBleGFjdFBpbk5vdEZvdW5kTWVzc2FnZSxcbiAgdHlwZSBMb29rdXBOb3RGb3VuZFN0YXRlLFxuICBwYXJzZUxvb2t1cFRvb2xjaGFpbixcbiAgdHlwZSBUb29sY2hhaW5WZXJzaW9ucyxcbiAgdHlwZSBMb29rdXBUb29sY2hhaW4sXG4gIHR5cGUgUmVzb2x2ZWRCb290c3RyYXAsXG59IGZyb20gJy4vY29yZS9wbHVnaW4tbG9va3VwLWVudmVsb3BlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9zZWxmLW11dGF0aW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9zeW50aC1mYWlsdXJlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9ydW50aW1lLWNoZWNrLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9wbGF0Zm9ybS10bHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL2F1ZGl0LWNvcnJlbGF0aW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9xdW90YS1leGNlZWRlZC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvc2VjdXJpdHktcmVwb3J0cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvcGlwZWxpbmUtcmVnaXN0cmF0aW9uLmpzJztcblxuLy8gUGx1Z2luIGRvbWFpbiB0eXBlICh0aGUgc3ludGgtdGltZSBhdXRob3JpbmcgdHlwZXMgbGl2ZSBpbiB0aGUgYC9jZGtgIGVudHJ5KVxuLy8gQ0RLLWZyZWU6IHRoZSBET1JBIGRlcGxveSBhdHRyaWJ1dGlvbiB0aGUgQVBJIHJlcG9ydHMgaW4gY3JlYXRlL3ZhbGlkYXRlXG4vLyByZXNwb25zZXMuIFRoZSBjb25zdHJ1Y3QgdGhhdCBzdGFtcHMgdGhlIHRhZyByZWFkcyB0aGUgc2FtZSBmdW5jdGlvbi5cbmV4cG9ydCAqIGZyb20gJy4vcGlwZWxpbmUvZGVwbG95LWF0dHJpYnV0aW9uLmpzJztcbi8vIENESy1mcmVlOiB0aGUgc3RhZ2UvcGx1Z2luL0lBTSBwcm9qZWN0aW9uIHRoZSBjcmVhdGUgKyB2YWxpZGF0ZSByZXNwb25zZXMgcmV0dXJuXG4vLyBzbyBhIHJldmlld2VyIGFwcHJvdmVzIHNvbWV0aGluZyBjb25jcmV0ZSByYXRoZXIgdGhhbiByYXcgcHJvcHMgSlNPTi5cbmV4cG9ydCAqIGZyb20gJy4vcGlwZWxpbmUvc3RydWN0dXJlLXByZXZpZXcuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9waXBlbGluZS9wbHVnaW4tc3BlYy5qcyc7XG5cbi8vIFRlbXBsYXRlIGVuZ2luZSDigJQgc3ludGgtdGltZSBzY3JpcHRpbmcgZm9yIHBpcGVsaW5lIGNvbmZpZyArIHBsdWdpbiBzcGVjc1xuZXhwb3J0IHtcbiAgdG9rZW5pemUsXG4gIGhhc1RlbXBsYXRlLFxuICBNQVhfRklFTERfU0laRV9CWVRFUyxcbiAgTUFYX1BBVEhfREVQVEgsXG4gIHR5cGUgVG9rZW4sXG4gIHR5cGUgTGl0ZXJhbFRva2VuLFxuICB0eXBlIEV4cHJUb2tlbixcbiAgdHlwZSBTb3VyY2VQb3NpdGlvbixcbiAgcmVzb2x2ZSxcbiAgZGVwZW5kZW5jaWVzLFxuICB0eXBlIFNjb3BlLFxuICB0eXBlIEZpZWxkUHJlZGljYXRlLFxuICB2YWxpZGF0ZVRlbXBsYXRlcyxcbiAgZGV0ZWN0Q3ljbGVzLFxuICBhbGxvd2VkU2NvcGVSb290cyxcbiAgdHlwZSBUZW1wbGF0ZUVycm9yLFxuICB0eXBlIFRlbXBsYXRlVmFsaWRhdGlvblJlc3VsdCxcbiAgdHlwZSBSZXNvbHZlUmVzdWx0LFxuICByZXNvbHZlU2VsZlJlZmVyZW5jaW5nLFxuICB2YWxpZGF0ZVRlbXBsYXRlRHJhZnQsXG4gIGZvcm1hdFRlbXBsYXRlRHJhZnRQcm9ibGVtcyxcbiAgdHlwZSBUZW1wbGF0ZURyYWZ0SW5wdXQsXG4gIHR5cGUgVGVtcGxhdGVEcmFmdExpa2UsXG4gIHR5cGUgVGVtcGxhdGVEcmFmdFByb2JsZW0sXG4gIHR5cGUgVGVtcGxhdGVEcmFmdFByb2JsZW1LaW5kLFxuICB0eXBlIFRlbXBsYXRlRHJhZnRWYWxpZGF0aW9uLFxufSBmcm9tICcuL3RlbXBsYXRlL2luZGV4LmpzJztcbi8vIEEgcGx1Z2luJ3MgYHt7IOKApiB9fWAgcmVzb2x1dGlvbiBhZ2FpbnN0IGEgcGlwZWxpbmUgc2NvcGUgKHN5bnRoLCBgcGx1Z2luIHRlc3RgKVxuZXhwb3J0IHsgcmVzb2x2ZVBsdWdpblRlbXBsYXRlcyB9IGZyb20gJy4vdGVtcGxhdGUvcGx1Z2luLXJlc29sdmVyLmpzJztcbiJdfQ==
@@ -1,7 +1,7 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { createLogger } from '@pipeline-builder/api-core';
4
- import { Duration, RemovalPolicy, Tags } from 'aws-cdk-lib';
4
+ import { Duration, RemovalPolicy, Stack, Tags } from 'aws-cdk-lib';
5
5
  import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';
6
6
  import { BuildSpec } from 'aws-cdk-lib/aws-codebuild';
7
7
  import { PipelineNotificationEvents, PipelineType, Variable } from 'aws-cdk-lib/aws-codepipeline';
@@ -344,6 +344,17 @@ export class PipelineBuilder extends Construct {
344
344
  if (deploysTag) {
345
345
  Tags.of(this.pipeline).add('pb.deploys', deploysTag);
346
346
  }
347
+ // The same drift-audit keys on the CloudFormation STACK itself.
348
+ // `Tags.of(this.pipeline)` reaches the resources under the pipeline only —
349
+ // never the enclosing stack — and `pipeline-manager audit stacks` reads
350
+ // DescribeStacks' STACK tags, so without these it found no pipeline-builder
351
+ // stack at all and reported every registry row as missing.
352
+ const stackTags = Stack.of(this).tags;
353
+ stackTags.setTag('pipeline-builder', 'true');
354
+ if (props.orgId)
355
+ stackTags.setTag('OrgId', props.orgId);
356
+ if (props.pipelineId)
357
+ stackTags.setTag('pb.pipeline-id', props.pipelineId);
347
358
  // Build the internal pipeline before accessing its properties
348
359
  this.pipeline.buildPipeline();
349
360
  // PLATFORM_SECRET_NAME is injected into the CodeBuild environment above,
@@ -542,4 +553,4 @@ export class PipelineBuilder extends Construct {
542
553
  };
543
554
  }
544
555
  }
545
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtYnVpbGRlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BpcGVsaW5lL3BpcGVsaW5lLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sS0FBSyxVQUFVLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBb0IsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xHLE9BQU8sS0FBSyxNQUFNLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxLQUFLLE9BQU8sTUFBTSxnQ0FBZ0MsQ0FBQztBQUMxRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlELE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6QyxPQUFPLEtBQUssR0FBRyxNQUFNLHFCQUFxQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQXlCLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVuRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFL0YsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTix1QkFBdUIsRUFDdkIseUJBQXlCLEVBQ3pCLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsK0JBQStCLEdBQ2hDLE1BQU0sNkJBQTZCLENBQUM7QUFFckMsT0FBTyxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxjQUFjLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0SSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN2SCxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXRFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQy9ILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSw4QkFBOEIsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUd4SSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHNCQUFzQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0YsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHeEUsTUFBTSxrQkFBa0IsR0FBK0M7SUFDckUsTUFBTSxFQUFFLDBCQUEwQixDQUFDLHlCQUF5QjtJQUM1RCxTQUFTLEVBQUUsMEJBQTBCLENBQUMsNEJBQTRCO0lBQ2xFLE9BQU8sRUFBRSwwQkFBMEIsQ0FBQywwQkFBMEI7SUFDOUQsUUFBUSxFQUFFLDBCQUEwQixDQUFDLDJCQUEyQjtJQUNoRSxVQUFVLEVBQUUsMEJBQTBCLENBQUMsNkJBQTZCO0NBQ3JFLENBQUM7QUFFRixTQUFTLHVCQUF1QixDQUFDLEtBQWM7SUFDN0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3ZDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRSxPQUFPLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxlQUFlLENBQUMsS0FBbUI7SUFDMUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsR0FBRyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRSxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUM3QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLFFBQVE7UUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QyxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBR0Q7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxhQUFhLENBQUMsU0FBNEIsRUFBRSxRQUFpQztJQUtwRixNQUFNLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDekQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUF5QyxFQUFFLFFBQTRCLEVBQUUsS0FBYSxFQUFVLEVBQUU7UUFDOUcsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUFFLE9BQU8sR0FBRyxDQUFDO1FBQzFELElBQUksUUFBUTtZQUFFLE9BQU8sUUFBUSxDQUFDO1FBQzlCLE1BQU0sSUFBSSxLQUFLLENBQ2IsaURBQWlELGNBQWMsZUFBZSxLQUFLLGtCQUFrQixHQUFHLHNCQUFzQjtjQUM1SCwwRUFBMEUsR0FBRyxDQUFDLFdBQVcsRUFBRSw4QkFBOEIsQ0FDNUgsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUNGLE9BQU87UUFDTCxVQUFVLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQztRQUMxRCxtQkFBbUIsRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUM7UUFDbEYsNkJBQTZCLEVBQUU7WUFDN0IsZ0JBQWdCLEVBQUUsRUFBRSxVQUFVLEVBQUUsd0JBQXdCLEVBQUUsRUFBRTtZQUM1RCxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsVUFBVSxDQUFDLDRCQUE0QixFQUFFLENBQUM7U0FDdkU7S0FDRixDQUFDO0FBQ0osQ0FBQztBQTRHRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsTUFBTSxPQUFPLGVBQWdCLFNBQVEsU0FBUztJQUM1QixRQUFRLENBQWU7SUFDdkIsTUFBTSxDQUF3QjtJQUM5Qzs7OztPQUlHO0lBQ2EsWUFBWSxDQUFzQjtJQUVsRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW1CO1FBQzNELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsOEVBQThFO1FBQzlFLDJFQUEyRTtRQUMzRSw2RUFBNkU7UUFDN0UseUVBQXlFO1FBQ3pFLDZFQUE2RTtRQUM3RSxFQUFFO1FBQ0Ysd0VBQXdFO1FBQ3hFLDRFQUE0RTtRQUM1RSxzRUFBc0U7UUFDdEUsMkVBQTJFO1FBQzNFLDREQUE0RDtRQUM1RCxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsUUFBUTtZQUNwQyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQztZQUNuRCxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2QsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzNFLE1BQU0sSUFBSSxLQUFLLENBQ2IsNkdBQTZHO3NCQUMzRyx5R0FBeUc7c0JBQ3pHLHlHQUF5RyxDQUM1RyxDQUFDO1lBQ0osQ0FBQztZQUNELGdHQUFnRztZQUNoRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUkscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFL0MsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BDLG1FQUFtRTtZQUNuRSxxRUFBcUU7WUFDckUsa0RBQWtEO1lBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDO2dCQUM1QixZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZO2dCQUN0QyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPO2FBQzdCLENBQUMsQ0FBQztZQUNILE1BQU0sWUFBWSxHQUFHLElBQUksWUFBWSxDQUNuQyxJQUFJLEVBQ0osUUFBUSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsRUFDbEM7Z0JBQ0UsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWTtnQkFDdEMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTztnQkFDNUIsV0FBVyxFQUFFLFlBQVksQ0FBQyxXQUFXO2dCQUNyQyxRQUFRO2dCQUNSLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztnQkFDbEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO2dCQUM1QixPQUFPLEVBQUUsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO2dCQUNoRCxPQUFPLEVBQUUsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO2dCQUN2RCxZQUFZLEVBQUUsa0JBQWtCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7Z0JBQy9ELDRCQUE0QixFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsNEJBQTRCO2dCQUMzRSxlQUFlLEVBQUUsS0FBSyxDQUFDLGVBQWU7YUFDdkMsQ0FDRixDQUFDO1lBRUYsK0JBQStCO1lBQy9CLE1BQU0sYUFBYSxHQUFHLElBQUksYUFBYSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDM0QsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUU5QywyQkFBMkI7WUFDM0Isa0ZBQWtGO1lBQ2xGLHdFQUF3RTtZQUN4RSw4Q0FBOEM7WUFDOUMsK0VBQStFO1lBQy9FLG9FQUFvRTtZQUNwRSxnRUFBZ0U7WUFDaEUsc0VBQXNFO1lBQ3RFLEVBQUU7WUFDRix1RUFBdUU7WUFDdkUsaUVBQWlFO1lBQ2pFLDZDQUE2QztZQUM3QyxNQUFNLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxhQUFhLENBQUM7Z0JBQ25ELENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEYsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM3QixNQUFNLGtCQUFrQixHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzNFLE1BQU0sZUFBZSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7WUFFOUMsMkVBQTJFO1lBQzNFLHVFQUF1RTtZQUN2RSxrRkFBa0Y7WUFDbEYsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JELDJDQUEyQztZQUMzQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsOEJBQThCLENBQUMsYUFBYSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFckYsd0VBQXdFO1lBQ3hFLG1FQUFtRTtZQUNuRSw4REFBOEQ7WUFDOUQsTUFBTSxpQkFBaUIsR0FBRyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFdEcsTUFBTSxZQUFZLEdBQUcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1lBQ2hELFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqRyxNQUFNLEtBQUssR0FBRyxtQkFBbUIsQ0FBQztnQkFDaEMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQjtnQkFDakMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO2dCQUNsQyxRQUFRO2dCQUNSLE1BQU07Z0JBQ04sS0FBSyxFQUFFLE1BQU07Z0JBQ2IsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU07Z0JBQ3JDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87Z0JBQzVCLEtBQUssRUFBRSxJQUFJO2dCQUNYLGtCQUFrQjtnQkFDbEIsZUFBZTtnQkFDZixTQUFTLEVBQUUsVUFBVTtnQkFDckIsVUFBVSxFQUFFLGdCQUFnQjtnQkFDNUIsa0VBQWtFO2dCQUNsRSxzRUFBc0U7Z0JBQ3RFLHNFQUFzRTtnQkFDdEUsV0FBVyxFQUFFLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNwRCxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7Z0JBQ2xCLGlCQUFpQjtnQkFDakIsYUFBYTthQUNkLENBQUMsQ0FBQztZQUNILFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUU5RSx5REFBeUQ7WUFDekQsZ0VBQWdFO1lBQ2hFLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLEtBQUs7Z0JBQ3BDLENBQUMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDO2dCQUNuRCxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2Qsa0VBQWtFO1lBQ2xFLDZFQUE2RTtZQUM3RSxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxLQUFLO2dCQUN4QyxDQUFDLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLGlDQUFpQyxDQUFDO2dCQUMxRSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBRWQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLFlBQVksQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBRS9LLDJFQUEyRTtZQUMzRSw0RUFBNEU7WUFDNUUsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyRixJQUFJLFVBQVUsRUFBRSxJQUFJLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztnQkFDNUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxDQUNuQyw0RUFBNEU7b0JBQzlFLG1GQUFtRjtvQkFDbkYsa0ZBQWtGLENBQ2pGLENBQUM7WUFDSixDQUFDO1lBQ0QsTUFBTSxJQUFJLEdBQUcsVUFBVTtnQkFDckIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQztnQkFDekMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUVkLHFEQUFxRDtZQUNyRCw0RUFBNEU7WUFDNUUsMkVBQTJFO1lBQzNFLDZFQUE2RTtZQUM3RSw2RUFBNkU7WUFDN0Usd0NBQXdDO1lBQ3hDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBRWxELG1FQUFtRTtZQUNuRSwwRUFBMEU7WUFDMUUsaURBQWlEO1lBQ2pELDZFQUE2RTtZQUM3RSxNQUFNLG9CQUFvQixHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xGLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsRUFBRTtnQkFDbEYsR0FBRyxDQUFDLGlCQUFpQixJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztnQkFDL0MsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO2dCQUNyQixHQUFHLENBQUMsY0FBYyxJQUFJLEVBQUUsY0FBYyxFQUFFLENBQUM7Z0JBQ3pDLFlBQVksRUFBRSxZQUFZLENBQUMsRUFBRTtnQkFDN0IsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWTtnQkFDdEMsS0FBSztnQkFDTCxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsb0JBQW9CLENBQUM7Z0JBQy9ELEdBQUcsb0JBQW9CO2FBQ3hCLENBQUMsQ0FBQztZQUVILHVFQUF1RTtZQUN2RSx5RUFBeUU7WUFDekUsdUVBQXVFO1lBQ3ZFLHFFQUFxRTtZQUNyRSxJQUFJLGdCQUFnQixHQUFHLHlCQUF5QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlFLElBQUksZ0JBQWdCLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7Z0JBQ25FLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksQ0FDbkMsR0FBRyxzQkFBc0IsdUNBQXVDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUs7c0JBQzdHLHNHQUFzRyxDQUN6RyxDQUFDO2dCQUNGLGdCQUFnQixHQUFHLEtBQUssQ0FBQztZQUMzQixDQUFDO1lBRUQsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDO29CQUNwQyxLQUFLLEVBQUUsSUFBSTtvQkFDWCxZQUFZO29CQUNaLFFBQVE7b0JBQ1IsY0FBYyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU07b0JBQzNDLGtCQUFrQjtvQkFDbEIsZUFBZTtvQkFDZixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7b0JBQ2xCLGlCQUFpQjtvQkFDakIsYUFBYTtvQkFDYixZQUFZO29CQUNaLEdBQUcsQ0FBQyxnQkFBZ0IsSUFBSSxrQkFBa0IsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO2lCQUM1RixDQUFDLENBQUM7Z0JBQ0gsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RCxDQUFDO1lBRUQsYUFBYTtZQUNiLHlFQUF5RTtZQUN6RSx3RUFBd0U7WUFDeEUsdUVBQXVFO1lBQ3ZFLCtEQUErRDtZQUMvRCx3RUFBd0U7WUFDeEUsc0VBQXNFO1lBQ3RFLDhEQUE4RDtZQUM5RCx5RUFBeUU7WUFDekUsMEVBQTBFO1lBQzFFLG1EQUFtRDtZQUNuRCxFQUFFO1lBQ0YseUVBQXlFO1lBQ3pFLHlFQUF5RTtZQUN6RSx1RUFBdUU7WUFDdkUsc0VBQXNFO1lBQ3RFLHNDQUFzQztZQUN0QyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDZixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDdEQsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUM7d0JBQUUsU0FBUztvQkFDcEMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDekMsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNyRSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkQsQ0FBQztZQUNELHdFQUF3RTtZQUN4RSw0RUFBNEU7WUFDNUUsNEVBQTRFO1lBQzVFLCtEQUErRDtZQUMvRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNqRSxDQUFDO1lBQ0QsNEVBQTRFO1lBQzVFLDJFQUEyRTtZQUMzRSx5RUFBeUU7WUFDekUsMkVBQTJFO1lBQzNFLHNFQUFzRTtZQUN0RSxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7WUFFRCw4REFBOEQ7WUFDOUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUU5Qix5RUFBeUU7WUFDekUsa0VBQWtFO1lBQ2xFLDBFQUEwRTtZQUMxRSwwRUFBMEU7WUFDMUUsOEVBQThFO1lBQzlFLHNFQUFzRTtZQUN0RSx5RUFBeUU7WUFDekUsMkVBQTJFO1lBQzNFLG1DQUFtQztZQUNuQyxFQUFFO1lBQ0YsdUVBQXVFO1lBQ3ZFLDBFQUEwRTtZQUMxRSw4REFBOEQ7WUFDOUQsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsSUFBSSxlQUFlLENBQUM7b0JBQzdELE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSztvQkFDcEIsT0FBTyxFQUFFLENBQUMsK0JBQStCLENBQUM7b0JBQzFDLFNBQVMsRUFBRSxDQUFDLHFDQUFxQyxrQkFBa0IsSUFBSSxDQUFDO2lCQUN6RSxDQUFDLENBQUMsQ0FBQztZQUNOLENBQUM7WUFDRCx5RUFBeUU7WUFDekUsbUVBQW1FO1lBQ25FLHNFQUFzRTtZQUN0RSx1RUFBdUU7WUFDdkUsc0VBQXNFO1lBQ3RFLFdBQVc7WUFDWCxJQUFJLHNCQUFzQixFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxJQUFJLGVBQWUsQ0FBQztvQkFDN0QsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLO29CQUNwQixPQUFPLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQztvQkFDMUMsU0FBUyxFQUFFLENBQUMscUNBQXFDLHNCQUFzQixJQUFJLENBQUM7aUJBQzdFLENBQUMsQ0FBQyxDQUFDO1lBQ04sQ0FBQztZQUVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1lBQzNDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN0RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFFekMsbURBQW1EO1lBQ25ELEtBQUssTUFBTSxDQUFDLElBQUksc0JBQXNCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDOUUsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLFFBQVEsQ0FBQztvQkFDbkMsWUFBWSxFQUFFLENBQUMsQ0FBQyxJQUFJO29CQUNwQixHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksS0FBSyxTQUFTLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUNyRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsS0FBSyxTQUFTLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO2lCQUNuRSxDQUFDLENBQUMsQ0FBQztZQUNOLENBQUM7WUFFRCwwQkFBMEI7WUFDMUIsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDdkUsSUFBSSxPQUFPLG9CQUFvQixLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM3QyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztnQkFDdEYsTUFBTSxrQkFBa0IsR0FBRyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUM7cUJBQ3ZGLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO3FCQUM3QyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ25CLElBQUksa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNsQyxXQUFXLENBQUMsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7Z0JBQ3RGLENBQUM7WUFDSCxDQUFDO1lBRUQsNEJBQTRCO1lBQzVCLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sS0FBSyxXQUFXLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDbkYsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsSUFBSyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFpQyxFQUFFLFFBQVEsSUFBSSxhQUFhLENBQUM7Z0JBQ2hILElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO29CQUNwQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO29CQUMxQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQ2pELENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCx5RUFBeUU7WUFDekUsMEVBQTBFO1lBQzFFLDJFQUEyRTtZQUMzRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLENBQUMsSUFBSSxPQUFPLG9CQUFvQixLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNuRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFO29CQUMxQyxZQUFZLEVBQUU7d0JBQ1osTUFBTSxFQUFFLENBQUMsa0JBQWtCLENBQUM7d0JBQzVCLFVBQVUsRUFBRSxDQUFDLDhDQUE4QyxDQUFDO3dCQUM1RCxTQUFTLEVBQUUsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDO3FCQUNyQztvQkFDRCxPQUFPLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQzVCLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsQ0FBQyxDQUMxRSxDQUFDO2lCQUNILENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCxrQ0FBa0M7WUFDbEMsd0VBQXdFO1lBQ3hFLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDdkYsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRTtvQkFDakQsTUFBTSxFQUFFLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQzt3QkFDNUIsU0FBUyxFQUFFLGtCQUFrQjt3QkFDN0IsVUFBVSxFQUFFLDhCQUE4Qjt3QkFDMUMsYUFBYSxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFO3dCQUN6RCxTQUFTLEVBQUUsS0FBSzt3QkFDaEIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO3FCQUM1QixDQUFDO29CQUNGLFNBQVMsRUFBRSxDQUFDO29CQUNaLGlCQUFpQixFQUFFLENBQUM7b0JBQ3BCLGdCQUFnQixFQUFFLFlBQVksSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLG1CQUFtQjtvQkFDekUsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLGtCQUFrQixDQUFDLGtDQUFrQztvQkFDcEYsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixDQUFDLGFBQWE7aUJBQzVELENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO2dCQUFTLENBQUM7WUFDVCxzRUFBc0U7WUFDdEUsOEVBQThFO1lBQzlFLGVBQWUsRUFBRSxFQUFFLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssbUJBQW1CO1FBQ3pCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUN6QyxNQUFNLFNBQVMsR0FBRyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssUUFBUTtZQUNsRSxDQUFDLENBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQVk7WUFDNUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNkLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQztRQUV4RSxJQUFJLENBQUMsU0FBUyxJQUFJLGFBQWEsS0FBSyxTQUFTO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFFaEUsTUFBTSxhQUFhLEdBQUcsU0FBUztZQUM3QixDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxTQUFTLENBQUM7WUFDcEQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVkLE1BQU0sTUFBTSxHQUFHLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7WUFDbkQsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFVBQVU7WUFDcEYsR0FBRyxDQUFDLGFBQWEsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQ3ZDLEdBQUcsQ0FBQyxhQUFhLEtBQUssU0FBUyxJQUFJO2dCQUNqQyxjQUFjLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7YUFDL0QsQ0FBQztZQUNGLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTO1lBQ2pELGFBQWEsRUFBRSxhQUFhLENBQUMsT0FBTztZQUNwQyxpQkFBaUIsRUFBRSxJQUFJO1NBQ3hCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssZUFBZSxDQUNyQixRQUF1QyxFQUN2QyxFQUFZLEVBQ1osVUFBOEIsRUFDOUIsa0JBQXNDLEVBQ3RDLFdBQW1CLEVBQ25CLEtBQXlCLEVBQ3pCLGlCQUE4QjtRQUU5Qix5RUFBeUU7UUFDekUsbUVBQW1FO1FBQ25FLHdFQUF3RTtRQUN4RSwrREFBK0Q7UUFDL0QsOEVBQThFO1FBQzlFLE1BQU0sT0FBTyxHQUFHLFFBQVEsRUFBRSxPQUFPLElBQUkseUJBQXlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUN0SCxNQUFNLFlBQVksR0FBRyxPQUFPO1lBQzFCLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUM7WUFDbkMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVkLHdGQUF3RjtRQUN4RixNQUFNLG1CQUFtQixHQUFHLFFBQVEsRUFBRSxjQUFjLElBQUksK0JBQStCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckgsTUFBTSx3QkFBd0IsR0FBRyxtQkFBbUI7WUFDbEQsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsbUJBQW1CLENBQUM7WUFDckQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVkLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFFcEMsNkRBQTZEO1FBQzdELCtFQUErRTtRQUMvRSw2RUFBNkU7UUFDN0UsTUFBTSxlQUFlLEdBQXNDO1lBQ3pELGlCQUFpQixFQUFFLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRTtZQUN6QyxHQUFHLENBQUMsVUFBVSxJQUFJLEVBQUUsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDekQsR0FBRyxDQUFDLGtCQUFrQixJQUFJLEVBQUUsb0JBQW9CLEVBQUUsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO1lBQ2xGLHdFQUF3RTtZQUN4RSxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLGlDQUFpQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ25JLHdFQUF3RTtZQUN4RSxrRUFBa0U7WUFDbEUsR0FBRyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsSUFBSTtnQkFDMUIsNEJBQTRCLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUM1QyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO2FBQzlDLENBQUM7WUFDRixpRUFBaUU7WUFDakUsdUVBQXVFO1lBQ3ZFLDhFQUE4RTtZQUM5RSxHQUFHLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDbEUseUVBQXlFO1lBQ3pFLGtFQUFrRTtZQUNsRSxxRUFBcUU7WUFDckUsdUVBQXVFO1NBQ3hFLENBQUM7UUFFRixNQUFNLGNBQWMsR0FBRztZQUNyQixHQUFHLENBQUMsWUFBWSxFQUFFLGNBQWMsSUFBSSxFQUFFLENBQUM7WUFDdkMsR0FBRyxDQUFDLHdCQUF3QixJQUFJLEVBQUUsQ0FBQztTQUNwQyxDQUFDO1FBRUYsT0FBTztZQUNMLEdBQUcsQ0FBQyxZQUFZLElBQUksRUFBRSxHQUFHLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxlQUFlLEVBQUUsWUFBWSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzdGLEdBQUcsQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRSxDQUFDO1lBQ3BELHFFQUFxRTtZQUNyRSx1RUFBdUU7WUFDdkUsMEVBQTBFO1lBQzFFLGlFQUFpRTtZQUNqRSx1RUFBdUU7WUFDdkUsZ0JBQWdCLEVBQUU7Z0JBQ2hCLFVBQVUsRUFBRSxpQkFBaUI7Z0JBQzdCLG9CQUFvQixFQUFFLGVBQWU7YUFDdEM7U0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YSc7XG5pbXBvcnQgeyBEdXJhdGlvbiwgUmVtb3ZhbFBvbGljeSwgVGFncyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0IHsgQnVpbGRTcGVjLCB0eXBlIElCdWlsZEltYWdlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVidWlsZCc7XG5pbXBvcnQgeyBQaXBlbGluZU5vdGlmaWNhdGlvbkV2ZW50cywgUGlwZWxpbmVUeXBlLCBWYXJpYWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmUnO1xuaW1wb3J0ICogYXMgZXZlbnRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMnO1xuaW1wb3J0ICogYXMgdGFyZ2V0cyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHMnO1xuaW1wb3J0IHsgRWZmZWN0LCBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGttcyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBzbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucyc7XG5pbXBvcnQgeyBDb2RlUGlwZWxpbmUsIHR5cGUgQ29kZUJ1aWxkT3B0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliL3BpcGVsaW5lcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IGRlc2NyaWJlRGVwbG95QXR0cmlidXRpb24gfSBmcm9tICcuL2RlcGxveS1hdHRyaWJ1dGlvbi5qcyc7XG5pbXBvcnQgeyBQaXBlbGluZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL3BpcGVsaW5lLWNvbmZpZ3VyYXRpb24uanMnO1xuaW1wb3J0IHsgUGx1Z2luTG9va3VwIH0gZnJvbSAnLi9wbHVnaW4tbG9va3VwLmpzJztcbmltcG9ydCB7IFNvdXJjZUJ1aWxkZXIgfSBmcm9tICcuL3NvdXJjZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IFN0YWdlQnVpbGRlciB9IGZyb20gJy4vc3RhZ2UtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBTdGVwTWFuaWZlc3RSZWNvcmRlciB9IGZyb20gJy4vc3RlcC1tYW5pZmVzdC1yZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlT3B0aW9ucywgU3ludGhPcHRpb25zIH0gZnJvbSAnLi9zdGVwLXR5cGVzLmpzJztcbmltcG9ydCB7IENvbmZpZywgQ29yZUNvbnN0YW50cywgaXNSZXNlcnZlZFRhZ0tleSB9IGZyb20gJy4uL2NvbmZpZy9hcHAtY29uZmlnLmpzJztcbmltcG9ydCB7IGxhbWJkYUFyY2hpdGVjdHVyZSwgbGFtYmRhUnVudGltZSwgbGFtYmRhVGltZW91dCB9IGZyb20gJy4uL2NvbmZpZy9hd3MtY29uZmlnLWNkay5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZ2lzdHJ5Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL2NvbmZpZy10eXBlcy5qcyc7XG5pbXBvcnQgeyBBcnRpZmFjdE1hbmFnZXIgfSBmcm9tICcuLi9jb3JlL2FydGlmYWN0LW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgVW5pcXVlSWQgfSBmcm9tICcuLi9jb3JlL2lkLWdlbmVyYXRvci5qcyc7XG5pbXBvcnQge1xuICBhc0ludCxcbiAgaXNUcnVlLFxuICBtZXRhZGF0YUZvckNvZGVQaXBlbGluZSxcbiAgbmV0d29ya0NvbmZpZ0Zyb21NZXRhZGF0YSxcbiAgcGFyc2VQaXBlbGluZVZhcmlhYmxlcyxcbiAgcm9sZUNvbmZpZ0Zyb21NZXRhZGF0YSxcbiAgc2VjdXJpdHlHcm91cENvbmZpZ0Zyb21NZXRhZGF0YSxcbn0gZnJvbSAnLi4vY29yZS9tZXRhZGF0YS1idWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29kZUJ1aWxkRGVmYXVsdHMgfSBmcm9tICcuLi9jb3JlL25ldHdvcmstdHlwZXMuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZU5ldHdvcmssIG5ldHdvcmtDb25maWdGcm9tRW52IH0gZnJvbSAnLi4vY29yZS9uZXR3b3JrLmpzJztcbmltcG9ydCB7IGNyZWF0ZUNvZGVCdWlsZFN0ZXAsIGN1cmF0ZWRTZWxmTXV0YXRpb25JbWFnZSwgZ2V0Q29tcHV0ZVR5cGUsIHJlc29sdmVEZWZhdWx0QnVpbGRJbWFnZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtaGVscGVycy5qcyc7XG5pbXBvcnQgeyBQSVBFTElORV9SRUdJU1RSQVRJT05fU0VDUkVUX0VOViwgUElQRUxJTkVfUkVHSVNUUkFUSU9OX1NFQ1JFVF9MRUFGIH0gZnJvbSAnLi4vY29yZS9waXBlbGluZS1yZWdpc3RyYXRpb24uanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFLZXlzLCBUcmlnZ2VyVHlwZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZXRhRGF0YVR5cGUgfSBmcm9tICcuLi9jb3JlL3BpcGVsaW5lLXR5cGVzLmpzJztcbmltcG9ydCB7IFBMQVRGT1JNX0NBX0JVTkRMRV9FTlYsIFBMQVRGT1JNX1RMU19WRVJJRllfRU5WLCBwbGF0Zm9ybUNhQnVuZGxlLCBwbGF0Zm9ybVRsc1ZlcmlmeSB9IGZyb20gJy4uL2NvcmUvcGxhdGZvcm0tdGxzLmpzJztcbmltcG9ydCB7IGFzc2VydFBsdWdpbkNvbnRyYWN0LCBjb250cmFjdFNjb3BlRnJvbVRlbXBsYXRlU2NvcGUsIHBsdWdpbkFydGlmYWN0QWxpYXMsIHBsdWdpblN0ZXBMYWJlbCB9IGZyb20gJy4uL2NvcmUvcGx1Z2luLWNvbnRyYWN0LmpzJztcbmltcG9ydCB0eXBlIHsgUmVzb2x2ZWRCb290c3RyYXAgfSBmcm9tICcuLi9jb3JlL3BsdWdpbi1sb29rdXAtZW52ZWxvcGUuanMnO1xuaW1wb3J0IHR5cGUgeyBSb2xlQ29uZmlnIH0gZnJvbSAnLi4vY29yZS9yb2xlLXR5cGVzLmpzJztcbmltcG9ydCB7IHJlc29sdmVSb2xlIH0gZnJvbSAnLi4vY29yZS9yb2xlLmpzJztcbmltcG9ydCB7IGlzUnVudGltZVZ1bG5DaGVja0VuYWJsZWQsIFJVTlRJTUVfVlVMTl9DSEVDS19LRVkgfSBmcm9tICcuLi9jb3JlL3J1bnRpbWUtY2hlY2suanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVNlY3VyaXR5R3JvdXAgfSBmcm9tICcuLi9jb3JlL3NlY3VyaXR5LWdyb3VwLmpzJztcbmltcG9ydCB7IHNlbGZNdXRhdGlvblBhcnRpYWxCdWlsZFNwZWMgfSBmcm9tICcuLi9jb3JlL3NlbGYtbXV0YXRpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBTdGVwTWFuaWZlc3RFbnRyeSB9IGZyb20gJy4uL2NvcmUvc3RlcC1tYW5pZmVzdC5qcyc7XG5cbmNvbnN0IFBJUEVMSU5FX0VWRU5UX01BUDogUmVjb3JkPHN0cmluZywgUGlwZWxpbmVOb3RpZmljYXRpb25FdmVudHM+ID0ge1xuICBGQUlMRUQ6IFBpcGVsaW5lTm90aWZpY2F0aW9uRXZlbnRzLlBJUEVMSU5FX0VYRUNVVElPTl9GQUlMRUQsXG4gIFNVQ0NFRURFRDogUGlwZWxpbmVOb3RpZmljYXRpb25FdmVudHMuUElQRUxJTkVfRVhFQ1VUSU9OX1NVQ0NFRURFRCxcbiAgU1RBUlRFRDogUGlwZWxpbmVOb3RpZmljYXRpb25FdmVudHMuUElQRUxJTkVfRVhFQ1VUSU9OX1NUQVJURUQsXG4gIENBTkNFTEVEOiBQaXBlbGluZU5vdGlmaWNhdGlvbkV2ZW50cy5QSVBFTElORV9FWEVDVVRJT05fQ0FOQ0VMRUQsXG4gIFNVUEVSU0VERUQ6IFBpcGVsaW5lTm90aWZpY2F0aW9uRXZlbnRzLlBJUEVMSU5FX0VYRUNVVElPTl9TVVBFUlNFREVELFxufTtcblxuZnVuY3Rpb24gcGFyc2VOb3RpZmljYXRpb25FdmVudHModmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlLnNwbGl0KCcsJykubWFwKHMgPT4gcy50cmltKCkpO1xuICByZXR1cm4gWydGQUlMRUQnLCAnU1VDQ0VFREVEJ107XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGBwYi5kZXBsb3lzYCB0YWcgdmFsdWUgYW5kIGVtaXQgdGhlIHN5bnRoLXRpbWUgd2FybmluZ3MgdGhhdCBjb21lXG4gKiB3aXRoIGl0LiBUaGUgZGVyaXZhdGlvbiBpdHNlbGYgaXMgQ0RLLWZyZWUgYW5kIGxpdmVzIGluXG4gKiB7QGxpbmsgZGVzY3JpYmVEZXBsb3lBdHRyaWJ1dGlvbn0sIHNvIGBQT1NUIC9waXBlbGluZXNgIGFuZFxuICogYFBPU1QgL3BpcGVsaW5lcy92YWxpZGF0ZWAgcmVwb3J0IHRoZSBzYW1lIGF0dHJpYnV0aW9uIHdpdGhvdXQgc3ludGhlc2l6aW5nLlxuICpcbiAqIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gbm90aGluZyBkZWNsYXJlcyBhbiBlbnZpcm9ubWVudCAobm8gZGVwbG95IHNpZ25hbCkuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkRGVwbG95c1RhZyhwcm9wczogQnVpbGRlclByb3BzKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBkZXBsb3lzVGFnLCB3YXJuaW5ncyB9ID0gZGVzY3JpYmVEZXBsb3lBdHRyaWJ1dGlvbihwcm9wcyk7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigncGlwZWxpbmUtYnVpbGRlcicpO1xuICBmb3IgKGNvbnN0IHcgb2Ygd2FybmluZ3MpIGxvZy53YXJuKHcubWVzc2FnZSk7XG4gIHJldHVybiBkZXBsb3lzVGFnO1xufVxuXG5cbi8qKlxuICogVGhlIENvZGVQaXBlbGluZSBwcm9wcyBhIHRvb2xjaGFpbiByZWxlYXNlIHBpbnMgKMKnMywgRDEwKTpcbiAqICAtIGBjbGlWZXJzaW9uYCAvIGBjZGtBc3NldHNDbGlWZXJzaW9uYCDigJQgdGhlIHJlbGVhc2UncyBgYXdzQ2RrYCAvXG4gKiAgICBgY2RrQXNzZXRzYCwgc28gU2VsZk11dGF0ZSBhbmQgYXNzZXQgcHVibGlzaGluZyBuZXZlciBpbnN0YWxsIG5wbSBgbGF0ZXN0YDtcbiAqICAtIGBzZWxmTXV0YXRpb25Db2RlQnVpbGREZWZhdWx0c2Ag4oCUIHRoZSBjdXJhdGVkIGltYWdlIHdpdGggaXRzIE5vZGUgcnVudGltZVxuICogICAgcGlubmVkIChgcnVudGltZS12ZXJzaW9ucy5ub2RlanNgKS5cbiAqIEEgdmFsdWUgc2V0IGV4cGxpY2l0bHkgaW4gcGlwZWxpbmUgbWV0YWRhdGEgcmVwbGFjZXMgdGhlIHBpbiAodGhlIGNhbGxlclxuICogc3ByZWFkcyB0aGUgbWV0YWRhdGEgYWZ0ZXIgdGhlc2UpLiBBIHJlbGVhc2UgdGhhdCBkb2Vzbid0IGNhcnJ5IGEgQ0xJXG4gKiB2ZXJzaW9uLCB3aXRoIG5vIGV4cGxpY2l0IG1ldGFkYXRhIGVpdGhlciwgZmFpbHMgdGhlIHN5bnRoLlxuICovXG5mdW5jdGlvbiB0b29sY2hhaW5QaW5zKGJvb3RzdHJhcDogUmVzb2x2ZWRCb290c3RyYXAsIGV4cGxpY2l0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHtcbiAgY2xpVmVyc2lvbjogc3RyaW5nO1xuICBjZGtBc3NldHNDbGlWZXJzaW9uOiBzdHJpbmc7XG4gIHNlbGZNdXRhdGlvbkNvZGVCdWlsZERlZmF1bHRzOiBDb2RlQnVpbGRPcHRpb25zO1xufSB7XG4gIGNvbnN0IHsgcmVsZWFzZVZlcnNpb24sIHZlcnNpb25zIH0gPSBib290c3RyYXAudG9vbGNoYWluO1xuICBjb25zdCBwaWNrID0gKGtleTogJ2NsaVZlcnNpb24nIHwgJ2Nka0Fzc2V0c0NsaVZlcnNpb24nLCByZWxlYXNlZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBsYWJlbDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBvd24gPSBleHBsaWNpdFtrZXldO1xuICAgIGlmICh0eXBlb2Ygb3duID09PSAnc3RyaW5nJyAmJiBvd24ubGVuZ3RoID4gMCkgcmV0dXJuIG93bjtcbiAgICBpZiAocmVsZWFzZWQpIHJldHVybiByZWxlYXNlZDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQk9PVFNUUkFQX0lNQUdFX1VOUkVTT0xWRUQ6IHRvb2xjaGFpbiByZWxlYXNlICR7cmVsZWFzZVZlcnNpb259IGNhcnJpZXMgbm8gJHtsYWJlbH0gdmVyc2lvbiwgc28gXFxgJHtrZXl9XFxgIGNhbid0IGJlIHBpbm5lZC4gYFxuICAgICAgKyBgU2V0IGl0IGV4cGxpY2l0bHkgaW4gcGlwZWxpbmUgbWV0YWRhdGEgKGF3czpjZGs6cGlwZWxpbmVzOmNvZGVwaXBlbGluZToke2tleS50b0xvd2VyQ2FzZSgpfSkgb3IgcmUtcmVzb2x2ZSB0aGUgcmVsZWFzZS5gLFxuICAgICk7XG4gIH07XG4gIHJldHVybiB7XG4gICAgY2xpVmVyc2lvbjogcGljaygnY2xpVmVyc2lvbicsIHZlcnNpb25zLmF3c0NkaywgJ2F3cy1jZGsnKSxcbiAgICBjZGtBc3NldHNDbGlWZXJzaW9uOiBwaWNrKCdjZGtBc3NldHNDbGlWZXJzaW9uJywgdmVyc2lvbnMuY2RrQXNzZXRzLCAnY2RrLWFzc2V0cycpLFxuICAgIHNlbGZNdXRhdGlvbkNvZGVCdWlsZERlZmF1bHRzOiB7XG4gICAgICBidWlsZEVudmlyb25tZW50OiB7IGJ1aWxkSW1hZ2U6IGN1cmF0ZWRTZWxmTXV0YXRpb25JbWFnZSgpIH0sXG4gICAgICBwYXJ0aWFsQnVpbGRTcGVjOiBCdWlsZFNwZWMuZnJvbU9iamVjdChzZWxmTXV0YXRpb25QYXJ0aWFsQnVpbGRTcGVjKCkpLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgUGlwZWxpbmVCdWlsZGVyIGNvbnN0cnVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkZXJQcm9wcyB7XG4gIC8qKiBQcm9qZWN0IGlkZW50aWZpZXIgKHdpbGwgYmUgc2FuaXRpemVkIHRvIGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgd2l0aCB1bmRlcnNjb3JlcykgKi9cbiAgcmVhZG9ubHkgcHJvamVjdDogc3RyaW5nO1xuXG4gIC8qKiBPcmdhbml6YXRpb24gaWRlbnRpZmllciAod2lsbCBiZSBzYW5pdGl6ZWQgdG8gbG93ZXJjYXNlIGFscGhhbnVtZXJpYyB3aXRoIHVuZGVyc2NvcmVzKSAqL1xuICByZWFkb25seSBvcmdhbml6YXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgZGVwbG95IGVudmlyb25tZW50IChlLmcuIGBwcm9kdWN0aW9uYCwgYHN0YWdpbmdgKSBmb3IgdGhlXG4gICAqIHNpbmdsZS1lbnZpcm9ubWVudCBjYXNlLiBXaGVuIHNldCAoYW5kIG5vIHN0YWdlIGRlY2xhcmVzIGl0cyBvd25cbiAgICogYGVudmlyb25tZW50YCksIHBpcGVsaW5lLWNvcmUgZGVyaXZlcyB0aGUgYHBiLmRlcGxveXNgIHRhZyBmcm9tIGl0LCBtYXJraW5nXG4gICAqIHRoZSBzb2xlIHN0YWdlIOKAlCBvciB0aGUgTEFTVCBzdGFnZSBvZiBhIG11bHRpLXN0YWdlIHBpcGVsaW5lICh3aXRoIGEgc3ludGhcbiAgICogd2FybmluZyksIG9yIGEgbGl0ZXJhbCBgRGVwbG95YCBzdGFnZSB3aGVuIHRoZXJlIGFyZSBubyBzdGFnZXMgdG8gbmFtZSDigJQgYXNcbiAgICogdGhlIGRlcGxveSBmb3IgRE9SQSBtZXRyaWNzLiBGb3IgbXVsdGktZW52aXJvbm1lbnQgcGlwZWxpbmVzLCBkZWNsYXJlXG4gICAqIGBlbnZpcm9ubWVudGAgcGVyIHN0YWdlIGluc3RlYWQgKHNlZSBgU3RhZ2VPcHRpb25zLmVudmlyb25tZW50YCkuXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudD86IHN0cmluZztcblxuICAvKiogVGVuYW50IGlkZW50aWZpZXIgZm9yIHJlc29sdmluZyBwZXItb3JnIHNlY3JldHMgZnJvbSBBV1MgU2VjcmV0cyBNYW5hZ2VyICovXG4gIHJlYWRvbmx5IG9yZ0lkPzogc3RyaW5nO1xuXG4gIC8qKiBQaXBlbGluZSBkYXRhYmFzZSByZWNvcmQgSUQg4oCUIGluamVjdGVkIGFzIFBJUEVMSU5FX0lEIGVudiB2YXIgZm9yIGF1dG9ub21vdXMgc3ludGggKi9cbiAgcmVhZG9ubHkgcGlwZWxpbmVJZD86IHN0cmluZztcblxuICAvKiogT3B0aW9uYWwgY3VzdG9tIHBpcGVsaW5lIG5hbWUuIERlZmF1bHRzIHRvOiB7b3JnYW5pemF0aW9ufS17cHJvamVjdH0tcGlwZWxpbmUgKi9cbiAgcmVhZG9ubHkgcGlwZWxpbmVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKiBHbG9iYWwgbWV0YWRhdGEgaW5oZXJpdGVkIGJ5IGFsbCBwaXBlbGluZSBzdGVwcyAqL1xuICByZWFkb25seSBnbG9iYWw/OiBNZXRhRGF0YVR5cGU7XG5cbiAgLyoqXG4gICAqIFBpcGVsaW5lLWxldmVsIHRlbXBsYXRlIHZhcmlhYmxlcywgZXhwb3NlZCB0byBge3sgcGlwZWxpbmUudmFycy4qIH19YCBpblxuICAgKiBwaXBlbGluZSBjb25maWdzIGFuZCBwbHVnaW4gc3BlY3MgKHNlZSBgUGx1Z2luU3BlYy5yZXF1aXJlZFZhcnNgKS4gRGVjbGFyZWRcbiAgICogaGVyZSBzbyB0aGUgYHBpcGVsaW5lLnZhcnNgIHRlbXBsYXRlIHNjb3BlIGlzIHR5cGUtY2hlY2tlZCBlbmQtdG8tZW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBQaXBlbGluZS1sZXZlbCBDb2RlQnVpbGQgZGVmYXVsdHMgYXBwbGllZCB0byBhbGwgQ29kZUJ1aWxkIGFjdGlvbnNcbiAgICogKHN5bnRoLCBzZWxmLW11dGF0aW9uLCBhc3NldCBwdWJsaXNoaW5nKSB2aWEgYGNvZGVCdWlsZERlZmF1bHRzYC5cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRzPzogQ29kZUJ1aWxkRGVmYXVsdHM7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIElBTSByb2xlIGZvciB0aGUgQ29kZVBpcGVsaW5lLlxuICAgKiBXaGVuIHByb3ZpZGVkLCByZXNvbHZlcyB0byBhIENESyBJUm9sZSBhbmQgaXMgcGFzc2VkIHRvIHRoZSBDb2RlUGlwZWxpbmUgY29uc3RydWN0LlxuICAgKiBXaGVuIG9taXR0ZWQsIENESyBhdXRvLWNyZWF0ZXMgYSByb2xlIHdpdGggdGhlIGNvcnJlY3QgY29kZXBpcGVsaW5lLmFtYXpvbmF3cy5jb20gcHJpbmNpcGFsLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZT86IFJvbGVDb25maWc7XG5cbiAgLyoqIFN5bnRoZXNpcyBjb25maWd1cmF0aW9uIGluY2x1ZGluZyBzb3VyY2UgYW5kIHBsdWdpbiBkZXRhaWxzICovXG4gIHJlYWRvbmx5IHN5bnRoOiBTeW50aE9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHBpcGVsaW5lIHN0YWdlcywgZWFjaCBjb250YWluaW5nIG9uZSBvciBtb3JlIENvZGVCdWlsZCBzdGVwcy5cbiAgICogU3RhZ2VzIGFyZSBhZGRlZCBhcyB3YXZlcyB0byB0aGUgQ29kZVBpcGVsaW5lIGFmdGVyIHRoZSBzeW50aCBzdGVwLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhZ2VzPzogU3RhZ2VPcHRpb25zW107XG5cbiAgLyoqIE9wdGlvbmFsIGNyb24vcmF0ZSBleHByZXNzaW9uIGZvciBzY2hlZHVsZWQgcGlwZWxpbmUgZXhlY3V0aW9uLiAqL1xuICByZWFkb25seSBzY2hlZHVsZT86IHN0cmluZztcblxuICAvKiogQ3VzdG9tIHRhZ3MgYXBwbGllZCB0byBhbGwgcGlwZWxpbmUgcmVzb3VyY2VzLiAqL1xuICByZWFkb25seSB0YWdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogUGx1Z2lucyBwcmUtcmVzb2x2ZWQgYnkgYHBpcGVsaW5lLW1hbmFnZXIgcGlwZWxpbmUgc3ludGhgIGZyb20gdGhlIHBsYXRmb3JtIEFQSSxcbiAgICoga2V5ZWQgYnkgYGFsaWFzIHx8IG5hbWVgLiBXaGVuIHByZXNlbnQsIGBQbHVnaW5Mb29rdXAucGx1Z2luKClgIHJldHVybnNcbiAgICogdGhlIG1hdGNoaW5nIGVudHJ5IGRpcmVjdGx5IGFuZCBza2lwcyB0aGUgY3VzdG9tIHJlc291cmNlIOKAlCBzbyB0aGVcbiAgICogc3ludGhlc2l6ZWQgQ0ZOIHRlbXBsYXRlIHNoaXBzIHdpdGggdGhlIHJlYWwgQ29kZUJ1aWxkIGltYWdlIGJha2VkIGluLlxuICAgKiBQb3B1bGF0ZWQgYnkgdGhlIENMSSBiZWZvcmUgaW52b2tpbmcgdGhlIGJvaWxlcnBsYXRlIGFwcDsgQ0RLIGNvbnN1bWVyc1xuICAgKiB3aG8gY29uc3RydWN0IFBpcGVsaW5lQnVpbGRlciBkaXJlY3RseSBub3JtYWxseSBsZWF2ZSB0aGlzIHVuc2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb2x2ZWRQbHVnaW5zPzogUmVjb3JkPHN0cmluZywgUGx1Z2luPjtcblxuICAvKipcbiAgICogVGhlIHRvb2xjaGFpbiByZWxlYXNlIHRoaXMgcGlwZWxpbmUgcnVucyBvbiwgcGlubmVkIGJ5IHRoZSBwaXBlbGluZSdzIG93blxuICAgKiBjb25maWcgKGB0b29sY2hhaW4ucmVsZWFzZWApLiBBYnNlbnQg4oeSIHRoZSBvcmcgZGVmYXVsdCwgaXRzIGNhbmFyeSwgb3IgdGhlXG4gICAqIHBsYXRmb3JtIGRlZmF1bHQg4oCUIHdoaWNoZXZlciB0aGUgcGxhdGZvcm0gcmVzb2x2ZXMgKEQ3LCBEOCkuXG4gICAqL1xuICByZWFkb25seSB0b29sY2hhaW4/OiB7IHJlYWRvbmx5IHJlbGVhc2U6IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb2x2ZWQgYHBpcGVsaW5lLWJvb3RzdHJhcGAgaGFsZiBvZiB0aGUgcGlwZWxpbmUncyB0b29sY2hhaW4gcmVsZWFzZVxuICAgKiAoUkVRVUlSRUQpLiBQaW5zIHRoZSBkZWZhdWx0IENvZGVCdWlsZCBpbWFnZSAoYGNvZGVCdWlsZERlZmF1bHRzYCxcbiAgICogcGx1Z2luLWxlc3Mgc3RlcHMsIGFzc2V0IHB1Ymxpc2hpbmcpIGJ5IGl0cyBzaWduZWQgZGlnZXN0IGFuZCBzdXBwbGllcyB0aGVcbiAgICogQ0RLIENMSSAoYGNsaVZlcnNpb25gKSBhbmQgYGNkay1hc3NldHNgIChgY2RrQXNzZXRzQ2xpVmVyc2lvbmApIHZlcnNpb25zLlxuICAgKiBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aC9kZXBsb3lgIHJlc29sdmVzIGl0IGZyb20gdGhlIHBsYXRmb3JtXG4gICAqIChgL3BsdWdpbnMvbG9va3VwYCwgbmFtZSBgcGlwZWxpbmUtYm9vdHN0cmFwYCk7IENESyBjb25zdW1lcnMgYnVpbGRpbmdcbiAgICogUGlwZWxpbmVCdWlsZGVyIGRpcmVjdGx5IHBhc3MgdGhlIHNhbWUgcmVjb3JkLiBUaGVyZSBpcyBubyBmYWxsYmFjayAoRDIpLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb2x2ZWRCb290c3RyYXA6IFJlc29sdmVkQm9vdHN0cmFwO1xuXG4gIC8qKlxuICAgKiBQbGF0Zm9ybS1zb3VyY2VkIHJlZ2lzdHJ5IG92ZXJyaWRlcywgYXBwbGllZCBvdmVyIHRoZSBlbnYtbG9hZGVkIGByZWdpc3RyeWBcbiAgICogY29uZmlnIGF0IHN5bnRoIHN0YXJ0LiBwaXBlbGluZS1tYW5hZ2VyIHBvcHVsYXRlcyB0aGlzIGZyb20gdGhlIHBsYXRmb3JtIFVSTFxuICAgKiBpdCBkZXBsb3lzIGFnYWluc3Qgc28gdGhlIENvZGVCdWlsZCBpbWFnZSBVUklzIHVzZSBhIHB1bGwgaG9zdCBBV1MgQ29kZUJ1aWxkXG4gICAqIGNhbiByZXNvbHZlIChpbnN0ZWFkIG9mIHRoZSBpbi1jbHVzdGVyIGByZWdpc3RyeTo1MDAwYCBkZWZhdWx0KS4gQ0RLXG4gICAqIGNvbnN1bWVycyBjb25zdHJ1Y3RpbmcgUGlwZWxpbmVCdWlsZGVyIGRpcmVjdGx5IG5vcm1hbGx5IGxlYXZlIHRoaXMgdW5zZXQuXG4gICAqL1xuICByZWFkb25seSByZWdpc3RyeT86IFBhcnRpYWw8UmVnaXN0cnlDb25maWc+O1xufVxuXG4vKipcbiAqIENESyBjb25zdHJ1Y3QgdGhhdCBjcmVhdGVzIGFuZCBjb25maWd1cmVzIGEgQ29kZVBpcGVsaW5lIGZvciBjb250aW51b3VzIGRlcGxveW1lbnQuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIE11bHRpLXNvdXJjZSBzdXBwb3J0IChTMywgR2l0SHViLCBDb2RlU3RhcilcbiAqIC0gUGx1Z2luLWJhc2VkIGJ1aWxkIHN0ZXBzXG4gKiAtIE1ldGFkYXRhLWRyaXZlbiBjb25maWd1cmF0aW9uXG4gKiAtIEF1dG9tYXRpYyB0YWdnaW5nXG4gKiAtIEF1dG9tYXRpYyBzYW5pdGl6YXRpb24gb2YgcHJvamVjdCBhbmQgb3JnYW5pemF0aW9uIG5hbWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIG5ldyBQaXBlbGluZUJ1aWxkZXIodGhpcywgJ015UGlwZWxpbmUnLCB7XG4gKiAgIHByb2plY3Q6ICdteS1hcHAnLFxuICogICBvcmdhbml6YXRpb246ICdteS1vcmcnLFxuICogICBzeW50aDoge1xuICogICAgIHNvdXJjZToge1xuICogICAgICAgdHlwZTogJ2dpdGh1YicsXG4gKiAgICAgICBvcHRpb25zOiB7IHJlcG86ICdvd25lci9yZXBvJywgYnJhbmNoOiAnbWFpbicgfVxuICogICAgIH0sXG4gKiAgICAgcGx1Z2luOiB7IG5hbWU6ICdzeW50aCcgfVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUGlwZWxpbmVCdWlsZGVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHBpcGVsaW5lOiBDb2RlUGlwZWxpbmU7XG4gIHB1YmxpYyByZWFkb25seSBjb25maWc6IFBpcGVsaW5lQ29uZmlndXJhdGlvbjtcbiAgLyoqXG4gICAqIFdoaWNoIHBsdWdpbiBlYWNoIENvZGVQaXBlbGluZSBhY3Rpb24gcnVucywgcmVhZCBvZmYgdGhlIGJ1aWx0XG4gICAqIHBpcGVsaW5lLiBUaGUgQ0xJIHNoaXBzIGl0IHdpdGggdGhlIHJlZ2lzdHJ5IHJlZ2lzdHJhdGlvbiBzbyBldmVudCBpbmdlc3RcbiAgICogY2FuIGF0dHJpYnV0ZSBhY3Rpb24gb3V0Y29tZXMgdG8gYSBwbHVnaW4gdmVyc2lvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzdGVwTWFuaWZlc3Q6IFN0ZXBNYW5pZmVzdEVudHJ5W107XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEJ1aWxkZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAvLyBBcHBseSBwbGF0Zm9ybS1zb3VyY2VkIHJlZ2lzdHJ5IG92ZXJyaWRlcyBCRUZPUkUgYW55IENvbmZpZy5nZXQoJ3JlZ2lzdHJ5JylcbiAgICAvLyAocGx1Z2luL2RlZmF1bHQgYnVpbGQtaW1hZ2UgcmVzb2x1dGlvbiBiZWxvdykgc28gdGhlIHN5bnRoIHVzZXMgdGhlIHB1bGxcbiAgICAvLyBob3N0IHRoZSBwbGF0Zm9ybSBkZXBsb3lzIGFnYWluc3QsIG5vdCB0aGUgaW4tY2x1c3RlciBlbnYgZGVmYXVsdC4gVGhlIENMSVxuICAgIC8vIG9ubHkgc2V0cyBwcm9wcy5yZWdpc3RyeSB3aGVuIElNQUdFX1JFR0lTVFJZX1BVTExfSE9TVCBpcyB1bnNldCwgc28gYW5cbiAgICAvLyBleHBsaWNpdCBvcGVyYXRvciBwdWxsIGhvc3QgaXMgbmV2ZXIgY2xvYmJlcmVkIChzZWUgYmFrZVBsYXRmb3JtUmVnaXN0cnkpLlxuICAgIC8vXG4gICAgLy8gU2NvcGVkICsgcmVzdG9yZWQgc28gdGhlIG92ZXJyaWRlIGRvZXMgTk9UIGxlYWsgaW50byB0aGUgcHJvY2Vzcy13aWRlXG4gICAgLy8gQ29uZmlnIGNhY2hlOiBpbiBhIG11bHRpLXBpcGVsaW5lIENESyBhcHAsIHBpcGVsaW5lIEIncyByZWdpc3RyeSBtdXN0IG5vdFxuICAgIC8vIGJsZWVkIGludG8gcGlwZWxpbmUgQSdzIGltYWdlIHJlc29sdXRpb24uIEFsbCByZWdpc3RyeSByZWFkcyBoYXBwZW5cbiAgICAvLyBzeW5jaHJvbm91c2x5IGJlbG93IChidWlsZC1pbWFnZSByZXNvbHV0aW9uKSwgc28gcmVzdG9yaW5nIGF0IHRoZSBlbmQgb2ZcbiAgICAvLyB0aGUgY29uc3RydWN0b3Iga2VlcHMgc2luZ2xlLXBpcGVsaW5lIGJlaGF2aW9yIGlkZW50aWNhbC5cbiAgICBjb25zdCByZXN0b3JlUmVnaXN0cnkgPSBwcm9wcy5yZWdpc3RyeVxuICAgICAgPyBDb25maWcub3ZlcnJpZGVTY29wZWQoJ3JlZ2lzdHJ5JywgcHJvcHMucmVnaXN0cnkpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgaWYgKCFwcm9wcy5yZXNvbHZlZEJvb3RzdHJhcD8ucGx1Z2luIHx8ICFwcm9wcy5yZXNvbHZlZEJvb3RzdHJhcC50b29sY2hhaW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdCT09UU1RSQVBfSU1BR0VfVU5SRVNPTFZFRDogUGlwZWxpbmVCdWlsZGVyIHJlcXVpcmVzIGByZXNvbHZlZEJvb3RzdHJhcGAg4oCUIHRoZSByZXNvbHZlZCBwaXBlbGluZS1ib290c3RyYXAgJ1xuICAgICAgICAgICsgJ2hhbGYgb2YgdGhlIHRvb2xjaGFpbiByZWxlYXNlLiBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aC9kZXBsb3lgIHJlc29sdmVzIGl0IGZyb20gdGhlIHBsYXRmb3JtOyAnXG4gICAgICAgICAgKyAnYSBDREsgYXBwIGNvbnN0cnVjdGluZyBQaXBlbGluZUJ1aWxkZXIgZGlyZWN0bHkgbXVzdCBwYXNzIGl0IChzZWUgYHBpcGVsaW5lLW1hbmFnZXIgdG9vbGNoYWluIGV4cG9ydGApLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBVc2UgUGlwZWxpbmVDb25maWd1cmF0aW9uIGZvciBhbGwgYnVzaW5lc3MgbG9naWMgKHZhbGlkYXRpb24sIHNhbml0aXphdGlvbiwgbWV0YWRhdGEgbWVyZ2luZylcbiAgICAgIHRoaXMuY29uZmlnID0gbmV3IFBpcGVsaW5lQ29uZmlndXJhdGlvbihwcm9wcyk7XG5cbiAgICAgIGNvbnN0IHNlcnZlckNvbmZpZyA9IENvbmZpZy5nZXQoJ3NlcnZlcicpO1xuICAgICAgY29uc3QgYXdzQ29uZmlnID0gQ29uZmlnLmdldCgnYXdzJyk7XG4gICAgICAvLyBQYXNzIG9yZytwcm9qZWN0IHNvIGxvZyBncm91cCAvIElBTSByb2xlIG5hbWVzIGdldCBhIHN0YWJsZSBoYXNoXG4gICAgICAvLyBzdWZmaXggcGVyIHBpcGVsaW5lLiBQcmV2ZW50cyBgUmVzb3VyY2UgYWxyZWFkeSBleGlzdHNgIGNvbGxpc2lvbnNcbiAgICAgIC8vIGFjcm9zcyBzdGFja3MgZGVwbG95ZWQgdG8gdGhlIHNhbWUgQVdTIGFjY291bnQuXG4gICAgICBjb25zdCB1bmlxdWVJZCA9IG5ldyBVbmlxdWVJZCh7XG4gICAgICAgIG9yZ2FuaXphdGlvbjogdGhpcy5jb25maWcub3JnYW5pemF0aW9uLFxuICAgICAgICBwcm9qZWN0OiB0aGlzLmNvbmZpZy5wcm9qZWN0LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwbHVnaW5Mb29rdXAgPSBuZXcgUGx1Z2luTG9va3VwKFxuICAgICAgICB0aGlzLFxuICAgICAgICB1bmlxdWVJZC5nZW5lcmF0ZSgncGx1Z2luOmxvb2t1cCcpLFxuICAgICAgICB7XG4gICAgICAgICAgb3JnYW5pemF0aW9uOiB0aGlzLmNvbmZpZy5vcmdhbml6YXRpb24sXG4gICAgICAgICAgcHJvamVjdDogdGhpcy5jb25maWcucHJvamVjdCxcbiAgICAgICAgICBwbGF0Zm9ybVVybDogc2VydmVyQ29uZmlnLnBsYXRmb3JtVXJsLFxuICAgICAgICAgIHVuaXF1ZUlkLFxuICAgICAgICAgIG9yZ0lkOiBwcm9wcy5vcmdJZCxcbiAgICAgICAgICBwaXBlbGluZUlkOiBwcm9wcy5waXBlbGluZUlkLFxuICAgICAgICAgIHJ1bnRpbWU6IGxhbWJkYVJ1bnRpbWUoYXdzQ29uZmlnLmxhbWJkYS5ydW50aW1lKSxcbiAgICAgICAgICB0aW1lb3V0OiBsYW1iZGFUaW1lb3V0KGF3c0NvbmZpZy5sYW1iZGEudGltZW91dFNlY29uZHMpLFxuICAgICAgICAgIGFyY2hpdGVjdHVyZTogbGFtYmRhQXJjaGl0ZWN0dXJlKGF3c0NvbmZpZy5sYW1iZGEuYXJjaGl0ZWN0dXJlKSxcbiAgICAgICAgICByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zOiBhd3NDb25maWcubGFtYmRhLnJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnMsXG4gICAgICAgICAgcmVzb2x2ZWRQbHVnaW5zOiBwcm9wcy5yZXNvbHZlZFBsdWdpbnMsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICAvLyBDcmVhdGUgc291cmNlIGFuZCBidWlsZCBzdGVwXG4gICAgICBjb25zdCBzb3VyY2VCdWlsZGVyID0gbmV3IFNvdXJjZUJ1aWxkZXIodGhpcywgdGhpcy5jb25maWcpO1xuICAgICAgY29uc3Qgc291cmNlID0gc291cmNlQnVpbGRlci5jcmVhdGUodW5pcXVlSWQpO1xuXG4gICAgICAvLyBTeW50aC1wbHVnaW4gcmVzb2x1dGlvbjpcbiAgICAgIC8vICAgMS4gUHJlLXJlc29sdmVkIGJ5IGBwaXBlbGluZS1tYW5hZ2VyIHBpcGVsaW5lIHN5bnRoL2RlcGxveWAgZnJvbSB0aGUgcGxhdGZvcm1cbiAgICAgIC8vICAgICAgQVBJIOKGkiB1c2UgaXQuIFN5bnRoIHN0ZXAgcnVucyBvbiB0aGUgcmVhbCBgY2RrLXN5bnRoYCBpbWFnZSB3aXRoXG4gICAgICAvLyAgICAgIHJlYWwgY29tbWFuZHMgYmFrZWQgaW50byB0aGUgdGVtcGxhdGUuXG4gICAgICAvLyAgIDIuIE90aGVyd2lzZSDihpIgYGJvb3RzdHJhcCgpYDogY29sZC1zdGFydCBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aGBcbiAgICAgIC8vICAgICAgb24gdGhlIHJlc29sdmVkIHRvb2xjaGFpbiByZWxlYXNlJ3MgcGlwZWxpbmUtYm9vdHN0cmFwIGltYWdlXG4gICAgICAvLyAgICAgIChgcmVzb2x2ZWRCb290c3RyYXBgKS4gVXNlZCB3aGVuIHRoZSBzeW50aCBwbHVnaW4gd2Fzbid0XG4gICAgICAvLyAgICAgIHByZS1yZXNvbHZlZCAoYSBub24tbWFuYWdlZCBzeW50aCBwbHVnaW4gd2hvc2UgbG9va3VwIG1pc3NlZCkuXG4gICAgICAvL1xuICAgICAgLy8gcGx1Z2luTG9va3VwLnBsdWdpbigpIHJlYWRzIGByZXNvbHZlZFBsdWdpbnNgIGludGVybmFsbHkgYW5kIHJldHVybnNcbiAgICAgIC8vIHRoZSBjYWNoZWQgZW50cnkgd2hlbiBwcmVzZW50IOKAlCBzbyBjYWxsaW5nIGl0IGFsd2F5cyB3aW5zIG92ZXJcbiAgICAgIC8vIGJvb3RzdHJhcCgpIHdoZW4gcHJlLXJlc29sdXRpb24gc3VjY2VlZGVkLlxuICAgICAgY29uc3Qgc3ludGhDYWNoZUtleSA9IHBsdWdpbkFydGlmYWN0QWxpYXModGhpcy5jb25maWcucGx1Z2luKTtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IHByb3BzLnJlc29sdmVkUGx1Z2lucz8uW3N5bnRoQ2FjaGVLZXldXG4gICAgICAgID8gcGx1Z2luTG9va3VwLnBsdWdpbih0aGlzLmNvbmZpZy5wbHVnaW4sIHBsdWdpblN0ZXBMYWJlbChudWxsLCB0aGlzLmNvbmZpZy5wbHVnaW4pKVxuICAgICAgICA6IHBsdWdpbkxvb2t1cC5ib290c3RyYXAoKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRDb21wdXRlVHlwZSA9IGdldENvbXB1dGVUeXBlKGF3c0NvbmZpZy5jb2RlQnVpbGQuY29tcHV0ZVR5cGUpO1xuICAgICAgY29uc3QgYXJ0aWZhY3RNYW5hZ2VyID0gbmV3IEFydGlmYWN0TWFuYWdlcigpO1xuXG4gICAgICAvLyBTY29wZSBleHBvc2VkIHRvIHBsdWdpbi1zcGVjIHRlbXBsYXRlcyBhcyBgcGlwZWxpbmUuKmAuIFNvdXJjZWQgZnJvbSB0aGVcbiAgICAgIC8vIGNvbmZpZyBzbyB0aGUgc3ludGggc3RlcCwgZXZlcnkgc3RhZ2Ugc3RlcCwgYW5kIHRoZSBzb3VyY2UgdG9rZW4gYWxsXG4gICAgICAvLyByZXNvbHZlIGFnYWluc3QgdGhlIHNhbWUgc25hcHNob3QgKHNlZSBQaXBlbGluZUNvbmZpZ3VyYXRpb24uZ2V0UGlwZWxpbmVTY29wZSkuXG4gICAgICBjb25zdCBwaXBlbGluZVNjb3BlID0gdGhpcy5jb25maWcuZ2V0UGlwZWxpbmVTY29wZSgpO1xuICAgICAgLy8gQ29udHJhY3Qg4oCUIHNlZSBTdGFnZUJ1aWxkZXIucmVzb2x2ZVN0ZXAuXG4gICAgICBhc3NlcnRQbHVnaW5Db250cmFjdChwbHVnaW4sIGNvbnRyYWN0U2NvcGVGcm9tVGVtcGxhdGVTY29wZShwaXBlbGluZVNjb3BlKSwgJ3N5bnRoJyk7XG5cbiAgICAgIC8vIFRoZSBwaXBlbGluZSdzIGRlZmF1bHQgYnVpbGQgaW1hZ2U6IHRoZSByZWxlYXNlJ3MgcGlwZWxpbmUtYm9vdHN0cmFwLFxuICAgICAgLy8gcmVzb2x2ZWQgb25jZSAob25lIHJlZ2lzdHJ5LWNyZWRlbnRpYWwgaW1wb3J0KSBhbmQgc2hhcmVkIGJ5IHRoZVxuICAgICAgLy8gcGlwZWxpbmUtd2lkZSBjb2RlQnVpbGREZWZhdWx0cyBhbmQgZXZlcnkgcGx1Z2luLWxlc3Mgc3RlcC5cbiAgICAgIGNvbnN0IGRlZmF1bHRCdWlsZEltYWdlID0gcmVzb2x2ZURlZmF1bHRCdWlsZEltYWdlKHRoaXMsIHByb3BzLm9yZ0lkLCBwcm9wcy5yZXNvbHZlZEJvb3RzdHJhcC5wbHVnaW4pO1xuXG4gICAgICBjb25zdCBzdGVwTWFuaWZlc3QgPSBuZXcgU3RlcE1hbmlmZXN0UmVjb3JkZXIoKTtcbiAgICAgIHN0ZXBNYW5pZmVzdC5yZWNvcmRCdWlsZEltYWdlKHByb3BzLnJlc29sdmVkQm9vdHN0cmFwLnBsdWdpbiwgcHJvcHMucmVzb2x2ZWRCb290c3RyYXAudG9vbGNoYWluKTtcbiAgICAgIGNvbnN0IHN5bnRoID0gY3JlYXRlQ29kZUJ1aWxkU3RlcCh7XG4gICAgICAgIC4uLnRoaXMuY29uZmlnLnN5bnRoQ3VzdG9taXphdGlvbixcbiAgICAgICAgaWQ6IHVuaXF1ZUlkLmdlbmVyYXRlKCdjZGs6c3ludGgnKSxcbiAgICAgICAgdW5pcXVlSWQsXG4gICAgICAgIHBsdWdpbixcbiAgICAgICAgaW5wdXQ6IHNvdXJjZSxcbiAgICAgICAgbWV0YWRhdGE6IHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZCxcbiAgICAgICAgbmV0d29yazogdGhpcy5jb25maWcubmV0d29yayxcbiAgICAgICAgc2NvcGU6IHRoaXMsXG4gICAgICAgIGRlZmF1bHRDb21wdXRlVHlwZSxcbiAgICAgICAgYXJ0aWZhY3RNYW5hZ2VyLFxuICAgICAgICBzdGFnZU5hbWU6ICduby1zdGFnZScsXG4gICAgICAgIHN0YWdlQWxpYXM6ICduby1zdGFnZS1hbGlhcycsXG4gICAgICAgIC8vIFRoZSBjYW5vbmljYWwga2V5IHNlZ21lbnQuIGAke2FsaWFzID8/IG5hbWV9LWFsaWFzYCBzdWZmaXhlZCBhblxuICAgICAgICAvLyBFWFBMSUNJVCBhbGlhcyB0b28gKGBteS1zeW50aGAg4oaSIGBteS1zeW50aC1hbGlhc2ApLCBzbyBhIHN0YWdlIHRoYXRcbiAgICAgICAgLy8gcGlja2VkIHRoZSBzeW50aCBvdXRwdXQgaW4gdGhlIFVJIGFza2VkIGZvciBhIGtleSBuZXZlciByZWdpc3RlcmVkLlxuICAgICAgICBwbHVnaW5BbGlhczogcGx1Z2luQXJ0aWZhY3RBbGlhcyh0aGlzLmNvbmZpZy5wbHVnaW4pLFxuICAgICAgICBvcmdJZDogcHJvcHMub3JnSWQsXG4gICAgICAgIGRlZmF1bHRCdWlsZEltYWdlLFxuICAgICAgICBwaXBlbGluZVNjb3BlLFxuICAgICAgfSk7XG4gICAgICBzdGVwTWFuaWZlc3QucmVjb3JkKHN5bnRoLCBwbHVnaW4sIHBsdWdpblN0ZXBMYWJlbChudWxsLCB0aGlzLmNvbmZpZy5wbHVnaW4pKTtcblxuICAgICAgLy8gUmVzb2x2ZSBwaXBlbGluZS1sZXZlbCBkZWZhdWx0cyBpbnRvIGNvZGVCdWlsZERlZmF1bHRzXG4gICAgICAvLyBCdWlsZCB0aGUgcGVyLW9yZyBwbGF0Zm9ybSBzZWNyZXQgbmFtZSBmb3IgQ29kZUJ1aWxkIGVudiB2YXJzXG4gICAgICBjb25zdCBwbGF0Zm9ybVNlY3JldE5hbWUgPSBwcm9wcy5vcmdJZFxuICAgICAgICA/IENvcmVDb25zdGFudHMuc2VjcmV0UGF0aChwcm9wcy5vcmdJZCwgJ3BsYXRmb3JtJylcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAvLyBUaGUgcmVnaXN0cmF0aW9uIGtleSB0aGUgc3ludGggcG9zdHMgaXRzIHN0ZXAgbWFuaWZlc3Qgd2l0aCDigJQgYVxuICAgICAgLy8gc2VwYXJhdGUgY3JlZGVudGlhbCBmcm9tIHRoZSBwbGF0Zm9ybSBvbmUgKGNvcmUvcGlwZWxpbmUtcmVnaXN0cmF0aW9uLnRzKS5cbiAgICAgIGNvbnN0IHJlZ2lzdHJhdGlvblNlY3JldE5hbWUgPSBwcm9wcy5vcmdJZFxuICAgICAgICA/IENvcmVDb25zdGFudHMuc2VjcmV0UGF0aChwcm9wcy5vcmdJZCwgUElQRUxJTkVfUkVHSVNUUkFUSU9OX1NFQ1JFVF9MRUFGKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3QgY29kZUJ1aWxkRGVmYXVsdHMgPSB0aGlzLnJlc29sdmVEZWZhdWx0cyh0aGlzLmNvbmZpZy5kZWZhdWx0cywgdW5pcXVlSWQsIHByb3BzLnBpcGVsaW5lSWQsIHBsYXRmb3JtU2VjcmV0TmFtZSwgc2VydmVyQ29uZmlnLnBsYXRmb3JtVXJsLCBwcm9wcy5vcmdJZCwgZGVmYXVsdEJ1aWxkSW1hZ2UpO1xuXG4gICAgICAvLyBSZXNvbHZlIElBTSByb2xlOiBleHBsaWNpdCBwcm9wIHdpbnMsIGVsc2UgYGlhbTpyb2xlYCBtZXRhZGF0YSwgZWxzZSBsZXRcbiAgICAgIC8vIENESyBhdXRvLWNyZWF0ZSB0aGUgcGlwZWxpbmUgcm9sZSAoY29kZXBpcGVsaW5lLmFtYXpvbmF3cy5jb20gcHJpbmNpcGFsKS5cbiAgICAgIGNvbnN0IHJvbGVDb25maWcgPSBwcm9wcy5yb2xlID8/IHJvbGVDb25maWdGcm9tTWV0YWRhdGEodGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkKTtcbiAgICAgIGlmIChyb2xlQ29uZmlnPy50eXBlID09PSAnY29kZUJ1aWxkRGVmYXVsdCcpIHtcbiAgICAgICAgY3JlYXRlTG9nZ2VyKCdwaXBlbGluZS1idWlsZGVyJykud2FybihcbiAgICAgICAgICAnY29kZUJ1aWxkRGVmYXVsdCByb2xlIHR5cGUgdXNlcyBjb2RlYnVpbGQuYW1hem9uYXdzLmNvbSB0cnVzdCBwcmluY2lwYWwg4oCUICcgK1xuICAgICAgICAndGhpcyBpcyBub3Qgc3VpdGFibGUgYXMgdGhlIHBpcGVsaW5lLWxldmVsIHJvbGUuIENvbnNpZGVyIHVzaW5nIHJvbGVBcm4vcm9sZU5hbWUgJyArXG4gICAgICAgICdvciBvbWl0dGluZyB0aGUgcm9sZSB0byBsZXQgQ0RLIGF1dG8tY3JlYXRlIG9uZSB3aXRoIGNvZGVwaXBlbGluZS5hbWF6b25hd3MuY29tLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCByb2xlID0gcm9sZUNvbmZpZ1xuICAgICAgICA/IHJlc29sdmVSb2xlKHRoaXMsIHVuaXF1ZUlkLCByb2xlQ29uZmlnKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgLy8g4pSA4pSAIEFydGlmYWN0IGJ1Y2tldCAoS01TIGVuY3J5cHRpb24gKyByZXRlbnRpb24pIOKUgOKUgFxuICAgICAgLy8gV2hlbiBgZW5jcnlwdGlvbi5rbXNLZXlBcm5gIGFuZC9vciBgb3BlcmF0aW9ucy5hcnRpZmFjdFJldGVudGlvbkRheXNgIGFyZVxuICAgICAgLy8gc2V0IHdlIGNyZWF0ZSBhIGN1c3RvbSBhcnRpZmFjdCBidWNrZXQgYW5kIHBhc3MgaXQgdG8gQ29kZVBpcGVsaW5lOyB0aGF0XG4gICAgICAvLyBpcyB0aGUgb25seSB3YXkgdG8gYXR0YWNoIGEgY3VzdG9tZXItbWFuYWdlZCBrZXkgKHRoZSBMMyBjb25zdHJ1Y3QgZXhwb3Nlc1xuICAgICAgLy8gYGFydGlmYWN0QnVja2V0YCwgbm90IGBlbmNyeXB0aW9uS2V5YCkuIEFic2VudCBib3RoIGtleXMsIENESyBhdXRvLWNyZWF0ZXNcbiAgICAgIC8vIHRoZSBidWNrZXQgYW5kIGJlaGF2aW9yIGlzIHVuY2hhbmdlZC5cbiAgICAgIGNvbnN0IGFydGlmYWN0QnVja2V0ID0gdGhpcy5idWlsZEFydGlmYWN0QnVja2V0KCk7XG5cbiAgICAgIC8vIENyZWF0ZSBDb2RlUGlwZWxpbmUgY29uc3RydWN0LiBUaGUgdG9vbGNoYWluIHBpbnMgKENMSSB2ZXJzaW9ucyxcbiAgICAgIC8vIHNlbGYtbXV0YXRpb24gcnVudGltZSkgZ28gQkVGT1JFIHRoZSBtZXRhZGF0YSBzcHJlYWQ6IGV4cGxpY2l0IHBpcGVsaW5lXG4gICAgICAvLyBtZXRhZGF0YSAoYGNsaVZlcnNpb25gLCBgY2RrQXNzZXRzQ2xpVmVyc2lvbmAsXG4gICAgICAvLyBgc2VsZk11dGF0aW9uQ29kZUJ1aWxkRGVmYXVsdHNgLCBgYXNzZXRQdWJsaXNoaW5nQ29kZUJ1aWxkRGVmYXVsdHNgKSB3aW5zLlxuICAgICAgY29uc3QgY29kZVBpcGVsaW5lTWV0YWRhdGEgPSBtZXRhZGF0YUZvckNvZGVQaXBlbGluZSh0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQpO1xuICAgICAgdGhpcy5waXBlbGluZSA9IG5ldyBDb2RlUGlwZWxpbmUodGhpcywgdW5pcXVlSWQuZ2VuZXJhdGUoJ3BpcGVsaW5lczpjb2RlcGlwZWxpbmUnKSwge1xuICAgICAgICAuLi4oY29kZUJ1aWxkRGVmYXVsdHMgJiYgeyBjb2RlQnVpbGREZWZhdWx0cyB9KSxcbiAgICAgICAgLi4uKHJvbGUgJiYgeyByb2xlIH0pLFxuICAgICAgICAuLi4oYXJ0aWZhY3RCdWNrZXQgJiYgeyBhcnRpZmFjdEJ1Y2tldCB9KSxcbiAgICAgICAgcGlwZWxpbmVUeXBlOiBQaXBlbGluZVR5cGUuVjIsXG4gICAgICAgIHBpcGVsaW5lTmFtZTogdGhpcy5jb25maWcucGlwZWxpbmVOYW1lLFxuICAgICAgICBzeW50aCxcbiAgICAgICAgLi4udG9vbGNoYWluUGlucyhwcm9wcy5yZXNvbHZlZEJvb3RzdHJhcCwgY29kZVBpcGVsaW5lTWV0YWRhdGEpLFxuICAgICAgICAuLi5jb2RlUGlwZWxpbmVNZXRhZGF0YSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBSdW4tdGltZSB2dWxuZXJhYmlsaXR5IGNoZWNrIChvcHQtaW4gbWV0YWRhdGEgZmxhZywgcmVwb3J0LW9ubHkpLiBJdFxuICAgICAgLy8gbmVlZHMgdGhlIHBpcGVsaW5lIGlkICh0aGUgY2hlY2sgaXMgcGVyIHBpcGVsaW5lKSBhbmQgdGhlIG9yZyBwbGF0Zm9ybVxuICAgICAgLy8gc2VjcmV0ICh0aGUgdmVyaWZ5IHN0ZXAgYXV0aGVudGljYXRlcyB3aXRoIGl0KTsgd2l0aG91dCBlaXRoZXIgaXQgaXNcbiAgICAgIC8vIHNraXBwZWQgd2l0aCBhIHdhcm5pbmcg4oCUIGEgdmlzaWJpbGl0eSBmZWF0dXJlIG5ldmVyIGZhaWxzIGEgc3ludGguXG4gICAgICBsZXQgcnVudGltZVZ1bG5DaGVjayA9IGlzUnVudGltZVZ1bG5DaGVja0VuYWJsZWQodGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkKTtcbiAgICAgIGlmIChydW50aW1lVnVsbkNoZWNrICYmICghcHJvcHMucGlwZWxpbmVJZCB8fCAhcGxhdGZvcm1TZWNyZXROYW1lKSkge1xuICAgICAgICBjcmVhdGVMb2dnZXIoJ3BpcGVsaW5lLWJ1aWxkZXInKS53YXJuKFxuICAgICAgICAgIGAke1JVTlRJTUVfVlVMTl9DSEVDS19LRVl9IGlzIGVuYWJsZWQgYnV0IHRoZSBwaXBlbGluZSBoYXMgbm8gJHshcHJvcHMucGlwZWxpbmVJZCA/ICdwaXBlbGluZUlkJyA6ICdvcmdJZCd9IOKAlCBgXG4gICAgICAgICAgKyAnc2tpcHBpbmcgdGhlIHJ1bi10aW1lIGNoZWNrIHN0ZXBzLiBTeW50aGVzaXplIHRocm91Z2ggYHBpcGVsaW5lLW1hbmFnZXIgcGlwZWxpbmUgc3ludGgvZGVwbG95IC0taWRgLicsXG4gICAgICAgICk7XG4gICAgICAgIHJ1bnRpbWVWdWxuQ2hlY2sgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLnN0YWdlcykge1xuICAgICAgICBjb25zdCBzdGFnZUJ1aWxkZXIgPSBuZXcgU3RhZ2VCdWlsZGVyKHtcbiAgICAgICAgICBzY29wZTogdGhpcyxcbiAgICAgICAgICBwbHVnaW5Mb29rdXAsXG4gICAgICAgICAgdW5pcXVlSWQsXG4gICAgICAgICAgZ2xvYmFsTWV0YWRhdGE6IHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZCxcbiAgICAgICAgICBkZWZhdWx0Q29tcHV0ZVR5cGUsXG4gICAgICAgICAgYXJ0aWZhY3RNYW5hZ2VyLFxuICAgICAgICAgIG9yZ0lkOiBwcm9wcy5vcmdJZCxcbiAgICAgICAgICBkZWZhdWx0QnVpbGRJbWFnZSxcbiAgICAgICAgICBwaXBlbGluZVNjb3BlLFxuICAgICAgICAgIHN0ZXBNYW5pZmVzdCxcbiAgICAgICAgICAuLi4ocnVudGltZVZ1bG5DaGVjayAmJiBwbGF0Zm9ybVNlY3JldE5hbWUgJiYgeyBydW50aW1lVnVsbkNoZWNrOiB7IHBsYXRmb3JtU2VjcmV0TmFtZSB9IH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgc3RhZ2VCdWlsZGVyLmFkZFN0YWdlcyh0aGlzLnBpcGVsaW5lLCBwcm9wcy5zdGFnZXMpO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgVGFncyDilIDilIBcbiAgICAgIC8vIFRoZSBmaXJzdCB0aHJlZSBhcmUgb3BlcmF0aW9ucy1lc3NlbnRpYWwgYW5kIHVzZWQgYnkgYHBpcGVsaW5lLW1hbmFnZXJcbiAgICAgIC8vIGF1ZGl0IHN0YWNrc2AgdG8gZGlmZiBDRk4gc3RhY2tzIGFnYWluc3QgdGhlIHBpcGVsaW5lX3JlZ2lzdHJ5IHRhYmxlLlxuICAgICAgLy8gYE9yZ0lkYCBpcyB0aGUgY2Fub25pY2FsIGtleSBmb3IgY29zdCBhdHRyaWJ1dGlvbiAoQVdTIENvc3QgRXhwbG9yZXJcbiAgICAgIC8vIGdyb3VwcyBieSB0YWcga2V5L3ZhbHVlIHdoZW4gYWN0aXZhdGVkIGluIEJpbGxpbmcgc2V0dGluZ3MpLlxuICAgICAgLy8gVVNFUiBUQUdTIEZJUlNULCBzbyB0aGUgcGxhdGZvcm0gdGFncyBiZWxvdyBvdmVyd3JpdGUgcmF0aGVyIHRoYW4gYXJlXG4gICAgICAvLyBvdmVyd3JpdHRlbi4gYFRhZ3Mub2ZgIGxldHMgYSBsYXRlciBhZGQgcmVwbGFjZSBhbiBlYXJsaWVyIG9uZSwgYW5kXG4gICAgICAvLyB0aGVzZSB1c2VkIHRvIGJlIGFwcGxpZWQgTEFTVCDigJQgd2hpY2ggbGV0IGEgY2FsbGVyIHJlZGVmaW5lXG4gICAgICAvLyBwYi5waXBlbGluZS1pZCwgT3JnSWQgb3IgcGIuZGVwbG95cyBhbmQgcG9pbnQgYW5vdGhlciBvcmcncyBleGVjdXRpb25zXG4gICAgICAvLyBhdCB0aGVpciBvd24gcGlwZWxpbmUsIHNpbmNlIHRoZSBldmVudHMgTGFtYmRhIHJlYWRzIGV4YWN0bHkgdGhvc2UgdGFnc1xuICAgICAgLy8gdG8gZGVjaWRlIHdob3NlIHJlcG9ydHMgYW4gZXhlY3V0aW9uIGJlbG9uZ3MgdG8uXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHJlc2VydmVkLWtleSBmaWx0ZXIgaXMgdGhlIHNlY29uZCBoYWxmOiBvcmRlcmluZyBhbG9uZSB3b3VsZCBsZXQgYVxuICAgICAgLy8gY2FsbGVyIHNldCBgcGIuZGVwbG95c2Agb24gYSBwaXBlbGluZSB0aGF0IGRlY2xhcmVzIG5vIGVudmlyb25tZW50IChub1xuICAgICAgLy8gcGxhdGZvcm0gdGFnIHRvIG92ZXJ3cml0ZSBpdCkuIFRoZSBBUEkgcmVmdXNlcyB0aGVzZSBrZXlzIHRvbywgYnV0IGFcbiAgICAgIC8vIHRlYW0gdXNpbmcgdGhpcyBjb25zdHJ1Y3QgZGlyZWN0bHkgbmV2ZXIgcGFzc2VzIHRocm91Z2ggdGhlIEFQSSwgc29cbiAgICAgIC8vIHRoaXMgaXMgdGhlIGNoZWNrIHRoYXQgYWx3YXlzIHJ1bnMuXG4gICAgICBpZiAocHJvcHMudGFncykge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcy50YWdzKSkge1xuICAgICAgICAgIGlmIChpc1Jlc2VydmVkVGFnS2V5KGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgIFRhZ3Mub2YodGhpcy5waXBlbGluZSkuYWRkKGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBUYWdzLm9mKHRoaXMucGlwZWxpbmUpLmFkZCgncGlwZWxpbmUtYnVpbGRlcicsICd0cnVlJyk7XG4gICAgICBUYWdzLm9mKHRoaXMucGlwZWxpbmUpLmFkZCgncHJvamVjdCcsIHRoaXMuY29uZmlnLnByb2plY3QpO1xuICAgICAgVGFncy5vZih0aGlzLnBpcGVsaW5lKS5hZGQoJ29yZ2FuaXphdGlvbicsIHRoaXMuY29uZmlnLm9yZ2FuaXphdGlvbik7XG4gICAgICBpZiAocHJvcHMub3JnSWQpIHtcbiAgICAgICAgVGFncy5vZih0aGlzLnBpcGVsaW5lKS5hZGQoJ09yZ0lkJywgcHJvcHMub3JnSWQpO1xuICAgICAgfVxuICAgICAgLy8gU3RhYmxlIGV2ZW50LXJlcG9ydGluZyBrZXkuIEFwcGxpZWQgYXQgc3ludGggKHRoZSBwaXBlbGluZUlkIGlzIGtub3duXG4gICAgICAvLyBoZXJlKSwgc28gaXQncyBwcmVzZW50IGZyb20gc3RhY2sgY3JlYXRpb24g4oCUIHRoZSBldmVudHMgTGFtYmRhIHJlYWRzIHRoaXNcbiAgICAgIC8vIHRhZyB0byBhdHRyaWJ1dGUgQ29kZVBpcGVsaW5lIHN0YXRlLWNoYW5nZSBldmVudHMgdG8gdGhlIHBpcGVsaW5lIHdpdGhvdXRcbiAgICAgIC8vIGV2ZXIgaGFuZGxpbmcgdGhlIEFSTi9hY2NvdW50LiBTZWUgcGFja2FnZXMvcGlwZWxpbmUtZXZlbnRzLlxuICAgICAgaWYgKHByb3BzLnBpcGVsaW5lSWQpIHtcbiAgICAgICAgVGFncy5vZih0aGlzLnBpcGVsaW5lKS5hZGQoJ3BiLnBpcGVsaW5lLWlkJywgcHJvcHMucGlwZWxpbmVJZCk7XG4gICAgICB9XG4gICAgICAvLyBEZXBsb3ktZW52aXJvbm1lbnQgYXR0cmlidXRpb24gZm9yIERPUkEgbWV0cmljcy4gYHBiLmRlcGxveXNgIGxpc3RzIGV2ZXJ5XG4gICAgICAvLyBkZXBsb3kgc3RhZ2UgYXMgYDxzdGFnZU5hbWU+OjxlbnZpcm9ubWVudD5gIHBhaXJzIGpvaW5lZCBieSBgK2AsIHJlYWQgYnlcbiAgICAgIC8vIHRoZSBldmVudHMgTGFtYmRhIGZyb20gdGhlIHNhbWUgTGlzdFRhZ3MgY2FsbCB0byBtYXJrIHdoaWNoIHN0YWdlcyBhcmVcbiAgICAgIC8vIGRlcGxveXMgYW5kIHRvIHdoaWNoIGVudmlyb25tZW50LiBBYnNlbnQgd2hlbiBubyBlbnZpcm9ubWVudCBpcyBkZWNsYXJlZFxuICAgICAgLy8g4oCUIHN1Y2ggcGlwZWxpbmVzIHByb2R1Y2Ugbm8gRE9SQSBkZXBsb3kgc2lnbmFsIHVudGlsIHRoZXkgcmUtc3ludGguXG4gICAgICBjb25zdCBkZXBsb3lzVGFnID0gYnVpbGREZXBsb3lzVGFnKHByb3BzKTtcbiAgICAgIGlmIChkZXBsb3lzVGFnKSB7XG4gICAgICAgIFRhZ3Mub2YodGhpcy5waXBlbGluZSkuYWRkKCdwYi5kZXBsb3lzJywgZGVwbG95c1RhZyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEJ1aWxkIHRoZSBpbnRlcm5hbCBwaXBlbGluZSBiZWZvcmUgYWNjZXNzaW5nIGl0cyBwcm9wZXJ0aWVzXG4gICAgICB0aGlzLnBpcGVsaW5lLmJ1aWxkUGlwZWxpbmUoKTtcblxuICAgICAgLy8gUExBVEZPUk1fU0VDUkVUX05BTUUgaXMgaW5qZWN0ZWQgaW50byB0aGUgQ29kZUJ1aWxkIGVudmlyb25tZW50IGFib3ZlLFxuICAgICAgLy8gYnV0IHRoZSBzeW50aCBwcm9jZXNzIHJlYWRzIHRoYXQgc2VjcmV0IGl0c2VsZiB3aXRoIHRoZSBBV1MgU0RLXG4gICAgICAvLyAoaGFuZGxlcnMvcGxhdGZvcm0tY3JlZGVudGlhbC50cyBHZXRTZWNyZXRWYWx1ZSkg4oCUIHNvIHRoZSByb2xlIG5lZWRzIGFuXG4gICAgICAvLyBleHBsaWNpdCBncmFudC4gTm90aGluZyB3YXMgZ3JhbnRpbmcgaXQ6IHRoZSBSRUdJU1RSWSBzZWNyZXQgd29ya3Mgb25seVxuICAgICAgLy8gYmVjYXVzZSBgTGludXhCdWlsZEltYWdlLmZyb21Eb2NrZXJSZWdpc3RyeSh7IHNlY3JldHNNYW5hZ2VyQ3JlZGVudGlhbHMgfSlgXG4gICAgICAvLyBtYWtlcyBDREsgZ3JhbnQgdGhhdCBvbmUgaW50ZXJuYWxseSwgd2hpY2ggZG9lcyBub3QgZ2VuZXJhbGlzZSB0byBhXG4gICAgICAvLyBzZWNyZXQgdGhlIGJ1aWxkIHJlYWRzIGZvciBpdHNlbGYuIFdpdGhvdXQgdGhpcyBldmVyeSBzeW50aCBmYWlscyB3aXRoXG4gICAgICAvLyBBY2Nlc3NEZW5pZWRFeGNlcHRpb24gb24gR2V0U2VjcmV0VmFsdWUsIGFuZCB0aGUgcGlwZWxpbmUgcm9sZSBoYXMgdG8gYmVcbiAgICAgIC8vIHBhdGNoZWQgYnkgaGFuZCBpbiBlYWNoIGFjY291bnQuXG4gICAgICAvL1xuICAgICAgLy8gU2NvcGVkIHRvIHRoaXMgb3JnJ3MgcGxhdGZvcm0gc2VjcmV0IGFuZCBtaXJyb3JpbmcgdGhlIHBsdWdpbi1sb29rdXBcbiAgICAgIC8vIExhbWJkYSdzIGdyYW50IChwaXBlbGluZS9wbHVnaW4tbG9va3VwLnRzKSwgaW5jbHVkaW5nIHRoZSBgLSpgIHN1ZmZpeCDigJRcbiAgICAgIC8vIFNlY3JldHMgTWFuYWdlciBhcHBlbmRzIHNpeCByYW5kb20gY2hhcmFjdGVycyB0byBldmVyeSBBUk4uXG4gICAgICBpZiAocGxhdGZvcm1TZWNyZXROYW1lKSB7XG4gICAgICAgIHRoaXMucGlwZWxpbmUuc3ludGhQcm9qZWN0LmFkZFRvUm9sZVBvbGljeShuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICBhY3Rpb25zOiBbJ3NlY3JldHNtYW5hZ2VyOkdldFNlY3JldFZhbHVlJ10sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbYGFybjphd3M6c2VjcmV0c21hbmFnZXI6KjoqOnNlY3JldDoke3BsYXRmb3JtU2VjcmV0TmFtZX0tKmBdLFxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICAvLyBTYW1lIGdyYW50IGZvciB0aGUgcmVnaXN0cmF0aW9uIGtleSwgYW5kIG9uIHRoZSBTWU5USCBwcm9qZWN0IG9ubHk6IGl0XG4gICAgICAvLyBpcyB0aGUgb25lIHN0ZXAgdGhhdCByZWdpc3RlcnMuIEl0cyBOQU1FIHJpZGVzIHRoZSBwaXBlbGluZS13aWRlXG4gICAgICAvLyBlbnZpcm9ubWVudCAocmVzb2x2ZURlZmF1bHRzKSwgbm90IGEgU0VDUkVUU19NQU5BR0VSIHZhcmlhYmxlLCBzbyBhXG4gICAgICAvLyBtaXNzaW5nIGtleSBza2lwcyB0aGUgcmVnaXN0cmF0aW9uIHdpdGggYSB3YXJuaW5nIGluc3RlYWQgb2YgZmFpbGluZ1xuICAgICAgLy8gdGhlIGJ1aWxkIGF0IERPV05MT0FEX1NPVVJDRSDigJQgYW5kIGEgc3RlcCB3aXRob3V0IHRoaXMgZ3JhbnQgY2Fubm90XG4gICAgICAvLyByZWFkIGl0LlxuICAgICAgaWYgKHJlZ2lzdHJhdGlvblNlY3JldE5hbWUpIHtcbiAgICAgICAgdGhpcy5waXBlbGluZS5zeW50aFByb2plY3QuYWRkVG9Sb2xlUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIGFjdGlvbnM6IFsnc2VjcmV0c21hbmFnZXI6R2V0U2VjcmV0VmFsdWUnXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtgYXJuOmF3czpzZWNyZXRzbWFuYWdlcjoqOio6c2VjcmV0OiR7cmVnaXN0cmF0aW9uU2VjcmV0TmFtZX0tKmBdLFxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNka1BpcGVsaW5lID0gdGhpcy5waXBlbGluZS5waXBlbGluZTtcbiAgICAgIHRoaXMuc3RlcE1hbmlmZXN0ID0gc3RlcE1hbmlmZXN0LmVudHJpZXMoY2RrUGlwZWxpbmUpO1xuICAgICAgY29uc3QgbWV0YSA9IHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZDtcblxuICAgICAgLy8g4pSA4pSAIFBpcGVsaW5lLWxldmVsIFZhcmlhYmxlcyAoQ29kZVBpcGVsaW5lIFYyKSDilIDilIBcbiAgICAgIGZvciAoY29uc3QgdiBvZiBwYXJzZVBpcGVsaW5lVmFyaWFibGVzKG1ldGFbTWV0YWRhdGFLZXlzLlBJUEVMSU5FX1ZBUklBQkxFU10pKSB7XG4gICAgICAgIGNka1BpcGVsaW5lLmFkZFZhcmlhYmxlKG5ldyBWYXJpYWJsZSh7XG4gICAgICAgICAgdmFyaWFibGVOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgLi4uKHYuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgeyBkZWZhdWx0VmFsdWU6IHYuZGVmYXVsdFZhbHVlIH0pLFxuICAgICAgICAgIC4uLih2LmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgJiYgeyBkZXNjcmlwdGlvbjogdi5kZXNjcmlwdGlvbiB9KSxcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgU05TIE5vdGlmaWNhdGlvbnMg4pSA4pSAXG4gICAgICBjb25zdCBub3RpZmljYXRpb25Ub3BpY0FybiA9IG1ldGFbTWV0YWRhdGFLZXlzLk5PVElGSUNBVElPTl9UT1BJQ19BUk5dO1xuICAgICAgaWYgKHR5cGVvZiBub3RpZmljYXRpb25Ub3BpY0FybiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgdG9waWMgPSBzbnMuVG9waWMuZnJvbVRvcGljQXJuKHRoaXMsICdOb3RpZmljYXRpb25Ub3BpYycsIG5vdGlmaWNhdGlvblRvcGljQXJuKTtcbiAgICAgICAgY29uc3Qgbm90aWZpY2F0aW9uRXZlbnRzID0gcGFyc2VOb3RpZmljYXRpb25FdmVudHMobWV0YVtNZXRhZGF0YUtleXMuTk9USUZJQ0FUSU9OX0VWRU5UU10pXG4gICAgICAgICAgLm1hcChlID0+IFBJUEVMSU5FX0VWRU5UX01BUFtlLnRvVXBwZXJDYXNlKCldKVxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIGlmIChub3RpZmljYXRpb25FdmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNka1BpcGVsaW5lLm5vdGlmeU9uKCdQaXBlbGluZU5vdGlmaWNhdGlvbicsIHRvcGljLCB7IGV2ZW50czogbm90aWZpY2F0aW9uRXZlbnRzIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgCBTY2hlZHVsZWQgRXhlY3V0aW9uIOKUgOKUgFxuICAgICAgaWYgKHByb3BzLnN5bnRoLnNvdXJjZS5vcHRpb25zPy50cmlnZ2VyID09PSBUcmlnZ2VyVHlwZS5TQ0hFRFVMRSB8fCBwcm9wcy5zY2hlZHVsZSkge1xuICAgICAgICBjb25zdCBleHByID0gcHJvcHMuc2NoZWR1bGUgfHwgKHByb3BzLnN5bnRoLnNvdXJjZS5vcHRpb25zIGFzIHsgc2NoZWR1bGU/OiBzdHJpbmcgfSk/LnNjaGVkdWxlIHx8ICdyYXRlKDEgZGF5KSc7XG4gICAgICAgIG5ldyBldmVudHMuUnVsZSh0aGlzLCAnU2NoZWR1bGVSdWxlJywge1xuICAgICAgICAgIHNjaGVkdWxlOiBldmVudHMuU2NoZWR1bGUuZXhwcmVzc2lvbihleHByKSxcbiAgICAgICAgICB0YXJnZXRzOiBbbmV3IHRhcmdldHMuQ29kZVBpcGVsaW5lKGNka1BpcGVsaW5lKV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgRXhlY3V0aW9uIEV2ZW50IFRyYWNraW5nIChmb3J3YXJkIHBpcGVsaW5lIHN0YXRlIGNoYW5nZXMgdG8gU05TKSDilIDilIBcbiAgICAgIC8vIGBpc1RydWVgLCBub3QgdHJ1dGhpbmVzczogYFwiZmFsc2VcImAgaXMgYSB0cnV0aHkgc3RyaW5nLCBzbyB0aGUgbWV0YWRhdGFcbiAgICAgIC8vIGBcImF3czpjZGs6b3BlcmF0aW9uczpleGVjdXRpb25ldmVudHNcIjogXCJmYWxzZVwiYCB1c2VkIHRvIENSRUFURSB0aGUgcnVsZS5cbiAgICAgIGlmIChpc1RydWUobWV0YVtNZXRhZGF0YUtleXMuRU5BQkxFX0VYRUNVVElPTl9FVkVOVFNdKSAmJiB0eXBlb2Ygbm90aWZpY2F0aW9uVG9waWNBcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG5ldyBldmVudHMuUnVsZSh0aGlzLCAnRXhlY3V0aW9uRXZlbnRSdWxlJywge1xuICAgICAgICAgIGV2ZW50UGF0dGVybjoge1xuICAgICAgICAgICAgc291cmNlOiBbJ2F3cy5jb2RlcGlwZWxpbmUnXSxcbiAgICAgICAgICAgIGRldGFpbFR5cGU6IFsnQ29kZVBpcGVsaW5lIFBpcGVsaW5lIEV4ZWN1dGlvbiBTdGF0ZSBDaGFuZ2UnXSxcbiAgICAgICAgICAgIHJlc291cmNlczogW2Nka1BpcGVsaW5lLnBpcGVsaW5lQXJuXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRhcmdldHM6IFtuZXcgdGFyZ2V0cy5TbnNUb3BpYyhcbiAgICAgICAgICAgIHNucy5Ub3BpYy5mcm9tVG9waWNBcm4odGhpcywgJ0V4ZWN1dGlvbkV2ZW50VG9waWMnLCBub3RpZmljYXRpb25Ub3BpY0FybiksXG4gICAgICAgICAgKV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgUGlwZWxpbmUgTWV0cmljcyAmIEFsYXJtcyDilIDilIBcbiAgICAgIC8vIFNhbWUgdHJhcDogYFwiYXdzOmNkazpvcGVyYXRpb25zOm1ldHJpY3NcIjogXCJmYWxzZVwiYCBjcmVhdGVkIHRoZSBhbGFybS5cbiAgICAgIGNvbnN0IGVuYWJsZU1ldHJpY3MgPSBpc1RydWUodGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkW01ldGFkYXRhS2V5cy5FTkFCTEVfTUVUUklDU10pO1xuICAgICAgaWYgKGVuYWJsZU1ldHJpY3MpIHtcbiAgICAgICAgbmV3IGNsb3Vkd2F0Y2guQWxhcm0odGhpcywgJ1BpcGVsaW5lRmFpbHVyZUFsYXJtJywge1xuICAgICAgICAgIG1ldHJpYzogbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgICAgICAgIG5hbWVzcGFjZTogJ0FXUy9Db2RlUGlwZWxpbmUnLFxuICAgICAgICAgICAgbWV0cmljTmFtZTogJ0ZhaWxlZFBpcGVsaW5lRXhlY3V0aW9uQ291bnQnLFxuICAgICAgICAgICAgZGltZW5zaW9uc01hcDogeyBQaXBlbGluZU5hbWU6IHRoaXMuY29uZmlnLnBpcGVsaW5lTmFtZSB9LFxuICAgICAgICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICAgICAgICAgIHBlcmlvZDogRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDEsXG4gICAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYFBpcGVsaW5lICR7dGhpcy5jb25maWcucGlwZWxpbmVOYW1lfSBleGVjdXRpb24gZmFpbGVkYCxcbiAgICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGNsb3Vkd2F0Y2guQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTF9UT19USFJFU0hPTEQsXG4gICAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLk5PVF9CUkVBQ0hJTkcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSZXZlcnQgdGhlIHBlci1idWlsZGVyIHJlZ2lzdHJ5IG92ZXJyaWRlIHNvIGl0IG5ldmVyIGxlYWtzIGludG8gdGhlXG4gICAgICAvLyBwcm9jZXNzLXdpZGUgQ29uZmlnIGNhY2hlIChzZWUgdGhlIG92ZXJyaWRlIGF0IHRoZSB0b3Agb2YgdGhlIGNvbnN0cnVjdG9yKS5cbiAgICAgIHJlc3RvcmVSZWdpc3RyeT8uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY3VzdG9tIGFydGlmYWN0IGJ1Y2tldCB3aGVuIGBlbmNyeXB0aW9uLmttc0tleUFybmAgYW5kL29yXG4gICAqIGBvcGVyYXRpb25zLmFydGlmYWN0UmV0ZW50aW9uRGF5c2AgYXJlIHNldC4gUmV0dXJucyB1bmRlZmluZWQgb3RoZXJ3aXNlIHNvXG4gICAqIENESyBhdXRvLWNyZWF0ZXMgdGhlIGRlZmF1bHQgYXJ0aWZhY3QgYnVja2V0ICh1bmNoYW5nZWQgYmVoYXZpb3IpLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEFydGlmYWN0QnVja2V0KCk6IHMzLklCdWNrZXQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQ7XG4gICAgY29uc3Qga21zS2V5QXJuID0gdHlwZW9mIG1ldGFbTWV0YWRhdGFLZXlzLktNU19LRVlfQVJOXSA9PT0gJ3N0cmluZydcbiAgICAgID8gKG1ldGFbTWV0YWRhdGFLZXlzLktNU19LRVlfQVJOXSBhcyBzdHJpbmcpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXRlbnRpb25EYXlzID0gYXNJbnQobWV0YVtNZXRhZGF0YUtleXMuQVJUSUZBQ1RfUkVURU5USU9OX0RBWVNdKTtcblxuICAgIGlmICgha21zS2V5QXJuICYmIHJldGVudGlvbkRheXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBrbXNLZXlBcm5cbiAgICAgID8ga21zLktleS5mcm9tS2V5QXJuKHRoaXMsICdBcnRpZmFjdEtleScsIGttc0tleUFybilcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgYnVja2V0ID0gbmV3IHMzLkJ1Y2tldCh0aGlzLCAnQXJ0aWZhY3RCdWNrZXQnLCB7XG4gICAgICBlbmNyeXB0aW9uOiBlbmNyeXB0aW9uS2V5ID8gczMuQnVja2V0RW5jcnlwdGlvbi5LTVMgOiBzMy5CdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQsXG4gICAgICAuLi4oZW5jcnlwdGlvbktleSAmJiB7IGVuY3J5cHRpb25LZXkgfSksXG4gICAgICAuLi4ocmV0ZW50aW9uRGF5cyAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IFt7IGV4cGlyYXRpb246IER1cmF0aW9uLmRheXMocmV0ZW50aW9uRGF5cykgfV0sXG4gICAgICB9KSxcbiAgICAgIGVuZm9yY2VTU0w6IHRydWUsXG4gICAgICBibG9ja1B1YmxpY0FjY2VzczogczMuQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgfSk7XG4gICAgVGFncy5vZihidWNrZXQpLmFkZCgncGlwZWxpbmUnLCB0aGlzLmNvbmZpZy5waXBlbGluZU5hbWUpO1xuICAgIHJldHVybiBidWNrZXQ7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgQ29kZUJ1aWxkRGVmYXVsdHMgaW50byB0aGUgc2hhcGUgZXhwZWN0ZWQgYnkgQ0RLJ3MgY29kZUJ1aWxkRGVmYXVsdHMuXG4gICAqIENvbWJpbmVzIG5ldHdvcmsgY29uZmlnLCBzZWN1cml0eSBncm91cHMsIGFuZCBwaXBlbGluZS1sZXZlbCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICogKFBJUEVMSU5FX0lELCBFWEVDVVRJT05fSUQsIFBMQVRGT1JNX0JBU0VfVVJMKSBhdmFpbGFibGUgdG8gYWxsIENvZGVCdWlsZCBhY3Rpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlRGVmYXVsdHMoXG4gICAgZGVmYXVsdHM6IENvZGVCdWlsZERlZmF1bHRzIHwgdW5kZWZpbmVkLFxuICAgIGlkOiBVbmlxdWVJZCxcbiAgICBwaXBlbGluZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcGxhdGZvcm1TZWNyZXROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcGxhdGZvcm1Vcmw6IHN0cmluZyxcbiAgICBvcmdJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRCdWlsZEltYWdlOiBJQnVpbGRJbWFnZSxcbiAgKTogQ29kZUJ1aWxkT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gUGVyLXBpcGVsaW5lIG5ldHdvcmsgY29uZmlnIHdpbnM7IG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gYW4gZW52LWRyaXZlblxuICAgIC8vIGdsb2JhbCBWUEMgKGludGVybmFsIC8gaW5zaWRlLUFXUy1vbmx5IG1vZGUpIHNvIGV2ZXJ5IHBpcGVsaW5lJ3NcbiAgICAvLyBDb2RlQnVpbGQgcnVucyBpbiB0aGUgVlBDIGFuZCBjYW4gcmVhY2ggdGhlIHByaXZhdGUgZ2F0ZXdheS4gVW5zZXQgaW5cbiAgICAvLyBwdWJsaWMgZGVwbG95cyDihpIgQ29kZUJ1aWxkIHN0YXlzIGluIHRoZSBBV1MtbWFuYWdlZCBuZXR3b3JrLlxuICAgIC8vIFByZWNlZGVuY2U6IGV4cGxpY2l0IHByb3AgPiBgZWMyOm5ldHdvcmtgIG1ldGFkYXRhID4gZW52LWRyaXZlbiBnbG9iYWwgVlBDLlxuICAgIGNvbnN0IG5ldHdvcmsgPSBkZWZhdWx0cz8ubmV0d29yayA/PyBuZXR3b3JrQ29uZmlnRnJvbU1ldGFkYXRhKHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZCkgPz8gbmV0d29ya0NvbmZpZ0Zyb21FbnYoKTtcbiAgICBjb25zdCBuZXR3b3JrUHJvcHMgPSBuZXR3b3JrXG4gICAgICA/IHJlc29sdmVOZXR3b3JrKHRoaXMsIGlkLCBuZXR3b3JrKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBTYW1lIHByZWNlZGVuY2UgZm9yIHN0YW5kYWxvbmUgc2VjdXJpdHkgZ3JvdXBzIChwcm9wID4gYGVjMjpzZWN1cml0eWdyb3VwYCBtZXRhZGF0YSkuXG4gICAgY29uc3Qgc2VjdXJpdHlHcm91cENvbmZpZyA9IGRlZmF1bHRzPy5zZWN1cml0eUdyb3VwcyA/PyBzZWN1cml0eUdyb3VwQ29uZmlnRnJvbU1ldGFkYXRhKHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZCk7XG4gICAgY29uc3Qgc3RhbmRhbG9uZVNlY3VyaXR5R3JvdXBzID0gc2VjdXJpdHlHcm91cENvbmZpZ1xuICAgICAgPyByZXNvbHZlU2VjdXJpdHlHcm91cCh0aGlzLCBpZCwgc2VjdXJpdHlHcm91cENvbmZpZylcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY2FCdW5kbGUgPSBwbGF0Zm9ybUNhQnVuZGxlKCk7XG5cbiAgICAvLyBQaXBlbGluZS1sZXZlbCBlbnYgdmFycyBhdmFpbGFibGUgdG8gYWxsIENvZGVCdWlsZCBhY3Rpb25zXG4gICAgLy8gTm90ZTogI3tjb2RlcGlwZWxpbmUuKn0gcmVzb2x2ZWQgdmFyaWFibGVzIG11c3QgZ28gdGhyb3VnaCBDb2RlQnVpbGRTdGVwLmVudlxuICAgIC8vIChhY3Rpb24tbGV2ZWwpLCBub3QgYnVpbGRFbnZpcm9ubWVudC5lbnZpcm9ubWVudFZhcmlhYmxlcyAocHJvamVjdC1sZXZlbCkuXG4gICAgY29uc3QgcGlwZWxpbmVFbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiBzdHJpbmcgfT4gPSB7XG4gICAgICBQTEFURk9STV9CQVNFX1VSTDogeyB2YWx1ZTogcGxhdGZvcm1VcmwgfSxcbiAgICAgIC4uLihwaXBlbGluZUlkICYmIHsgUElQRUxJTkVfSUQ6IHsgdmFsdWU6IHBpcGVsaW5lSWQgfSB9KSxcbiAgICAgIC4uLihwbGF0Zm9ybVNlY3JldE5hbWUgJiYgeyBQTEFURk9STV9TRUNSRVRfTkFNRTogeyB2YWx1ZTogcGxhdGZvcm1TZWNyZXROYW1lIH0gfSksXG4gICAgICAvLyBUaGUgcmVnaXN0cmF0aW9uIGtleSdzIHNlY3JldCBOQU1FIChvbmx5IHRoZSBzeW50aCByb2xlIG1heSByZWFkIGl0KS5cbiAgICAgIC4uLihvcmdJZCAmJiB7IFtQSVBFTElORV9SRUdJU1RSQVRJT05fU0VDUkVUX0VOVl06IHsgdmFsdWU6IENvcmVDb25zdGFudHMuc2VjcmV0UGF0aChvcmdJZCwgUElQRUxJTkVfUkVHSVNUUkFUSU9OX1NFQ1JFVF9MRUFGKSB9IH0pLFxuICAgICAgLy8gUExBVEZPUk1fVExTX1ZFUklGWT1mYWxzZSAoZGV2IHNlbGYtc2lnbmVkIHBsYXRmb3JtKTogZXZlcnkgQ29kZUJ1aWxkXG4gICAgICAvLyBzdGVwIHJlYWNoZXMgdGhlIHBsYXRmb3JtIHVudmVyaWZpZWQuIFNlZSBjb3JlL3BsYXRmb3JtLXRscy50cy5cbiAgICAgIC4uLighcGxhdGZvcm1UbHNWZXJpZnkoKSAmJiB7XG4gICAgICAgIE5PREVfVExTX1JFSkVDVF9VTkFVVEhPUklaRUQ6IHsgdmFsdWU6ICcwJyB9LFxuICAgICAgICBbUExBVEZPUk1fVExTX1ZFUklGWV9FTlZdOiB7IHZhbHVlOiAnZmFsc2UnIH0sXG4gICAgICB9KSxcbiAgICAgIC8vIEEgcHJpdmF0ZS1DQSBwbGF0Zm9ybTogdGhlIENBIHRyYXZlbHMgd2l0aCB0aGUgcGlwZWxpbmUgc28gdGhlXG4gICAgICAvLyBzZWxmLW11dGF0aW5nIHN5bnRoIChhbmQgYW55IHN0ZXAgY2FsbGluZyB0aGUgcGxhdGZvcm0pIFZFUklGSUVTIHRoZVxuICAgICAgLy8gY2VydGlmaWNhdGUgaW5zdGVhZCBvZiBuZWVkaW5nIGAtLW5vLXZlcmlmeS1zc2xgLiBTZWUgY29yZS9wbGF0Zm9ybS10bHMudHMuXG4gICAgICAuLi4oY2FCdW5kbGUgJiYgeyBbUExBVEZPUk1fQ0FfQlVORExFX0VOVl06IHsgdmFsdWU6IGNhQnVuZGxlIH0gfSksXG4gICAgICAvLyBObyBpbWFnZSBjYXJyeTogdGhlIHNlbGYtbXV0YXRpbmcgc3ludGggcmUtcmVzb2x2ZXMgdGhlIHRvb2xjaGFpbiBmcm9tXG4gICAgICAvLyB0aGUgcGxhdGZvcm0gKHJlc29sdmVCb290c3RyYXBJbWFnZSksIHNvIGEgcmUtc3ludGggZm9sbG93cyB0aGVcbiAgICAgIC8vIHJlbGVhc2UgdGhlIHBsYXRmb3JtIHJlc29sdmVzIG9uIHRoYXQgcnVuLiBUaGUgcmVsZWFzZSBpcyByZWNvcmRlZFxuICAgICAgLy8gcGxhdGZvcm0tc2lkZSBpbiB0aGUgc3RlcCBtYW5pZmVzdCwgbmV2ZXIgaW4gdGhlIGN1c3RvbWVyJ3MgYWNjb3VudC5cbiAgICB9O1xuXG4gICAgY29uc3Qgc2VjdXJpdHlHcm91cHMgPSBbXG4gICAgICAuLi4obmV0d29ya1Byb3BzPy5zZWN1cml0eUdyb3VwcyA/PyBbXSksXG4gICAgICAuLi4oc3RhbmRhbG9uZVNlY3VyaXR5R3JvdXBzID8/IFtdKSxcbiAgICBdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLihuZXR3b3JrUHJvcHMgJiYgeyB2cGM6IG5ldHdvcmtQcm9wcy52cGMsIHN1Ym5ldFNlbGVjdGlvbjogbmV0d29ya1Byb3BzLnN1Ym5ldFNlbGVjdGlvbiB9KSxcbiAgICAgIC4uLihzZWN1cml0eUdyb3Vwcy5sZW5ndGggPiAwICYmIHsgc2VjdXJpdHlHcm91cHMgfSksXG4gICAgICAvLyBidWlsZEltYWdlIGF0IHRoaXMgbGV2ZWwgcmVhY2hlcyBDREsgUGlwZWxpbmVzJyBpbnRlcm5hbGx5LXdyYXBwZWRcbiAgICAgIC8vIFNoZWxsU3RlcCBDb2RlQnVpbGQgYWN0aW9uIGFuZCBhc3NldCBwdWJsaXNoaW5nLCB3aGljaCBvdGhlcndpc2UgcnVuXG4gICAgICAvLyBvbiBDREsncyBkZWZhdWx0IGN1cmF0ZWQgaW1hZ2UuIEl0IGlzIHRoZSByZWxlYXNlJ3MgcGlwZWxpbmUtYm9vdHN0cmFwLFxuICAgICAgLy8gcHVsbGVkIGV4YWN0bHkgbGlrZSBhIHBsdWdpbiBpbWFnZS4gUGVyLXN0ZXAgYGJ1aWxkSW1hZ2VgIG9uIGFcbiAgICAgIC8vIENvZGVCdWlsZFN0ZXAgc3RpbGwgd2luczsgc2VsZi1tdXRhdGlvbiBvdmVycmlkZXMgaXQgKGN1cmF0ZWQsIEQxMCkuXG4gICAgICBidWlsZEVudmlyb25tZW50OiB7XG4gICAgICAgIGJ1aWxkSW1hZ2U6IGRlZmF1bHRCdWlsZEltYWdlLFxuICAgICAgICBlbnZpcm9ubWVudFZhcmlhYmxlczogcGlwZWxpbmVFbnZWYXJzLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iXX0=
556
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtYnVpbGRlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BpcGVsaW5lL3BpcGVsaW5lLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNuRSxPQUFPLEtBQUssVUFBVSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQW9CLE1BQU0sMkJBQTJCLENBQUM7QUFDeEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRyxPQUFPLEtBQUssTUFBTSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sS0FBSyxPQUFPLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5RCxPQUFPLEtBQUssR0FBRyxNQUFNLHFCQUFxQixDQUFDO0FBQzNDLE9BQU8sS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekMsT0FBTyxLQUFLLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUF5QixNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFB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ZSxFQUFFLFlBQVksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM3RixHQUFHLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsQ0FBQztZQUNwRCxxRUFBcUU7WUFDckUsdUVBQXVFO1lBQ3ZFLDBFQUEwRTtZQUMxRSxpRUFBaUU7WUFDakUsdUVBQXVFO1lBQ3ZFLGdCQUFnQixFQUFFO2dCQUNoQixVQUFVLEVBQUUsaUJBQWlCO2dCQUM3QixvQkFBb0IsRUFBRSxlQUFlO2FBQ3RDO1NBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGEnO1xuaW1wb3J0IHsgRHVyYXRpb24sIFJlbW92YWxQb2xpY3ksIFN0YWNrLCBUYWdzIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgY2xvdWR3YXRjaCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgeyBCdWlsZFNwZWMsIHR5cGUgSUJ1aWxkSW1hZ2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29kZWJ1aWxkJztcbmltcG9ydCB7IFBpcGVsaW5lTm90aWZpY2F0aW9uRXZlbnRzLCBQaXBlbGluZVR5cGUsIFZhcmlhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVwaXBlbGluZSc7XG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgKiBhcyB0YXJnZXRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0cyc7XG5pbXBvcnQgeyBFZmZlY3QsIFBvbGljeVN0YXRlbWVudCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMga21zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1rbXMnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCAqIGFzIHNucyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc25zJztcbmltcG9ydCB7IENvZGVQaXBlbGluZSwgdHlwZSBDb2RlQnVpbGRPcHRpb25zIH0gZnJvbSAnYXdzLWNkay1saWIvcGlwZWxpbmVzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgZGVzY3JpYmVEZXBsb3lBdHRyaWJ1dGlvbiB9IGZyb20gJy4vZGVwbG95LWF0dHJpYnV0aW9uLmpzJztcbmltcG9ydCB7IFBpcGVsaW5lQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vcGlwZWxpbmUtY29uZmlndXJhdGlvbi5qcyc7XG5pbXBvcnQgeyBQbHVnaW5Mb29rdXAgfSBmcm9tICcuL3BsdWdpbi1sb29rdXAuanMnO1xuaW1wb3J0IHsgU291cmNlQnVpbGRlciB9IGZyb20gJy4vc291cmNlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgU3RhZ2VCdWlsZGVyIH0gZnJvbSAnLi9zdGFnZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IFN0ZXBNYW5pZmVzdFJlY29yZGVyIH0gZnJvbSAnLi9zdGVwLW1hbmlmZXN0LXJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VPcHRpb25zLCBTeW50aE9wdGlvbnMgfSBmcm9tICcuL3N0ZXAtdHlwZXMuanMnO1xuaW1wb3J0IHsgQ29uZmlnLCBDb3JlQ29uc3RhbnRzLCBpc1Jlc2VydmVkVGFnS2V5IH0gZnJvbSAnLi4vY29uZmlnL2FwcC1jb25maWcuanMnO1xuaW1wb3J0IHsgbGFtYmRhQXJjaGl0ZWN0dXJlLCBsYW1iZGFSdW50aW1lLCBsYW1iZGFUaW1lb3V0IH0gZnJvbSAnLi4vY29uZmlnL2F3cy1jb25maWctY2RrLmpzJztcbmltcG9ydCB0eXBlIHsgUmVnaXN0cnlDb25maWcgfSBmcm9tICcuLi9jb25maWcvY29uZmlnLXR5cGVzLmpzJztcbmltcG9ydCB7IEFydGlmYWN0TWFuYWdlciB9IGZyb20gJy4uL2NvcmUvYXJ0aWZhY3QtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBVbmlxdWVJZCB9IGZyb20gJy4uL2NvcmUvaWQtZ2VuZXJhdG9yLmpzJztcbmltcG9ydCB7XG4gIGFzSW50LFxuICBpc1RydWUsXG4gIG1ldGFkYXRhRm9yQ29kZVBpcGVsaW5lLFxuICBuZXR3b3JrQ29uZmlnRnJvbU1ldGFkYXRhLFxuICBwYXJzZVBpcGVsaW5lVmFyaWFibGVzLFxuICByb2xlQ29uZmlnRnJvbU1ldGFkYXRhLFxuICBzZWN1cml0eUdyb3VwQ29uZmlnRnJvbU1ldGFkYXRhLFxufSBmcm9tICcuLi9jb3JlL21ldGFkYXRhLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBDb2RlQnVpbGREZWZhdWx0cyB9IGZyb20gJy4uL2NvcmUvbmV0d29yay10eXBlcy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlTmV0d29yaywgbmV0d29ya0NvbmZpZ0Zyb21FbnYgfSBmcm9tICcuLi9jb3JlL25ldHdvcmsuanMnO1xuaW1wb3J0IHsgY3JlYXRlQ29kZUJ1aWxkU3RlcCwgY3VyYXRlZFNlbGZNdXRhdGlvbkltYWdlLCBnZXRDb21wdXRlVHlwZSwgcmVzb2x2ZURlZmF1bHRCdWlsZEltYWdlIH0gZnJvbSAnLi4vY29yZS9waXBlbGluZS1oZWxwZXJzLmpzJztcbmltcG9ydCB7IFBJUEVMSU5FX1JFR0lTVFJBVElPTl9TRUNSRVRfRU5WLCBQSVBFTElORV9SRUdJU1RSQVRJT05fU0VDUkVUX0xFQUYgfSBmcm9tICcuLi9jb3JlL3BpcGVsaW5lLXJlZ2lzdHJhdGlvbi5qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YUtleXMsIFRyaWdnZXJUeXBlIH0gZnJvbSAnLi4vY29yZS9waXBlbGluZS10eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1ldGFEYXRhVHlwZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtdHlwZXMuanMnO1xuaW1wb3J0IHsgUExBVEZPUk1fQ0FfQlVORExFX0VOViwgUExBVEZPUk1fVExTX1ZFUklGWV9FTlYsIHBsYXRmb3JtQ2FCdW5kbGUsIHBsYXRmb3JtVGxzVmVyaWZ5IH0gZnJvbSAnLi4vY29yZS9wbGF0Zm9ybS10bHMuanMnO1xuaW1wb3J0IHsgYXNzZXJ0UGx1Z2luQ29udHJhY3QsIGNvbnRyYWN0U2NvcGVGcm9tVGVtcGxhdGVTY29wZSwgcGx1Z2luQXJ0aWZhY3RBbGlhcywgcGx1Z2luU3RlcExhYmVsIH0gZnJvbSAnLi4vY29yZS9wbHVnaW4tY29udHJhY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlZEJvb3RzdHJhcCB9IGZyb20gJy4uL2NvcmUvcGx1Z2luLWxvb2t1cC1lbnZlbG9wZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJvbGVDb25maWcgfSBmcm9tICcuLi9jb3JlL3JvbGUtdHlwZXMuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVJvbGUgfSBmcm9tICcuLi9jb3JlL3JvbGUuanMnO1xuaW1wb3J0IHsgaXNSdW50aW1lVnVsbkNoZWNrRW5hYmxlZCwgUlVOVElNRV9WVUxOX0NIRUNLX0tFWSB9IGZyb20gJy4uL2NvcmUvcnVudGltZS1jaGVjay5qcyc7XG5pbXBvcnQgeyByZXNvbHZlU2VjdXJpdHlHcm91cCB9IGZyb20gJy4uL2NvcmUvc2VjdXJpdHktZ3JvdXAuanMnO1xuaW1wb3J0IHsgc2VsZk11dGF0aW9uUGFydGlhbEJ1aWxkU3BlYyB9IGZyb20gJy4uL2NvcmUvc2VsZi1tdXRhdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0ZXBNYW5pZmVzdEVudHJ5IH0gZnJvbSAnLi4vY29yZS9zdGVwLW1hbmlmZXN0LmpzJztcblxuY29uc3QgUElQRUxJTkVfRVZFTlRfTUFQOiBSZWNvcmQ8c3RyaW5nLCBQaXBlbGluZU5vdGlmaWNhdGlvbkV2ZW50cz4gPSB7XG4gIEZBSUxFRDogUGlwZWxpbmVOb3RpZmljYXRpb25FdmVudHMuUElQRUxJTkVfRVhFQ1VUSU9OX0ZBSUxFRCxcbiAgU1VDQ0VFREVEOiBQaXBlbGluZU5vdGlmaWNhdGlvbkV2ZW50cy5QSVBFTElORV9FWEVDVVRJT05fU1VDQ0VFREVELFxuICBTVEFSVEVEOiBQaXBlbGluZU5vdGlmaWNhdGlvbkV2ZW50cy5QSVBFTElORV9FWEVDVVRJT05fU1RBUlRFRCxcbiAgQ0FOQ0VMRUQ6IFBpcGVsaW5lTm90aWZpY2F0aW9uRXZlbnRzLlBJUEVMSU5FX0VYRUNVVElPTl9DQU5DRUxFRCxcbiAgU1VQRVJTRURFRDogUGlwZWxpbmVOb3RpZmljYXRpb25FdmVudHMuUElQRUxJTkVfRVhFQ1VUSU9OX1NVUEVSU0VERUQsXG59O1xuXG5mdW5jdGlvbiBwYXJzZU5vdGlmaWNhdGlvbkV2ZW50cyh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWUuc3BsaXQoJywnKS5tYXAocyA9PiBzLnRyaW0oKSk7XG4gIHJldHVybiBbJ0ZBSUxFRCcsICdTVUNDRUVERUQnXTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgYHBiLmRlcGxveXNgIHRhZyB2YWx1ZSBhbmQgZW1pdCB0aGUgc3ludGgtdGltZSB3YXJuaW5ncyB0aGF0IGNvbWVcbiAqIHdpdGggaXQuIFRoZSBkZXJpdmF0aW9uIGl0c2VsZiBpcyBDREstZnJlZSBhbmQgbGl2ZXMgaW5cbiAqIHtAbGluayBkZXNjcmliZURlcGxveUF0dHJpYnV0aW9ufSwgc28gYFBPU1QgL3BpcGVsaW5lc2AgYW5kXG4gKiBgUE9TVCAvcGlwZWxpbmVzL3ZhbGlkYXRlYCByZXBvcnQgdGhlIHNhbWUgYXR0cmlidXRpb24gd2l0aG91dCBzeW50aGVzaXppbmcuXG4gKlxuICogUmV0dXJucyB1bmRlZmluZWQgd2hlbiBub3RoaW5nIGRlY2xhcmVzIGFuIGVudmlyb25tZW50IChubyBkZXBsb3kgc2lnbmFsKS5cbiAqL1xuZnVuY3Rpb24gYnVpbGREZXBsb3lzVGFnKHByb3BzOiBCdWlsZGVyUHJvcHMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IGRlcGxveXNUYWcsIHdhcm5pbmdzIH0gPSBkZXNjcmliZURlcGxveUF0dHJpYnV0aW9uKHByb3BzKTtcbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCdwaXBlbGluZS1idWlsZGVyJyk7XG4gIGZvciAoY29uc3QgdyBvZiB3YXJuaW5ncykgbG9nLndhcm4ody5tZXNzYWdlKTtcbiAgcmV0dXJuIGRlcGxveXNUYWc7XG59XG5cblxuLyoqXG4gKiBUaGUgQ29kZVBpcGVsaW5lIHByb3BzIGEgdG9vbGNoYWluIHJlbGVhc2UgcGlucyAowqczLCBEMTApOlxuICogIC0gYGNsaVZlcnNpb25gIC8gYGNka0Fzc2V0c0NsaVZlcnNpb25gIOKAlCB0aGUgcmVsZWFzZSdzIGBhd3NDZGtgIC9cbiAqICAgIGBjZGtBc3NldHNgLCBzbyBTZWxmTXV0YXRlIGFuZCBhc3NldCBwdWJsaXNoaW5nIG5ldmVyIGluc3RhbGwgbnBtIGBsYXRlc3RgO1xuICogIC0gYHNlbGZNdXRhdGlvbkNvZGVCdWlsZERlZmF1bHRzYCDigJQgdGhlIGN1cmF0ZWQgaW1hZ2Ugd2l0aCBpdHMgTm9kZSBydW50aW1lXG4gKiAgICBwaW5uZWQgKGBydW50aW1lLXZlcnNpb25zLm5vZGVqc2ApLlxuICogQSB2YWx1ZSBzZXQgZXhwbGljaXRseSBpbiBwaXBlbGluZSBtZXRhZGF0YSByZXBsYWNlcyB0aGUgcGluICh0aGUgY2FsbGVyXG4gKiBzcHJlYWRzIHRoZSBtZXRhZGF0YSBhZnRlciB0aGVzZSkuIEEgcmVsZWFzZSB0aGF0IGRvZXNuJ3QgY2FycnkgYSBDTElcbiAqIHZlcnNpb24sIHdpdGggbm8gZXhwbGljaXQgbWV0YWRhdGEgZWl0aGVyLCBmYWlscyB0aGUgc3ludGguXG4gKi9cbmZ1bmN0aW9uIHRvb2xjaGFpblBpbnMoYm9vdHN0cmFwOiBSZXNvbHZlZEJvb3RzdHJhcCwgZXhwbGljaXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KToge1xuICBjbGlWZXJzaW9uOiBzdHJpbmc7XG4gIGNka0Fzc2V0c0NsaVZlcnNpb246IHN0cmluZztcbiAgc2VsZk11dGF0aW9uQ29kZUJ1aWxkRGVmYXVsdHM6IENvZGVCdWlsZE9wdGlvbnM7XG59IHtcbiAgY29uc3QgeyByZWxlYXNlVmVyc2lvbiwgdmVyc2lvbnMgfSA9IGJvb3RzdHJhcC50b29sY2hhaW47XG4gIGNvbnN0IHBpY2sgPSAoa2V5OiAnY2xpVmVyc2lvbicgfCAnY2RrQXNzZXRzQ2xpVmVyc2lvbicsIHJlbGVhc2VkOiBzdHJpbmcgfCB1bmRlZmluZWQsIGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IG93biA9IGV4cGxpY2l0W2tleV07XG4gICAgaWYgKHR5cGVvZiBvd24gPT09ICdzdHJpbmcnICYmIG93bi5sZW5ndGggPiAwKSByZXR1cm4gb3duO1xuICAgIGlmIChyZWxlYXNlZCkgcmV0dXJuIHJlbGVhc2VkO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBCT09UU1RSQVBfSU1BR0VfVU5SRVNPTFZFRDogdG9vbGNoYWluIHJlbGVhc2UgJHtyZWxlYXNlVmVyc2lvbn0gY2FycmllcyBubyAke2xhYmVsfSB2ZXJzaW9uLCBzbyBcXGAke2tleX1cXGAgY2FuJ3QgYmUgcGlubmVkLiBgXG4gICAgICArIGBTZXQgaXQgZXhwbGljaXRseSBpbiBwaXBlbGluZSBtZXRhZGF0YSAoYXdzOmNkazpwaXBlbGluZXM6Y29kZXBpcGVsaW5lOiR7a2V5LnRvTG93ZXJDYXNlKCl9KSBvciByZS1yZXNvbHZlIHRoZSByZWxlYXNlLmAsXG4gICAgKTtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBjbGlWZXJzaW9uOiBwaWNrKCdjbGlWZXJzaW9uJywgdmVyc2lvbnMuYXdzQ2RrLCAnYXdzLWNkaycpLFxuICAgIGNka0Fzc2V0c0NsaVZlcnNpb246IHBpY2soJ2Nka0Fzc2V0c0NsaVZlcnNpb24nLCB2ZXJzaW9ucy5jZGtBc3NldHMsICdjZGstYXNzZXRzJyksXG4gICAgc2VsZk11dGF0aW9uQ29kZUJ1aWxkRGVmYXVsdHM6IHtcbiAgICAgIGJ1aWxkRW52aXJvbm1lbnQ6IHsgYnVpbGRJbWFnZTogY3VyYXRlZFNlbGZNdXRhdGlvbkltYWdlKCkgfSxcbiAgICAgIHBhcnRpYWxCdWlsZFNwZWM6IEJ1aWxkU3BlYy5mcm9tT2JqZWN0KHNlbGZNdXRhdGlvblBhcnRpYWxCdWlsZFNwZWMoKSksXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIHRoZSBQaXBlbGluZUJ1aWxkZXIgY29uc3RydWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRlclByb3BzIHtcbiAgLyoqIFByb2plY3QgaWRlbnRpZmllciAod2lsbCBiZSBzYW5pdGl6ZWQgdG8gbG93ZXJjYXNlIGFscGhhbnVtZXJpYyB3aXRoIHVuZGVyc2NvcmVzKSAqL1xuICByZWFkb25seSBwcm9qZWN0OiBzdHJpbmc7XG5cbiAgLyoqIE9yZ2FuaXphdGlvbiBpZGVudGlmaWVyICh3aWxsIGJlIHNhbml0aXplZCB0byBsb3dlcmNhc2UgYWxwaGFudW1lcmljIHdpdGggdW5kZXJzY29yZXMpICovXG4gIHJlYWRvbmx5IG9yZ2FuaXphdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZXBsb3kgZW52aXJvbm1lbnQgKGUuZy4gYHByb2R1Y3Rpb25gLCBgc3RhZ2luZ2ApIGZvciB0aGVcbiAgICogc2luZ2xlLWVudmlyb25tZW50IGNhc2UuIFdoZW4gc2V0IChhbmQgbm8gc3RhZ2UgZGVjbGFyZXMgaXRzIG93blxuICAgKiBgZW52aXJvbm1lbnRgKSwgcGlwZWxpbmUtY29yZSBkZXJpdmVzIHRoZSBgcGIuZGVwbG95c2AgdGFnIGZyb20gaXQsIG1hcmtpbmdcbiAgICogdGhlIHNvbGUgc3RhZ2Ug4oCUIG9yIHRoZSBMQVNUIHN0YWdlIG9mIGEgbXVsdGktc3RhZ2UgcGlwZWxpbmUgKHdpdGggYSBzeW50aFxuICAgKiB3YXJuaW5nKSwgb3IgYSBsaXRlcmFsIGBEZXBsb3lgIHN0YWdlIHdoZW4gdGhlcmUgYXJlIG5vIHN0YWdlcyB0byBuYW1lIOKAlCBhc1xuICAgKiB0aGUgZGVwbG95IGZvciBET1JBIG1ldHJpY3MuIEZvciBtdWx0aS1lbnZpcm9ubWVudCBwaXBlbGluZXMsIGRlY2xhcmVcbiAgICogYGVudmlyb25tZW50YCBwZXIgc3RhZ2UgaW5zdGVhZCAoc2VlIGBTdGFnZU9wdGlvbnMuZW52aXJvbm1lbnRgKS5cbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50Pzogc3RyaW5nO1xuXG4gIC8qKiBUZW5hbnQgaWRlbnRpZmllciBmb3IgcmVzb2x2aW5nIHBlci1vcmcgc2VjcmV0cyBmcm9tIEFXUyBTZWNyZXRzIE1hbmFnZXIgKi9cbiAgcmVhZG9ubHkgb3JnSWQ/OiBzdHJpbmc7XG5cbiAgLyoqIFBpcGVsaW5lIGRhdGFiYXNlIHJlY29yZCBJRCDigJQgaW5qZWN0ZWQgYXMgUElQRUxJTkVfSUQgZW52IHZhciBmb3IgYXV0b25vbW91cyBzeW50aCAqL1xuICByZWFkb25seSBwaXBlbGluZUlkPzogc3RyaW5nO1xuXG4gIC8qKiBPcHRpb25hbCBjdXN0b20gcGlwZWxpbmUgbmFtZS4gRGVmYXVsdHMgdG86IHtvcmdhbml6YXRpb259LXtwcm9qZWN0fS1waXBlbGluZSAqL1xuICByZWFkb25seSBwaXBlbGluZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqIEdsb2JhbCBtZXRhZGF0YSBpbmhlcml0ZWQgYnkgYWxsIHBpcGVsaW5lIHN0ZXBzICovXG4gIHJlYWRvbmx5IGdsb2JhbD86IE1ldGFEYXRhVHlwZTtcblxuICAvKipcbiAgICogUGlwZWxpbmUtbGV2ZWwgdGVtcGxhdGUgdmFyaWFibGVzLCBleHBvc2VkIHRvIGB7eyBwaXBlbGluZS52YXJzLiogfX1gIGluXG4gICAqIHBpcGVsaW5lIGNvbmZpZ3MgYW5kIHBsdWdpbiBzcGVjcyAoc2VlIGBQbHVnaW5TcGVjLnJlcXVpcmVkVmFyc2ApLiBEZWNsYXJlZFxuICAgKiBoZXJlIHNvIHRoZSBgcGlwZWxpbmUudmFyc2AgdGVtcGxhdGUgc2NvcGUgaXMgdHlwZS1jaGVja2VkIGVuZC10by1lbmQuXG4gICAqL1xuICByZWFkb25seSB2YXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFBpcGVsaW5lLWxldmVsIENvZGVCdWlsZCBkZWZhdWx0cyBhcHBsaWVkIHRvIGFsbCBDb2RlQnVpbGQgYWN0aW9uc1xuICAgKiAoc3ludGgsIHNlbGYtbXV0YXRpb24sIGFzc2V0IHB1Ymxpc2hpbmcpIHZpYSBgY29kZUJ1aWxkRGVmYXVsdHNgLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdHM/OiBDb2RlQnVpbGREZWZhdWx0cztcblxuICAvKipcbiAgICogT3B0aW9uYWwgSUFNIHJvbGUgZm9yIHRoZSBDb2RlUGlwZWxpbmUuXG4gICAqIFdoZW4gcHJvdmlkZWQsIHJlc29sdmVzIHRvIGEgQ0RLIElSb2xlIGFuZCBpcyBwYXNzZWQgdG8gdGhlIENvZGVQaXBlbGluZSBjb25zdHJ1Y3QuXG4gICAqIFdoZW4gb21pdHRlZCwgQ0RLIGF1dG8tY3JlYXRlcyBhIHJvbGUgd2l0aCB0aGUgY29ycmVjdCBjb2RlcGlwZWxpbmUuYW1hem9uYXdzLmNvbSBwcmluY2lwYWwuXG4gICAqL1xuICByZWFkb25seSByb2xlPzogUm9sZUNvbmZpZztcblxuICAvKiogU3ludGhlc2lzIGNvbmZpZ3VyYXRpb24gaW5jbHVkaW5nIHNvdXJjZSBhbmQgcGx1Z2luIGRldGFpbHMgKi9cbiAgcmVhZG9ubHkgc3ludGg6IFN5bnRoT3B0aW9ucztcblxuICAvKipcbiAgICogT3B0aW9uYWwgcGlwZWxpbmUgc3RhZ2VzLCBlYWNoIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgQ29kZUJ1aWxkIHN0ZXBzLlxuICAgKiBTdGFnZXMgYXJlIGFkZGVkIGFzIHdhdmVzIHRvIHRoZSBDb2RlUGlwZWxpbmUgYWZ0ZXIgdGhlIHN5bnRoIHN0ZXAuXG4gICAqL1xuICByZWFkb25seSBzdGFnZXM/OiBTdGFnZU9wdGlvbnNbXTtcblxuICAvKiogT3B0aW9uYWwgY3Jvbi9yYXRlIGV4cHJlc3Npb24gZm9yIHNjaGVkdWxlZCBwaXBlbGluZSBleGVjdXRpb24uICovXG4gIHJlYWRvbmx5IHNjaGVkdWxlPzogc3RyaW5nO1xuXG4gIC8qKiBDdXN0b20gdGFncyBhcHBsaWVkIHRvIGFsbCBwaXBlbGluZSByZXNvdXJjZXMuICovXG4gIHJlYWRvbmx5IHRhZ3M/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBQbHVnaW5zIHByZS1yZXNvbHZlZCBieSBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aGAgZnJvbSB0aGUgcGxhdGZvcm0gQVBJLFxuICAgKiBrZXllZCBieSBgYWxpYXMgfHwgbmFtZWAuIFdoZW4gcHJlc2VudCwgYFBsdWdpbkxvb2t1cC5wbHVnaW4oKWAgcmV0dXJuc1xuICAgKiB0aGUgbWF0Y2hpbmcgZW50cnkgZGlyZWN0bHkgYW5kIHNraXBzIHRoZSBjdXN0b20gcmVzb3VyY2Ug4oCUIHNvIHRoZVxuICAgKiBzeW50aGVzaXplZCBDRk4gdGVtcGxhdGUgc2hpcHMgd2l0aCB0aGUgcmVhbCBDb2RlQnVpbGQgaW1hZ2UgYmFrZWQgaW4uXG4gICAqIFBvcHVsYXRlZCBieSB0aGUgQ0xJIGJlZm9yZSBpbnZva2luZyB0aGUgYm9pbGVycGxhdGUgYXBwOyBDREsgY29uc3VtZXJzXG4gICAqIHdobyBjb25zdHJ1Y3QgUGlwZWxpbmVCdWlsZGVyIGRpcmVjdGx5IG5vcm1hbGx5IGxlYXZlIHRoaXMgdW5zZXQuXG4gICAqL1xuICByZWFkb25seSByZXNvbHZlZFBsdWdpbnM/OiBSZWNvcmQ8c3RyaW5nLCBQbHVnaW4+O1xuXG4gIC8qKlxuICAgKiBUaGUgdG9vbGNoYWluIHJlbGVhc2UgdGhpcyBwaXBlbGluZSBydW5zIG9uLCBwaW5uZWQgYnkgdGhlIHBpcGVsaW5lJ3Mgb3duXG4gICAqIGNvbmZpZyAoYHRvb2xjaGFpbi5yZWxlYXNlYCkuIEFic2VudCDih5IgdGhlIG9yZyBkZWZhdWx0LCBpdHMgY2FuYXJ5LCBvciB0aGVcbiAgICogcGxhdGZvcm0gZGVmYXVsdCDigJQgd2hpY2hldmVyIHRoZSBwbGF0Zm9ybSByZXNvbHZlcyAoRDcsIEQ4KS5cbiAgICovXG4gIHJlYWRvbmx5IHRvb2xjaGFpbj86IHsgcmVhZG9ubHkgcmVsZWFzZTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlZCBgcGlwZWxpbmUtYm9vdHN0cmFwYCBoYWxmIG9mIHRoZSBwaXBlbGluZSdzIHRvb2xjaGFpbiByZWxlYXNlXG4gICAqIChSRVFVSVJFRCkuIFBpbnMgdGhlIGRlZmF1bHQgQ29kZUJ1aWxkIGltYWdlIChgY29kZUJ1aWxkRGVmYXVsdHNgLFxuICAgKiBwbHVnaW4tbGVzcyBzdGVwcywgYXNzZXQgcHVibGlzaGluZykgYnkgaXRzIHNpZ25lZCBkaWdlc3QgYW5kIHN1cHBsaWVzIHRoZVxuICAgKiBDREsgQ0xJIChgY2xpVmVyc2lvbmApIGFuZCBgY2RrLWFzc2V0c2AgKGBjZGtBc3NldHNDbGlWZXJzaW9uYCkgdmVyc2lvbnMuXG4gICAqIGBwaXBlbGluZS1tYW5hZ2VyIHBpcGVsaW5lIHN5bnRoL2RlcGxveWAgcmVzb2x2ZXMgaXQgZnJvbSB0aGUgcGxhdGZvcm1cbiAgICogKGAvcGx1Z2lucy9sb29rdXBgLCBuYW1lIGBwaXBlbGluZS1ib290c3RyYXBgKTsgQ0RLIGNvbnN1bWVycyBidWlsZGluZ1xuICAgKiBQaXBlbGluZUJ1aWxkZXIgZGlyZWN0bHkgcGFzcyB0aGUgc2FtZSByZWNvcmQuIFRoZXJlIGlzIG5vIGZhbGxiYWNrIChEMikuXG4gICAqL1xuICByZWFkb25seSByZXNvbHZlZEJvb3RzdHJhcDogUmVzb2x2ZWRCb290c3RyYXA7XG5cbiAgLyoqXG4gICAqIFBsYXRmb3JtLXNvdXJjZWQgcmVnaXN0cnkgb3ZlcnJpZGVzLCBhcHBsaWVkIG92ZXIgdGhlIGVudi1sb2FkZWQgYHJlZ2lzdHJ5YFxuICAgKiBjb25maWcgYXQgc3ludGggc3RhcnQuIHBpcGVsaW5lLW1hbmFnZXIgcG9wdWxhdGVzIHRoaXMgZnJvbSB0aGUgcGxhdGZvcm0gVVJMXG4gICAqIGl0IGRlcGxveXMgYWdhaW5zdCBzbyB0aGUgQ29kZUJ1aWxkIGltYWdlIFVSSXMgdXNlIGEgcHVsbCBob3N0IEFXUyBDb2RlQnVpbGRcbiAgICogY2FuIHJlc29sdmUgKGluc3RlYWQgb2YgdGhlIGluLWNsdXN0ZXIgYHJlZ2lzdHJ5OjUwMDBgIGRlZmF1bHQpLiBDREtcbiAgICogY29uc3VtZXJzIGNvbnN0cnVjdGluZyBQaXBlbGluZUJ1aWxkZXIgZGlyZWN0bHkgbm9ybWFsbHkgbGVhdmUgdGhpcyB1bnNldC5cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lzdHJ5PzogUGFydGlhbDxSZWdpc3RyeUNvbmZpZz47XG59XG5cbi8qKlxuICogQ0RLIGNvbnN0cnVjdCB0aGF0IGNyZWF0ZXMgYW5kIGNvbmZpZ3VyZXMgYSBDb2RlUGlwZWxpbmUgZm9yIGNvbnRpbnVvdXMgZGVwbG95bWVudC5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gTXVsdGktc291cmNlIHN1cHBvcnQgKFMzLCBHaXRIdWIsIENvZGVTdGFyKVxuICogLSBQbHVnaW4tYmFzZWQgYnVpbGQgc3RlcHNcbiAqIC0gTWV0YWRhdGEtZHJpdmVuIGNvbmZpZ3VyYXRpb25cbiAqIC0gQXV0b21hdGljIHRhZ2dpbmdcbiAqIC0gQXV0b21hdGljIHNhbml0aXphdGlvbiBvZiBwcm9qZWN0IGFuZCBvcmdhbml6YXRpb24gbmFtZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogbmV3IFBpcGVsaW5lQnVpbGRlcih0aGlzLCAnTXlQaXBlbGluZScsIHtcbiAqICAgcHJvamVjdDogJ215LWFwcCcsXG4gKiAgIG9yZ2FuaXphdGlvbjogJ215LW9yZycsXG4gKiAgIHN5bnRoOiB7XG4gKiAgICAgc291cmNlOiB7XG4gKiAgICAgICB0eXBlOiAnZ2l0aHViJyxcbiAqICAgICAgIG9wdGlvbnM6IHsgcmVwbzogJ293bmVyL3JlcG8nLCBicmFuY2g6ICdtYWluJyB9XG4gKiAgICAgfSxcbiAqICAgICBwbHVnaW46IHsgbmFtZTogJ3N5bnRoJyB9XG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBQaXBlbGluZUJ1aWxkZXIgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgcGlwZWxpbmU6IENvZGVQaXBlbGluZTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbmZpZzogUGlwZWxpbmVDb25maWd1cmF0aW9uO1xuICAvKipcbiAgICogV2hpY2ggcGx1Z2luIGVhY2ggQ29kZVBpcGVsaW5lIGFjdGlvbiBydW5zLCByZWFkIG9mZiB0aGUgYnVpbHRcbiAgICogcGlwZWxpbmUuIFRoZSBDTEkgc2hpcHMgaXQgd2l0aCB0aGUgcmVnaXN0cnkgcmVnaXN0cmF0aW9uIHNvIGV2ZW50IGluZ2VzdFxuICAgKiBjYW4gYXR0cmlidXRlIGFjdGlvbiBvdXRjb21lcyB0byBhIHBsdWdpbiB2ZXJzaW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0ZXBNYW5pZmVzdDogU3RlcE1hbmlmZXN0RW50cnlbXTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQnVpbGRlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIEFwcGx5IHBsYXRmb3JtLXNvdXJjZWQgcmVnaXN0cnkgb3ZlcnJpZGVzIEJFRk9SRSBhbnkgQ29uZmlnLmdldCgncmVnaXN0cnknKVxuICAgIC8vIChwbHVnaW4vZGVmYXVsdCBidWlsZC1pbWFnZSByZXNvbHV0aW9uIGJlbG93KSBzbyB0aGUgc3ludGggdXNlcyB0aGUgcHVsbFxuICAgIC8vIGhvc3QgdGhlIHBsYXRmb3JtIGRlcGxveXMgYWdhaW5zdCwgbm90IHRoZSBpbi1jbHVzdGVyIGVudiBkZWZhdWx0LiBUaGUgQ0xJXG4gICAgLy8gb25seSBzZXRzIHByb3BzLnJlZ2lzdHJ5IHdoZW4gSU1BR0VfUkVHSVNUUllfUFVMTF9IT1NUIGlzIHVuc2V0LCBzbyBhblxuICAgIC8vIGV4cGxpY2l0IG9wZXJhdG9yIHB1bGwgaG9zdCBpcyBuZXZlciBjbG9iYmVyZWQgKHNlZSBiYWtlUGxhdGZvcm1SZWdpc3RyeSkuXG4gICAgLy9cbiAgICAvLyBTY29wZWQgKyByZXN0b3JlZCBzbyB0aGUgb3ZlcnJpZGUgZG9lcyBOT1QgbGVhayBpbnRvIHRoZSBwcm9jZXNzLXdpZGVcbiAgICAvLyBDb25maWcgY2FjaGU6IGluIGEgbXVsdGktcGlwZWxpbmUgQ0RLIGFwcCwgcGlwZWxpbmUgQidzIHJlZ2lzdHJ5IG11c3Qgbm90XG4gICAgLy8gYmxlZWQgaW50byBwaXBlbGluZSBBJ3MgaW1hZ2UgcmVzb2x1dGlvbi4gQWxsIHJlZ2lzdHJ5IHJlYWRzIGhhcHBlblxuICAgIC8vIHN5bmNocm9ub3VzbHkgYmVsb3cgKGJ1aWxkLWltYWdlIHJlc29sdXRpb24pLCBzbyByZXN0b3JpbmcgYXQgdGhlIGVuZCBvZlxuICAgIC8vIHRoZSBjb25zdHJ1Y3RvciBrZWVwcyBzaW5nbGUtcGlwZWxpbmUgYmVoYXZpb3IgaWRlbnRpY2FsLlxuICAgIGNvbnN0IHJlc3RvcmVSZWdpc3RyeSA9IHByb3BzLnJlZ2lzdHJ5XG4gICAgICA/IENvbmZpZy5vdmVycmlkZVNjb3BlZCgncmVnaXN0cnknLCBwcm9wcy5yZWdpc3RyeSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXByb3BzLnJlc29sdmVkQm9vdHN0cmFwPy5wbHVnaW4gfHwgIXByb3BzLnJlc29sdmVkQm9vdHN0cmFwLnRvb2xjaGFpbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0JPT1RTVFJBUF9JTUFHRV9VTlJFU09MVkVEOiBQaXBlbGluZUJ1aWxkZXIgcmVxdWlyZXMgYHJlc29sdmVkQm9vdHN0cmFwYCDigJQgdGhlIHJlc29sdmVkIHBpcGVsaW5lLWJvb3RzdHJhcCAnXG4gICAgICAgICAgKyAnaGFsZiBvZiB0aGUgdG9vbGNoYWluIHJlbGVhc2UuIGBwaXBlbGluZS1tYW5hZ2VyIHBpcGVsaW5lIHN5bnRoL2RlcGxveWAgcmVzb2x2ZXMgaXQgZnJvbSB0aGUgcGxhdGZvcm07ICdcbiAgICAgICAgICArICdhIENESyBhcHAgY29uc3RydWN0aW5nIFBpcGVsaW5lQnVpbGRlciBkaXJlY3RseSBtdXN0IHBhc3MgaXQgKHNlZSBgcGlwZWxpbmUtbWFuYWdlciB0b29sY2hhaW4gZXhwb3J0YCkuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBQaXBlbGluZUNvbmZpZ3VyYXRpb24gZm9yIGFsbCBidXNpbmVzcyBsb2dpYyAodmFsaWRhdGlvbiwgc2FuaXRpemF0aW9uLCBtZXRhZGF0YSBtZXJnaW5nKVxuICAgICAgdGhpcy5jb25maWcgPSBuZXcgUGlwZWxpbmVDb25maWd1cmF0aW9uKHByb3BzKTtcblxuICAgICAgY29uc3Qgc2VydmVyQ29uZmlnID0gQ29uZmlnLmdldCgnc2VydmVyJyk7XG4gICAgICBjb25zdCBhd3NDb25maWcgPSBDb25maWcuZ2V0KCdhd3MnKTtcbiAgICAgIC8vIFBhc3Mgb3JnK3Byb2plY3Qgc28gbG9nIGdyb3VwIC8gSUFNIHJvbGUgbmFtZXMgZ2V0IGEgc3RhYmxlIGhhc2hcbiAgICAgIC8vIHN1ZmZpeCBwZXIgcGlwZWxpbmUuIFByZXZlbnRzIGBSZXNvdXJjZSBhbHJlYWR5IGV4aXN0c2AgY29sbGlzaW9uc1xuICAgICAgLy8gYWNyb3NzIHN0YWNrcyBkZXBsb3llZCB0byB0aGUgc2FtZSBBV1MgYWNjb3VudC5cbiAgICAgIGNvbnN0IHVuaXF1ZUlkID0gbmV3IFVuaXF1ZUlkKHtcbiAgICAgICAgb3JnYW5pemF0aW9uOiB0aGlzLmNvbmZpZy5vcmdhbml6YXRpb24sXG4gICAgICAgIHByb2plY3Q6IHRoaXMuY29uZmlnLnByb2plY3QsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHBsdWdpbkxvb2t1cCA9IG5ldyBQbHVnaW5Mb29rdXAoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHVuaXF1ZUlkLmdlbmVyYXRlKCdwbHVnaW46bG9va3VwJyksXG4gICAgICAgIHtcbiAgICAgICAgICBvcmdhbml6YXRpb246IHRoaXMuY29uZmlnLm9yZ2FuaXphdGlvbixcbiAgICAgICAgICBwcm9qZWN0OiB0aGlzLmNvbmZpZy5wcm9qZWN0LFxuICAgICAgICAgIHBsYXRmb3JtVXJsOiBzZXJ2ZXJDb25maWcucGxhdGZvcm1VcmwsXG4gICAgICAgICAgdW5pcXVlSWQsXG4gICAgICAgICAgb3JnSWQ6IHByb3BzLm9yZ0lkLFxuICAgICAgICAgIHBpcGVsaW5lSWQ6IHByb3BzLnBpcGVsaW5lSWQsXG4gICAgICAgICAgcnVudGltZTogbGFtYmRhUnVudGltZShhd3NDb25maWcubGFtYmRhLnJ1bnRpbWUpLFxuICAgICAgICAgIHRpbWVvdXQ6IGxhbWJkYVRpbWVvdXQoYXdzQ29uZmlnLmxhbWJkYS50aW1lb3V0U2Vjb25kcyksXG4gICAgICAgICAgYXJjaGl0ZWN0dXJlOiBsYW1iZGFBcmNoaXRlY3R1cmUoYXdzQ29uZmlnLmxhbWJkYS5hcmNoaXRlY3R1cmUpLFxuICAgICAgICAgIHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM6IGF3c0NvbmZpZy5sYW1iZGEucmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucyxcbiAgICAgICAgICByZXNvbHZlZFBsdWdpbnM6IHByb3BzLnJlc29sdmVkUGx1Z2lucyxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIC8vIENyZWF0ZSBzb3VyY2UgYW5kIGJ1aWxkIHN0ZXBcbiAgICAgIGNvbnN0IHNvdXJjZUJ1aWxkZXIgPSBuZXcgU291cmNlQnVpbGRlcih0aGlzLCB0aGlzLmNvbmZpZyk7XG4gICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VCdWlsZGVyLmNyZWF0ZSh1bmlxdWVJZCk7XG5cbiAgICAgIC8vIFN5bnRoLXBsdWdpbiByZXNvbHV0aW9uOlxuICAgICAgLy8gICAxLiBQcmUtcmVzb2x2ZWQgYnkgYHBpcGVsaW5lLW1hbmFnZXIgcGlwZWxpbmUgc3ludGgvZGVwbG95YCBmcm9tIHRoZSBwbGF0Zm9ybVxuICAgICAgLy8gICAgICBBUEkg4oaSIHVzZSBpdC4gU3ludGggc3RlcCBydW5zIG9uIHRoZSByZWFsIGBjZGstc3ludGhgIGltYWdlIHdpdGhcbiAgICAgIC8vICAgICAgcmVhbCBjb21tYW5kcyBiYWtlZCBpbnRvIHRoZSB0ZW1wbGF0ZS5cbiAgICAgIC8vICAgMi4gT3RoZXJ3aXNlIOKGkiBgYm9vdHN0cmFwKClgOiBjb2xkLXN0YXJ0IGBwaXBlbGluZS1tYW5hZ2VyIHBpcGVsaW5lIHN5bnRoYFxuICAgICAgLy8gICAgICBvbiB0aGUgcmVzb2x2ZWQgdG9vbGNoYWluIHJlbGVhc2UncyBwaXBlbGluZS1ib290c3RyYXAgaW1hZ2VcbiAgICAgIC8vICAgICAgKGByZXNvbHZlZEJvb3RzdHJhcGApLiBVc2VkIHdoZW4gdGhlIHN5bnRoIHBsdWdpbiB3YXNuJ3RcbiAgICAgIC8vICAgICAgcHJlLXJlc29sdmVkIChhIG5vbi1tYW5hZ2VkIHN5bnRoIHBsdWdpbiB3aG9zZSBsb29rdXAgbWlzc2VkKS5cbiAgICAgIC8vXG4gICAgICAvLyBwbHVnaW5Mb29rdXAucGx1Z2luKCkgcmVhZHMgYHJlc29sdmVkUGx1Z2luc2AgaW50ZXJuYWxseSBhbmQgcmV0dXJuc1xuICAgICAgLy8gdGhlIGNhY2hlZCBlbnRyeSB3aGVuIHByZXNlbnQg4oCUIHNvIGNhbGxpbmcgaXQgYWx3YXlzIHdpbnMgb3ZlclxuICAgICAgLy8gYm9vdHN0cmFwKCkgd2hlbiBwcmUtcmVzb2x1dGlvbiBzdWNjZWVkZWQuXG4gICAgICBjb25zdCBzeW50aENhY2hlS2V5ID0gcGx1Z2luQXJ0aWZhY3RBbGlhcyh0aGlzLmNvbmZpZy5wbHVnaW4pO1xuICAgICAgY29uc3QgcGx1Z2luID0gcHJvcHMucmVzb2x2ZWRQbHVnaW5zPy5bc3ludGhDYWNoZUtleV1cbiAgICAgICAgPyBwbHVnaW5Mb29rdXAucGx1Z2luKHRoaXMuY29uZmlnLnBsdWdpbiwgcGx1Z2luU3RlcExhYmVsKG51bGwsIHRoaXMuY29uZmlnLnBsdWdpbikpXG4gICAgICAgIDogcGx1Z2luTG9va3VwLmJvb3RzdHJhcCgpO1xuICAgICAgY29uc3QgZGVmYXVsdENvbXB1dGVUeXBlID0gZ2V0Q29tcHV0ZVR5cGUoYXdzQ29uZmlnLmNvZGVCdWlsZC5jb21wdXRlVHlwZSk7XG4gICAgICBjb25zdCBhcnRpZmFjdE1hbmFnZXIgPSBuZXcgQXJ0aWZhY3RNYW5hZ2VyKCk7XG5cbiAgICAgIC8vIFNjb3BlIGV4cG9zZWQgdG8gcGx1Z2luLXNwZWMgdGVtcGxhdGVzIGFzIGBwaXBlbGluZS4qYC4gU291cmNlZCBmcm9tIHRoZVxuICAgICAgLy8gY29uZmlnIHNvIHRoZSBzeW50aCBzdGVwLCBldmVyeSBzdGFnZSBzdGVwLCBhbmQgdGhlIHNvdXJjZSB0b2tlbiBhbGxcbiAgICAgIC8vIHJlc29sdmUgYWdhaW5zdCB0aGUgc2FtZSBzbmFwc2hvdCAoc2VlIFBpcGVsaW5lQ29uZmlndXJhdGlvbi5nZXRQaXBlbGluZVNjb3BlKS5cbiAgICAgIGNvbnN0IHBpcGVsaW5lU2NvcGUgPSB0aGlzLmNvbmZpZy5nZXRQaXBlbGluZVNjb3BlKCk7XG4gICAgICAvLyBDb250cmFjdCDigJQgc2VlIFN0YWdlQnVpbGRlci5yZXNvbHZlU3RlcC5cbiAgICAgIGFzc2VydFBsdWdpbkNvbnRyYWN0KHBsdWdpbiwgY29udHJhY3RTY29wZUZyb21UZW1wbGF0ZVNjb3BlKHBpcGVsaW5lU2NvcGUpLCAnc3ludGgnKTtcblxuICAgICAgLy8gVGhlIHBpcGVsaW5lJ3MgZGVmYXVsdCBidWlsZCBpbWFnZTogdGhlIHJlbGVhc2UncyBwaXBlbGluZS1ib290c3RyYXAsXG4gICAgICAvLyByZXNvbHZlZCBvbmNlIChvbmUgcmVnaXN0cnktY3JlZGVudGlhbCBpbXBvcnQpIGFuZCBzaGFyZWQgYnkgdGhlXG4gICAgICAvLyBwaXBlbGluZS13aWRlIGNvZGVCdWlsZERlZmF1bHRzIGFuZCBldmVyeSBwbHVnaW4tbGVzcyBzdGVwLlxuICAgICAgY29uc3QgZGVmYXVsdEJ1aWxkSW1hZ2UgPSByZXNvbHZlRGVmYXVsdEJ1aWxkSW1hZ2UodGhpcywgcHJvcHMub3JnSWQsIHByb3BzLnJlc29sdmVkQm9vdHN0cmFwLnBsdWdpbik7XG5cbiAgICAgIGNvbnN0IHN0ZXBNYW5pZmVzdCA9IG5ldyBTdGVwTWFuaWZlc3RSZWNvcmRlcigpO1xuICAgICAgc3RlcE1hbmlmZXN0LnJlY29yZEJ1aWxkSW1hZ2UocHJvcHMucmVzb2x2ZWRCb290c3RyYXAucGx1Z2luLCBwcm9wcy5yZXNvbHZlZEJvb3RzdHJhcC50b29sY2hhaW4pO1xuICAgICAgY29uc3Qgc3ludGggPSBjcmVhdGVDb2RlQnVpbGRTdGVwKHtcbiAgICAgICAgLi4udGhpcy5jb25maWcuc3ludGhDdXN0b21pemF0aW9uLFxuICAgICAgICBpZDogdW5pcXVlSWQuZ2VuZXJhdGUoJ2NkazpzeW50aCcpLFxuICAgICAgICB1bmlxdWVJZCxcbiAgICAgICAgcGx1Z2luLFxuICAgICAgICBpbnB1dDogc291cmNlLFxuICAgICAgICBtZXRhZGF0YTogdGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkLFxuICAgICAgICBuZXR3b3JrOiB0aGlzLmNvbmZpZy5uZXR3b3JrLFxuICAgICAgICBzY29wZTogdGhpcyxcbiAgICAgICAgZGVmYXVsdENvbXB1dGVUeXBlLFxuICAgICAgICBhcnRpZmFjdE1hbmFnZXIsXG4gICAgICAgIHN0YWdlTmFtZTogJ25vLXN0YWdlJyxcbiAgICAgICAgc3RhZ2VBbGlhczogJ25vLXN0YWdlLWFsaWFzJyxcbiAgICAgICAgLy8gVGhlIGNhbm9uaWNhbCBrZXkgc2VnbWVudC4gYCR7YWxpYXMgPz8gbmFtZX0tYWxpYXNgIHN1ZmZpeGVkIGFuXG4gICAgICAgIC8vIEVYUExJQ0lUIGFsaWFzIHRvbyAoYG15LXN5bnRoYCDihpIgYG15LXN5bnRoLWFsaWFzYCksIHNvIGEgc3RhZ2UgdGhhdFxuICAgICAgICAvLyBwaWNrZWQgdGhlIHN5bnRoIG91dHB1dCBpbiB0aGUgVUkgYXNrZWQgZm9yIGEga2V5IG5ldmVyIHJlZ2lzdGVyZWQuXG4gICAgICAgIHBsdWdpbkFsaWFzOiBwbHVnaW5BcnRpZmFjdEFsaWFzKHRoaXMuY29uZmlnLnBsdWdpbiksXG4gICAgICAgIG9yZ0lkOiBwcm9wcy5vcmdJZCxcbiAgICAgICAgZGVmYXVsdEJ1aWxkSW1hZ2UsXG4gICAgICAgIHBpcGVsaW5lU2NvcGUsXG4gICAgICB9KTtcbiAgICAgIHN0ZXBNYW5pZmVzdC5yZWNvcmQoc3ludGgsIHBsdWdpbiwgcGx1Z2luU3RlcExhYmVsKG51bGwsIHRoaXMuY29uZmlnLnBsdWdpbikpO1xuXG4gICAgICAvLyBSZXNvbHZlIHBpcGVsaW5lLWxldmVsIGRlZmF1bHRzIGludG8gY29kZUJ1aWxkRGVmYXVsdHNcbiAgICAgIC8vIEJ1aWxkIHRoZSBwZXItb3JnIHBsYXRmb3JtIHNlY3JldCBuYW1lIGZvciBDb2RlQnVpbGQgZW52IHZhcnNcbiAgICAgIGNvbnN0IHBsYXRmb3JtU2VjcmV0TmFtZSA9IHByb3BzLm9yZ0lkXG4gICAgICAgID8gQ29yZUNvbnN0YW50cy5zZWNyZXRQYXRoKHByb3BzLm9yZ0lkLCAncGxhdGZvcm0nKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIFRoZSByZWdpc3RyYXRpb24ga2V5IHRoZSBzeW50aCBwb3N0cyBpdHMgc3RlcCBtYW5pZmVzdCB3aXRoIOKAlCBhXG4gICAgICAvLyBzZXBhcmF0ZSBjcmVkZW50aWFsIGZyb20gdGhlIHBsYXRmb3JtIG9uZSAoY29yZS9waXBlbGluZS1yZWdpc3RyYXRpb24udHMpLlxuICAgICAgY29uc3QgcmVnaXN0cmF0aW9uU2VjcmV0TmFtZSA9IHByb3BzLm9yZ0lkXG4gICAgICAgID8gQ29yZUNvbnN0YW50cy5zZWNyZXRQYXRoKHByb3BzLm9yZ0lkLCBQSVBFTElORV9SRUdJU1RSQVRJT05fU0VDUkVUX0xFQUYpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBjb2RlQnVpbGREZWZhdWx0cyA9IHRoaXMucmVzb2x2ZURlZmF1bHRzKHRoaXMuY29uZmlnLmRlZmF1bHRzLCB1bmlxdWVJZCwgcHJvcHMucGlwZWxpbmVJZCwgcGxhdGZvcm1TZWNyZXROYW1lLCBzZXJ2ZXJDb25maWcucGxhdGZvcm1VcmwsIHByb3BzLm9yZ0lkLCBkZWZhdWx0QnVpbGRJbWFnZSk7XG5cbiAgICAgIC8vIFJlc29sdmUgSUFNIHJvbGU6IGV4cGxpY2l0IHByb3Agd2lucywgZWxzZSBgaWFtOnJvbGVgIG1ldGFkYXRhLCBlbHNlIGxldFxuICAgICAgLy8gQ0RLIGF1dG8tY3JlYXRlIHRoZSBwaXBlbGluZSByb2xlIChjb2RlcGlwZWxpbmUuYW1hem9uYXdzLmNvbSBwcmluY2lwYWwpLlxuICAgICAgY29uc3Qgcm9sZUNvbmZpZyA9IHByb3BzLnJvbGUgPz8gcm9sZUNvbmZpZ0Zyb21NZXRhZGF0YSh0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQpO1xuICAgICAgaWYgKHJvbGVDb25maWc/LnR5cGUgPT09ICdjb2RlQnVpbGREZWZhdWx0Jykge1xuICAgICAgICBjcmVhdGVMb2dnZXIoJ3BpcGVsaW5lLWJ1aWxkZXInKS53YXJuKFxuICAgICAgICAgICdjb2RlQnVpbGREZWZhdWx0IHJvbGUgdHlwZSB1c2VzIGNvZGVidWlsZC5hbWF6b25hd3MuY29tIHRydXN0IHByaW5jaXBhbCDigJQgJyArXG4gICAgICAgICd0aGlzIGlzIG5vdCBzdWl0YWJsZSBhcyB0aGUgcGlwZWxpbmUtbGV2ZWwgcm9sZS4gQ29uc2lkZXIgdXNpbmcgcm9sZUFybi9yb2xlTmFtZSAnICtcbiAgICAgICAgJ29yIG9taXR0aW5nIHRoZSByb2xlIHRvIGxldCBDREsgYXV0by1jcmVhdGUgb25lIHdpdGggY29kZXBpcGVsaW5lLmFtYXpvbmF3cy5jb20uJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJvbGUgPSByb2xlQ29uZmlnXG4gICAgICAgID8gcmVzb2x2ZVJvbGUodGhpcywgdW5pcXVlSWQsIHJvbGVDb25maWcpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAvLyDilIDilIAgQXJ0aWZhY3QgYnVja2V0IChLTVMgZW5jcnlwdGlvbiArIHJldGVudGlvbikg4pSA4pSAXG4gICAgICAvLyBXaGVuIGBlbmNyeXB0aW9uLmttc0tleUFybmAgYW5kL29yIGBvcGVyYXRpb25zLmFydGlmYWN0UmV0ZW50aW9uRGF5c2AgYXJlXG4gICAgICAvLyBzZXQgd2UgY3JlYXRlIGEgY3VzdG9tIGFydGlmYWN0IGJ1Y2tldCBhbmQgcGFzcyBpdCB0byBDb2RlUGlwZWxpbmU7IHRoYXRcbiAgICAgIC8vIGlzIHRoZSBvbmx5IHdheSB0byBhdHRhY2ggYSBjdXN0b21lci1tYW5hZ2VkIGtleSAodGhlIEwzIGNvbnN0cnVjdCBleHBvc2VzXG4gICAgICAvLyBgYXJ0aWZhY3RCdWNrZXRgLCBub3QgYGVuY3J5cHRpb25LZXlgKS4gQWJzZW50IGJvdGgga2V5cywgQ0RLIGF1dG8tY3JlYXRlc1xuICAgICAgLy8gdGhlIGJ1Y2tldCBhbmQgYmVoYXZpb3IgaXMgdW5jaGFuZ2VkLlxuICAgICAgY29uc3QgYXJ0aWZhY3RCdWNrZXQgPSB0aGlzLmJ1aWxkQXJ0aWZhY3RCdWNrZXQoKTtcblxuICAgICAgLy8gQ3JlYXRlIENvZGVQaXBlbGluZSBjb25zdHJ1Y3QuIFRoZSB0b29sY2hhaW4gcGlucyAoQ0xJIHZlcnNpb25zLFxuICAgICAgLy8gc2VsZi1tdXRhdGlvbiBydW50aW1lKSBnbyBCRUZPUkUgdGhlIG1ldGFkYXRhIHNwcmVhZDogZXhwbGljaXQgcGlwZWxpbmVcbiAgICAgIC8vIG1ldGFkYXRhIChgY2xpVmVyc2lvbmAsIGBjZGtBc3NldHNDbGlWZXJzaW9uYCxcbiAgICAgIC8vIGBzZWxmTXV0YXRpb25Db2RlQnVpbGREZWZhdWx0c2AsIGBhc3NldFB1Ymxpc2hpbmdDb2RlQnVpbGREZWZhdWx0c2ApIHdpbnMuXG4gICAgICBjb25zdCBjb2RlUGlwZWxpbmVNZXRhZGF0YSA9IG1ldGFkYXRhRm9yQ29kZVBpcGVsaW5lKHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZCk7XG4gICAgICB0aGlzLnBpcGVsaW5lID0gbmV3IENvZGVQaXBlbGluZSh0aGlzLCB1bmlxdWVJZC5nZW5lcmF0ZSgncGlwZWxpbmVzOmNvZGVwaXBlbGluZScpLCB7XG4gICAgICAgIC4uLihjb2RlQnVpbGREZWZhdWx0cyAmJiB7IGNvZGVCdWlsZERlZmF1bHRzIH0pLFxuICAgICAgICAuLi4ocm9sZSAmJiB7IHJvbGUgfSksXG4gICAgICAgIC4uLihhcnRpZmFjdEJ1Y2tldCAmJiB7IGFydGlmYWN0QnVja2V0IH0pLFxuICAgICAgICBwaXBlbGluZVR5cGU6IFBpcGVsaW5lVHlwZS5WMixcbiAgICAgICAgcGlwZWxpbmVOYW1lOiB0aGlzLmNvbmZpZy5waXBlbGluZU5hbWUsXG4gICAgICAgIHN5bnRoLFxuICAgICAgICAuLi50b29sY2hhaW5QaW5zKHByb3BzLnJlc29sdmVkQm9vdHN0cmFwLCBjb2RlUGlwZWxpbmVNZXRhZGF0YSksXG4gICAgICAgIC4uLmNvZGVQaXBlbGluZU1ldGFkYXRhLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJ1bi10aW1lIHZ1bG5lcmFiaWxpdHkgY2hlY2sgKG9wdC1pbiBtZXRhZGF0YSBmbGFnLCByZXBvcnQtb25seSkuIEl0XG4gICAgICAvLyBuZWVkcyB0aGUgcGlwZWxpbmUgaWQgKHRoZSBjaGVjayBpcyBwZXIgcGlwZWxpbmUpIGFuZCB0aGUgb3JnIHBsYXRmb3JtXG4gICAgICAvLyBzZWNyZXQgKHRoZSB2ZXJpZnkgc3RlcCBhdXRoZW50aWNhdGVzIHdpdGggaXQpOyB3aXRob3V0IGVpdGhlciBpdCBpc1xuICAgICAgLy8gc2tpcHBlZCB3aXRoIGEgd2FybmluZyDigJQgYSB2aXNpYmlsaXR5IGZlYXR1cmUgbmV2ZXIgZmFpbHMgYSBzeW50aC5cbiAgICAgIGxldCBydW50aW1lVnVsbkNoZWNrID0gaXNSdW50aW1lVnVsbkNoZWNrRW5hYmxlZCh0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQpO1xuICAgICAgaWYgKHJ1bnRpbWVWdWxuQ2hlY2sgJiYgKCFwcm9wcy5waXBlbGluZUlkIHx8ICFwbGF0Zm9ybVNlY3JldE5hbWUpKSB7XG4gICAgICAgIGNyZWF0ZUxvZ2dlcigncGlwZWxpbmUtYnVpbGRlcicpLndhcm4oXG4gICAgICAgICAgYCR7UlVOVElNRV9WVUxOX0NIRUNLX0tFWX0gaXMgZW5hYmxlZCBidXQgdGhlIHBpcGVsaW5lIGhhcyBubyAkeyFwcm9wcy5waXBlbGluZUlkID8gJ3BpcGVsaW5lSWQnIDogJ29yZ0lkJ30g4oCUIGBcbiAgICAgICAgICArICdza2lwcGluZyB0aGUgcnVuLXRpbWUgY2hlY2sgc3RlcHMuIFN5bnRoZXNpemUgdGhyb3VnaCBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aC9kZXBsb3kgLS1pZGAuJyxcbiAgICAgICAgKTtcbiAgICAgICAgcnVudGltZVZ1bG5DaGVjayA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcHMuc3RhZ2VzKSB7XG4gICAgICAgIGNvbnN0IHN0YWdlQnVpbGRlciA9IG5ldyBTdGFnZUJ1aWxkZXIoe1xuICAgICAgICAgIHNjb3BlOiB0aGlzLFxuICAgICAgICAgIHBsdWdpbkxvb2t1cCxcbiAgICAgICAgICB1bmlxdWVJZCxcbiAgICAgICAgICBnbG9iYWxNZXRhZGF0YTogdGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkLFxuICAgICAgICAgIGRlZmF1bHRDb21wdXRlVHlwZSxcbiAgICAgICAgICBhcnRpZmFjdE1hbmFnZXIsXG4gICAgICAgICAgb3JnSWQ6IHByb3BzLm9yZ0lkLFxuICAgICAgICAgIGRlZmF1bHRCdWlsZEltYWdlLFxuICAgICAgICAgIHBpcGVsaW5lU2NvcGUsXG4gICAgICAgICAgc3RlcE1hbmlmZXN0LFxuICAgICAgICAgIC4uLihydW50aW1lVnVsbkNoZWNrICYmIHBsYXRmb3JtU2VjcmV0TmFtZSAmJiB7IHJ1bnRpbWVWdWxuQ2hlY2s6IHsgcGxhdGZvcm1TZWNyZXROYW1lIH0gfSksXG4gICAgICAgIH0pO1xuICAgICAgICBzdGFnZUJ1aWxkZXIuYWRkU3RhZ2VzKHRoaXMucGlwZWxpbmUsIHByb3BzLnN0YWdlcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgCBUYWdzIOKUgOKUgFxuICAgICAgLy8gVGhlIGZpcnN0IHRocmVlIGFyZSBvcGVyYXRpb25zLWVzc2VudGlhbCBhbmQgdXNlZCBieSBgcGlwZWxpbmUtbWFuYWdlclxuICAgICAgLy8gYXVkaXQgc3RhY2tzYCB0byBkaWZmIENGTiBzdGFja3MgYWdhaW5zdCB0aGUgcGlwZWxpbmVfcmVnaXN0cnkgdGFibGUuXG4gICAgICAvLyBgT3JnSWRgIGlzIHRoZSBjYW5vbmljYWwga2V5IGZvciBjb3N0IGF0dHJpYnV0aW9uIChBV1MgQ29zdCBFeHBsb3JlclxuICAgICAgLy8gZ3JvdXBzIGJ5IHRhZyBrZXkvdmFsdWUgd2hlbiBhY3RpdmF0ZWQgaW4gQmlsbGluZyBzZXR0aW5ncykuXG4gICAgICAvLyBVU0VSIFRBR1MgRklSU1QsIHNvIHRoZSBwbGF0Zm9ybSB0YWdzIGJlbG93IG92ZXJ3cml0ZSByYXRoZXIgdGhhbiBhcmVcbiAgICAgIC8vIG92ZXJ3cml0dGVuLiBgVGFncy5vZmAgbGV0cyBhIGxhdGVyIGFkZCByZXBsYWNlIGFuIGVhcmxpZXIgb25lLCBhbmRcbiAgICAgIC8vIHRoZXNlIHVzZWQgdG8gYmUgYXBwbGllZCBMQVNUIOKAlCB3aGljaCBsZXQgYSBjYWxsZXIgcmVkZWZpbmVcbiAgICAgIC8vIHBiLnBpcGVsaW5lLWlkLCBPcmdJZCBvciBwYi5kZXBsb3lzIGFuZCBwb2ludCBhbm90aGVyIG9yZydzIGV4ZWN1dGlvbnNcbiAgICAgIC8vIGF0IHRoZWlyIG93biBwaXBlbGluZSwgc2luY2UgdGhlIGV2ZW50cyBMYW1iZGEgcmVhZHMgZXhhY3RseSB0aG9zZSB0YWdzXG4gICAgICAvLyB0byBkZWNpZGUgd2hvc2UgcmVwb3J0cyBhbiBleGVjdXRpb24gYmVsb25ncyB0by5cbiAgICAgIC8vXG4gICAgICAvLyBUaGUgcmVzZXJ2ZWQta2V5IGZpbHRlciBpcyB0aGUgc2Vjb25kIGhhbGY6IG9yZGVyaW5nIGFsb25lIHdvdWxkIGxldCBhXG4gICAgICAvLyBjYWxsZXIgc2V0IGBwYi5kZXBsb3lzYCBvbiBhIHBpcGVsaW5lIHRoYXQgZGVjbGFyZXMgbm8gZW52aXJvbm1lbnQgKG5vXG4gICAgICAvLyBwbGF0Zm9ybSB0YWcgdG8gb3ZlcndyaXRlIGl0KS4gVGhlIEFQSSByZWZ1c2VzIHRoZXNlIGtleXMgdG9vLCBidXQgYVxuICAgICAgLy8gdGVhbSB1c2luZyB0aGlzIGNvbnN0cnVjdCBkaXJlY3RseSBuZXZlciBwYXNzZXMgdGhyb3VnaCB0aGUgQVBJLCBzb1xuICAgICAgLy8gdGhpcyBpcyB0aGUgY2hlY2sgdGhhdCBhbHdheXMgcnVucy5cbiAgICAgIGlmIChwcm9wcy50YWdzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzLnRhZ3MpKSB7XG4gICAgICAgICAgaWYgKGlzUmVzZXJ2ZWRUYWdLZXkoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgVGFncy5vZih0aGlzLnBpcGVsaW5lKS5hZGQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFRhZ3Mub2YodGhpcy5waXBlbGluZSkuYWRkKCdwaXBlbGluZS1idWlsZGVyJywgJ3RydWUnKTtcbiAgICAgIFRhZ3Mub2YodGhpcy5waXBlbGluZSkuYWRkKCdwcm9qZWN0JywgdGhpcy5jb25maWcucHJvamVjdCk7XG4gICAgICBUYWdzLm9mKHRoaXMucGlwZWxpbmUpLmFkZCgnb3JnYW5pemF0aW9uJywgdGhpcy5jb25maWcub3JnYW5pemF0aW9uKTtcbiAgICAgIGlmIChwcm9wcy5vcmdJZCkge1xuICAgICAgICBUYWdzLm9mKHRoaXMucGlwZWxpbmUpLmFkZCgnT3JnSWQnLCBwcm9wcy5vcmdJZCk7XG4gICAgICB9XG4gICAgICAvLyBTdGFibGUgZXZlbnQtcmVwb3J0aW5nIGtleS4gQXBwbGllZCBhdCBzeW50aCAodGhlIHBpcGVsaW5lSWQgaXMga25vd25cbiAgICAgIC8vIGhlcmUpLCBzbyBpdCdzIHByZXNlbnQgZnJvbSBzdGFjayBjcmVhdGlvbiDigJQgdGhlIGV2ZW50cyBMYW1iZGEgcmVhZHMgdGhpc1xuICAgICAgLy8gdGFnIHRvIGF0dHJpYnV0ZSBDb2RlUGlwZWxpbmUgc3RhdGUtY2hhbmdlIGV2ZW50cyB0byB0aGUgcGlwZWxpbmUgd2l0aG91dFxuICAgICAgLy8gZXZlciBoYW5kbGluZyB0aGUgQVJOL2FjY291bnQuIFNlZSBwYWNrYWdlcy9waXBlbGluZS1ldmVudHMuXG4gICAgICBpZiAocHJvcHMucGlwZWxpbmVJZCkge1xuICAgICAgICBUYWdzLm9mKHRoaXMucGlwZWxpbmUpLmFkZCgncGIucGlwZWxpbmUtaWQnLCBwcm9wcy5waXBlbGluZUlkKTtcbiAgICAgIH1cbiAgICAgIC8vIERlcGxveS1lbnZpcm9ubWVudCBhdHRyaWJ1dGlvbiBmb3IgRE9SQSBtZXRyaWNzLiBgcGIuZGVwbG95c2AgbGlzdHMgZXZlcnlcbiAgICAgIC8vIGRlcGxveSBzdGFnZSBhcyBgPHN0YWdlTmFtZT46PGVudmlyb25tZW50PmAgcGFpcnMgam9pbmVkIGJ5IGArYCwgcmVhZCBieVxuICAgICAgLy8gdGhlIGV2ZW50cyBMYW1iZGEgZnJvbSB0aGUgc2FtZSBMaXN0VGFncyBjYWxsIHRvIG1hcmsgd2hpY2ggc3RhZ2VzIGFyZVxuICAgICAgLy8gZGVwbG95cyBhbmQgdG8gd2hpY2ggZW52aXJvbm1lbnQuIEFic2VudCB3aGVuIG5vIGVudmlyb25tZW50IGlzIGRlY2xhcmVkXG4gICAgICAvLyDigJQgc3VjaCBwaXBlbGluZXMgcHJvZHVjZSBubyBET1JBIGRlcGxveSBzaWduYWwgdW50aWwgdGhleSByZS1zeW50aC5cbiAgICAgIGNvbnN0IGRlcGxveXNUYWcgPSBidWlsZERlcGxveXNUYWcocHJvcHMpO1xuICAgICAgaWYgKGRlcGxveXNUYWcpIHtcbiAgICAgICAgVGFncy5vZih0aGlzLnBpcGVsaW5lKS5hZGQoJ3BiLmRlcGxveXMnLCBkZXBsb3lzVGFnKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIHNhbWUgZHJpZnQtYXVkaXQga2V5cyBvbiB0aGUgQ2xvdWRGb3JtYXRpb24gU1RBQ0sgaXRzZWxmLlxuICAgICAgLy8gYFRhZ3Mub2YodGhpcy5waXBlbGluZSlgIHJlYWNoZXMgdGhlIHJlc291cmNlcyB1bmRlciB0aGUgcGlwZWxpbmUgb25seSDigJRcbiAgICAgIC8vIG5ldmVyIHRoZSBlbmNsb3Npbmcgc3RhY2sg4oCUIGFuZCBgcGlwZWxpbmUtbWFuYWdlciBhdWRpdCBzdGFja3NgIHJlYWRzXG4gICAgICAvLyBEZXNjcmliZVN0YWNrcycgU1RBQ0sgdGFncywgc28gd2l0aG91dCB0aGVzZSBpdCBmb3VuZCBubyBwaXBlbGluZS1idWlsZGVyXG4gICAgICAvLyBzdGFjayBhdCBhbGwgYW5kIHJlcG9ydGVkIGV2ZXJ5IHJlZ2lzdHJ5IHJvdyBhcyBtaXNzaW5nLlxuICAgICAgY29uc3Qgc3RhY2tUYWdzID0gU3RhY2sub2YodGhpcykudGFncztcbiAgICAgIHN0YWNrVGFncy5zZXRUYWcoJ3BpcGVsaW5lLWJ1aWxkZXInLCAndHJ1ZScpO1xuICAgICAgaWYgKHByb3BzLm9yZ0lkKSBzdGFja1RhZ3Muc2V0VGFnKCdPcmdJZCcsIHByb3BzLm9yZ0lkKTtcbiAgICAgIGlmIChwcm9wcy5waXBlbGluZUlkKSBzdGFja1RhZ3Muc2V0VGFnKCdwYi5waXBlbGluZS1pZCcsIHByb3BzLnBpcGVsaW5lSWQpO1xuXG4gICAgICAvLyBCdWlsZCB0aGUgaW50ZXJuYWwgcGlwZWxpbmUgYmVmb3JlIGFjY2Vzc2luZyBpdHMgcHJvcGVydGllc1xuICAgICAgdGhpcy5waXBlbGluZS5idWlsZFBpcGVsaW5lKCk7XG5cbiAgICAgIC8vIFBMQVRGT1JNX1NFQ1JFVF9OQU1FIGlzIGluamVjdGVkIGludG8gdGhlIENvZGVCdWlsZCBlbnZpcm9ubWVudCBhYm92ZSxcbiAgICAgIC8vIGJ1dCB0aGUgc3ludGggcHJvY2VzcyByZWFkcyB0aGF0IHNlY3JldCBpdHNlbGYgd2l0aCB0aGUgQVdTIFNES1xuICAgICAgLy8gKGhhbmRsZXJzL3BsYXRmb3JtLWNyZWRlbnRpYWwudHMgR2V0U2VjcmV0VmFsdWUpIOKAlCBzbyB0aGUgcm9sZSBuZWVkcyBhblxuICAgICAgLy8gZXhwbGljaXQgZ3JhbnQuIE5vdGhpbmcgd2FzIGdyYW50aW5nIGl0OiB0aGUgUkVHSVNUUlkgc2VjcmV0IHdvcmtzIG9ubHlcbiAgICAgIC8vIGJlY2F1c2UgYExpbnV4QnVpbGRJbWFnZS5mcm9tRG9ja2VyUmVnaXN0cnkoeyBzZWNyZXRzTWFuYWdlckNyZWRlbnRpYWxzIH0pYFxuICAgICAgLy8gbWFrZXMgQ0RLIGdyYW50IHRoYXQgb25lIGludGVybmFsbHksIHdoaWNoIGRvZXMgbm90IGdlbmVyYWxpc2UgdG8gYVxuICAgICAgLy8gc2VjcmV0IHRoZSBidWlsZCByZWFkcyBmb3IgaXRzZWxmLiBXaXRob3V0IHRoaXMgZXZlcnkgc3ludGggZmFpbHMgd2l0aFxuICAgICAgLy8gQWNjZXNzRGVuaWVkRXhjZXB0aW9uIG9uIEdldFNlY3JldFZhbHVlLCBhbmQgdGhlIHBpcGVsaW5lIHJvbGUgaGFzIHRvIGJlXG4gICAgICAvLyBwYXRjaGVkIGJ5IGhhbmQgaW4gZWFjaCBhY2NvdW50LlxuICAgICAgLy9cbiAgICAgIC8vIFNjb3BlZCB0byB0aGlzIG9yZydzIHBsYXRmb3JtIHNlY3JldCBhbmQgbWlycm9yaW5nIHRoZSBwbHVnaW4tbG9va3VwXG4gICAgICAvLyBMYW1iZGEncyBncmFudCAocGlwZWxpbmUvcGx1Z2luLWxvb2t1cC50cyksIGluY2x1ZGluZyB0aGUgYC0qYCBzdWZmaXgg4oCUXG4gICAgICAvLyBTZWNyZXRzIE1hbmFnZXIgYXBwZW5kcyBzaXggcmFuZG9tIGNoYXJhY3RlcnMgdG8gZXZlcnkgQVJOLlxuICAgICAgaWYgKHBsYXRmb3JtU2VjcmV0TmFtZSkge1xuICAgICAgICB0aGlzLnBpcGVsaW5lLnN5bnRoUHJvamVjdC5hZGRUb1JvbGVQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgYWN0aW9uczogWydzZWNyZXRzbWFuYWdlcjpHZXRTZWNyZXRWYWx1ZSddLFxuICAgICAgICAgIHJlc291cmNlczogW2Bhcm46YXdzOnNlY3JldHNtYW5hZ2VyOio6KjpzZWNyZXQ6JHtwbGF0Zm9ybVNlY3JldE5hbWV9LSpgXSxcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgICAgLy8gU2FtZSBncmFudCBmb3IgdGhlIHJlZ2lzdHJhdGlvbiBrZXksIGFuZCBvbiB0aGUgU1lOVEggcHJvamVjdCBvbmx5OiBpdFxuICAgICAgLy8gaXMgdGhlIG9uZSBzdGVwIHRoYXQgcmVnaXN0ZXJzLiBJdHMgTkFNRSByaWRlcyB0aGUgcGlwZWxpbmUtd2lkZVxuICAgICAgLy8gZW52aXJvbm1lbnQgKHJlc29sdmVEZWZhdWx0cyksIG5vdCBhIFNFQ1JFVFNfTUFOQUdFUiB2YXJpYWJsZSwgc28gYVxuICAgICAgLy8gbWlzc2luZyBrZXkgc2tpcHMgdGhlIHJlZ2lzdHJhdGlvbiB3aXRoIGEgd2FybmluZyBpbnN0ZWFkIG9mIGZhaWxpbmdcbiAgICAgIC8vIHRoZSBidWlsZCBhdCBET1dOTE9BRF9TT1VSQ0Ug4oCUIGFuZCBhIHN0ZXAgd2l0aG91dCB0aGlzIGdyYW50IGNhbm5vdFxuICAgICAgLy8gcmVhZCBpdC5cbiAgICAgIGlmIChyZWdpc3RyYXRpb25TZWNyZXROYW1lKSB7XG4gICAgICAgIHRoaXMucGlwZWxpbmUuc3ludGhQcm9qZWN0LmFkZFRvUm9sZVBvbGljeShuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICBhY3Rpb25zOiBbJ3NlY3JldHNtYW5hZ2VyOkdldFNlY3JldFZhbHVlJ10sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbYGFybjphd3M6c2VjcmV0c21hbmFnZXI6KjoqOnNlY3JldDoke3JlZ2lzdHJhdGlvblNlY3JldE5hbWV9LSpgXSxcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjZGtQaXBlbGluZSA9IHRoaXMucGlwZWxpbmUucGlwZWxpbmU7XG4gICAgICB0aGlzLnN0ZXBNYW5pZmVzdCA9IHN0ZXBNYW5pZmVzdC5lbnRyaWVzKGNka1BpcGVsaW5lKTtcbiAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQ7XG5cbiAgICAgIC8vIOKUgOKUgCBQaXBlbGluZS1sZXZlbCBWYXJpYWJsZXMgKENvZGVQaXBlbGluZSBWMikg4pSA4pSAXG4gICAgICBmb3IgKGNvbnN0IHYgb2YgcGFyc2VQaXBlbGluZVZhcmlhYmxlcyhtZXRhW01ldGFkYXRhS2V5cy5QSVBFTElORV9WQVJJQUJMRVNdKSkge1xuICAgICAgICBjZGtQaXBlbGluZS5hZGRWYXJpYWJsZShuZXcgVmFyaWFibGUoe1xuICAgICAgICAgIHZhcmlhYmxlTmFtZTogdi5uYW1lLFxuICAgICAgICAgIC4uLih2LmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHsgZGVmYXVsdFZhbHVlOiB2LmRlZmF1bHRWYWx1ZSB9KSxcbiAgICAgICAgICAuLi4odi5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkICYmIHsgZGVzY3JpcHRpb246IHYuZGVzY3JpcHRpb24gfSksXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSAIFNOUyBOb3RpZmljYXRpb25zIOKUgOKUgFxuICAgICAgY29uc3Qgbm90aWZpY2F0aW9uVG9waWNBcm4gPSBtZXRhW01ldGFkYXRhS2V5cy5OT1RJRklDQVRJT05fVE9QSUNfQVJOXTtcbiAgICAgIGlmICh0eXBlb2Ygbm90aWZpY2F0aW9uVG9waWNBcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IHRvcGljID0gc25zLlRvcGljLmZyb21Ub3BpY0Fybih0aGlzLCAnTm90aWZpY2F0aW9uVG9waWMnLCBub3RpZmljYXRpb25Ub3BpY0Fybik7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbkV2ZW50cyA9IHBhcnNlTm90aWZpY2F0aW9uRXZlbnRzKG1ldGFbTWV0YWRhdGFLZXlzLk5PVElGSUNBVElPTl9FVkVOVFNdKVxuICAgICAgICAgIC5tYXAoZSA9PiBQSVBFTElORV9FVkVOVF9NQVBbZS50b1VwcGVyQ2FzZSgpXSlcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICBpZiAobm90aWZpY2F0aW9uRXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjZGtQaXBlbGluZS5ub3RpZnlPbignUGlwZWxpbmVOb3RpZmljYXRpb24nLCB0b3BpYywgeyBldmVudHM6IG5vdGlmaWNhdGlvbkV2ZW50cyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgU2NoZWR1bGVkIEV4ZWN1dGlvbiDilIDilIBcbiAgICAgIGlmIChwcm9wcy5zeW50aC5zb3VyY2Uub3B0aW9ucz8udHJpZ2dlciA9PT0gVHJpZ2dlclR5cGUuU0NIRURVTEUgfHwgcHJvcHMuc2NoZWR1bGUpIHtcbiAgICAgICAgY29uc3QgZXhwciA9IHByb3BzLnNjaGVkdWxlIHx8IChwcm9wcy5zeW50aC5zb3VyY2Uub3B0aW9ucyBhcyB7IHNjaGVkdWxlPzogc3RyaW5nIH0pPy5zY2hlZHVsZSB8fCAncmF0ZSgxIGRheSknO1xuICAgICAgICBuZXcgZXZlbnRzLlJ1bGUodGhpcywgJ1NjaGVkdWxlUnVsZScsIHtcbiAgICAgICAgICBzY2hlZHVsZTogZXZlbnRzLlNjaGVkdWxlLmV4cHJlc3Npb24oZXhwciksXG4gICAgICAgICAgdGFyZ2V0czogW25ldyB0YXJnZXRzLkNvZGVQaXBlbGluZShjZGtQaXBlbGluZSldLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSAIEV4ZWN1dGlvbiBFdmVudCBUcmFja2luZyAoZm9yd2FyZCBwaXBlbGluZSBzdGF0ZSBjaGFuZ2VzIHRvIFNOUykg4pSA4pSAXG4gICAgICAvLyBgaXNUcnVlYCwgbm90IHRydXRoaW5lc3M6IGBcImZhbHNlXCJgIGlzIGEgdHJ1dGh5IHN0cmluZywgc28gdGhlIG1ldGFkYXRhXG4gICAgICAvLyBgXCJhd3M6Y2RrOm9wZXJhdGlvbnM6ZXhlY3V0aW9uZXZlbnRzXCI6IFwiZmFsc2VcImAgdXNlZCB0byBDUkVBVEUgdGhlIHJ1bGUuXG4gICAgICBpZiAoaXNUcnVlKG1ldGFbTWV0YWRhdGFLZXlzLkVOQUJMRV9FWEVDVVRJT05fRVZFTlRTXSkgJiYgdHlwZW9mIG5vdGlmaWNhdGlvblRvcGljQXJuID09PSAnc3RyaW5nJykge1xuICAgICAgICBuZXcgZXZlbnRzLlJ1bGUodGhpcywgJ0V4ZWN1dGlvbkV2ZW50UnVsZScsIHtcbiAgICAgICAgICBldmVudFBhdHRlcm46IHtcbiAgICAgICAgICAgIHNvdXJjZTogWydhd3MuY29kZXBpcGVsaW5lJ10sXG4gICAgICAgICAgICBkZXRhaWxUeXBlOiBbJ0NvZGVQaXBlbGluZSBQaXBlbGluZSBFeGVjdXRpb24gU3RhdGUgQ2hhbmdlJ10sXG4gICAgICAgICAgICByZXNvdXJjZXM6IFtjZGtQaXBlbGluZS5waXBlbGluZUFybl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0YXJnZXRzOiBbbmV3IHRhcmdldHMuU25zVG9waWMoXG4gICAgICAgICAgICBzbnMuVG9waWMuZnJvbVRvcGljQXJuKHRoaXMsICdFeGVjdXRpb25FdmVudFRvcGljJywgbm90aWZpY2F0aW9uVG9waWNBcm4pLFxuICAgICAgICAgICldLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSAIFBpcGVsaW5lIE1ldHJpY3MgJiBBbGFybXMg4pSA4pSAXG4gICAgICAvLyBTYW1lIHRyYXA6IGBcImF3czpjZGs6b3BlcmF0aW9uczptZXRyaWNzXCI6IFwiZmFsc2VcImAgY3JlYXRlZCB0aGUgYWxhcm0uXG4gICAgICBjb25zdCBlbmFibGVNZXRyaWNzID0gaXNUcnVlKHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZFtNZXRhZGF0YUtleXMuRU5BQkxFX01FVFJJQ1NdKTtcbiAgICAgIGlmIChlbmFibGVNZXRyaWNzKSB7XG4gICAgICAgIG5ldyBjbG91ZHdhdGNoLkFsYXJtKHRoaXMsICdQaXBlbGluZUZhaWx1cmVBbGFybScsIHtcbiAgICAgICAgICBtZXRyaWM6IG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgICAgICAgICBuYW1lc3BhY2U6ICdBV1MvQ29kZVBpcGVsaW5lJyxcbiAgICAgICAgICAgIG1ldHJpY05hbWU6ICdGYWlsZWRQaXBlbGluZUV4ZWN1dGlvbkNvdW50JyxcbiAgICAgICAgICAgIGRpbWVuc2lvbnNNYXA6IHsgUGlwZWxpbmVOYW1lOiB0aGlzLmNvbmZpZy5waXBlbGluZU5hbWUgfSxcbiAgICAgICAgICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gICAgICAgICAgICBwZXJpb2Q6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGhyZXNob2xkOiAxLFxuICAgICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgICAgICAgIGFsYXJtRGVzY3JpcHRpb246IGBQaXBlbGluZSAke3RoaXMuY29uZmlnLnBpcGVsaW5lTmFtZX0gZXhlY3V0aW9uIGZhaWxlZGAsXG4gICAgICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBjbG91ZHdhdGNoLkNvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fT1JfRVFVQUxfVE9fVEhSRVNIT0xELFxuICAgICAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IGNsb3Vkd2F0Y2guVHJlYXRNaXNzaW5nRGF0YS5OT1RfQlJFQUNISU5HLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gUmV2ZXJ0IHRoZSBwZXItYnVpbGRlciByZWdpc3RyeSBvdmVycmlkZSBzbyBpdCBuZXZlciBsZWFrcyBpbnRvIHRoZVxuICAgICAgLy8gcHJvY2Vzcy13aWRlIENvbmZpZyBjYWNoZSAoc2VlIHRoZSBvdmVycmlkZSBhdCB0aGUgdG9wIG9mIHRoZSBjb25zdHJ1Y3RvcikuXG4gICAgICByZXN0b3JlUmVnaXN0cnk/LigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGN1c3RvbSBhcnRpZmFjdCBidWNrZXQgd2hlbiBgZW5jcnlwdGlvbi5rbXNLZXlBcm5gIGFuZC9vclxuICAgKiBgb3BlcmF0aW9ucy5hcnRpZmFjdFJldGVudGlvbkRheXNgIGFyZSBzZXQuIFJldHVybnMgdW5kZWZpbmVkIG90aGVyd2lzZSBzb1xuICAgKiBDREsgYXV0by1jcmVhdGVzIHRoZSBkZWZhdWx0IGFydGlmYWN0IGJ1Y2tldCAodW5jaGFuZ2VkIGJlaGF2aW9yKS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRBcnRpZmFjdEJ1Y2tldCgpOiBzMy5JQnVja2V0IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkO1xuICAgIGNvbnN0IGttc0tleUFybiA9IHR5cGVvZiBtZXRhW01ldGFkYXRhS2V5cy5LTVNfS0VZX0FSTl0gPT09ICdzdHJpbmcnXG4gICAgICA/IChtZXRhW01ldGFkYXRhS2V5cy5LTVNfS0VZX0FSTl0gYXMgc3RyaW5nKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmV0ZW50aW9uRGF5cyA9IGFzSW50KG1ldGFbTWV0YWRhdGFLZXlzLkFSVElGQUNUX1JFVEVOVElPTl9EQVlTXSk7XG5cbiAgICBpZiAoIWttc0tleUFybiAmJiByZXRlbnRpb25EYXlzID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0ga21zS2V5QXJuXG4gICAgICA/IGttcy5LZXkuZnJvbUtleUFybih0aGlzLCAnQXJ0aWZhY3RLZXknLCBrbXNLZXlBcm4pXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQodGhpcywgJ0FydGlmYWN0QnVja2V0Jywge1xuICAgICAgZW5jcnlwdGlvbjogZW5jcnlwdGlvbktleSA/IHMzLkJ1Y2tldEVuY3J5cHRpb24uS01TIDogczMuQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VELFxuICAgICAgLi4uKGVuY3J5cHRpb25LZXkgJiYgeyBlbmNyeXB0aW9uS2V5IH0pLFxuICAgICAgLi4uKHJldGVudGlvbkRheXMgIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBbeyBleHBpcmF0aW9uOiBEdXJhdGlvbi5kYXlzKHJldGVudGlvbkRheXMpIH1dLFxuICAgICAgfSksXG4gICAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IHMzLkJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgIH0pO1xuICAgIFRhZ3Mub2YoYnVja2V0KS5hZGQoJ3BpcGVsaW5lJywgdGhpcy5jb25maWcucGlwZWxpbmVOYW1lKTtcbiAgICByZXR1cm4gYnVja2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIENvZGVCdWlsZERlZmF1bHRzIGludG8gdGhlIHNoYXBlIGV4cGVjdGVkIGJ5IENESydzIGNvZGVCdWlsZERlZmF1bHRzLlxuICAgKiBDb21iaW5lcyBuZXR3b3JrIGNvbmZpZywgc2VjdXJpdHkgZ3JvdXBzLCBhbmQgcGlwZWxpbmUtbGV2ZWwgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqIChQSVBFTElORV9JRCwgRVhFQ1VUSU9OX0lELCBQTEFURk9STV9CQVNFX1VSTCkgYXZhaWxhYmxlIHRvIGFsbCBDb2RlQnVpbGQgYWN0aW9ucy5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZURlZmF1bHRzKFxuICAgIGRlZmF1bHRzOiBDb2RlQnVpbGREZWZhdWx0cyB8IHVuZGVmaW5lZCxcbiAgICBpZDogVW5pcXVlSWQsXG4gICAgcGlwZWxpbmVJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHBsYXRmb3JtU2VjcmV0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHBsYXRmb3JtVXJsOiBzdHJpbmcsXG4gICAgb3JnSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0QnVpbGRJbWFnZTogSUJ1aWxkSW1hZ2UsXG4gICk6IENvZGVCdWlsZE9wdGlvbnMgfCB1bmRlZmluZWQge1xuICAgIC8vIFBlci1waXBlbGluZSBuZXR3b3JrIGNvbmZpZyB3aW5zOyBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIGFuIGVudi1kcml2ZW5cbiAgICAvLyBnbG9iYWwgVlBDIChpbnRlcm5hbCAvIGluc2lkZS1BV1Mtb25seSBtb2RlKSBzbyBldmVyeSBwaXBlbGluZSdzXG4gICAgLy8gQ29kZUJ1aWxkIHJ1bnMgaW4gdGhlIFZQQyBhbmQgY2FuIHJlYWNoIHRoZSBwcml2YXRlIGdhdGV3YXkuIFVuc2V0IGluXG4gICAgLy8gcHVibGljIGRlcGxveXMg4oaSIENvZGVCdWlsZCBzdGF5cyBpbiB0aGUgQVdTLW1hbmFnZWQgbmV0d29yay5cbiAgICAvLyBQcmVjZWRlbmNlOiBleHBsaWNpdCBwcm9wID4gYGVjMjpuZXR3b3JrYCBtZXRhZGF0YSA+IGVudi1kcml2ZW4gZ2xvYmFsIFZQQy5cbiAgICBjb25zdCBuZXR3b3JrID0gZGVmYXVsdHM/Lm5ldHdvcmsgPz8gbmV0d29ya0NvbmZpZ0Zyb21NZXRhZGF0YSh0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQpID8/IG5ldHdvcmtDb25maWdGcm9tRW52KCk7XG4gICAgY29uc3QgbmV0d29ya1Byb3BzID0gbmV0d29ya1xuICAgICAgPyByZXNvbHZlTmV0d29yayh0aGlzLCBpZCwgbmV0d29yaylcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gU2FtZSBwcmVjZWRlbmNlIGZvciBzdGFuZGFsb25lIHNlY3VyaXR5IGdyb3VwcyAocHJvcCA+IGBlYzI6c2VjdXJpdHlncm91cGAgbWV0YWRhdGEpLlxuICAgIGNvbnN0IHNlY3VyaXR5R3JvdXBDb25maWcgPSBkZWZhdWx0cz8uc2VjdXJpdHlHcm91cHMgPz8gc2VjdXJpdHlHcm91cENvbmZpZ0Zyb21NZXRhZGF0YSh0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQpO1xuICAgIGNvbnN0IHN0YW5kYWxvbmVTZWN1cml0eUdyb3VwcyA9IHNlY3VyaXR5R3JvdXBDb25maWdcbiAgICAgID8gcmVzb2x2ZVNlY3VyaXR5R3JvdXAodGhpcywgaWQsIHNlY3VyaXR5R3JvdXBDb25maWcpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGNhQnVuZGxlID0gcGxhdGZvcm1DYUJ1bmRsZSgpO1xuXG4gICAgLy8gUGlwZWxpbmUtbGV2ZWwgZW52IHZhcnMgYXZhaWxhYmxlIHRvIGFsbCBDb2RlQnVpbGQgYWN0aW9uc1xuICAgIC8vIE5vdGU6ICN7Y29kZXBpcGVsaW5lLip9IHJlc29sdmVkIHZhcmlhYmxlcyBtdXN0IGdvIHRocm91Z2ggQ29kZUJ1aWxkU3RlcC5lbnZcbiAgICAvLyAoYWN0aW9uLWxldmVsKSwgbm90IGJ1aWxkRW52aXJvbm1lbnQuZW52aXJvbm1lbnRWYXJpYWJsZXMgKHByb2plY3QtbGV2ZWwpLlxuICAgIGNvbnN0IHBpcGVsaW5lRW52VmFyczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogc3RyaW5nIH0+ID0ge1xuICAgICAgUExBVEZPUk1fQkFTRV9VUkw6IHsgdmFsdWU6IHBsYXRmb3JtVXJsIH0sXG4gICAgICAuLi4ocGlwZWxpbmVJZCAmJiB7IFBJUEVMSU5FX0lEOiB7IHZhbHVlOiBwaXBlbGluZUlkIH0gfSksXG4gICAgICAuLi4ocGxhdGZvcm1TZWNyZXROYW1lICYmIHsgUExBVEZPUk1fU0VDUkVUX05BTUU6IHsgdmFsdWU6IHBsYXRmb3JtU2VjcmV0TmFtZSB9IH0pLFxuICAgICAgLy8gVGhlIHJlZ2lzdHJhdGlvbiBrZXkncyBzZWNyZXQgTkFNRSAob25seSB0aGUgc3ludGggcm9sZSBtYXkgcmVhZCBpdCkuXG4gICAgICAuLi4ob3JnSWQgJiYgeyBbUElQRUxJTkVfUkVHSVNUUkFUSU9OX1NFQ1JFVF9FTlZdOiB7IHZhbHVlOiBDb3JlQ29uc3RhbnRzLnNlY3JldFBhdGgob3JnSWQsIFBJUEVMSU5FX1JFR0lTVFJBVElPTl9TRUNSRVRfTEVBRikgfSB9KSxcbiAgICAgIC8vIFBMQVRGT1JNX1RMU19WRVJJRlk9ZmFsc2UgKGRldiBzZWxmLXNpZ25lZCBwbGF0Zm9ybSk6IGV2ZXJ5IENvZGVCdWlsZFxuICAgICAgLy8gc3RlcCByZWFjaGVzIHRoZSBwbGF0Zm9ybSB1bnZlcmlmaWVkLiBTZWUgY29yZS9wbGF0Zm9ybS10bHMudHMuXG4gICAgICAuLi4oIXBsYXRmb3JtVGxzVmVyaWZ5KCkgJiYge1xuICAgICAgICBOT0RFX1RMU19SRUpFQ1RfVU5BVVRIT1JJWkVEOiB7IHZhbHVlOiAnMCcgfSxcbiAgICAgICAgW1BMQVRGT1JNX1RMU19WRVJJRllfRU5WXTogeyB2YWx1ZTogJ2ZhbHNlJyB9LFxuICAgICAgfSksXG4gICAgICAvLyBBIHByaXZhdGUtQ0EgcGxhdGZvcm06IHRoZSBDQSB0cmF2ZWxzIHdpdGggdGhlIHBpcGVsaW5lIHNvIHRoZVxuICAgICAgLy8gc2VsZi1tdXRhdGluZyBzeW50aCAoYW5kIGFueSBzdGVwIGNhbGxpbmcgdGhlIHBsYXRmb3JtKSBWRVJJRklFUyB0aGVcbiAgICAgIC8vIGNlcnRpZmljYXRlIGluc3RlYWQgb2YgbmVlZGluZyBgLS1uby12ZXJpZnktc3NsYC4gU2VlIGNvcmUvcGxhdGZvcm0tdGxzLnRzLlxuICAgICAgLi4uKGNhQnVuZGxlICYmIHsgW1BMQVRGT1JNX0NBX0JVTkRMRV9FTlZdOiB7IHZhbHVlOiBjYUJ1bmRsZSB9IH0pLFxuICAgICAgLy8gTm8gaW1hZ2UgY2Fycnk6IHRoZSBzZWxmLW11dGF0aW5nIHN5bnRoIHJlLXJlc29sdmVzIHRoZSB0b29sY2hhaW4gZnJvbVxuICAgICAgLy8gdGhlIHBsYXRmb3JtIChyZXNvbHZlQm9vdHN0cmFwSW1hZ2UpLCBzbyBhIHJlLXN5bnRoIGZvbGxvd3MgdGhlXG4gICAgICAvLyByZWxlYXNlIHRoZSBwbGF0Zm9ybSByZXNvbHZlcyBvbiB0aGF0IHJ1bi4gVGhlIHJlbGVhc2UgaXMgcmVjb3JkZWRcbiAgICAgIC8vIHBsYXRmb3JtLXNpZGUgaW4gdGhlIHN0ZXAgbWFuaWZlc3QsIG5ldmVyIGluIHRoZSBjdXN0b21lcidzIGFjY291bnQuXG4gICAgfTtcblxuICAgIGNvbnN0IHNlY3VyaXR5R3JvdXBzID0gW1xuICAgICAgLi4uKG5ldHdvcmtQcm9wcz8uc2VjdXJpdHlHcm91cHMgPz8gW10pLFxuICAgICAgLi4uKHN0YW5kYWxvbmVTZWN1cml0eUdyb3VwcyA/PyBbXSksXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi4obmV0d29ya1Byb3BzICYmIHsgdnBjOiBuZXR3b3JrUHJvcHMudnBjLCBzdWJuZXRTZWxlY3Rpb246IG5ldHdvcmtQcm9wcy5zdWJuZXRTZWxlY3Rpb24gfSksXG4gICAgICAuLi4oc2VjdXJpdHlHcm91cHMubGVuZ3RoID4gMCAmJiB7IHNlY3VyaXR5R3JvdXBzIH0pLFxuICAgICAgLy8gYnVpbGRJbWFnZSBhdCB0aGlzIGxldmVsIHJlYWNoZXMgQ0RLIFBpcGVsaW5lcycgaW50ZXJuYWxseS13cmFwcGVkXG4gICAgICAvLyBTaGVsbFN0ZXAgQ29kZUJ1aWxkIGFjdGlvbiBhbmQgYXNzZXQgcHVibGlzaGluZywgd2hpY2ggb3RoZXJ3aXNlIHJ1blxuICAgICAgLy8gb24gQ0RLJ3MgZGVmYXVsdCBjdXJhdGVkIGltYWdlLiBJdCBpcyB0aGUgcmVsZWFzZSdzIHBpcGVsaW5lLWJvb3RzdHJhcCxcbiAgICAgIC8vIHB1bGxlZCBleGFjdGx5IGxpa2UgYSBwbHVnaW4gaW1hZ2UuIFBlci1zdGVwIGBidWlsZEltYWdlYCBvbiBhXG4gICAgICAvLyBDb2RlQnVpbGRTdGVwIHN0aWxsIHdpbnM7IHNlbGYtbXV0YXRpb24gb3ZlcnJpZGVzIGl0IChjdXJhdGVkLCBEMTApLlxuICAgICAgYnVpbGRFbnZpcm9ubWVudDoge1xuICAgICAgICBidWlsZEltYWdlOiBkZWZhdWx0QnVpbGRJbWFnZSxcbiAgICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IHBpcGVsaW5lRW52VmFycyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIl19