UNPKG

@aws/pdk

Version:

All documentation is located at: https://aws.github.io/aws-pdk

130 lines 21.5 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.SmithyProjectDefinition = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); /*! Copyright [Amazon.com](http://amazon.com/), Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ const path = require("path"); const projen_1 = require("projen"); const smithy_build_1 = require("projen/lib/smithy/smithy-build"); const smithy_build_gradle_file_1 = require("./components/smithy-build-gradle-file"); const smithy_settings_gradle_file_1 = require("./components/smithy-settings-gradle-file"); const version_1 = require("./version"); const generate_task_1 = require("../../codegen/components/generate-task"); const utils_1 = require("../../codegen/components/utils"); /** * Definition for a Smithy project */ class SmithyProjectDefinition extends projen_1.Component { constructor(project, options) { super(project); /** * Set of dependencies used to avoid adding duplicates */ this.dependencySet = new Set(); // Ignore gradle wrapper by default if (options.ignoreGradleWrapper ?? true) { project.gitignore.addPatterns("gradle"); project.gitignore.addPatterns("gradlew"); project.gitignore.addPatterns("gradlew.bat"); } // Always ignore the .gradle dir which the wrapper downloads gradle into project.gitignore.addPatterns(".gradle"); this.gradleProjectName = project.name.replace(/[\/\\:<>"?\*|]/g, "-"); // Add settings.gradle new smithy_settings_gradle_file_1.SmithySettingsGradleFile(project, { gradleProjectName: this.gradleProjectName, }); const modelDir = "src/main/smithy"; this.modelDir = modelDir; // Always add the following required dependencies const requiredDependencies = [ "software.amazon.smithy:smithy-cli", "software.amazon.smithy:smithy-model", ]; // Ensure dependencies always include the required dependencies, allowing users to customise the version const userSpecifiedDependencies = options.smithyBuildOptions?.maven?.dependencies ?? []; const userSpecifiedDependencySet = new Set(userSpecifiedDependencies.map((dep) => dep.split(":").slice(0, -1).join(":"))); const dependencies = [ ...requiredDependencies .filter((requiredDep) => !userSpecifiedDependencySet.has(requiredDep)) .map((dep) => `${dep}:${version_1.DEFAULT_SMITHY_VERSION}`), ...userSpecifiedDependencies, ]; // Add build.gradle this.smithyBuildGradleFile = new smithy_build_gradle_file_1.SmithyBuildGradleFile(project, { modelDir, dependencies: [], repositoryUrls: options.smithyBuildOptions?.maven?.repositoryUrls, }); // Create the smithy build json file this.smithyBuild = new smithy_build_1.SmithyBuild(project, { version: "2.0", ...options.smithyBuildOptions, sources: [ modelDir, ...this.asRelativePathsToProject(options.smithyBuildOptions?.additionalSources ?? []), ], projections: { ...options.smithyBuildOptions?.projections, }, maven: { dependencies: [], repositories: (options.smithyBuildOptions?.maven?.repositoryUrls ?? [ "https://repo.maven.apache.org/maven2/", "file://~/.m2/repository", ]).map((url) => ({ url })), }, }); this.addDeps(...dependencies); const generateTask = generate_task_1.GenerateTask.ensure(project); // Copy the gradle files during build if they don't exist. We don't overwrite to allow users to BYO gradle wrapper // and set `ignoreGradleWrapper: false`. generateTask.exec((0, utils_1.buildTypeSafeApiExecCommand)(utils_1.TypeSafeApiScript.COPY_GRADLE_WRAPPER)); // Build with gradle to generate smithy projections, and any other tasks generateTask.exec("./gradlew build"); if (options.ignoreSmithyBuildOutput ?? true) { // Ignore the build directory, and smithy-output which was the old build directory for the cli-based generation project.gitignore.addPatterns("build", "smithy-output"); } } /** * Add maven-style or local file dependencies to the smithy model project * @param deps dependencies to add, eg "software.amazon.smithy:smithy-validation-model:1.27.2" or "file://../some/path/build/lib/my-shapes.jar */ addDeps(...deps) { const depsToAdd = deps.filter((dep) => !this.dependencySet.has(dep)); depsToAdd.forEach((dep) => this.dependencySet.add(dep)); this.smithyBuildGradleFile.addDeps(...depsToAdd); this.smithyBuild.addMavenDependencies(...depsToAdd.filter((dep) => !dep.startsWith(smithy_build_gradle_file_1.SmithyBuildGradleFile.fileDependencyPrefix))); } /** * Add dependencies on other smithy models, such that their shapes can be imported in this project * @param deps smithy definitions to depend on */ addSmithyDeps(...deps) { this.addDeps(...deps.map((dep) => `${smithy_build_gradle_file_1.SmithyBuildGradleFile.fileDependencyPrefix}${path.join(path.relative(this.project.outdir, dep.project.outdir), "build", "libs", `${dep.gradleProjectName}.jar`)}`)); } /** * Add additional paths to model source files or directories. * Paths should be relative to the project outdir. Any absolute paths will be * resolved as relative paths. */ addSources(...sources) { const relativeSources = this.asRelativePathsToProject(sources); this.smithyBuild.addSources(...relativeSources); this.smithyBuildGradleFile.addSources(...relativeSources); } /** * Convert any given absolute paths to relative paths to the project outdir * @private */ asRelativePathsToProject(paths) { return paths.map((p) => path.isAbsolute(p) ? path.relative(this.project.outdir, p) : p); } } exports.SmithyProjectDefinition = SmithyProjectDefinition; _a = JSII_RTTI_SYMBOL_1; SmithyProjectDefinition[_a] = { fqn: "@aws/pdk.type_safe_api.SmithyProjectDefinition", version: "0.26.14" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21pdGh5LXByb2plY3QtZGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNtaXRoeS1wcm9qZWN0LWRlZmluaXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtzQ0FDc0M7QUFDdEMsNkJBQTZCO0FBQzdCLG1DQUE0QztBQUM1QyxpRUFBNkQ7QUFDN0Qsb0ZBQThFO0FBQzlFLDBGQUFvRjtBQUVwRix1Q0FBbUQ7QUFDbkQsMEVBQXNFO0FBQ3RFLDBEQUd3QztBQXdCeEM7O0dBRUc7QUFDSCxNQUFhLHVCQUF3QixTQUFRLGtCQUFTO0lBd0JwRCxZQUFZLE9BQWdCLEVBQUUsT0FBdUM7UUFDbkUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBTmpCOztXQUVHO1FBQ2Msa0JBQWEsR0FBZ0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUt0RCxtQ0FBbUM7UUFDbkMsSUFBSSxPQUFPLENBQUMsbUJBQW1CLElBQUksSUFBSSxFQUFFLENBQUM7WUFDeEMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDekMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUNELHdFQUF3RTtRQUN4RSxPQUFPLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV6QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFdEUsc0JBQXNCO1FBQ3RCLElBQUksc0RBQXdCLENBQUMsT0FBTyxFQUFFO1lBQ3BDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxpQkFBaUI7U0FDMUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxRQUFRLEdBQUcsaUJBQWlC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LENBQUMsVUFBVSxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHdCQUF3QixDQUFDLEtBQWU7UUFDOUMsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUMvRCxDQUFDO0lBQ0osQ0FBQzs7QUExS0gsMERBMktDIiwic291cmNlc0NvbnRlbnQiOlsiLyohIENvcHlyaWdodCBbQW1hem9uLmNvbV0oaHR0cDovL2FtYXpvbi5jb20vKSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wICovXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBDb21wb25lbnQsIFByb2plY3QgfSBmcm9tIFwicHJvamVuXCI7XG5pbXBvcnQgeyBTbWl0aHlCdWlsZCB9IGZyb20gXCJwcm9qZW4vbGliL3NtaXRoeS9zbWl0aHktYnVpbGRcIjtcbmltcG9ydCB7IFNtaXRoeUJ1aWxkR3JhZGxlRmlsZSB9IGZyb20gXCIuL2NvbXBvbmVudHMvc21pdGh5LWJ1aWxkLWdyYWRsZS1maWxlXCI7XG5pbXBvcnQgeyBTbWl0aHlTZXR0aW5nc0dyYWRsZUZpbGUgfSBmcm9tIFwiLi9jb21wb25lbnRzL3NtaXRoeS1zZXR0aW5ncy1ncmFkbGUtZmlsZVwiO1xuaW1wb3J0IHsgU21pdGh5QnVpbGRPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERFRkFVTFRfU01JVEhZX1ZFUlNJT04gfSBmcm9tIFwiLi92ZXJzaW9uXCI7XG5pbXBvcnQgeyBHZW5lcmF0ZVRhc2sgfSBmcm9tIFwiLi4vLi4vY29kZWdlbi9jb21wb25lbnRzL2dlbmVyYXRlLXRhc2tcIjtcbmltcG9ydCB7XG4gIGJ1aWxkVHlwZVNhZmVBcGlFeGVjQ29tbWFuZCxcbiAgVHlwZVNhZmVBcGlTY3JpcHQsXG59IGZyb20gXCIuLi8uLi9jb2RlZ2VuL2NvbXBvbmVudHMvdXRpbHNcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBhIHNtaXRoeSBwcm9qZWN0IGRlZmluaXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbWl0aHlQcm9qZWN0RGVmaW5pdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogU21pdGh5IGJ1aWxkIG9wdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IHNtaXRoeUJ1aWxkT3B0aW9ucz86IFNtaXRoeUJ1aWxkT3B0aW9ucztcbiAgLyoqXG4gICAqIFNldCB0byBmYWxzZSBpZiB5b3Ugd291bGQgbGlrZSB0byBjaGVjayBpbiB5b3VyIHNtaXRoeSBidWlsZCBvdXRwdXQgb3IgaGF2ZSBtb3JlIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgd2hhdCBpc1xuICAgKiBjaGVja2VkIGluLCBlZyBpZiB5b3UgYWRkIG90aGVyIHByb2plY3Rpb25zIHRvIHRoZSBzbWl0aHktYnVpbGQuanNvbiBmaWxlLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBpZ25vcmVTbWl0aHlCdWlsZE91dHB1dD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTZXQgdG8gZmFsc2UgaWYgeW91IHdvdWxkIGxpa2UgdG8gY2hlY2sgaW4geW91ciBncmFkbGUgd3JhcHBlci4gRG8gc28gaWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIGEgZGlmZmVyZW50IHZlcnNpb25cbiAgICogb2YgZ3JhZGxlIHRvIHRoZSBvbmUgcHJvdmlkZWQgYnkgZGVmYXVsdFxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBpZ25vcmVHcmFkbGVXcmFwcGVyPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZWZpbml0aW9uIGZvciBhIFNtaXRoeSBwcm9qZWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBTbWl0aHlQcm9qZWN0RGVmaW5pdGlvbiBleHRlbmRzIENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBncmFkbGUgcHJvamVjdFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGdyYWRsZVByb2plY3ROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZSB0byB0aGUgYnVpbGQuZ3JhZGxlIGZpbGUgY29tcG9uZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNtaXRoeUJ1aWxkR3JhZGxlRmlsZTogU21pdGh5QnVpbGRHcmFkbGVGaWxlO1xuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBzbWl0aHktYnVpbGQuanNvbiBmaWxlIGNvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzbWl0aHlCdWlsZDogU21pdGh5QnVpbGQ7XG4gIC8qKlxuICAgKiBEaXJlY3Rvcnkgb2YgbW9kZWwgc291cmNlIGNvZGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtb2RlbERpcjogc3RyaW5nO1xuICAvKipcbiAgICogU2V0IG9mIGRlcGVuZGVuY2llcyB1c2VkIHRvIGF2b2lkIGFkZGluZyBkdXBsaWNhdGVzXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRlcGVuZGVuY3lTZXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIG9wdGlvbnM6IFNtaXRoeVByb2plY3REZWZpbml0aW9uT3B0aW9ucykge1xuICAgIHN1cGVyKHByb2plY3QpO1xuXG4gICAgLy8gSWdub3JlIGdyYWRsZSB3cmFwcGVyIGJ5IGRlZmF1bHRcbiAgICBpZiAob3B0aW9ucy5pZ25vcmVHcmFkbGVXcmFwcGVyID8/IHRydWUpIHtcbiAgICAgIHByb2plY3QuZ2l0aWdub3JlLmFkZFBhdHRlcm5zKFwiZ3JhZGxlXCIpO1xuICAgICAgcHJvamVjdC5naXRpZ25vcmUuYWRkUGF0dGVybnMoXCJncmFkbGV3XCIpO1xuICAgICAgcHJvamVjdC5naXRpZ25vcmUuYWRkUGF0dGVybnMoXCJncmFkbGV3LmJhdFwiKTtcbiAgICB9XG4gICAgLy8gQWx3YXlzIGlnbm9yZSB0aGUgLmdyYWRsZSBkaXIgd2hpY2ggdGhlIHdyYXBwZXIgZG93bmxvYWRzIGdyYWRsZSBpbnRvXG4gICAgcHJvamVjdC5naXRpZ25vcmUuYWRkUGF0dGVybnMoXCIuZ3JhZGxlXCIpO1xuXG4gICAgdGhpcy5ncmFkbGVQcm9qZWN0TmFtZSA9IHByb2plY3QubmFtZS5yZXBsYWNlKC9bXFwvXFxcXDo8PlwiP1xcKnxdL2csIFwiLVwiKTtcblxuICAgIC8vIEFkZCBzZXR0aW5ncy5ncmFkbGVcbiAgICBuZXcgU21pdGh5U2V0dGluZ3NHcmFkbGVGaWxlKHByb2plY3QsIHtcbiAgICAgIGdyYWRsZVByb2plY3ROYW1lOiB0aGlzLmdyYWRsZVByb2plY3ROYW1lLFxuICAgIH0pO1xuXG4gICAgY29uc3QgbW9kZWxEaXIgPSBcInNyYy9tYWluL3NtaXRoeVwiO1xuICAgIHRoaXMubW9kZWxEaXIgPSBtb2RlbERpcjtcblxuICAgIC8vIEFsd2F5cyBhZGQgdGhlIGZvbGxvd2luZyByZXF1aXJlZCBkZXBlbmRlbmNpZXNcbiAgICBjb25zdCByZXF1aXJlZERlcGVuZGVuY2llcyA9IFtcbiAgICAgIFwic29mdHdhcmUuYW1hem9uLnNtaXRoeTpzbWl0aHktY2xpXCIsXG4gICAgICBcInNvZnR3YXJlLmFtYXpvbi5zbWl0aHk6c21pdGh5LW1vZGVsXCIsXG4gICAgXTtcblxuICAgIC8vIEVuc3VyZSBkZXBlbmRlbmNpZXMgYWx3YXlzIGluY2x1ZGUgdGhlIHJlcXVpcmVkIGRlcGVuZGVuY2llcywgYWxsb3dpbmcgdXNlcnMgdG8gY3VzdG9taXNlIHRoZSB2ZXJzaW9uXG4gICAgY29uc3QgdXNlclNwZWNpZmllZERlcGVuZGVuY2llcyA9XG4gICAgICBvcHRpb25zLnNtaXRoeUJ1aWxkT3B0aW9ucz8ubWF2ZW4/LmRlcGVuZGVuY2llcyA/PyBbXTtcbiAgICBjb25zdCB1c2VyU3BlY2lmaWVkRGVwZW5kZW5jeVNldCA9IG5ldyBTZXQoXG4gICAgICB1c2VyU3BlY2lmaWVkRGVwZW5kZW5jaWVzLm1hcCgoZGVwKSA9PlxuICAgICAgICBkZXAuc3BsaXQoXCI6XCIpLnNsaWNlKDAsIC0xKS5qb2luKFwiOlwiKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBbXG4gICAgICAuLi5yZXF1aXJlZERlcGVuZGVuY2llc1xuICAgICAgICAuZmlsdGVyKChyZXF1aXJlZERlcCkgPT4gIXVzZXJTcGVjaWZpZWREZXBlbmRlbmN5U2V0LmhhcyhyZXF1aXJlZERlcCkpXG4gICAgICAgIC5tYXAoKGRlcCkgPT4gYCR7ZGVwfToke0RFRkFVTFRfU01JVEhZX1ZFUlNJT059YCksXG4gICAgICAuLi51c2VyU3BlY2lmaWVkRGVwZW5kZW5jaWVzLFxuICAgIF07XG5cbiAgICAvLyBBZGQgYnVpbGQuZ3JhZGxlXG4gICAgdGhpcy5zbWl0aHlCdWlsZEdyYWRsZUZpbGUgPSBuZXcgU21pdGh5QnVpbGRHcmFkbGVGaWxlKHByb2plY3QsIHtcbiAgICAgIG1vZGVsRGlyLFxuICAgICAgZGVwZW5kZW5jaWVzOiBbXSxcbiAgICAgIHJlcG9zaXRvcnlVcmxzOiBvcHRpb25zLnNtaXRoeUJ1aWxkT3B0aW9ucz8ubWF2ZW4/LnJlcG9zaXRvcnlVcmxzLFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBzbWl0aHkgYnVpbGQganNvbiBmaWxlXG4gICAgdGhpcy5zbWl0aHlCdWlsZCA9IG5ldyBTbWl0aHlCdWlsZChwcm9qZWN0LCB7XG4gICAgICB2ZXJzaW9uOiBcIjIuMFwiLFxuICAgICAgLi4ub3B0aW9ucy5zbWl0aHlCdWlsZE9wdGlvbnMsXG4gICAgICBzb3VyY2VzOiBbXG4gICAgICAgIG1vZGVsRGlyLFxuICAgICAgICAuLi50aGlzLmFzUmVsYXRpdmVQYXRoc1RvUHJvamVjdChcbiAgICAgICAgICBvcHRpb25zLnNtaXRoeUJ1aWxkT3B0aW9ucz8uYWRkaXRpb25hbFNvdXJjZXMgPz8gW11cbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICBwcm9qZWN0aW9uczoge1xuICAgICAgICAuLi5vcHRpb25zLnNtaXRoeUJ1aWxkT3B0aW9ucz8ucHJvamVjdGlvbnMsXG4gICAgICB9LFxuICAgICAgbWF2ZW46IHtcbiAgICAgICAgZGVwZW5kZW5jaWVzOiBbXSxcbiAgICAgICAgcmVwb3NpdG9yaWVzOiAoXG4gICAgICAgICAgb3B0aW9ucy5zbWl0aHlCdWlsZE9wdGlvbnM/Lm1hdmVuPy5yZXBvc2l0b3J5VXJscyA/PyBbXG4gICAgICAgICAgICBcImh0dHBzOi8vcmVwby5tYXZlbi5hcGFjaGUub3JnL21hdmVuMi9cIixcbiAgICAgICAgICAgIFwiZmlsZTovL34vLm0yL3JlcG9zaXRvcnlcIixcbiAgICAgICAgICBdXG4gICAgICAgICkubWFwKCh1cmwpID0+ICh7IHVybCB9KSksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5hZGREZXBzKC4uLmRlcGVuZGVuY2llcyk7XG5cbiAgICBjb25zdCBnZW5lcmF0ZVRhc2sgPSBHZW5lcmF0ZVRhc2suZW5zdXJlKHByb2plY3QpO1xuXG4gICAgLy8gQ29weSB0aGUgZ3JhZGxlIGZpbGVzIGR1cmluZyBidWlsZCBpZiB0aGV5IGRvbid0IGV4aXN0LiBXZSBkb24ndCBvdmVyd3JpdGUgdG8gYWxsb3cgdXNlcnMgdG8gQllPIGdyYWRsZSB3cmFwcGVyXG4gICAgLy8gYW5kIHNldCBgaWdub3JlR3JhZGxlV3JhcHBlcjogZmFsc2VgLlxuICAgIGdlbmVyYXRlVGFzay5leGVjKFxuICAgICAgYnVpbGRUeXBlU2FmZUFwaUV4ZWNDb21tYW5kKFR5cGVTYWZlQXBpU2NyaXB0LkNPUFlfR1JBRExFX1dSQVBQRVIpXG4gICAgKTtcblxuICAgIC8vIEJ1aWxkIHdpdGggZ3JhZGxlIHRvIGdlbmVyYXRlIHNtaXRoeSBwcm9qZWN0aW9ucywgYW5kIGFueSBvdGhlciB0YXNrc1xuICAgIGdlbmVyYXRlVGFzay5leGVjKFwiLi9ncmFkbGV3IGJ1aWxkXCIpO1xuXG4gICAgaWYgKG9wdGlvbnMuaWdub3JlU21pdGh5QnVpbGRPdXRwdXQgPz8gdHJ1ZSkge1xuICAgICAgLy8gSWdub3JlIHRoZSBidWlsZCBkaXJlY3RvcnksIGFuZCBzbWl0aHktb3V0cHV0IHdoaWNoIHdhcyB0aGUgb2xkIGJ1aWxkIGRpcmVjdG9yeSBmb3IgdGhlIGNsaS1iYXNlZCBnZW5lcmF0aW9uXG4gICAgICBwcm9qZWN0LmdpdGlnbm9yZS5hZGRQYXR0ZXJucyhcImJ1aWxkXCIsIFwic21pdGh5LW91dHB1dFwiKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIG1hdmVuLXN0eWxlIG9yIGxvY2FsIGZpbGUgZGVwZW5kZW5jaWVzIHRvIHRoZSBzbWl0aHkgbW9kZWwgcHJvamVjdFxuICAgKiBAcGFyYW0gZGVwcyBkZXBlbmRlbmNpZXMgdG8gYWRkLCBlZyBcInNvZnR3YXJlLmFtYXpvbi5zbWl0aHk6c21pdGh5LXZhbGlkYXRpb24tbW9kZWw6MS4yNy4yXCIgb3IgXCJmaWxlOi8vLi4vc29tZS9wYXRoL2J1aWxkL2xpYi9teS1zaGFwZXMuamFyXG4gICAqL1xuICBwdWJsaWMgYWRkRGVwcyguLi5kZXBzOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IGRlcHNUb0FkZCA9IGRlcHMuZmlsdGVyKChkZXApID0+ICF0aGlzLmRlcGVuZGVuY3lTZXQuaGFzKGRlcCkpO1xuICAgIGRlcHNUb0FkZC5mb3JFYWNoKChkZXApID0+IHRoaXMuZGVwZW5kZW5jeVNldC5hZGQoZGVwKSk7XG4gICAgdGhpcy5zbWl0aHlCdWlsZEdyYWRsZUZpbGUuYWRkRGVwcyguLi5kZXBzVG9BZGQpO1xuICAgIHRoaXMuc21pdGh5QnVpbGQuYWRkTWF2ZW5EZXBlbmRlbmNpZXMoXG4gICAgICAuLi5kZXBzVG9BZGQuZmlsdGVyKFxuICAgICAgICAoZGVwKSA9PiAhZGVwLnN0YXJ0c1dpdGgoU21pdGh5QnVpbGRHcmFkbGVGaWxlLmZpbGVEZXBlbmRlbmN5UHJlZml4KVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGRlcGVuZGVuY2llcyBvbiBvdGhlciBzbWl0aHkgbW9kZWxzLCBzdWNoIHRoYXQgdGhlaXIgc2hhcGVzIGNhbiBiZSBpbXBvcnRlZCBpbiB0aGlzIHByb2plY3RcbiAgICogQHBhcmFtIGRlcHMgc21pdGh5IGRlZmluaXRpb25zIHRvIGRlcGVuZCBvblxuICAgKi9cbiAgcHVibGljIGFkZFNtaXRoeURlcHMoLi4uZGVwczogU21pdGh5UHJvamVjdERlZmluaXRpb25bXSkge1xuICAgIHRoaXMuYWRkRGVwcyhcbiAgICAgIC4uLmRlcHMubWFwKFxuICAgICAgICAoZGVwKSA9PlxuICAgICAgICAgIGAke1NtaXRoeUJ1aWxkR3JhZGxlRmlsZS5maWxlRGVwZW5kZW5jeVByZWZpeH0ke3BhdGguam9pbihcbiAgICAgICAgICAgIHBhdGgucmVsYXRpdmUodGhpcy5wcm9qZWN0Lm91dGRpciwgZGVwLnByb2plY3Qub3V0ZGlyKSxcbiAgICAgICAgICAgIFwiYnVpbGRcIixcbiAgICAgICAgICAgIFwibGlic1wiLFxuICAgICAgICAgICAgYCR7ZGVwLmdyYWRsZVByb2plY3ROYW1lfS5qYXJgXG4gICAgICAgICAgKX1gXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYWRkaXRpb25hbCBwYXRocyB0byBtb2RlbCBzb3VyY2UgZmlsZXMgb3IgZGlyZWN0b3JpZXMuXG4gICAqIFBhdGhzIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCBvdXRkaXIuIEFueSBhYnNvbHV0ZSBwYXRocyB3aWxsIGJlXG4gICAqIHJlc29sdmVkIGFzIHJlbGF0aXZlIHBhdGhzLlxuICAgKi9cbiAgcHVibGljIGFkZFNvdXJjZXMoLi4uc291cmNlczogc3RyaW5nW10pIHtcbiAgICBjb25zdCByZWxhdGl2ZVNvdXJjZXMgPSB0aGlzLmFzUmVsYXRpdmVQYXRoc1RvUHJvamVjdChzb3VyY2VzKTtcbiAgICB0aGlzLnNtaXRoeUJ1aWxkLmFkZFNvdXJjZXMoLi4ucmVsYXRpdmVTb3VyY2VzKTtcbiAgICB0aGlzLnNtaXRoeUJ1aWxkR3JhZGxlRmlsZS5hZGRTb3VyY2VzKC4uLnJlbGF0aXZlU291cmNlcyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhbnkgZ2l2ZW4gYWJzb2x1dGUgcGF0aHMgdG8gcmVsYXRpdmUgcGF0aHMgdG8gdGhlIHByb2plY3Qgb3V0ZGlyXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzUmVsYXRpdmVQYXRoc1RvUHJvamVjdChwYXRoczogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gcGF0aHMubWFwKChwKSA9PlxuICAgICAgcGF0aC5pc0Fic29sdXRlKHApID8gcGF0aC5yZWxhdGl2ZSh0aGlzLnByb2plY3Qub3V0ZGlyLCBwKSA6IHBcbiAgICApO1xuICB9XG59XG4iXX0=