cdk-nuxt 2.23.0 → 2.24.1

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.
@@ -167,6 +167,17 @@ export declare class NuxtServerAppStack extends Stack {
167
167
  * to be handled by the Lambda function for dynamic content generation.
168
168
  */
169
169
  private createServerRouteBehavior;
170
+ /**
171
+ * Creates behaviors for the CloudFront distribution based on the consumer-supplied {@link NuxtCloudFrontBehavior} list.
172
+ * Each behavior can override the cache policy, attach a CloudFront Function, or both.
173
+ *
174
+ * When {@link NuxtCloudFrontBehavior.fnCode} is provided, this method creates the `cloudfront.Function`
175
+ * resource inside the stack itself so that it is always correctly scoped.
176
+ *
177
+ * The provided {@link NuxtCloudFrontBehavior.cachePolicy} is used when specified; otherwise the
178
+ * default Nuxt app cache policy ({@link appCachePolicy}) is used.
179
+ */
180
+ private createAdditionalBehaviors;
170
181
  /**
171
182
  * Creates a behavior for the CloudFront distribution to route matching incoming requests for the static assets
172
183
  * to the S3 bucket that holds these static assets.
@@ -295,6 +295,10 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
295
295
  if (props.serverRoutes && props.serverRoutes.length > 0) {
296
296
  routingBehaviours = { ...routingBehaviours, ...this.createServerRouteBehavior(props.serverRoutes) };
297
297
  }
298
+ // Inject custom behaviors (cache policy overrides and/or CloudFront Functions) before static asset behaviors
299
+ if (props.additionalBehaviors && props.additionalBehaviors.length > 0) {
300
+ routingBehaviours = { ...routingBehaviours, ...this.createAdditionalBehaviors(props.additionalBehaviors) };
301
+ }
298
302
  routingBehaviours = { ...routingBehaviours, ...this.createStaticAssetsRouteBehavior() };
299
303
  return routingBehaviours;
300
304
  }
@@ -364,6 +368,39 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
364
368
  });
365
369
  return rules;
366
370
  }
371
+ /**
372
+ * Creates behaviors for the CloudFront distribution based on the consumer-supplied {@link NuxtCloudFrontBehavior} list.
373
+ * Each behavior can override the cache policy, attach a CloudFront Function, or both.
374
+ *
375
+ * When {@link NuxtCloudFrontBehavior.fnCode} is provided, this method creates the `cloudfront.Function`
376
+ * resource inside the stack itself so that it is always correctly scoped.
377
+ *
378
+ * The provided {@link NuxtCloudFrontBehavior.cachePolicy} is used when specified; otherwise the
379
+ * default Nuxt app cache policy ({@link appCachePolicy}) is used.
380
+ */
381
+ createAdditionalBehaviors(behaviors) {
382
+ const rules = {};
383
+ behaviors.forEach((behavior, index) => {
384
+ var _a, _b;
385
+ let functionAssociations = [];
386
+ if (behavior.fnCode) {
387
+ // Create the CloudFront Function inside the stack so it is always correctly scoped.
388
+ const cfFunction = new aws_cloudfront_1.Function(this, `${this.resourceIdPrefix}-behavior-fn-${index}`, {
389
+ code: behavior.fnCode,
390
+ });
391
+ functionAssociations = [{
392
+ function: cfFunction,
393
+ eventType: (_a = behavior.eventType) !== null && _a !== void 0 ? _a : aws_cloudfront_1.FunctionEventType.VIEWER_REQUEST,
394
+ }];
395
+ }
396
+ rules[behavior.pathPattern] = {
397
+ ...this.nuxtServerRouteBehavior,
398
+ cachePolicy: (_b = behavior.cachePolicy) !== null && _b !== void 0 ? _b : this.appCachePolicy,
399
+ ...(functionAssociations.length > 0 ? { functionAssociations } : {}),
400
+ };
401
+ });
402
+ return rules;
403
+ }
367
404
  /**
368
405
  * Creates a behavior for the CloudFront distribution to route matching incoming requests for the static assets
369
406
  * to the S3 bucket that holds these static assets.
@@ -573,4 +610,4 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
573
610
  }
574
611
  }
575
612
  exports.NuxtServerAppStack = NuxtServerAppStack;
576
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTnV4dFNlcnZlckFwcFN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiTnV4dFNlcnZlckFwcFN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUEyRDtBQUUzRCwrRUFBK0Q7QUFDL0QsK0RBZW9DO0FBQ3BDLHVEQUFzRjtBQUN0RiwrQ0FNNEI7QUFDNUIseURBQXdHO0FBQ3hHLHFFQUFxRjtBQUNyRiwrRUFBOEU7QUFDOUUseUVBQWlFO0FBQ2pFLG1EQUErRDtBQUMvRCxnRUFBNEY7QUFDNUYsdURBQXVFO0FBQ3ZFLHVFQUE4RDtBQUM5RCw2QkFBNkI7QUFDN0IsMkJBQXdEO0FBRXhELDZGQUFnRjtBQUNoRixtRUFBMkc7QUFFM0c7O0dBRUc7QUFDSCxNQUFhLGtCQUFtQixTQUFRLG1CQUFLO0lBa0d6QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCOztRQUNwRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNiLEdBQUcsS0FBSztZQUVSLHVFQUF1RTtZQUN2RSxxQkFBcUIsRUFBRSxLQUFLLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxDQUFBLE1BQUEsS0FBSyxDQUFDLEdBQUcsMENBQUUsTUFBTSxNQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMscUJBQXFCO1NBQ2pJLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFakYscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUEsa0RBQTRCLEVBQUMsTUFBQSxLQUFLLENBQUMsT0FBTyxtQ0FBSSxHQUFHLENB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QWtFO1lBQ2xFLGFBQWEsRUFBRSwyQkFBYSxDQUFDLE9BQU87WUFDcEMsaUJBQWlCLEVBQUUsSUFBSTtTQUMxQixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRTlDLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFHTyx3QkFBd0IsQ0FBQyxLQUE4Qjs7UUFDM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsTUFBTSxFQUFFLDRCQUE0QixFQUFFLEdBQUcsT0FBTyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFFekcsSUFBSSw0QkFBNEIsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLHVCQUF1QixFQUFFO1lBQ3BGLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQzdCLGNBQWMsRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsY0FBYztZQUN0RCxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO1lBQ3hDLGlCQUFpQixFQUFFLE1BQUEsS0FBSyxDQUFDLDBCQUEwQixtQ0FBSSxJQUFJO1lBQzNELGtCQUFrQixFQUFFLEtBQUssQ0FBQyxzQkFBc0I7WUFDaEQsMkJBQTJCLEVBQUUsS0FBSyxDQUFDLCtCQUErQjtZQUNsRSwwQkFBMEIsRUFBRSxLQUFLLENBQUMsOEJBQThCO1NBQ25FLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSjtBQTlzQkQsZ0RBOHNCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RHVyYXRpb24sIFJlbW92YWxQb2xpY3ksIFN0YWNrfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge0NvbnN0cnVjdH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge0NlcnRpZmljYXRlfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgICBBbGxvd2VkTWV0aG9kcyxcbiAgICB0eXBlIEJlaGF2aW9yT3B0aW9ucyxcbiAgICBDYWNoZUNvb2tpZUJlaGF2aW9yLFxuICAgIENhY2hlZE1ldGhvZHMsXG4gICAgQ2FjaGVIZWFkZXJCZWhhdmlvcixcbiAgICBDYWNoZVBvbGljeSxcbiAgICBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IsXG4gICAgRGlzdHJpYnV0aW9uLCBIdHRwVmVyc2lvbixcbiAgICB0eXBlIElPcmlnaW5BY2Nlc3NJZGVudGl0eSxcbiAgICBPcmlnaW5BY2Nlc3NJZGVudGl0eSxcbiAgICBPcmlnaW5Qcm90b2NvbFBvbGljeSwgT3JpZ2luUmVxdWVzdFBvbGljeSxcbiAgICBQcmljZUNsYXNzLFxuICAgIFNlY3VyaXR5UG9saWN5UHJvdG9jb2wsXG4gICAgVmlld2VyUHJvdG9jb2xQb2xpY3ksT3JpZ2luUmVxdWVzdENvb2tpZUJlaGF2aW9yLCBPcmlnaW5SZXF1ZXN0SGVhZGVyQmVoYXZpb3IsIE9yaWdpblJlcXVlc3RRdWVyeVN0cmluZ0JlaGF2aW9yXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udFwiO1xuaW1wb3J0IHtBcmNoaXRlY3R1cmUsIENvZGUsIEZ1bmN0aW9uLCBSdW50aW1lLCBUcmFjaW5nfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHtcbiAgICBCbG9ja1B1YmxpY0FjY2VzcyxcbiAgICBCdWNrZXQsXG4gICAgQnVja2V0QWNjZXNzQ29udHJvbCxcbiAgICBCdWNrZXRFbmNyeXB0aW9uLFxuICAgIE9iamVjdE93bmVyc2hpcFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQge0FhYWFSZWNvcmQsIEFSZWNvcmQsIEhvc3RlZFpvbmUsIHR5cGUgSUhvc3RlZFpvbmUsIFJlY29yZFRhcmdldH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzXCI7XG5pbXBvcnQge0J1Y2tldERlcGxveW1lbnQsIFNvdXJjZSwgU3RvcmFnZUNsYXNzfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzLWRlcGxveW1lbnRcIjtcbmltcG9ydCB7SHR0cE9yaWdpbiwgUzNCdWNrZXRPcmlnaW59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zXCI7XG5pbXBvcnQge0Nsb3VkRnJvbnRUYXJnZXR9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1My10YXJnZXRzXCI7XG5pbXBvcnQgeyBMb2dHcm91cCwgUmV0ZW50aW9uRGF5cyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiO1xuaW1wb3J0IHtnZXROdXh0QXBwU3RhdGljQXNzZXRDb25maWdzLCB0eXBlIFN0YXRpY0Fzc2V0Q29uZmlnfSBmcm9tIFwiLi4vTnV4dEFwcFN0YXRpY0Fzc2V0c1wiO1xuaW1wb3J0IHtSdWxlLCBSdWxlVGFyZ2V0SW5wdXQsIFNjaGVkdWxlfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50c1wiO1xuaW1wb3J0IHtMYW1iZGFGdW5jdGlvbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0c1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHt3cml0ZUZpbGVTeW5jLCBta2RpclN5bmMsIGV4aXN0c1N5bmN9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHt0eXBlIE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzfSBmcm9tIFwiLi9OdXh0U2VydmVyQXBwU3RhY2tQcm9wc1wiO1xuaW1wb3J0IHtIdHRwTGFtYmRhSW50ZWdyYXRpb259IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyLWludGVncmF0aW9uc1wiO1xuaW1wb3J0IHtEb21haW5OYW1lLCBFbmRwb2ludFR5cGUsIEh0dHBBcGksIEh0dHBNZXRob2QsIFNlY3VyaXR5UG9saWN5fSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXl2MlwiO1xuXG4vKipcbiAqIENESyBzdGFjayB0byBkZXBsb3kgYSBkeW5hbWljIE51eHQgYXBwICh0YXJnZXQ9c2VydmVyKSBvbiBBV1Mgd2l0aCBMYW1iZGEsIEFwaUdhdGV3YXksIFMzIGFuZCBDbG91ZEZyb250LlxuICovXG5leHBvcnQgY2xhc3MgTnV4dFNlcnZlckFwcFN0YWNrIGV4dGVuZHMgU3RhY2sge1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgcHJlZml4IG9mIHRoZSByZXNvdXJjZXMgY3JlYXRlZCBieSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2VJZFByZWZpeDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IGRlcGxveW1lbnQgdGhhdCBpcyB1c2VkIHRvIHRhZyB0aGUgc3RhdGljIGFzc2V0cyBvZiB0aGUgZGVwbG95bWVudFxuICAgICAqIHRvIGxhdGVyIGJlIGFibGUgdG8gY2xlYW4gdXAgb3V0ZGF0ZWQgYXNzZXRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlcGxveW1lbnRSZXZpc2lvbjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aXR5IHRvIHVzZSBmb3IgYWNjZXNzaW5nIHRoZSBkZXBsb3ltZW50IGFzc2V0cyBvbiBTMy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZG5BY2Nlc3NJZGVudGl0eTogSU9yaWdpbkFjY2Vzc0lkZW50aXR5O1xuXG4gICAgLyoqXG4gICAgICogVGhlIFMzIGJ1Y2tldCB3aGVyZSB0aGUgZGVwbG95bWVudCBhc3NldHMgZ2V0cyBzdG9yZWQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpY0Fzc2V0c0J1Y2tldDogQnVja2V0O1xuXG4gICAgLyoqXG4gICAgICogVGhlIFMzIGJ1Y2tldCB3aGVyZSB0aGUgYWNjZXNzIGxvZ3Mgb2YgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIGdldHMgc3RvcmVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBhY2Nlc3NMb2dzQnVja2V0OiBCdWNrZXR8dW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogVGhlIFMzIGJ1Y2tldCB3aGVyZSB0aGUgc2l0ZW1hcCBhc3NldHMgZ2V0cyBzdG9yZWQuXG4gICAgICovXG4gICAgcHVibGljIHNpdGVtYXBCdWNrZXQ6IEJ1Y2tldHx1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgTGFtYmRhIGZ1bmN0aW9uIHRvIHJlbmRlciB0aGUgTnV4dCBhcHAgb24gdGhlIHNlcnZlciBzaWRlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcExhbWJkYUZ1bmN0aW9uOiBGdW5jdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gdGhhdCBjbGVhbnVwcyB0aGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xlYW51cExhbWJkYUZ1bmN0aW9uOiBGdW5jdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBBUEkgZ2F0ZXdheSB0byBtYWtlIHRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gcmVuZGVyIHRoZSBOdXh0IGFwcCBwdWJsaWNseSBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgYXBpR2F0ZXdheTogSHR0cEFwaTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjb25maWdzIGZvciB0aGUgc3RhdGljIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAgdGhhdCBzaGFsbCBiZSBwdWJsaWNseSBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljQXNzZXRDb25maWdzOiBTdGF0aWNBc3NldENvbmZpZ1tdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIG9yaWdpbiBmb3IgdGhlIEFQSSBnYXRld2F5IHRvIHJvdXRlIGluY29taW5nIHJlcXVlc3RzIHRvIHRoZSBOdXh0IExhbWJkYSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGh0dHBPcmlnaW46IEh0dHBPcmlnaW47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY2FjaGUgcG9saWN5IHRoYXQgc3BlY2lmaWVzIHdoaWNoIEhUVFAgaGVhZGVycywgY29va2llcywgYW5kIHF1ZXJ5IHN0cmluZ3NcbiAgICAgKiBDbG91ZEZyb250IGZvcndhcmRzIHRvIHRoZSBOdXh0IGFwcCBhbmQgdXNlcyB0byBnZW5lcmF0ZSBhIGNhY2hlIGtleS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFwcENhY2hlUG9saWN5OiBDYWNoZVBvbGljeTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW4gcmVxdWVzdCBwb2xpY3kgdGhhdCBzcGVjaWZpZXMgd2hpY2ggSFRUUCBoZWFkZXJzLCBjb29raWVzLCBhbmQgcXVlcnkgc3RyaW5nc1xuICAgICAqIENsb3VkRnJvbnQgZm9yd2FyZHMgdG8gdGhlIE51eHQgYXBwIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjYWNoZSBrZXkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhcHBSZXF1ZXN0UG9saWN5OiBPcmlnaW5SZXF1ZXN0UG9saWN5IHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJlaGF2aW9yIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgaW5jb21pbmcgd2ViIHJlcXVlc3RzXG4gICAgICogdG8gdGhlIE51eHQgTGFtYmRhIGZ1bmN0aW9uICh2aWEgQVBJIGdhdGV3YXkpLlxuICAgICAqL1xuICAgIHByaXZhdGUgbnV4dFNlcnZlclJvdXRlQmVoYXZpb3I6IEJlaGF2aW9yT3B0aW9ucztcblxuICAgIC8qKlxuICAgICAqIFRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBpbmNvbWluZyByZXF1ZXN0cyB0byB0aGUgTnV4dCBMYW1iZGEgZnVuY3Rpb24gKHZpYSB0aGUgQVBJIGdhdGV3YXkpXG4gICAgICogb3IgdGhlIFMzIGFzc2V0cyBmb2xkZXIgKHdpdGggY2FjaGluZykuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RuOiBEaXN0cmlidXRpb247XG5cbiAgICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpIHtcbiAgICAgICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICAgICAgICAuLi5wcm9wcyxcblxuICAgICAgICAgICAgLy8gRm9yY2UgY3Jvc3MtcmVnaW9uIHJlZmVyZW5jZXMgaWYgYSBXQUYgQUNMIGlzIHVzZWQgb3V0c2lkZSB1cy1lYXN0LTFcbiAgICAgICAgICAgIGNyb3NzUmVnaW9uUmVmZXJlbmNlczogcHJvcHMud2ViQWNsQXJuICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZW52Py5yZWdpb24gIT09ICd1cy1lYXN0LTEnID8gdHJ1ZSA6IHByb3BzLmNyb3NzUmVnaW9uUmVmZXJlbmNlcyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZXNvdXJjZUlkUHJlZml4ID0gYCR7cHJvcHMucHJvamVjdH0tJHtwcm9wcy5zZXJ2aWNlfS0ke3Byb3BzLmVudmlyb25tZW50fWA7XG5cbiAgICAgICAgLy8gTnV4dCBhcHAgcmVzb3VyY2VzXG4gICAgICAgIHRoaXMuZGVwbG95bWVudFJldmlzaW9uID0gdGhpcy5jcmVhdGVEZXBsb3ltZW50UmV2aXNpb24ocHJvcHMpO1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0Q29uZmlncyA9IGdldE51eHRBcHBTdGF0aWNBc3NldENvbmZpZ3MocHJvcHMucm9vdERpciA/PyAnLicpO1xuICAgICAgICB0aGlzLmNkbkFjY2Vzc0lkZW50aXR5ID0gdGhpcy5jcmVhdGVDZG5BY2Nlc3NJZGVudGl0eSgpO1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldCA9IHRoaXMuY3JlYXRlU3RhdGljQXNzZXRzQnVja2V0KCk7XG5cbiAgICAgICAgaWYgKHByb3BzLmVuYWJsZUFjY2Vzc0xvZ3NBbmFseXNpcykge1xuICAgICAgICAgICAgdGhpcy5hY2Nlc3NMb2dzQnVja2V0ID0gdGhpcy5jcmVhdGVBY2Nlc3NMb2dzQnVja2V0KCk7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFjY2Vzc0xvZ3NBbmFseXNpcyhwcm9wcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcHMuZW5hYmxlU2l0ZW1hcCkge1xuICAgICAgICAgICAgdGhpcy5zaXRlbWFwQnVja2V0ID0gdGhpcy5jcmVhdGVTaXRlbWFwQnVja2V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcExhbWJkYUZ1bmN0aW9uID0gdGhpcy5jcmVhdGVBcHBMYW1iZGFGdW5jdGlvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuYXBpR2F0ZXdheSA9IHRoaXMuY3JlYXRlQXBpR2F0ZXdheShwcm9wcyk7XG4gICAgICAgIHRoaXMuaHR0cE9yaWdpbiA9IHRoaXMuY3JlYXRlTnV4dEFwcEh0dHBPcmlnaW4oKTtcbiAgICAgICAgdGhpcy5hcHBDYWNoZVBvbGljeSA9IHRoaXMuY3JlYXRlTnV4dEFwcENhY2hlUG9saWN5KHByb3BzKVxuICAgICAgICB0aGlzLmFwcFJlcXVlc3RQb2xpY3kgPSB0aGlzLmNyZWF0ZU51eHRBcHBSZXF1ZXN0UG9saWN5KHByb3BzKVxuICAgICAgICB0aGlzLm51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yID0gdGhpcy5jcmVhdGVOdXh0U2VydmVyUm91dGVCZWhhdmlvcigpXG5cbiAgICAgICAgdGhpcy5jZG4gPSB0aGlzLmNyZWF0ZUNsb3VkRnJvbnREaXN0cmlidXRpb24ocHJvcHMpO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZURlcGxveW1lbnRzKCk7XG4gICAgICAgIHRoaXMuY3JlYXRlRG5zUmVjb3Jkcyhwcm9wcyk7XG4gICAgICAgIHRoaXMuY3JlYXRlQXBwUGluZ1J1bGUocHJvcHMpO1xuXG4gICAgICAgIC8vIFN0YXRpYyBhc3NldHMgY2xlYW51cCByZXNvdXJjZXNcbiAgICAgICAgdGhpcy5jbGVhbnVwTGFtYmRhRnVuY3Rpb24gPSB0aGlzLmNyZWF0ZUNsZWFudXBMYW1iZGFGdW5jdGlvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2xlYW51cFRyaWdnZXJSdWxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgY3VycmVudCBkZXBsb3ltZW50IHJldmlzaW9uIGZpbGUgaW4gdGhlIHB1YmxpYyBmb2xkZXIgb2YgdGhlIE51eHQgYXBwIHRvIGJlIGFjY2Vzc2libGVcbiAgICAgKiBhbmQgcmV0dXJucyB0aGUgY3VycmVudCByZXZpc2lvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZURlcGxveW1lbnRSZXZpc2lvbihwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBhcHBSZXZpc2lvbiA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcblxuICAgICAgICBjb25zdCBkaXIgPSBwYXRoLmpvaW4ocHJvcHMucm9vdERpciA/PyAnLicsICcub3V0cHV0JywgJ3B1YmxpYycpO1xuICAgICAgICBta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgd3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oZGlyLCAnYXBwLXJldmlzaW9uJyksIGFwcFJldmlzaW9uLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgICAgIHJldHVybiBhcHBSZXZpc2lvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBpZGVudGl0eSB0byBhY2Nlc3MgdGhlIFMzIGRlcGxveW1lbnQgYXNzZXQgZmlsZXMgdmlhIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVDZG5BY2Nlc3NJZGVudGl0eSgpOiBJT3JpZ2luQWNjZXNzSWRlbnRpdHkge1xuICAgICAgICBjb25zdCBvcmlnaW5BY2Nlc3NJZGVudGl0eU5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNkbi1zMy1hY2Nlc3NgO1xuICAgICAgICByZXR1cm4gbmV3IE9yaWdpbkFjY2Vzc0lkZW50aXR5KHRoaXMsIG9yaWdpbkFjY2Vzc0lkZW50aXR5TmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgYnVja2V0IHRvIHN0b3JlIHRoZSBzdGF0aWMgZGVwbG95bWVudCBhc3NldCBmaWxlcyBvZiB0aGUgTnV4dCBhcHAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlU3RhdGljQXNzZXRzQnVja2V0KCk6IEJ1Y2tldCB7XG4gICAgICAgIGNvbnN0IGJ1Y2tldE5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFzc2V0c2A7XG4gICAgICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBCdWNrZXQodGhpcywgYnVja2V0TmFtZSwge1xuICAgICAgICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IEJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgICAgICAgIGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAvLyBUaGUgYnVja2V0IGFuZCBhbGwgb2YgaXRzIG9iamVjdHMgY2FuIGJlIGRlbGV0ZWQsIGJlY2F1c2UgYWxsIHRoZSBjb250ZW50IGlzIG1hbmFnZWQgaW4gdGhpcyBwcm9qZWN0XG4gICAgICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICAgICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgICAgICAgIG9iamVjdE93bmVyc2hpcDogT2JqZWN0T3duZXJzaGlwLkJVQ0tFVF9PV05FUl9FTkZPUkNFRCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnVja2V0LmdyYW50UmVhZFdyaXRlKHRoaXMuY2RuQWNjZXNzSWRlbnRpdHkpO1xuXG4gICAgICAgIHJldHVybiBidWNrZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgYnVja2V0IHRvIHN0b3JlIHRoZSBzaXRlbWFwIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlU2l0ZW1hcEJ1Y2tldCgpOiBCdWNrZXQge1xuICAgICAgICBjb25zdCBidWNrZXROYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1zaXRlbWFwYDtcbiAgICAgICAgY29uc3QgYnVja2V0ID0gbmV3IEJ1Y2tldCh0aGlzLCBidWNrZXROYW1lLCB7XG4gICAgICAgICAgICBidWNrZXROYW1lLFxuICAgICAgICAgICAgYWNjZXNzQ29udHJvbDogQnVja2V0QWNjZXNzQ29udHJvbC5QUklWQVRFLFxuICAgICAgICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IEJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgICAgICAgIGVuY3J5cHRpb246IEJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRCxcbiAgICAgICAgICAgIGVuZm9yY2VTU0w6IHRydWUsXG4gICAgICAgICAgICAvLyBUaGUgYnVja2V0IGFuZCBhbGwgb2YgaXRzIG9iamVjdHMgY2FuIGJlIGRlbGV0ZWQsIGJlY2F1c2UgYWxsIHRoZSBjb250ZW50IGlzIG1hbmFnZWQgaW4gdGhpcyBwcm9qZWN0XG4gICAgICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICAgICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnVja2V0LmdyYW50UmVhZFdyaXRlKHRoaXMuY2RuQWNjZXNzSWRlbnRpdHkpO1xuXG4gICAgICAgIHJldHVybiBidWNrZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRvIHJlbmRlciB0aGUgTnV4dCBhcHAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQXBwTGFtYmRhRnVuY3Rpb24ocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogRnVuY3Rpb24ge1xuICAgICAgICBjb25zdCBmdW5jTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tbnV4dGA7XG5cbiAgICAgICAgY29uc3QgYXBwTG9nR3JvdXAgPSBuZXcgTG9nR3JvdXAodGhpcywgYCR7ZnVuY05hbWV9LWxvZ3NgLCB7XG4gICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke2Z1bmNOYW1lfWAsXG4gICAgICAgICAgICByZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX01PTlRILFxuICAgICAgICB9KTtcbiAgICAgICAgYXBwTG9nR3JvdXAuYXBwbHlSZW1vdmFsUG9saWN5KFJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbih0aGlzLCBmdW5jTmFtZSwge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgUmVuZGVycyB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IE51eHQgYXBwLmAsXG4gICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgICAgICAgaGFuZGxlcjogYCR7cHJvcHMuZW50cnlwb2ludCA/PyAnaW5kZXgnfS5oYW5kbGVyYCxcbiAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KGAke3Byb3BzLnJvb3REaXIgPz8gJy4nIH0vLm91dHB1dC9zZXJ2ZXJgLCB7XG4gICAgICAgICAgICAgICAgZXhjbHVkZTogWycqKi5zdmcnLCAnKiouaWNvJywgJyoqLnBuZycsICcqKi5qcGcnLCAnKiouanMubWFwJ10sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMTApLFxuICAgICAgICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSA/PyAxNzkyLFxuICAgICAgICAgICAgYWxsb3dQdWJsaWNTdWJuZXQ6IGZhbHNlLFxuICAgICAgICAgICAgdHJhY2luZzogcHJvcHMuZW5hYmxlVHJhY2luZyA/IFRyYWNpbmcuQUNUSVZFIDogVHJhY2luZy5ESVNBQkxFRCxcbiAgICAgICAgICAgIGxvZ0dyb3VwOiBhcHBMb2dHcm91cCxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgICAgICAgTk9ERV9PUFRJT05TOiAnLS1lbmFibGUtc291cmNlLW1hcHMnLFxuICAgICAgICAgICAgICAgIC4uLkpTT04ucGFyc2UocHJvcHMuZW50cnlwb2ludEVudiA/PyAne30nKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIExhbWJkYSBmdW5jdGlvbiB0aGF0IGNsZWFudXBzIHRoZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcC5cbiAgICAgKiBOb3RlIHRoYXQgd2UgdXNlIHRoZSBidW5kbGVkIEFXUyBTREsgZm9yIE5vZGUgdG8gYXZvaWQgdGhlIG5lZWQgZm9yIGEgY3VzdG9tIGxheWVyXG4gICAgICogd2hpY2ggcmVzdHJpY3RzIHRoZSBjb25zdW1lciB0byBhIHNwZWNpZmljIHlhcm4gb3IgbnBtIHZlcnNpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVDbGVhbnVwTGFtYmRhRnVuY3Rpb24ocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogRnVuY3Rpb24ge1xuICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWU6IHN0cmluZyA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2xlYW51cGA7XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uRGlyUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9mdW5jdGlvbnMvYXNzZXRzLWNsZWFudXAnKTtcblxuICAgICAgICBjb25zdCBjbGVhbnVwTG9nR3JvdXAgPSBuZXcgTG9nR3JvdXAodGhpcywgYCR7ZnVuY3Rpb25OYW1lfS1sb2dzYCwge1xuICAgICAgICAgICAgbG9nR3JvdXBOYW1lOiBgL2F3cy9sYW1iZGEvJHtmdW5jdGlvbk5hbWV9YCxcbiAgICAgICAgICAgIHJldGVudGlvbjogUmV0ZW50aW9uRGF5cy5UV09fV0VFS1MsXG4gICAgICAgIH0pO1xuICAgICAgICBjbGVhbnVwTG9nR3JvdXAuYXBwbHlSZW1vdmFsUG9saWN5KFJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0OiBGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbih0aGlzLCBmdW5jdGlvbk5hbWUsIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBBdXRvLWRlbGV0ZXMgdGhlIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgaW4gdGhlICR7dGhpcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0TmFtZX0gUzMgYnVja2V0LmAsXG4gICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQoYCR7ZnVuY3Rpb25EaXJQYXRofS9idWlsZC9hcHBgLCB7XG4gICAgICAgICAgICAgICAgZXhjbHVkZTogWycqLmQudHMnXVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDE1KSxcbiAgICAgICAgICAgIG1lbW9yeVNpemU6IDUxMixcbiAgICAgICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgICAgICAgU1RBVElDX0FTU0VUU19CVUNLRVQ6IHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgT1VUREFURURfQVNTRVRTX1JFVEVOVElPTl9EQVlTOiBgJHtwcm9wcy5vdXRkYXRlZEFzc2V0c1JldGVudGlvbkRheXMgPz8gMzB9YCxcbiAgICAgICAgICAgICAgICBFTlZJUk9OTUVOVDogcHJvcHMuZW52aXJvbm1lbnQsXG4gICAgICAgICAgICAgICAgQVdTX05PREVKU19DT05ORUNUSU9OX1JFVVNFX0VOQUJMRUQ6ICcxJyxcbiAgICAgICAgICAgICAgICBOT0RFX09QVElPTlM6ICctLWVuYWJsZS1zb3VyY2UtbWFwcycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbG9nR3JvdXA6IGNsZWFudXBMb2dHcm91cCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gZ3JhbnQgZnVuY3Rpb24gYWNjZXNzIHRvIFMzIGJ1Y2tldFxuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5ncmFudFJlYWQocmVzdWx0KTtcbiAgICAgICAgdGhpcy5zdGF0aWNBc3NldHNCdWNrZXQuZ3JhbnREZWxldGUocmVzdWx0KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIEFQSSBnYXRld2F5IHRvIG1ha2UgdGhlIE51eHQgYXBwIHJlbmRlciBMYW1iZGEgZnVuY3Rpb24gcHVibGljbHkgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUFwaUdhdGV3YXkocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogSHR0cEFwaSB7XG4gICAgICAgIGNvbnN0IGFwaU5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFwaWA7XG4gICAgICAgIGNvbnN0IGxhbWJkYUludGVncmF0aW9uID0gbmV3IEh0dHBMYW1iZGFJbnRlZ3JhdGlvbihgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWxhbWJkYS1pbnRlZ3JhdGlvbmAsIHRoaXMuYXBwTGFtYmRhRnVuY3Rpb24pO1xuXG4gICAgICAgIC8vIFdlIHdhbnQgdGhlIEFQSSBnYXRld2F5IHRvIGJlIGFjY2Vzc2libGUgYnkgdGhlIGN1c3RvbSBkb21haW4gbmFtZS5cbiAgICAgICAgLy8gRXZlbiB0aG91Z2ggd2UgYWNjZXNzIHRoZSBnYXRld2F5IHZpYSBDbG91ZEZyb250IChmb3IgYXV0byBodHRwIHRvIGh0dHBzIHJlZGlyZWN0cyksIHRoaXMgaXMgcmVxdWlyZWRcbiAgICAgICAgLy8gdG8gYmUgYWJsZSB0byByZWRpcmVjdCB0aGUgb3JpZ2luYWwgJ0hvc3QnIGhlYWRlciB0byB0aGUgTnV4dCBhcHBsaWNhdGlvbiwgaWYgcmVxdWVzdGVkLlxuICAgICAgICBjb25zdCBkb21haW5OYW1lID0gbmV3IERvbWFpbk5hbWUodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hcGktZG9tYWluYCwge1xuICAgICAgICAgICAgZG9tYWluTmFtZTogcHJvcHMuZG9tYWluLFxuICAgICAgICAgICAgY2VydGlmaWNhdGU6IENlcnRpZmljYXRlLmZyb21DZXJ0aWZpY2F0ZUFybih0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXJlZ2lvbmFsLWNlcnRpZmljYXRlYCwgcHJvcHMucmVnaW9uYWxUbHNDZXJ0aWZpY2F0ZUFybiksXG4gICAgICAgICAgICBlbmRwb2ludFR5cGU6IEVuZHBvaW50VHlwZS5SRUdJT05BTCxcbiAgICAgICAgICAgIHNlY3VyaXR5UG9saWN5OiBTZWN1cml0eVBvbGljeS5UTFNfMV8yXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGFwaUdhdGV3YXkgPSBuZXcgSHR0cEFwaSh0aGlzLCBhcGlOYW1lLCB7XG4gICAgICAgICAgICBhcGlOYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBDb25uZWN0cyB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHdpdGggdGhlICR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fSBMYW1iZGEgZnVuY3Rpb24gdG8gbWFrZSBpdCBwdWJsaWNseSBhdmFpbGFibGUuYCxcbiAgICAgICAgICAgIC8vIFRoZSBhcHAgZG9lcyBub3QgYWxsb3cgYW55IGNyb3NzLW9yaWdpbiBhY2Nlc3MgYnkgcHVycG9zZTogdGhlIGFwcCBzaG91bGQgbm90IGJlIGVtYmVkZGFibGUgYW55d2hlcmVcbiAgICAgICAgICAgIGNvcnNQcmVmbGlnaHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRlZmF1bHRJbnRlZ3JhdGlvbjogbGFtYmRhSW50ZWdyYXRpb24sXG4gICAgICAgICAgICBkZWZhdWx0RG9tYWluTWFwcGluZzoge1xuICAgICAgICAgICAgICAgIGRvbWFpbk5hbWU6IGRvbWFpbk5hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXBpR2F0ZXdheS5hZGRSb3V0ZXMoe1xuICAgICAgICAgICAgaW50ZWdyYXRpb246IGxhbWJkYUludGVncmF0aW9uLFxuICAgICAgICAgICAgcGF0aDogJy97cHJveHkrfScsXG4gICAgICAgICAgICBtZXRob2RzOiBbXG4gICAgICAgICAgICAgICAgSHR0cE1ldGhvZC5HRVQsXG4gICAgICAgICAgICAgICAgSHR0cE1ldGhvZC5IRUFELFxuICAgICAgICAgICAgICAgIEh0dHBNZXRob2QuT1BUSU9OUyxcbiAgICAgICAgICAgICAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgICAgICAgICAgICAgSHR0cE1ldGhvZC5QVVQsXG4gICAgICAgICAgICAgICAgSHR0cE1ldGhvZC5QQVRDSCxcbiAgICAgICAgICAgICAgICBIdHRwTWV0aG9kLkRFTEVURSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBhcGlHYXRld2F5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRoYXQgcm91dGVzIGluY29taW5nIHJlcXVlc3RzIHRvIHRoZSBOdXh0IExhbWJkYSBmdW5jdGlvbiAodmlhIHRoZSBBUEkgZ2F0ZXdheSlcbiAgICAgKiBvciB0aGUgUzMgYXNzZXRzIGZvbGRlciAod2l0aCBjYWNoaW5nKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVDbG91ZEZyb250RGlzdHJpYnV0aW9uKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IERpc3RyaWJ1dGlvbiB7XG4gICAgICAgIGNvbnN0IGNkbk5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNkbmA7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBEaXN0cmlidXRpb24odGhpcywgY2RuTmFtZSwge1xuICAgICAgICAgICAgZG9tYWluTmFtZXM6IFtwcm9wcy5kb21haW5dLFxuICAgICAgICAgICAgY29tbWVudDogY2RuTmFtZSxcbiAgICAgICAgICAgIG1pbmltdW1Qcm90b2NvbFZlcnNpb246IFNlY3VyaXR5UG9saWN5UHJvdG9jb2wuVExTX1YxXzJfMjAxOCxcbiAgICAgICAgICAgIGNlcnRpZmljYXRlOiBDZXJ0aWZpY2F0ZS5mcm9tQ2VydGlmaWNhdGVBcm4odGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1nbG9iYWwtY2VydGlmaWNhdGVgLCBwcm9wcy5nbG9iYWxUbHNDZXJ0aWZpY2F0ZUFybiksXG4gICAgICAgICAgICBodHRwVmVyc2lvbjogSHR0cFZlcnNpb24uSFRUUDJfQU5EXzMsXG4gICAgICAgICAgICBkZWZhdWx0QmVoYXZpb3I6IHRoaXMubnV4dFNlcnZlclJvdXRlQmVoYXZpb3IsXG4gICAgICAgICAgICBhZGRpdGlvbmFsQmVoYXZpb3JzOiB0aGlzLnNldHVwQ2xvdWRGcm9udFJvdXRpbmcocHJvcHMpLFxuICAgICAgICAgICAgcHJpY2VDbGFzczogUHJpY2VDbGFzcy5QUklDRV9DTEFTU18xMDAsIC8vIFVzZSBvbmx5IE5vcnRoIEFtZXJpY2EgYW5kIEV1cm9wZVxuICAgICAgICAgICAgbG9nQnVja2V0OiB0aGlzLmFjY2Vzc0xvZ3NCdWNrZXQsXG4gICAgICAgICAgICBsb2dGaWxlUHJlZml4OiBwcm9wcy5lbmFibGVBY2Nlc3NMb2dzQW5hbHlzaXMgPyAndW5wcm9jZXNzZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbG9nSW5jbHVkZXNDb29raWVzOiBwcm9wcy5lbmFibGVBY2Nlc3NMb2dzQW5hbHlzaXMsXG4gICAgICAgICAgICB3ZWJBY2xJZDogcHJvcHMud2ViQWNsQXJuLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiBiZWhhdmlvciBvcmlnaW4gdG8gcm91dGUgaW5jb21pbmcgcmVxdWVzdHMgdG8gdGhlIE51eHQgcmVuZGVyIExhbWJkYSBmdW5jdGlvbiAodmlhIEFQSSBnYXRld2F5KS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZU51eHRBcHBIdHRwT3JpZ2luKCk6IEh0dHBPcmlnaW4ge1xuICAgICAgICByZXR1cm4gbmV3IEh0dHBPcmlnaW4oYCR7dGhpcy5hcGlHYXRld2F5Lmh0dHBBcGlJZH0uZXhlY3V0ZS1hcGkuJHt0aGlzLnJlZ2lvbn0uYW1hem9uYXdzLmNvbWAsIHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb25BdHRlbXB0czogMixcbiAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDIpLFxuICAgICAgICAgICAgcmVhZFRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMTApLFxuICAgICAgICAgICAgcHJvdG9jb2xQb2xpY3k6IE9yaWdpblByb3RvY29sUG9saWN5LkhUVFBTX09OTFksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBiZWhhdmlvciBmb3IgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIGluY29taW5nIHdlYiByZXF1ZXN0c1xuICAgICAqIHRvIHRoZSBOdXh0IHJlbmRlciBMYW1iZGEgZnVuY3Rpb24gKHZpYSBBUEkgZ2F0ZXdheSkuXG4gICAgICogQWRkaXRpb25hbGx5LCB0aGlzIGF1dG9tYXRpY2FsbHkgcmVkaXJlY3RzIEhUVFAgcmVxdWVzdHMgdG8gSFRUUFMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVOdXh0U2VydmVyUm91dGVCZWhhdmlvcigpOiBCZWhhdmlvck9wdGlvbnMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb3JpZ2luOiB0aGlzLmh0dHBPcmlnaW4sXG4gICAgICAgICAgICBhbGxvd2VkTWV0aG9kczogQWxsb3dlZE1ldGhvZHMuQUxMT1dfR0VUX0hFQUQsXG4gICAgICAgICAgICBjb21wcmVzczogdHJ1ZSxcbiAgICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6IHRoaXMuYXBwUmVxdWVzdFBvbGljeSxcbiAgICAgICAgICAgIGNhY2hlUG9saWN5OiB0aGlzLmFwcENhY2hlUG9saWN5XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cENsb3VkRnJvbnRSb3V0aW5nKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4ge1xuICAgICAgICBsZXQgcm91dGluZ0JlaGF2aW91cnM6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4gPSB7XG5cbiAgICAgICAgICAgIC8vIE51eHQgSTE4biBmaWxlcyBhcmUgc2VydmVkIHZpYSBhIHNlcnZlciByb3V0ZVxuICAgICAgICAgICAgJy9faTE4bi8qJzogdGhpcy5udXh0U2VydmVyUm91dGVCZWhhdmlvcixcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTcGVjaWZpYyBvbmVzIGZpcnN0XG4gICAgICAgIGlmIChwcm9wcy5lbmFibGVBcGkpIHtcbiAgICAgICAgICAgIHJvdXRpbmdCZWhhdmlvdXJzID0gey4uLnJvdXRpbmdCZWhhdmlvdXJzLCAuLi50aGlzLmNyZWF0ZUFwaVJvdXRlQmVoYXZpb3IoKX07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BzLmVuYWJsZVNpdGVtYXApIHtcbiAgICAgICAgICAgIHJvdXRpbmdCZWhhdmlvdXJzID0gey4uLnJvdXRpbmdCZWhhdmlvdXJzLCAuLi50aGlzLmNyZWF0ZVNpdGVtYXBSb3V0ZUJlaGF2aW9yKCl9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGN1c3RvbSBzZXJ2ZXIgcm91dGVzIGJlZm9yZSBzdGF0aWMgYXNzZXRzIHRvIGVuc3VyZSB0aGV5IHRha2UgcHJlY2VkZW5jZVxuICAgICAgICBpZiAocHJvcHMuc2VydmVyUm91dGVzICYmIHByb3BzLnNlcnZlclJvdXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByb3V0aW5nQmVoYXZpb3VycyA9IHsuLi5yb3V0aW5nQmVoYXZpb3VycywgLi4udGhpcy5jcmVhdGVTZXJ2ZXJSb3V0ZUJlaGF2aW9yKHByb3BzLnNlcnZlclJvdXRlcyl9O1xuICAgICAgICB9XG5cbiAgICAgICAgcm91dGluZ0JlaGF2aW91cnMgPSB7Li4ucm91dGluZ0JlaGF2aW91cnMsIC4uLnRoaXMuY3JlYXRlU3RhdGljQXNzZXRzUm91dGVCZWhhdmlvcigpfTtcblxuICAgICAgICByZXR1cm4gcm91dGluZ0JlaGF2aW91cnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNhY2hlIHBvbGljeSBmb3IgdGhlIE51eHQgYXBwIHJvdXRlIGJlaGF2aW9yIG9mIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZU51eHRBcHBDYWNoZVBvbGljeShwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBDYWNoZVBvbGljeSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2FjaGVQb2xpY3kodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jYWNoZS1wb2xpY3lgLCB7XG4gICAgICAgICAgICBjYWNoZVBvbGljeU5hbWU6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2RuLWNhY2hlLXBvbGljeWAsXG4gICAgICAgICAgICBjb21tZW50OiBgRGVmaW5lcyB3aGljaCByZXF1ZXN0IGRhdGEgdG8gcGFzcyB0byB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IG9yaWdpbiBhbmQgaG93IHRoZSBjYWNoZSBrZXkgaXMgY2FsY3VsYXRlZC5gLFxuICAgICAgICAgICAgZGVmYXVsdFR0bDogRHVyYXRpb24uc2Vjb25kcygwKSxcbiAgICAgICAgICAgIG1pblR0bDogRHVyYXRpb24uc2Vjb25kcygwKSxcbiAgICAgICAgICAgIG1heFR0bDogRHVyYXRpb24uZGF5cygzNjUpLFxuICAgICAgICAgICAgcXVlcnlTdHJpbmdCZWhhdmlvcjogcHJvcHMuY2FjaGVLZXlRdWVyeVBhcmFtcz8ubGVuZ3RoID8gQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5jYWNoZUtleVF1ZXJ5UGFyYW1zKSA6IChwcm9wcy5kZW55Q2FjaGVLZXlRdWVyeVBhcmFtcz8ubGVuZ3RoID8gQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmRlbnlMaXN0KC4uLnByb3BzLmRlbnlDYWNoZUtleVF1ZXJ5UGFyYW1zKSA6IChwcm9wcy5hbGxvd1F1ZXJ5UGFyYW1zPy5sZW5ndGggPyBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmFsbG93UXVlcnlQYXJhbXMpIDogKHByb3BzLmRlbnlRdWVyeVBhcmFtcz8ubGVuZ3RoID8gQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmRlbnlMaXN0KC4uLnByb3BzLmRlbnlRdWVyeVBhcmFtcykgOiBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsKCkpKSksXG4gICAgICAgICAgICBoZWFkZXJCZWhhdmlvcjogcHJvcHMuY2FjaGVLZXlIZWFkZXJzPy5sZW5ndGggPyBDYWNoZUhlYWRlckJlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5jYWNoZUtleUhlYWRlcnMpIDogKHByb3BzLmFsbG93SGVhZGVycz8ubGVuZ3RoID8gQ2FjaGVIZWFkZXJCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuYWxsb3dIZWFkZXJzKSA6IENhY2hlSGVhZGVyQmVoYXZpb3Iubm9uZSgpKSxcbiAgICAgICAgICAgIGNvb2tpZUJlaGF2aW9yOiBwcm9wcy5jYWNoZUtleUNvb2tpZXM/Lmxlbmd0aCA/IENhY2hlQ29va2llQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmNhY2hlS2V5Q29va2llcykgOiAocHJvcHMuYWxsb3dDb29raWVzPy5sZW5ndGggPyBDYWNoZUNvb2tpZUJlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5hbGxvd0Nvb2tpZXMpIDogQ2FjaGVDb29raWVCZWhhdmlvci5ub25lKCkpLFxuICAgICAgICAgICAgZW5hYmxlQWNjZXB0RW5jb2RpbmdCcm90bGk6IHRydWUsXG4gICAgICAgICAgICBlbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb3JpZ2luIHJlcXVlc3QgcG9saWN5IGZvciB0aGUgTnV4dCBhcHAgcm91dGUgYmVoYXZpb3Igb2YgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLlxuICAgICAqIE5vIHBvbGljeSBpcyBjcmVhdGVkIGlmIG5vIGV4cGxpY2l0IGNvbmZpZyBpcyBwcm92aWRlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZU51eHRBcHBSZXF1ZXN0UG9saWN5KHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IE9yaWdpblJlcXVlc3RQb2xpY3l8dW5kZWZpbmVkIHtcblxuICAgICAgICAvLyBJZiBubyBleHBsaWNpdCBjb25maWcgaXMgcHJvdmlkZWQsIHdlIHdhbnQgdG8gdXNlIHRoZSBkZWZhdWx0IGZyb20gQ2xvdWRmcm9udFxuICAgICAgICBjb25zdCBoYXNBbnlDb25maWcgPSBwcm9wcy5mb3J3YXJkUXVlcnlQYXJhbXM/Lmxlbmd0aCB8fCBwcm9wcy5mb3J3YXJkSGVhZGVycz8ubGVuZ3RoIHx8IHByb3BzLmZvcndhcmRDb29raWVzPy5sZW5ndGg7XG4gICAgICAgIGlmICghaGFzQW55Q29uZmlnKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBPcmlnaW5SZXF1ZXN0UG9saWN5KHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tcmVxdWVzdC1wb2xpY3lgLCB7XG4gICAgICAgICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5TmFtZTogYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jZG4tcmVxdWVzdC1wb2xpY3lgLFxuICAgICAgICAgICAgY29tbWVudDogYERlZmluZXMgd2hpY2ggcmVxdWVzdCBkYXRhIHRvIHBhc3MgdG8gdGhlICR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fSBvcmlnaW4gd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNhY2hlIGtleS5gLFxuICAgICAgICAgICAgcXVlcnlTdHJpbmdCZWhhdmlvcjogcHJvcHMuZm9yd2FyZFF1ZXJ5UGFyYW1zPy5sZW5ndGggPyBPcmlnaW5SZXF1ZXN0UXVlcnlTdHJpbmdCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuZm9yd2FyZFF1ZXJ5UGFyYW1zKSA6IE9yaWdpblJlcXVlc3RRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbCgpLFxuICAgICAgICAgICAgaGVhZGVyQmVoYXZpb3I6IHByb3BzLmZvcndhcmRIZWFkZXJzPy5sZW5ndGggPyBPcmlnaW5SZXF1ZXN0SGVhZGVyQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmZvcndhcmRIZWFkZXJzKSA6IE9yaWdpblJlcXVlc3RIZWFkZXJCZWhhdmlvci5ub25lKCksXG4gICAgICAgICAgICBjb29raWVCZWhhdmlvcjogcHJvcHMuZm9yd2FyZENvb2tpZXM/Lmxlbmd0aCA/IE9yaWdpblJlcXVlc3RDb29raWVCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuZm9yd2FyZENvb2tpZXMpIDogT3JpZ2luUmVxdWVzdENvb2tpZUJlaGF2aW9yLm5vbmUoKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJlaGF2aW9yIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgbWF0Y2hpbmcgTnV4dCBhcHAgQVBJIHJlcXVlc3RzIHRvIHRoZSBBUEkgZ2F0ZXdheS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUFwaVJvdXRlQmVoYXZpb3IoKTogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiB7XG4gICAgICAgIGNvbnN0IGFwaUJlaGF2aW9yOiBCZWhhdmlvck9wdGlvbnMgPSB7XG4gICAgICAgICAgICBvcmlnaW46IHRoaXMuaHR0cE9yaWdpbixcbiAgICAgICAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0FMTCxcbiAgICAgICAgICAgIGNhY2hlZE1ldGhvZHM6IENhY2hlZE1ldGhvZHMuQ0FDSEVfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgIGNhY2hlUG9saWN5OiB0aGlzLmFwcENhY2hlUG9saWN5LFxuICAgICAgICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogdGhpcy5hcHBSZXF1ZXN0UG9saWN5LFxuICAgICAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LkhUVFBTX09OTFlcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBydWxlczogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiA9IHt9O1xuICAgICAgICBydWxlc1snL2FwaS8qJ10gPSBhcGlCZWhhdmlvcjtcblxuICAgICAgICByZXR1cm4gcnVsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBiZWhhdmlvcnMgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBzcGVjaWZpZWQgcGF0aCBwYXR0ZXJucyB0byB0aGUgU1NSIG9yaWdpbi5cbiAgICAgKiBUaGlzIGFsbG93cyBzZXJ2ZXIgZW5kcG9pbnRzIHRoYXQgdXNlIGZpbGUtbGlrZSBVUkxzIChlLmcuLCAvc2l0ZW1hcC54bWwgZnJvbSBAbnV4dGpzL3NpdGVtYXApIFxuICAgICAqIHRvIGJlIGhhbmRsZWQgYnkgdGhlIExhbWJkYSBmdW5jdGlvbiBmb3IgZHluYW1pYyBjb250ZW50IGdlbmVyYXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTZXJ2ZXJSb3V0ZUJlaGF2aW9yKHNlcnZlclJvdXRlczogc3RyaW5nW10pOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+IHtcbiAgICAgICAgY29uc3QgcnVsZXM6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIHNlcnZlclJvdXRlcy5mb3JFYWNoKHJvdXRlID0+IHtcbiAgICAgICAgICAgIHJ1bGVzW3JvdXRlXSA9IHRoaXMubnV4dFNlcnZlclJvdXRlQmVoYXZpb3I7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBydWxlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYmVoYXZpb3IgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBtYXRjaGluZyBpbmNvbWluZyByZXF1ZXN0cyBmb3IgdGhlIHN0YXRpYyBhc3NldHNcbiAgICAgKiB0byB0aGUgUzMgYnVja2V0IHRoYXQgaG9sZHMgdGhlc2Ugc3RhdGljIGFzc2V0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTdGF0aWNBc3NldHNSb3V0ZUJlaGF2aW9yKCk6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4ge1xuICAgICAgICBjb25zdCBzdGF0aWNBc3NldHNDYWNoZUNvbmZpZzogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgICAgICAgb3JpZ2luOiBTM0J1Y2tldE9yaWdpbi53aXRoT3JpZ2luQWNjZXNzSWRlbnRpdHkodGhpcy5zdGF0aWNBc3NldHNCdWNrZXQsIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uQXR0ZW1wdHM6IDIsXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMyksXG4gICAgICAgICAgICAgICAgb3JpZ2luQWNjZXNzSWRlbnRpdHk6IHRoaXMuY2RuQWNjZXNzSWRlbnRpdHksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZWRNZXRob2RzOiBDYWNoZWRNZXRob2RzLkNBQ0hFX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZVBvbGljeTogQ2FjaGVQb2xpY3kuQ0FDSElOR19PUFRJTUlaRUQsXG4gICAgICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcnVsZXM6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4gPSB7fTtcbiAgICAgICAgdGhpcy5zdGF0aWNBc3NldENvbmZpZ3MuZm9yRWFjaChhc3NldCA9PiB7XG4gICAgICAgICAgICBydWxlc1tgJHthc3NldC50YXJnZXR9JHthc3NldC5wYXR0ZXJufWBdID0gc3RhdGljQXNzZXRzQ2FjaGVDb25maWdcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gcnVsZXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYmVoYXZpb3IgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBtYXRjaGluZyBpbmNvbWluZyByZXF1ZXN0cyBmb3IgdGhlIHNpdGVtYXAgYXNzZXRzXG4gICAgICogdG8gdGhlIFMzIGJ1Y2tldCB0aGF0IGhvbGRzIHRoZXNlIHNpdGVtYXAgYXNzZXRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVNpdGVtYXBSb3V0ZUJlaGF2aW9yKCk6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4ge1xuICAgICAgICBpZiAoIXRoaXMuc2l0ZW1hcEJ1Y2tldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2l0ZW1hcCBidWNrZXQgbXVzdCBleGlzdCBiZWZvcmUgY3JlYXRpbmcgc2l0ZW1hcCByb3V0ZSBiZWhhdmlvci5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaXRlbWFwQ2FjaGVDb25maWc6IEJlaGF2aW9yT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG9yaWdpbjogUzNCdWNrZXRPcmlnaW4ud2l0aE9yaWdpbkFjY2Vzc0lkZW50aXR5KHRoaXMuc2l0ZW1hcEJ1Y2tldCwge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25BdHRlbXB0czogMixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogRHVyYXRpb24uc2Vjb25kcygzKSxcbiAgICAgICAgICAgICAgICBvcmlnaW5BY2Nlc3NJZGVudGl0eTogdGhpcy5jZG5BY2Nlc3NJZGVudGl0eSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICAgICAgICBhbGxvd2VkTWV0aG9kczogQWxsb3dlZE1ldGhvZHMuQUxMT1dfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgIGNhY2hlZE1ldGhvZHM6IENhY2hlZE1ldGhvZHMuQ0FDSEVfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgIGNhY2hlUG9saWN5OiBDYWNoZVBvbGljeS5DQUNISU5HX09QVElNSVpFRCxcbiAgICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQU1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJ1bGVzOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+ID0ge307XG4gICAgICAgIHJ1bGVzWycqc2l0ZW1hcC54bWwnXSA9IHNpdGVtYXBDYWNoZUNvbmZpZztcbiAgICAgICAgcnVsZXNbJypzaXRlbWFwLWdvbmUueG1sJ10gPSBzaXRlbWFwQ2FjaGVDb25maWc7XG4gICAgICAgIHJ1bGVzWycvc2l0ZW1hcHMvKiddID0gc2l0ZW1hcENhY2hlQ29uZmlnO1xuXG4gICAgICAgIHJldHVybiBydWxlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGxvYWRzIHRoZSBzdGF0aWMgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcCBhcyBkZWZpbmVkIGluIHtAc2VlIGdldE51eHRBcHBTdGF0aWNBc3NldENvbmZpZ3N9IHRvIHRoZSBzdGF0aWMgYXNzZXRzIFMzIGJ1Y2tldC5cbiAgICAgKiBJbiBvcmRlciB0byBlbmFibGUgYSB6ZXJvLWRvd250aW1lIGRlcGxveW1lbnQgd2l0aCBtaW5pbWFsIHN0b3JhZ2UgbG9hZCxcbiAgICAgKiB3ZSBkZXBsb3kgdGhlIHN0YXRpYyBhc3NldHMgb2YgZXZlcnkgZGVwbG95bWVudCBpbnRvIHRoZSBzYW1lIGZvbGRlciBidXQgbWFyayB0aGVtIHdpdGggYSBkZXBsb3ltZW50IHJldmlzaW9uLlxuICAgICAqIEJ5IGRvaW5nIHNvLCB0aGUgZmlsZXMgb2YgcHJldmlvdXMgZGVwbG95bWVudHMgYXJlIHJldGFpbmVkIHRvIGFsbG93IGNsaWVudHMgdG8gY29udGludWUgdG8gd29yayB3aXRoIGFuIG9sZGVyIHJldmlzaW9uXG4gICAgICogYnV0IGdldHMgY2xlYW5lZCB1cCBhZnRlciBhIHNwZWNpZmllZCBwZXJpb2Qgb2YgdGltZSB2aWEgdGhlIGNsZWFudXAgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY29uZmlndXJlRGVwbG95bWVudHMoKTogQnVja2V0RGVwbG95bWVudFtdIHtcbiAgICAgICAgY29uc3QgbG9nR3JvdXAgPSBuZXcgTG9nR3JvdXAodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hc3NldHMtZGVwbG95bWVudC1sb2dzYCwge1xuICAgICAgICAgICAgbG9nR3JvdXBOYW1lOiBgL2F3cy9sYW1iZGEvJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFzc2V0cy1kZXBsb3ltZW50YCxcbiAgICAgICAgICAgIHJldGVudGlvbjogUmV0ZW50aW9uRGF5cy5PTkVfREFZLFxuICAgICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZXR1cm5zIGEgZGVwbG95bWVudCBmb3IgZXZlcnkgY29uZmlndXJlZCBzdGF0aWMgYXNzZXQgdHlwZSB0byByZXNwZWN0IHRoZSBkaWZmZXJlbnQgY2FjaGUgc2V0dGluZ3NcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGljQXNzZXRDb25maWdzLmZpbHRlcihhc3NldCA9PiBleGlzdHNTeW5jKGFzc2V0LnNvdXJjZSkpLm1hcCgoYXNzZXQsIGFzc2V0SW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQnVja2V0RGVwbG95bWVudCh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFzc2V0cy1kZXBsb3ltZW50LSR7YXNzZXRJbmRleH1gLCB7XG4gICAgICAgICAgICAgICAgc291cmNlczogW1NvdXJjZS5hc3NldChhc3NldC5zb3VyY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZTogYXNzZXQuZXhjbHVkZSxcbiAgICAgICAgICAgICAgICB9KV0sXG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb25CdWNrZXQ6IHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LFxuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBhc3NldC50YXJnZXQucmVwbGFjZSgvXlxcLysvZywgJycpLCAvLyBSZW1vdmUgbGVhZGluZyBzbGFzaFxuICAgICAgICAgICAgICAgIHBydW5lOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzdG9yYWdlQ2xhc3M6IFN0b3JhZ2VDbGFzcy5TVEFOREFSRCxcbiAgICAgICAgICAgICAgICBleGNsdWRlOiBbJyonXSxcbiAgICAgICAgICAgICAgICBpbmNsdWRlOiBbYXNzZXQucGF0dGVybl0sXG4gICAgICAgICAgICAgICAgY2FjaGVDb250cm9sOiBhc3NldC5jYWNoZUNvbnRyb2wsXG4gICAgICAgICAgICAgICAgY29udGVudFR5cGU6IGFzc2V0LmNvbnRlbnRUeXBlLFxuICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbjogYXNzZXQuaW52YWxpZGF0ZU9uQ2hhbmdlID8gdGhpcy5jZG4gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uUGF0aHM6IGFzc2V0LmludmFsaWRhdGVPbkNoYW5nZSA/IFtgLyR7YXNzZXQucGF0dGVybn1gXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBsb2dHcm91cDogbG9nR3JvdXAsXG5cbiAgICAgICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSBidWlsZCByZXZpc2lvbiBvbiBldmVyeSBhc3NldCB0byBhbGxvdyBjbGVhbnVwIG9mIG91dGRhdGVkIGFzc2V0c1xuICAgICAgICAgICAgICAgICAgICByZXZpc2lvbjogdGhpcy5kZXBsb3ltZW50UmV2aXNpb24sXG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIC8vIFNvbWUgTnV4dCBhcHBsaWNhdGlvbnMgaGF2ZSBhIGxvdCBvZiBhc3NldHMgdG8gZGVwbG95IHdoZXJlYnkgdGhlIGZ1bmN0aW9uIG1pZ2h0IHJ1biBvdXQgb2YgbWVtb3J5LlxuICAgICAgICAgICAgICAgIC8vIEFkZGl0aW9uYWxseSwgYSBoaWdoIG1lbW9yeSBsaW1pdCBtaWdodCBzcGVlZCB1cCBkZXBsb3ltZW50cy5cbiAgICAgICAgICAgICAgICBtZW1vcnlMaW1pdDogMTc5MlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgdGhlIGhvc3RlZCB6b25lIGF0IHdoaWNoIHRoZSBETlMgcmVjb3JkcyBzaGFsbCBiZSBjcmVhdGVkIHRvIGFjY2VzcyB0aGUgTnV4dCBhcHAgb24gdGhlIGludGVybmV0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRIb3N0ZWRab25lKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IElIb3N0ZWRab25lIHtcbiAgICAgICAgY29uc3QgZG9tYWluUGFydHMgPSBwcm9wcy5kb21haW4uc3BsaXQoJy4nKTtcblxuICAgICAgICByZXR1cm4gSG9zdGVkWm9uZS5mcm9tSG9zdGVkWm9uZUF0dHJpYnV0ZXModGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1ob3N0ZWQtem9uZWAsIHtcbiAgICAgICAgICAgIGhvc3RlZFpvbmVJZDogcHJvcHMuaG9zdGVkWm9uZUlkLFxuICAgICAgICAgICAgem9uZU5hbWU6IGRvbWFpblBhcnRzW2RvbWFpblBhcnRzLmxlbmd0aCAtIDFdLCAvLyBTdXBwb3J0IHN1YmRvbWFpbnNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgRE5TIHJlY29yZHMgdG8gYWNjZXNzIHRoZSBOdXh0IGFwcCBvbiB0aGUgaW50ZXJuZXQgdmlhIHRoZSBjdXN0b20gZG9tYWluLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZURuc1JlY29yZHMocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGhvc3RlZFpvbmUgPSB0aGlzLmZpbmRIb3N0ZWRab25lKHByb3BzKTtcbiAgICAgICAgY29uc3QgZG5zVGFyZ2V0ID0gUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhuZXcgQ2xvdWRGcm9udFRhcmdldCh0aGlzLmNkbikpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIHJlY29yZCBmb3IgSVB2NFxuICAgICAgICBuZXcgQVJlY29yZCh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWlwdjQtcmVjb3JkYCwge1xuICAgICAgICAgICAgcmVjb3JkTmFtZTogcHJvcHMuZG9tYWluLFxuICAgICAgICAgICAgem9uZTogaG9zdGVkWm9uZSxcbiAgICAgICAgICAgIHRhcmdldDogZG5zVGFyZ2V0LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDcmVhdGUgYSByZWNvcmQgZm9yIElQdjZcbiAgICAgICAgbmV3IEFhYWFSZWNvcmQodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1pcHY2LXJlY29yZGAsIHtcbiAgICAgICAgICAgIHJlY29yZE5hbWU6IHByb3BzLmRvbWFpbixcbiAgICAgICAgICAgIHpvbmU6IGhvc3RlZFpvbmUsXG4gICAgICAgICAgICB0YXJnZXQ6IGRuc1RhcmdldCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNjaGVkdWxlZCBydWxlIHRvIHBpbmcgdGhlIE51eHQgYXBwIExhbWJkYSBmdW5jdGlvbiBldmVyeSA1IG1pbnV0ZXMgaW4gb3JkZXIgdG8ga2VlcCBpdCB3YXJtXG4gICAgICogYW5kIHNwZWVkIHVwIGluaXRpYWwgU1NSIHJlcXVlc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUFwcFBpbmdSdWxlKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IHZvaWQge1xuICAgICAgICBjb25zdCBmYWtlQXBpR2F0ZXdheUV2ZW50RGF0YSA9IHtcbiAgICAgICAgICAgIFwidmVyc2lvblwiOiBcIjIuMFwiLFxuICAgICAgICAgICAgXCJyb3V0ZUtleVwiOiBcIkdFVCAve3Byb3h5K31cIixcbiAgICAgICAgICAgIFwicmF3UGF0aFwiOiBcIi9cIixcbiAgICAgICAgICAgIFwicmF3UXVlcnlTdHJpbmdcIjogXCJcIixcbiAgICAgICAgICAgIFwiaGVhZGVyc1wiOiB7fSxcbiAgICAgICAgICAgIFwicmVxdWVzdENvbnRleHRcIjoge1xuICAgICAgICAgICAgICAgIFwiZG9tYWluTmFtZVwiOiBwcm9wcy5kb21haW4sXG4gICAgICAgICAgICAgICAgXCJodHRwXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJtZXRob2RcIjogXCJHRVRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJwYXRoXCI6IFwiL1wiLFxuICAgICAgICAgICAgICAgICAgICBcInByb3RvY29sXCI6IFwiSFRUUC8xLjFcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBuZXcgUnVsZSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXBpbmdlci1ydWxlYCwge1xuICAgICAgICAgICAgcnVsZU5hbWU6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tcGluZ2VyYCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgUGluZ3MgdGhlIExhbWJkYSBmdW5jdGlvbiBvZiB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IGFwcCBldmVyeSA1IG1pbnV0ZXMgdG8ga2VlcCBpdCB3YXJtLmAsXG4gICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgc2NoZWR1bGU6IFNjaGVkdWxlLnJhdGUoRHVyYXRpb24ubWludXRlcyg1KSksXG4gICAgICAgICAgICB0YXJnZXRzOiBbbmV3IExhbWJkYUZ1bmN0aW9uKHRoaXMuYXBwTGFtYmRhRnVuY3Rpb24sIHtcbiAgICAgICAgICAgICAgICBldmVudDogUnVsZVRhcmdldElucHV0LmZyb21PYmplY3QoZmFrZUFwaUdhdGV3YXlFdmVudERhdGEpXG4gICAgICAgICAgICB9KV0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNjaGVkdWxlZCBydWxlIHRoYXQgcnVucyBldmVyeSBUdWVzZGF5IGF0IDAzOjMwIEFNIEdNVCB0byB0cmlnZ2VyXG4gICAgICogb3VyIGNsZWFudXAgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNsZWFudXBUcmlnZ2VyUnVsZSgpOiB2b2lkIHtcbiAgICAgICAgbmV3IFJ1bGUodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1zY2hlZHVsZXItcnVsZWAsIHtcbiAgICAgICAgICAgIHJ1bGVOYW1lOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXNjaGVkdWxlcmAsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYFRyaWdnZXJzIGEgY2xlYW51cCBvZiB0aGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cyBhdCB0aGUgJHt0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXROYW1lfSBTMyBidWNrZXQuYCxcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICBzY2hlZHVsZTogU2NoZWR1bGUuY3Jvbih7d2Vla0RheTogJzInLCBob3VyOiAnMycsIG1pbnV0ZTogJzMwJ30pLFxuICAgICAgICAgICAgdGFyZ2V0czogW25ldyBMYW1iZGFGdW5jdGlvbih0aGlzLmNsZWFudXBMYW1iZGFGdW5jdGlvbildLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgUzMgYnVja2V0IHRvIHN0b3JlIHRoZSBhY2Nlc3MgbG9ncyBvZiB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBY2Nlc3NMb2dzQnVja2V0KCk6IEJ1Y2tldCB7XG4gICAgICAgIGNvbnN0IGJ1Y2tldE5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFjY2Vzcy1sb2dzYDtcbiAgICAgICAgY29uc3QgYnVja2V0ID0gbmV3IEJ1Y2tldCh0aGlzLCBidWNrZXROYW1lLCB7XG4gICAgICAgICAgICBidWNrZXROYW1lLFxuICAgICAgICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IEJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgICAgICAgIG9iamVjdE93bmVyc2hpcDogT2JqZWN0T3duZXJzaGlwLkJVQ0tFVF9PV05FUl9QUkVGRVJSRUQsXG4gICAgICAgICAgICAvLyBXaGVuIHRoZSBzdGFjayBpcyBkZXN0cm95ZWQsIHdlIGV4cGVjdCBldmVyeXRoaW5nIHRvIGJlIGRlbGV0ZWRcbiAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICBidWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5jZG5BY2Nlc3NJZGVudGl0eSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1Y2tldDtcbiAgICB9XG5cblxuICAgIHByaXZhdGUgY3JlYXRlQWNjZXNzTG9nc0FuYWx5c2lzKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuYWNjZXNzTG9nc0J1Y2tldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY2Nlc3MgYnVja2V0IG5vdCBzZXQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgQ2xvdWRGcm9udEFjY2Vzc0xvZ3NBbmFseXNpcyB9ID0gcmVxdWlyZSgnLi4vYWNjZXNzLWxvZ3MtYW5hbHlzaXMvQ2xvdWRGcm9udEFjY2Vzc0xvZ3NBbmFseXNpcycpO1xuXG4gICAgICAgIG5ldyBDbG91ZEZyb250QWNjZXNzTG9nc0FuYWx5c2lzKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYWNjZXNzLWxvZ3MtYW5hbHlzaXNgLCB7XG4gICAgICAgICAgICBidWNrZXQ6IHRoaXMuYWNjZXNzTG9nc0J1Y2tldCxcbiAgICAgICAgICAgIHJlc291cmNlUHJlZml4OiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFjY2Vzcy1sb2dzYCxcbiAgICAgICAgICAgIGFjY2Vzc0xvZ0Nvb2tpZXM6IHByb3BzLmFjY2Vzc0xvZ0Nvb2tpZXMsXG4gICAgICAgICAgICBhbm9ueW1pemVDbGllbnRJcDogcHJvcHMuYW5vbnltaXplQWNjZXNzTG9nQ2xpZW50SXAgPz8gdHJ1ZSxcbiAgICAgICAgICAgIGV4cGlyZVJhd0xvZ3NBZnRlcjogcHJvcHMuYWNjZXNzTG9nc1Jhd1JldGVudGlvbixcbiAgICAgICAgICAgIGV4cGlyZUludGVybWVkaWF0ZUxvZ3NBZnRlcjogcHJvcHMuYWNjZXNzTG9nc0ludGVybWVkaWF0ZVJldGVudGlvbixcbiAgICAgICAgICAgIGV4cGlyZVRyYW5zZm9ybWVkTG9nc0FmdGVyOiBwcm9wcy5hY2Nlc3NMb2dzVHJhbnNmb3JtZWRSZXRlbnRpb24sXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==
613
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTnV4dFNlcnZlckFwcFN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiTnV4dFNlcnZlckFwcFN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUEyRDtBQUUzRCwrRUFBK0Q7QUFDL0QsK0RBaUJvQztBQUNwQyx1REFBc0Y7QUFDdEYsK0NBTTRCO0FBQzVCLHlEQUF3RztBQUN4RyxxRUFBcUY7QUFDckYsK0VBQThFO0FBQzlFLHlFQUFpRTtBQUNqRSxtREFBK0Q7QUFDL0QsZ0VBQTRGO0FBQzVGLHVEQUF1RTtBQUN2RSx1RUFBOEQ7QUFDOUQsNkJBQTZCO0FBQzdCLDJCQUF3RDtBQUd4RCw2RkFBZ0Y7QUFDaEYsbUVBQTJHO0FBRTNHOztHQUVHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxtQkFBSztJQWtHekMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE4Qjs7UUFDcEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDYixHQUFHLEtBQUs7WUFFUix1RUFBdUU7WUFDdkUscUJBQXFCLEVBQUUsS0FBSyxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksQ0FBQSxNQUFBLEtBQUssQ0FBQyxHQUFHLDBDQUFFLE1BQU0sTUFBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLHFCQUFxQjtTQUNqSSxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRWpGLHFCQUFxQjtRQUNyQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFBLGtEQUE0QixFQUFDLE1BQUEsS0FBSyxDQUFDLE9BQU8sbUNBQUksR0FBRyxD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QUFVO1lBQ1YsaUJBQWlCLEVBQUUsMEJBQWlCLENBQUMsU0FBUztZQUM5QyxlQUFlLEVBQUUsd0JBQWUsQ0FBQyxzQkFBc0I7WUFDdkQsa0VBQWtFO1lBQ2xFLGFBQWEsRUFBRSwyQkFBYSxDQUFDLE9BQU87WUFDcEMsaUJBQWlCLEVBQUUsSUFBSTtTQUMxQixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRTlDLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFHTyx3QkFBd0IsQ0FBQyxLQUE4Qjs7UUFDM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsTUFBTSxFQUFFLDRCQUE0QixFQUFFLEdBQUcsT0FBTyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFFekcsSUFBSSw0QkFBNEIsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLHVCQUF1QixFQUFFO1lBQ3BGLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQzdCLGNBQWMsRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsY0FBYztZQUN0RCxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO1lBQ3hDLGlCQUFpQixFQUFFLE1BQUEsS0FBSyxDQUFDLDBCQUEwQixtQ0FBSSxJQUFJO1lBQzNELGtCQUFrQixFQUFFLEtBQUssQ0FBQyxzQkFBc0I7WUFDaEQsMkJBQTJCLEVBQUUsS0FBSyxDQUFDLCtCQUErQjtZQUNsRSwwQkFBMEIsRUFBRSxLQUFLLENBQUMsOEJBQThCO1NBQ25FLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSjtBQXh2QkQsZ0RBd3ZCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RHVyYXRpb24sIFJlbW92YWxQb2xpY3ksIFN0YWNrfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge0NvbnN0cnVjdH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge0NlcnRpZmljYXRlfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgICBBbGxvd2VkTWV0aG9kcyxcbiAgICB0eXBlIEJlaGF2aW9yT3B0aW9ucyxcbiAgICBDYWNoZUNvb2tpZUJlaGF2aW9yLFxuICAgIENhY2hlZE1ldGhvZHMsXG4gICAgQ2FjaGVIZWFkZXJCZWhhdmlvcixcbiAgICBDYWNoZVBvbGljeSxcbiAgICBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IsXG4gICAgRGlzdHJpYnV0aW9uLCBIdHRwVmVyc2lvbixcbiAgICB0eXBlIElPcmlnaW5BY2Nlc3NJZGVudGl0eSxcbiAgICBPcmlnaW5BY2Nlc3NJZGVudGl0eSxcbiAgICBPcmlnaW5Qcm90b2NvbFBvbGljeSwgT3JpZ2luUmVxdWVzdFBvbGljeSxcbiAgICBQcmljZUNsYXNzLFxuICAgIFNlY3VyaXR5UG9saWN5UHJvdG9jb2wsXG4gICAgVmlld2VyUHJvdG9jb2xQb2xpY3ksIE9yaWdpblJlcXVlc3RDb29raWVCZWhhdmlvciwgT3JpZ2luUmVxdWVzdEhlYWRlckJlaGF2aW9yLCBPcmlnaW5SZXF1ZXN0UXVlcnlTdHJpbmdCZWhhdmlvcixcbiAgICBGdW5jdGlvbkV2ZW50VHlwZSwgdHlwZSBGdW5jdGlvbkFzc29jaWF0aW9uLFxuICAgIEZ1bmN0aW9uIGFzIENsb3VkRnJvbnRGdW5jdGlvbixcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCI7XG5pbXBvcnQge0FyY2hpdGVjdHVyZSwgQ29kZSwgRnVuY3Rpb24sIFJ1bnRpbWUsIFRyYWNpbmd9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQge1xuICAgIEJsb2NrUHVibGljQWNjZXNzLFxuICAgIEJ1Y2tldCxcbiAgICBCdWNrZXRBY2Nlc3NDb250cm9sLFxuICAgIEJ1Y2tldEVuY3J5cHRpb24sXG4gICAgT2JqZWN0T3duZXJzaGlwXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7QWFhYVJlY29yZCwgQVJlY29yZCwgSG9zdGVkWm9uZSwgdHlwZSBJSG9zdGVkWm9uZSwgUmVjb3JkVGFyZ2V0fSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCB7QnVja2V0RGVwbG95bWVudCwgU291cmNlLCBTdG9yYWdlQ2xhc3N9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudFwiO1xuaW1wb3J0IHtIdHRwT3JpZ2luLCBTM0J1Y2tldE9yaWdpbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250LW9yaWdpbnNcIjtcbmltcG9ydCB7Q2xvdWRGcm9udFRhcmdldH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHNcIjtcbmltcG9ydCB7IExvZ0dyb3VwLCBSZXRlbnRpb25EYXlzIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCI7XG5pbXBvcnQge2dldE51eHRBcHBTdGF0aWNBc3NldENvbmZpZ3MsIHR5cGUgU3RhdGljQXNzZXRDb25maWd9IGZyb20gXCIuLi9OdXh0QXBwU3RhdGljQXNzZXRzXCI7XG5pbXBvcnQge1J1bGUsIFJ1bGVUYXJnZXRJbnB1dCwgU2NoZWR1bGV9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzXCI7XG5pbXBvcnQge0xhbWJkYUZ1bmN0aW9ufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQge3dyaXRlRmlsZVN5bmMsIG1rZGlyU3luYywgZXhpc3RzU3luY30gZnJvbSBcImZzXCI7XG5pbXBvcnQge3R5cGUgTnV4dFNlcnZlckFwcFN0YWNrUHJvcHN9IGZyb20gXCIuL051eHRTZXJ2ZXJBcHBTdGFja1Byb3BzXCI7XG5pbXBvcnQge3R5cGUgTnV4dENsb3VkRnJvbnRCZWhhdmlvcn0gZnJvbSBcIi4vTnV4dFNlcnZlckFwcFN0YWNrUHJvcHNcIjtcbmltcG9ydCB7SHR0cExhbWJkYUludGVncmF0aW9ufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXl2Mi1pbnRlZ3JhdGlvbnNcIjtcbmltcG9ydCB7RG9tYWluTmFtZSwgRW5kcG9pbnRUeXBlLCBIdHRwQXBpLCBIdHRwTWV0aG9kLCBTZWN1cml0eVBvbGljeX0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5djJcIjtcblxuLyoqXG4gKiBDREsgc3RhY2sgdG8gZGVwbG95IGEgZHluYW1pYyBOdXh0IGFwcCAodGFyZ2V0PXNlcnZlcikgb24gQVdTIHdpdGggTGFtYmRhLCBBcGlHYXRld2F5LCBTMyBhbmQgQ2xvdWRGcm9udC5cbiAqL1xuZXhwb3J0IGNsYXNzIE51eHRTZXJ2ZXJBcHBTdGFjayBleHRlbmRzIFN0YWNrIHtcblxuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIHByZWZpeCBvZiB0aGUgcmVzb3VyY2VzIGNyZWF0ZWQgYnkgdGhlIHN0YWNrLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlSWRQcmVmaXg6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudCBkZXBsb3ltZW50IHRoYXQgaXMgdXNlZCB0byB0YWcgdGhlIHN0YXRpYyBhc3NldHMgb2YgdGhlIGRlcGxveW1lbnRcbiAgICAgKiB0byBsYXRlciBiZSBhYmxlIHRvIGNsZWFuIHVwIG91dGRhdGVkIGFzc2V0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXBsb3ltZW50UmV2aXNpb246IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGl0eSB0byB1c2UgZm9yIGFjY2Vzc2luZyB0aGUgZGVwbG95bWVudCBhc3NldHMgb24gUzMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RuQWNjZXNzSWRlbnRpdHk6IElPcmlnaW5BY2Nlc3NJZGVudGl0eTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBTMyBidWNrZXQgd2hlcmUgdGhlIGRlcGxveW1lbnQgYXNzZXRzIGdldHMgc3RvcmVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWNBc3NldHNCdWNrZXQ6IEJ1Y2tldDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBTMyBidWNrZXQgd2hlcmUgdGhlIGFjY2VzcyBsb2dzIG9mIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiBnZXRzIHN0b3JlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWNjZXNzTG9nc0J1Y2tldDogQnVja2V0fHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBTMyBidWNrZXQgd2hlcmUgdGhlIHNpdGVtYXAgYXNzZXRzIGdldHMgc3RvcmVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBzaXRlbWFwQnVja2V0OiBCdWNrZXR8dW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogVGhlIExhbWJkYSBmdW5jdGlvbiB0byByZW5kZXIgdGhlIE51eHQgYXBwIG9uIHRoZSBzZXJ2ZXIgc2lkZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcHBMYW1iZGFGdW5jdGlvbjogRnVuY3Rpb247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgY2xlYW51cHMgdGhlIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsZWFudXBMYW1iZGFGdW5jdGlvbjogRnVuY3Rpb247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgQVBJIGdhdGV3YXkgdG8gbWFrZSB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRvIHJlbmRlciB0aGUgTnV4dCBhcHAgcHVibGljbHkgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGFwaUdhdGV3YXk6IEh0dHBBcGk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29uZmlncyBmb3IgdGhlIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwIHRoYXQgc2hhbGwgYmUgcHVibGljbHkgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpY0Fzc2V0Q29uZmlnczogU3RhdGljQXNzZXRDb25maWdbXTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiBvcmlnaW4gZm9yIHRoZSBBUEkgZ2F0ZXdheSB0byByb3V0ZSBpbmNvbWluZyByZXF1ZXN0cyB0byB0aGUgTnV4dCBMYW1iZGEgZnVuY3Rpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBodHRwT3JpZ2luOiBIdHRwT3JpZ2luO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNhY2hlIHBvbGljeSB0aGF0IHNwZWNpZmllcyB3aGljaCBIVFRQIGhlYWRlcnMsIGNvb2tpZXMsIGFuZCBxdWVyeSBzdHJpbmdzXG4gICAgICogQ2xvdWRGcm9udCBmb3J3YXJkcyB0byB0aGUgTnV4dCBhcHAgYW5kIHVzZXMgdG8gZ2VuZXJhdGUgYSBjYWNoZSBrZXkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhcHBDYWNoZVBvbGljeTogQ2FjaGVQb2xpY3k7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luIHJlcXVlc3QgcG9saWN5IHRoYXQgc3BlY2lmaWVzIHdoaWNoIEhUVFAgaGVhZGVycywgY29va2llcywgYW5kIHF1ZXJ5IHN0cmluZ3NcbiAgICAgKiBDbG91ZEZyb250IGZvcndhcmRzIHRvIHRoZSBOdXh0IGFwcCB3aXRob3V0IGFmZmVjdGluZyB0aGUgY2FjaGUga2V5LlxuICAgICAqL1xuICAgIHByaXZhdGUgYXBwUmVxdWVzdFBvbGljeTogT3JpZ2luUmVxdWVzdFBvbGljeSB8IHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiZWhhdmlvciBmb3IgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIGluY29taW5nIHdlYiByZXF1ZXN0c1xuICAgICAqIHRvIHRoZSBOdXh0IExhbWJkYSBmdW5jdGlvbiAodmlhIEFQSSBnYXRld2F5KS5cbiAgICAgKi9cbiAgICBwcml2YXRlIG51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yOiBCZWhhdmlvck9wdGlvbnM7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgaW5jb21pbmcgcmVxdWVzdHMgdG8gdGhlIE51eHQgTGFtYmRhIGZ1bmN0aW9uICh2aWEgdGhlIEFQSSBnYXRld2F5KVxuICAgICAqIG9yIHRoZSBTMyBhc3NldHMgZm9sZGVyICh3aXRoIGNhY2hpbmcpLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkbjogRGlzdHJpYnV0aW9uO1xuXG4gICAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKSB7XG4gICAgICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgICAgICAgLi4ucHJvcHMsXG5cbiAgICAgICAgICAgIC8vIEZvcmNlIGNyb3NzLXJlZ2lvbiByZWZlcmVuY2VzIGlmIGEgV0FGIEFDTCBpcyB1c2VkIG91dHNpZGUgdXMtZWFzdC0xXG4gICAgICAgICAgICBjcm9zc1JlZ2lvblJlZmVyZW5jZXM6IHByb3BzLndlYkFjbEFybiAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmVudj8ucmVnaW9uICE9PSAndXMtZWFzdC0xJyA/IHRydWUgOiBwcm9wcy5jcm9zc1JlZ2lvblJlZmVyZW5jZXMsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmVzb3VyY2VJZFByZWZpeCA9IGAke3Byb3BzLnByb2plY3R9LSR7cHJvcHMuc2VydmljZX0tJHtwcm9wcy5lbnZpcm9ubWVudH1gO1xuXG4gICAgICAgIC8vIE51eHQgYXBwIHJlc291cmNlc1xuICAgICAgICB0aGlzLmRlcGxveW1lbnRSZXZpc2lvbiA9IHRoaXMuY3JlYXRlRGVwbG95bWVudFJldmlzaW9uKHByb3BzKTtcbiAgICAgICAgdGhpcy5zdGF0aWNBc3NldENvbmZpZ3MgPSBnZXROdXh0QXBwU3RhdGljQXNzZXRDb25maWdzKHByb3BzLnJvb3REaXIgPz8gJy4nKTtcbiAgICAgICAgdGhpcy5jZG5BY2Nlc3NJZGVudGl0eSA9IHRoaXMuY3JlYXRlQ2RuQWNjZXNzSWRlbnRpdHkoKTtcbiAgICAgICAgdGhpcy5zdGF0aWNBc3NldHNCdWNrZXQgPSB0aGlzLmNyZWF0ZVN0YXRpY0Fzc2V0c0J1Y2tldCgpO1xuXG4gICAgICAgIGlmIChwcm9wcy5lbmFibGVBY2Nlc3NMb2dzQW5hbHlzaXMpIHtcbiAgICAgICAgICAgIHRoaXMuYWNjZXNzTG9nc0J1Y2tldCA9IHRoaXMuY3JlYXRlQWNjZXNzTG9nc0J1Y2tldCgpO1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVBY2Nlc3NMb2dzQW5hbHlzaXMocHJvcHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BzLmVuYWJsZVNpdGVtYXApIHtcbiAgICAgICAgICAgIHRoaXMuc2l0ZW1hcEJ1Y2tldCA9IHRoaXMuY3JlYXRlU2l0ZW1hcEJ1Y2tldCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBMYW1iZGFGdW5jdGlvbiA9IHRoaXMuY3JlYXRlQXBwTGFtYmRhRnVuY3Rpb24ocHJvcHMpO1xuICAgICAgICB0aGlzLmFwaUdhdGV3YXkgPSB0aGlzLmNyZWF0ZUFwaUdhdGV3YXkocHJvcHMpO1xuICAgICAgICB0aGlzLmh0dHBPcmlnaW4gPSB0aGlzLmNyZWF0ZU51eHRBcHBIdHRwT3JpZ2luKCk7XG4gICAgICAgIHRoaXMuYXBwQ2FjaGVQb2xpY3kgPSB0aGlzLmNyZWF0ZU51eHRBcHBDYWNoZVBvbGljeShwcm9wcylcbiAgICAgICAgdGhpcy5hcHBSZXF1ZXN0UG9saWN5ID0gdGhpcy5jcmVhdGVOdXh0QXBwUmVxdWVzdFBvbGljeShwcm9wcylcbiAgICAgICAgdGhpcy5udXh0U2VydmVyUm91dGVCZWhhdmlvciA9IHRoaXMuY3JlYXRlTnV4dFNlcnZlclJvdXRlQmVoYXZpb3IoKVxuXG4gICAgICAgIHRoaXMuY2RuID0gdGhpcy5jcmVhdGVDbG91ZEZyb250RGlzdHJpYnV0aW9uKHByb3BzKTtcbiAgICAgICAgdGhpcy5jb25maWd1cmVEZXBsb3ltZW50cygpO1xuICAgICAgICB0aGlzLmNyZWF0ZURuc1JlY29yZHMocHJvcHMpO1xuICAgICAgICB0aGlzLmNyZWF0ZUFwcFBpbmdSdWxlKHByb3BzKTtcblxuICAgICAgICAvLyBTdGF0aWMgYXNzZXRzIGNsZWFudXAgcmVzb3VyY2VzXG4gICAgICAgIHRoaXMuY2xlYW51cExhbWJkYUZ1bmN0aW9uID0gdGhpcy5jcmVhdGVDbGVhbnVwTGFtYmRhRnVuY3Rpb24ocHJvcHMpO1xuICAgICAgICB0aGlzLmNyZWF0ZUNsZWFudXBUcmlnZ2VyUnVsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIGN1cnJlbnQgZGVwbG95bWVudCByZXZpc2lvbiBmaWxlIGluIHRoZSBwdWJsaWMgZm9sZGVyIG9mIHRoZSBOdXh0IGFwcCB0byBiZSBhY2Nlc3NpYmxlXG4gICAgICogYW5kIHJldHVybnMgdGhlIGN1cnJlbnQgcmV2aXNpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVEZXBsb3ltZW50UmV2aXNpb24ocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgYXBwUmV2aXNpb24gPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG5cbiAgICAgICAgY29uc3QgZGlyID0gcGF0aC5qb2luKHByb3BzLnJvb3REaXIgPz8gJy4nLCAnLm91dHB1dCcsICdwdWJsaWMnKTtcbiAgICAgICAgbWtkaXJTeW5jKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIHdyaXRlRmlsZVN5bmMocGF0aC5qb2luKGRpciwgJ2FwcC1yZXZpc2lvbicpLCBhcHBSZXZpc2lvbiwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICAgICAgICByZXR1cm4gYXBwUmV2aXNpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgaWRlbnRpdHkgdG8gYWNjZXNzIHRoZSBTMyBkZXBsb3ltZW50IGFzc2V0IGZpbGVzIHZpYSB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQ2RuQWNjZXNzSWRlbnRpdHkoKTogSU9yaWdpbkFjY2Vzc0lkZW50aXR5IHtcbiAgICAgICAgY29uc3Qgb3JpZ2luQWNjZXNzSWRlbnRpdHlOYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jZG4tczMtYWNjZXNzYDtcbiAgICAgICAgcmV0dXJuIG5ldyBPcmlnaW5BY2Nlc3NJZGVudGl0eSh0aGlzLCBvcmlnaW5BY2Nlc3NJZGVudGl0eU5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIGJ1Y2tldCB0byBzdG9yZSB0aGUgc3RhdGljIGRlcGxveW1lbnQgYXNzZXQgZmlsZXMgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVN0YXRpY0Fzc2V0c0J1Y2tldCgpOiBCdWNrZXQge1xuICAgICAgICBjb25zdCBidWNrZXROYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hc3NldHNgO1xuICAgICAgICBjb25zdCBidWNrZXQgPSBuZXcgQnVja2V0KHRoaXMsIGJ1Y2tldE5hbWUsIHtcbiAgICAgICAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBCbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTEwsXG4gICAgICAgICAgICBidWNrZXROYW1lLFxuICAgICAgICAgICAgLy8gVGhlIGJ1Y2tldCBhbmQgYWxsIG9mIGl0cyBvYmplY3RzIGNhbiBiZSBkZWxldGVkLCBiZWNhdXNlIGFsbCB0aGUgY29udGVudCBpcyBtYW5hZ2VkIGluIHRoaXMgcHJvamVjdFxuICAgICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgICAgICAgICBvYmplY3RPd25lcnNoaXA6IE9iamVjdE93bmVyc2hpcC5CVUNLRVRfT1dORVJfRU5GT1JDRUQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJ1Y2tldC5ncmFudFJlYWRXcml0ZSh0aGlzLmNkbkFjY2Vzc0lkZW50aXR5KTtcblxuICAgICAgICByZXR1cm4gYnVja2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIGJ1Y2tldCB0byBzdG9yZSB0aGUgc2l0ZW1hcCBhc3NldHMgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVNpdGVtYXBCdWNrZXQoKTogQnVja2V0IHtcbiAgICAgICAgY29uc3QgYnVja2V0TmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tc2l0ZW1hcGA7XG4gICAgICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBCdWNrZXQodGhpcywgYnVja2V0TmFtZSwge1xuICAgICAgICAgICAgYnVja2V0TmFtZSxcbiAgICAgICAgICAgIGFjY2Vzc0NvbnRyb2w6IEJ1Y2tldEFjY2Vzc0NvbnRyb2wuUFJJVkFURSxcbiAgICAgICAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBCbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTEwsXG4gICAgICAgICAgICBlbmNyeXB0aW9uOiBCdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQsXG4gICAgICAgICAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgICAgICAgICAgLy8gVGhlIGJ1Y2tldCBhbmQgYWxsIG9mIGl0cyBvYmplY3RzIGNhbiBiZSBkZWxldGVkLCBiZWNhdXNlIGFsbCB0aGUgY29udGVudCBpcyBtYW5hZ2VkIGluIHRoaXMgcHJvamVjdFxuICAgICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJ1Y2tldC5ncmFudFJlYWRXcml0ZSh0aGlzLmNkbkFjY2Vzc0lkZW50aXR5KTtcblxuICAgICAgICByZXR1cm4gYnVja2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIExhbWJkYSBmdW5jdGlvbiB0byByZW5kZXIgdGhlIE51eHQgYXBwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUFwcExhbWJkYUZ1bmN0aW9uKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IEZ1bmN0aW9uIHtcbiAgICAgICAgY29uc3QgZnVuY05hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LW51eHRgO1xuXG4gICAgICAgIGNvbnN0IGFwcExvZ0dyb3VwID0gbmV3IExvZ0dyb3VwKHRoaXMsIGAke2Z1bmNOYW1lfS1sb2dzYCwge1xuICAgICAgICAgICAgbG9nR3JvdXBOYW1lOiBgL2F3cy9sYW1iZGEvJHtmdW5jTmFtZX1gLFxuICAgICAgICAgICAgcmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLk9ORV9NT05USCxcbiAgICAgICAgfSk7XG4gICAgICAgIGFwcExvZ0dyb3VwLmFwcGx5UmVtb3ZhbFBvbGljeShSZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuXG4gICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24odGhpcywgZnVuY05hbWUsIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogZnVuY05hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYFJlbmRlcnMgdGhlICR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fSBOdXh0IGFwcC5gLFxuICAgICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgICAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgICAgICAgIGhhbmRsZXI6IGAke3Byb3BzLmVudHJ5cG9pbnQgPz8gJ2luZGV4J30uaGFuZGxlcmAsXG4gICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChgJHtwcm9wcy5yb290RGlyID8/ICcuJyB9Ly5vdXRwdXQvc2VydmVyYCwge1xuICAgICAgICAgICAgICAgIGV4Y2x1ZGU6IFsnKiouc3ZnJywgJyoqLmljbycsICcqKi5wbmcnLCAnKiouanBnJywgJyoqLmpzLm1hcCddLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDEwKSxcbiAgICAgICAgICAgIG1lbW9yeVNpemU6IHByb3BzLm1lbW9yeVNpemUgPz8gMTc5MixcbiAgICAgICAgICAgIGFsbG93UHVibGljU3VibmV0OiBmYWxzZSxcbiAgICAgICAgICAgIHRyYWNpbmc6IHByb3BzLmVuYWJsZVRyYWNpbmcgPyBUcmFjaW5nLkFDVElWRSA6IFRyYWNpbmcuRElTQUJMRUQsXG4gICAgICAgICAgICBsb2dHcm91cDogYXBwTG9nR3JvdXAsXG4gICAgICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgICAgIE5PREVfT1BUSU9OUzogJy0tZW5hYmxlLXNvdXJjZS1tYXBzJyxcbiAgICAgICAgICAgICAgICAuLi5KU09OLnBhcnNlKHByb3BzLmVudHJ5cG9pbnRFbnYgPz8gJ3t9JyksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBMYW1iZGEgZnVuY3Rpb24gdGhhdCBjbGVhbnVwcyB0aGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAuXG4gICAgICogTm90ZSB0aGF0IHdlIHVzZSB0aGUgYnVuZGxlZCBBV1MgU0RLIGZvciBOb2RlIHRvIGF2b2lkIHRoZSBuZWVkIGZvciBhIGN1c3RvbSBsYXllclxuICAgICAqIHdoaWNoIHJlc3RyaWN0cyB0aGUgY29uc3VtZXIgdG8gYSBzcGVjaWZpYyB5YXJuIG9yIG5wbSB2ZXJzaW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQ2xlYW51cExhbWJkYUZ1bmN0aW9uKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IEZ1bmN0aW9uIHtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lOiBzdHJpbmcgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNsZWFudXBgO1xuICAgICAgICBjb25zdCBmdW5jdGlvbkRpclBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vZnVuY3Rpb25zL2Fzc2V0cy1jbGVhbnVwJyk7XG5cbiAgICAgICAgY29uc3QgY2xlYW51cExvZ0dyb3VwID0gbmV3IExvZ0dyb3VwKHRoaXMsIGAke2Z1bmN0aW9uTmFtZX0tbG9nc2AsIHtcbiAgICAgICAgICAgIGxvZ0dyb3VwTmFtZTogYC9hd3MvbGFtYmRhLyR7ZnVuY3Rpb25OYW1lfWAsXG4gICAgICAgICAgICByZXRlbnRpb246IFJldGVudGlvbkRheXMuVFdPX1dFRUtTLFxuICAgICAgICB9KTtcbiAgICAgICAgY2xlYW51cExvZ0dyb3VwLmFwcGx5UmVtb3ZhbFBvbGljeShSZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdDogRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24odGhpcywgZnVuY3Rpb25OYW1lLCB7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQXV0by1kZWxldGVzIHRoZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzIGluIHRoZSAke3RoaXMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWV9IFMzIGJ1Y2tldC5gLFxuICAgICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgICAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgICAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KGAke2Z1bmN0aW9uRGlyUGF0aH0vYnVpbGQvYXBwYCwge1xuICAgICAgICAgICAgICAgIGV4Y2x1ZGU6IFsnKi5kLnRzJ11cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxNSksXG4gICAgICAgICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgICAgIFNUQVRJQ19BU1NFVFNfQlVDS0VUOiB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXROYW1lLFxuICAgICAgICAgICAgICAgIE9VVERBVEVEX0FTU0VUU19SRVRFTlRJT05fREFZUzogYCR7cHJvcHMub3V0ZGF0ZWRBc3NldHNSZXRlbnRpb25EYXlzID8/IDMwfWAsXG4gICAgICAgICAgICAgICAgRU5WSVJPTk1FTlQ6IHByb3BzLmVudmlyb25tZW50LFxuICAgICAgICAgICAgICAgIEFXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEOiAnMScsXG4gICAgICAgICAgICAgICAgTk9ERV9PUFRJT05TOiAnLS1lbmFibGUtc291cmNlLW1hcHMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxvZ0dyb3VwOiBjbGVhbnVwTG9nR3JvdXAsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGdyYW50IGZ1bmN0aW9uIGFjY2VzcyB0byBTMyBidWNrZXRcbiAgICAgICAgdGhpcy5zdGF0aWNBc3NldHNCdWNrZXQuZ3JhbnRSZWFkKHJlc3VsdCk7XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LmdyYW50RGVsZXRlKHJlc3VsdCk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBBUEkgZ2F0ZXdheSB0byBtYWtlIHRoZSBOdXh0IGFwcCByZW5kZXIgTGFtYmRhIGZ1bmN0aW9uIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBcGlHYXRld2F5KHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IEh0dHBBcGkge1xuICAgICAgICBjb25zdCBhcGlOYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hcGlgO1xuICAgICAgICBjb25zdCBsYW1iZGFJbnRlZ3JhdGlvbiA9IG5ldyBIdHRwTGFtYmRhSW50ZWdyYXRpb24oYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1sYW1iZGEtaW50ZWdyYXRpb25gLCB0aGlzLmFwcExhbWJkYUZ1bmN0aW9uKTtcblxuICAgICAgICAvLyBXZSB3YW50IHRoZSBBUEkgZ2F0ZXdheSB0byBiZSBhY2Nlc3NpYmxlIGJ5IHRoZSBjdXN0b20gZG9tYWluIG5hbWUuXG4gICAgICAgIC8vIEV2ZW4gdGhvdWdoIHdlIGFjY2VzcyB0aGUgZ2F0ZXdheSB2aWEgQ2xvdWRGcm9udCAoZm9yIGF1dG8gaHR0cCB0byBodHRwcyByZWRpcmVjdHMpLCB0aGlzIGlzIHJlcXVpcmVkXG4gICAgICAgIC8vIHRvIGJlIGFibGUgdG8gcmVkaXJlY3QgdGhlIG9yaWdpbmFsICdIb3N0JyBoZWFkZXIgdG8gdGhlIE51eHQgYXBwbGljYXRpb24sIGlmIHJlcXVlc3RlZC5cbiAgICAgICAgY29uc3QgZG9tYWluTmFtZSA9IG5ldyBEb21haW5OYW1lKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYXBpLWRvbWFpbmAsIHtcbiAgICAgICAgICAgIGRvbWFpbk5hbWU6IHByb3BzLmRvbWFpbixcbiAgICAgICAgICAgIGNlcnRpZmljYXRlOiBDZXJ0aWZpY2F0ZS5mcm9tQ2VydGlmaWNhdGVBcm4odGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1yZWdpb25hbC1jZXJ0aWZpY2F0ZWAsIHByb3BzLnJlZ2lvbmFsVGxzQ2VydGlmaWNhdGVBcm4pLFxuICAgICAgICAgICAgZW5kcG9pbnRUeXBlOiBFbmRwb2ludFR5cGUuUkVHSU9OQUwsXG4gICAgICAgICAgICBzZWN1cml0eVBvbGljeTogU2VjdXJpdHlQb2xpY3kuVExTXzFfMlxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBhcGlHYXRld2F5ID0gbmV3IEh0dHBBcGkodGhpcywgYXBpTmFtZSwge1xuICAgICAgICAgICAgYXBpTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQ29ubmVjdHMgdGhlICR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB3aXRoIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gTGFtYmRhIGZ1bmN0aW9uIHRvIG1ha2UgaXQgcHVibGljbHkgYXZhaWxhYmxlLmAsXG4gICAgICAgICAgICAvLyBUaGUgYXBwIGRvZXMgbm90IGFsbG93IGFueSBjcm9zcy1vcmlnaW4gYWNjZXNzIGJ5IHB1cnBvc2U6IHRoZSBhcHAgc2hvdWxkIG5vdCBiZSBlbWJlZGRhYmxlIGFueXdoZXJlXG4gICAgICAgICAgICBjb3JzUHJlZmxpZ2h0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkZWZhdWx0SW50ZWdyYXRpb246IGxhbWJkYUludGVncmF0aW9uLFxuICAgICAgICAgICAgZGVmYXVsdERvbWFpbk1hcHBpbmc6IHtcbiAgICAgICAgICAgICAgICBkb21haW5OYW1lOiBkb21haW5OYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFwaUdhdGV3YXkuYWRkUm91dGVzKHtcbiAgICAgICAgICAgIGludGVncmF0aW9uOiBsYW1iZGFJbnRlZ3JhdGlvbixcbiAgICAgICAgICAgIHBhdGg6ICcve3Byb3h5K30nLFxuICAgICAgICAgICAgbWV0aG9kczogW1xuICAgICAgICAgICAgICAgIEh0dHBNZXRob2QuR0VULFxuICAgICAgICAgICAgICAgIEh0dHBNZXRob2QuSEVBRCxcbiAgICAgICAgICAgICAgICBIdHRwTWV0aG9kLk9QVElPTlMsXG4gICAgICAgICAgICAgICAgSHR0cE1ldGhvZC5QT1NULFxuICAgICAgICAgICAgICAgIEh0dHBNZXRob2QuUFVULFxuICAgICAgICAgICAgICAgIEh0dHBNZXRob2QuUEFUQ0gsXG4gICAgICAgICAgICAgICAgSHR0cE1ldGhvZC5ERUxFVEUsXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gYXBpR2F0ZXdheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0aGF0IHJvdXRlcyBpbmNvbWluZyByZXF1ZXN0cyB0byB0aGUgTnV4dCBMYW1iZGEgZnVuY3Rpb24gKHZpYSB0aGUgQVBJIGdhdGV3YXkpXG4gICAgICogb3IgdGhlIFMzIGFzc2V0cyBmb2xkZXIgKHdpdGggY2FjaGluZykuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcHNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQ2xvdWRGcm9udERpc3RyaWJ1dGlvbihwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBEaXN0cmlidXRpb24ge1xuICAgICAgICBjb25zdCBjZG5OYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jZG5gO1xuXG4gICAgICAgIHJldHVybiBuZXcgRGlzdHJpYnV0aW9uKHRoaXMsIGNkbk5hbWUsIHtcbiAgICAgICAgICAgIGRvbWFpbk5hbWVzOiBbcHJvcHMuZG9tYWluXSxcbiAgICAgICAgICAgIGNvbW1lbnQ6IGNkbk5hbWUsXG4gICAgICAgICAgICBtaW5pbXVtUHJvdG9jb2xWZXJzaW9uOiBTZWN1cml0eVBvbGljeVByb3RvY29sLlRMU19WMV8yXzIwMTgsXG4gICAgICAgICAgICBjZXJ0aWZpY2F0ZTogQ2VydGlmaWNhdGUuZnJvbUNlcnRpZmljYXRlQXJuKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tZ2xvYmFsLWNlcnRpZmljYXRlYCwgcHJvcHMuZ2xvYmFsVGxzQ2VydGlmaWNhdGVBcm4pLFxuICAgICAgICAgICAgaHR0cFZlcnNpb246IEh0dHBWZXJzaW9uLkhUVFAyX0FORF8zLFxuICAgICAgICAgICAgZGVmYXVsdEJlaGF2aW9yOiB0aGlzLm51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yLFxuICAgICAgICAgICAgYWRkaXRpb25hbEJlaGF2aW9yczogdGhpcy5zZXR1cENsb3VkRnJvbnRSb3V0aW5nKHByb3BzKSxcbiAgICAgICAgICAgIHByaWNlQ2xhc3M6IFByaWNlQ2xhc3MuUFJJQ0VfQ0xBU1NfMTAwLCAvLyBVc2Ugb25seSBOb3J0aCBBbWVyaWNhIGFuZCBFdXJvcGVcbiAgICAgICAgICAgIGxvZ0J1Y2tldDogdGhpcy5hY2Nlc3NMb2dzQnVja2V0LFxuICAgICAgICAgICAgbG9nRmlsZVByZWZpeDogcHJvcHMuZW5hYmxlQWNjZXNzTG9nc0FuYWx5c2lzID8gJ3VucHJvY2Vzc2VkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGxvZ0luY2x1ZGVzQ29va2llczogcHJvcHMuZW5hYmxlQWNjZXNzTG9nc0FuYWx5c2lzLFxuICAgICAgICAgICAgd2ViQWNsSWQ6IHByb3BzLndlYkFjbEFybixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gYmVoYXZpb3Igb3JpZ2luIHRvIHJvdXRlIGluY29taW5nIHJlcXVlc3RzIHRvIHRoZSBOdXh0IHJlbmRlciBMYW1iZGEgZnVuY3Rpb24gKHZpYSBBUEkgZ2F0ZXdheSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVOdXh0QXBwSHR0cE9yaWdpbigpOiBIdHRwT3JpZ2luIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIdHRwT3JpZ2luKGAke3RoaXMuYXBpR2F0ZXdheS5odHRwQXBpSWR9LmV4ZWN1dGUtYXBpLiR7dGhpcy5yZWdpb259LmFtYXpvbmF3cy5jb21gLCB7XG4gICAgICAgICAgICBjb25uZWN0aW9uQXR0ZW1wdHM6IDIsXG4gICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogRHVyYXRpb24uc2Vjb25kcygyKSxcbiAgICAgICAgICAgIHJlYWRUaW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDEwKSxcbiAgICAgICAgICAgIHByb3RvY29sUG9saWN5OiBPcmlnaW5Qcm90b2NvbFBvbGljeS5IVFRQU19PTkxZLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYmVoYXZpb3IgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBpbmNvbWluZyB3ZWIgcmVxdWVzdHNcbiAgICAgKiB0byB0aGUgTnV4dCByZW5kZXIgTGFtYmRhIGZ1bmN0aW9uICh2aWEgQVBJIGdhdGV3YXkpLlxuICAgICAqIEFkZGl0aW9uYWxseSwgdGhpcyBhdXRvbWF0aWNhbGx5IHJlZGlyZWN0cyBIVFRQIHJlcXVlc3RzIHRvIEhUVFBTLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlTnV4dFNlcnZlclJvdXRlQmVoYXZpb3IoKTogQmVoYXZpb3JPcHRpb25zIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9yaWdpbjogdGhpcy5odHRwT3JpZ2luLFxuICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFELFxuICAgICAgICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICAgICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5OiB0aGlzLmFwcFJlcXVlc3RQb2xpY3ksXG4gICAgICAgICAgICBjYWNoZVBvbGljeTogdGhpcy5hcHBDYWNoZVBvbGljeVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBDbG91ZEZyb250Um91dGluZyhwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+IHtcbiAgICAgICAgbGV0IHJvdXRpbmdCZWhhdmlvdXJzOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+ID0ge1xuXG4gICAgICAgICAgICAvLyBOdXh0IEkxOG4gZmlsZXMgYXJlIHNlcnZlZCB2aWEgYSBzZXJ2ZXIgcm91dGVcbiAgICAgICAgICAgICcvX2kxOG4vKic6IHRoaXMubnV4dFNlcnZlclJvdXRlQmVoYXZpb3IsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gU3BlY2lmaWMgb25lcyBmaXJzdFxuICAgICAgICBpZiAocHJvcHMuZW5hYmxlQXBpKSB7XG4gICAgICAgICAgICByb3V0aW5nQmVoYXZpb3VycyA9IHsuLi5yb3V0aW5nQmVoYXZpb3VycywgLi4udGhpcy5jcmVhdGVBcGlSb3V0ZUJlaGF2aW9yKCl9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wcy5lbmFibGVTaXRlbWFwKSB7XG4gICAgICAgICAgICByb3V0aW5nQmVoYXZpb3VycyA9IHsuLi5yb3V0aW5nQmVoYXZpb3VycywgLi4udGhpcy5jcmVhdGVTaXRlbWFwUm91dGVCZWhhdmlvcigpfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBjdXN0b20gc2VydmVyIHJvdXRlcyBiZWZvcmUgc3RhdGljIGFzc2V0cyB0byBlbnN1cmUgdGhleSB0YWtlIHByZWNlZGVuY2VcbiAgICAgICAgaWYgKHByb3BzLnNlcnZlclJvdXRlcyAmJiBwcm9wcy5zZXJ2ZXJSb3V0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcm91dGluZ0JlaGF2aW91cnMgPSB7Li4ucm91dGluZ0JlaGF2aW91cnMsIC4uLnRoaXMuY3JlYXRlU2VydmVyUm91dGVCZWhhdmlvcihwcm9wcy5zZXJ2ZXJSb3V0ZXMpfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluamVjdCBjdXN0b20gYmVoYXZpb3JzIChjYWNoZSBwb2xpY3kgb3ZlcnJpZGVzIGFuZC9vciBDbG91ZEZyb250IEZ1bmN0aW9ucykgYmVmb3JlIHN0YXRpYyBhc3NldCBiZWhhdmlvcnNcbiAgICAgICAgaWYgKHByb3BzLmFkZGl0aW9uYWxCZWhhdmlvcnMgJiYgcHJvcHMuYWRkaXRpb25hbEJlaGF2aW9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByb3V0aW5nQmVoYXZpb3VycyA9IHsuLi5yb3V0aW5nQmVoYXZpb3VycywgLi4udGhpcy5jcmVhdGVBZGRpdGlvbmFsQmVoYXZpb3JzKHByb3BzLmFkZGl0aW9uYWxCZWhhdmlvcnMpfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJvdXRpbmdCZWhhdmlvdXJzID0gey4uLnJvdXRpbmdCZWhhdmlvdXJzLCAuLi50aGlzLmNyZWF0ZVN0YXRpY0Fzc2V0c1JvdXRlQmVoYXZpb3IoKX07XG5cbiAgICAgICAgcmV0dXJuIHJvdXRpbmdCZWhhdmlvdXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjYWNoZSBwb2xpY3kgZm9yIHRoZSBOdXh0IGFwcCByb3V0ZSBiZWhhdmlvciBvZiB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVOdXh0QXBwQ2FjaGVQb2xpY3kocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogQ2FjaGVQb2xpY3kge1xuICAgICAgICByZXR1cm4gbmV3IENhY2hlUG9saWN5KHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2FjaGUtcG9saWN5YCwge1xuICAgICAgICAgICAgY2FjaGVQb2xpY3lOYW1lOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNkbi1jYWNoZS1wb2xpY3lgLFxuICAgICAgICAgICAgY29tbWVudDogYERlZmluZXMgd2hpY2ggcmVxdWVzdCBkYXRhIHRvIHBhc3MgdG8gdGhlICR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fSBvcmlnaW4gYW5kIGhvdyB0aGUgY2FjaGUga2V5IGlzIGNhbGN1bGF0ZWQuYCxcbiAgICAgICAgICAgIGRlZmF1bHRUdGw6IER1cmF0aW9uLnNlY29uZHMoMCksXG4gICAgICAgICAgICBtaW5UdGw6IER1cmF0aW9uLnNlY29uZHMoMCksXG4gICAgICAgICAgICBtYXhUdGw6IER1cmF0aW9uLmRheXMoMzY1KSxcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IHByb3BzLmNhY2hlS2V5UXVlcnlQYXJhbXM/Lmxlbmd0aCA/IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuY2FjaGVLZXlRdWVyeVBhcmFtcykgOiAocHJvcHMuZGVueUNhY2hlS2V5UXVlcnlQYXJhbXM/Lmxlbmd0aCA/IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5kZW55TGlzdCguLi5wcm9wcy5kZW55Q2FjaGVLZXlRdWVyeVBhcmFtcykgOiAocHJvcHMuYWxsb3dRdWVyeVBhcmFtcz8ubGVuZ3RoID8gQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5hbGxvd1F1ZXJ5UGFyYW1zKSA6IChwcm9wcy5kZW55UXVlcnlQYXJhbXM/Lmxlbmd0aCA/IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5kZW55TGlzdCguLi5wcm9wcy5kZW55UXVlcnlQYXJhbXMpIDogQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbCgpKSkpLFxuICAgICAgICAgICAgaGVhZGVyQmVoYXZpb3I6IHByb3BzLmNhY2hlS2V5SGVhZGVycz8ubGVuZ3RoID8gQ2FjaGVIZWFkZXJCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuY2FjaGVLZXlIZWFkZXJzKSA6IChwcm9wcy5hbGxvd0hlYWRlcnM/Lmxlbmd0aCA/IENhY2hlSGVhZGVyQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmFsbG93SGVhZGVycykgOiBDYWNoZUhlYWRlckJlaGF2aW9yLm5vbmUoKSksXG4gICAgICAgICAgICBjb29raWVCZWhhdmlvcjogcHJvcHMuY2FjaGVLZXlDb29raWVzPy5sZW5ndGggPyBDYWNoZUNvb2tpZUJlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5jYWNoZUtleUNvb2tpZXMpIDogKHByb3BzLmFsbG93Q29va2llcz8ubGVuZ3RoID8gQ2FjaGVDb29raWVCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuYWxsb3dDb29raWVzKSA6IENhY2hlQ29va2llQmVoYXZpb3Iubm9uZSgpKSxcbiAgICAgICAgICAgIGVuYWJsZUFjY2VwdEVuY29kaW5nQnJvdGxpOiB0cnVlLFxuICAgICAgICAgICAgZW5hYmxlQWNjZXB0RW5jb2RpbmdHemlwOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9yaWdpbiByZXF1ZXN0IHBvbGljeSBmb3IgdGhlIE51eHQgYXBwIHJvdXRlIGJlaGF2aW9yIG9mIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAgICAgKiBObyBwb2xpY3kgaXMgY3JlYXRlZCBpZiBubyBleHBsaWNpdCBjb25maWcgaXMgcHJvdmlkZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVOdXh0QXBwUmVxdWVzdFBvbGljeShwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBPcmlnaW5SZXF1ZXN0UG9saWN5fHVuZGVmaW5lZCB7XG5cbiAgICAgICAgLy8gSWYgbm8gZXhwbGljaXQgY29uZmlnIGlzIHByb3ZpZGVkLCB3ZSB3YW50IHRvIHVzZSB0aGUgZGVmYXVsdCBmcm9tIENsb3VkZnJvbnRcbiAgICAgICAgY29uc3QgaGFzQW55Q29uZmlnID0gcHJvcHMuZm9yd2FyZFF1ZXJ5UGFyYW1zPy5sZW5ndGggfHwgcHJvcHMuZm9yd2FyZEhlYWRlcnM/Lmxlbmd0aCB8fCBwcm9wcy5mb3J3YXJkQ29va2llcz8ubGVuZ3RoO1xuICAgICAgICBpZiAoIWhhc0FueUNvbmZpZykge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgT3JpZ2luUmVxdWVzdFBvbGljeSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXJlcXVlc3QtcG9saWN5YCwge1xuICAgICAgICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeU5hbWU6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2RuLXJlcXVlc3QtcG9saWN5YCxcbiAgICAgICAgICAgIGNvbW1lbnQ6IGBEZWZpbmVzIHdoaWNoIHJlcXVlc3QgZGF0YSB0byBwYXNzIHRvIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gb3JpZ2luIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjYWNoZSBrZXkuYCxcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IHByb3BzLmZvcndhcmRRdWVyeVBhcmFtcz8ubGVuZ3RoID8gT3JpZ2luUmVxdWVzdFF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmZvcndhcmRRdWVyeVBhcmFtcykgOiBPcmlnaW5SZXF1ZXN0UXVlcnlTdHJpbmdCZWhhdmlvci5hbGwoKSxcbiAgICAgICAgICAgIGhlYWRlckJlaGF2aW9yOiBwcm9wcy5mb3J3YXJkSGVhZGVycz8ubGVuZ3RoID8gT3JpZ2luUmVxdWVzdEhlYWRlckJlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5mb3J3YXJkSGVhZGVycykgOiBPcmlnaW5SZXF1ZXN0SGVhZGVyQmVoYXZpb3Iubm9uZSgpLFxuICAgICAgICAgICAgY29va2llQmVoYXZpb3I6IHByb3BzLmZvcndhcmRDb29raWVzPy5sZW5ndGggPyBPcmlnaW5SZXF1ZXN0Q29va2llQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmZvcndhcmRDb29raWVzKSA6IE9yaWdpblJlcXVlc3RDb29raWVCZWhhdmlvci5ub25lKCksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBiZWhhdmlvciBmb3IgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIG1hdGNoaW5nIE51eHQgYXBwIEFQSSByZXF1ZXN0cyB0byB0aGUgQVBJIGdhdGV3YXkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBcGlSb3V0ZUJlaGF2aW9yKCk6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4ge1xuICAgICAgICBjb25zdCBhcGlCZWhhdmlvcjogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgICAgICAgb3JpZ2luOiB0aGlzLmh0dHBPcmlnaW4sXG4gICAgICAgICAgICBjb21wcmVzczogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19BTEwsXG4gICAgICAgICAgICBjYWNoZWRNZXRob2RzOiBDYWNoZWRNZXRob2RzLkNBQ0hFX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZVBvbGljeTogdGhpcy5hcHBDYWNoZVBvbGljeSxcbiAgICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6IHRoaXMuYXBwUmVxdWVzdFBvbGljeSxcbiAgICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5IVFRQU19PTkxZXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcnVsZXM6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4gPSB7fTtcbiAgICAgICAgcnVsZXNbJy9hcGkvKiddID0gYXBpQmVoYXZpb3I7XG5cbiAgICAgICAgcmV0dXJuIHJ1bGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYmVoYXZpb3JzIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgc3BlY2lmaWVkIHBhdGggcGF0dGVybnMgdG8gdGhlIFNTUiBvcmlnaW4uXG4gICAgICogVGhpcyBhbGxvd3Mgc2VydmVyIGVuZHBvaW50cyB0aGF0IHVzZSBmaWxlLWxpa2UgVVJMcyAoZS5nLiwgL3NpdGVtYXAueG1sIGZyb20gQG51eHRqcy9zaXRlbWFwKSBcbiAgICAgKiB0byBiZSBoYW5kbGVkIGJ5IHRoZSBMYW1iZGEgZnVuY3Rpb24gZm9yIGR5bmFtaWMgY29udGVudCBnZW5lcmF0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlU2VydmVyUm91dGVCZWhhdmlvcihzZXJ2ZXJSb3V0ZXM6IHN0cmluZ1tdKTogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiB7XG4gICAgICAgIGNvbnN0IHJ1bGVzOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+ID0ge307XG4gICAgICAgIFxuICAgICAgICBzZXJ2ZXJSb3V0ZXMuZm9yRWFjaChyb3V0ZSA9PiB7XG4gICAgICAgICAgICBydWxlc1tyb3V0ZV0gPSB0aGlzLm51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcnVsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBiZWhhdmlvcnMgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiBiYXNlZCBvbiB0aGUgY29uc3VtZXItc3VwcGxpZWQge0BsaW5rIE51eHRDbG91ZEZyb250QmVoYXZpb3J9IGxpc3QuXG4gICAgICogRWFjaCBiZWhhdmlvciBjYW4gb3ZlcnJpZGUgdGhlIGNhY2hlIHBvbGljeSwgYXR0YWNoIGEgQ2xvdWRGcm9udCBGdW5jdGlvbiwgb3IgYm90aC5cbiAgICAgKlxuICAgICAqIFdoZW4ge0BsaW5rIE51eHRDbG91ZEZyb250QmVoYXZpb3IuZm5Db2RlfSBpcyBwcm92aWRlZCwgdGhpcyBtZXRob2QgY3JlYXRlcyB0aGUgYGNsb3VkZnJvbnQuRnVuY3Rpb25gXG4gICAgICogcmVzb3VyY2UgaW5zaWRlIHRoZSBzdGFjayBpdHNlbGYgc28gdGhhdCBpdCBpcyBhbHdheXMgY29ycmVjdGx5IHNjb3BlZC5cbiAgICAgKlxuICAgICAqIFRoZSBwcm92aWRlZCB7QGxpbmsgTnV4dENsb3VkRnJvbnRCZWhhdmlvci5jYWNoZVBvbGljeX0gaXMgdXNlZCB3aGVuIHNwZWNpZmllZDsgb3RoZXJ3aXNlIHRoZVxuICAgICAqIGRlZmF1bHQgTnV4dCBhcHAgY2FjaGUgcG9saWN5ICh7QGxpbmsgYXBwQ2FjaGVQb2xpY3l9KSBpcyB1c2VkLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQWRkaXRpb25hbEJlaGF2aW9ycyhiZWhhdmlvcnM6IE51eHRDbG91ZEZyb250QmVoYXZpb3JbXSk6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4ge1xuICAgICAgICBjb25zdCBydWxlczogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiA9IHt9O1xuXG4gICAgICAgIGJlaGF2aW9ycy5mb3JFYWNoKChiZWhhdmlvciwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGxldCBmdW5jdGlvbkFzc29jaWF0aW9uczogRnVuY3Rpb25Bc3NvY2lhdGlvbltdID0gW107XG5cbiAgICAgICAgICAgIGlmIChiZWhhdmlvci5mbkNvZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIENsb3VkRnJvbnQgRnVuY3Rpb24gaW5zaWRlIHRoZSBzdGFjayBzbyBpdCBpcyBhbHdheXMgY29ycmVjdGx5IHNjb3BlZC5cbiAgICAgICAgICAgICAgICBjb25zdCBjZkZ1bmN0aW9uID0gbmV3IENsb3VkRnJvbnRGdW5jdGlvbih0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWJlaGF2aW9yLWZuLSR7aW5kZXh9YCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBiZWhhdmlvci5mbkNvZGUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnMgPSBbe1xuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbjogY2ZGdW5jdGlvbixcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBiZWhhdmlvci5ldmVudFR5cGUgPz8gRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1QsXG4gICAgICAgICAgICAgICAgfV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJ1bGVzW2JlaGF2aW9yLnBhdGhQYXR0ZXJuXSA9IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLm51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yLFxuICAgICAgICAgICAgICAgIGNhY2hlUG9saWN5OiBiZWhhdmlvci5jYWNoZVBvbGljeSA/PyB0aGlzLmFwcENhY2hlUG9saWN5LFxuICAgICAgICAgICAgICAgIC4uLihmdW5jdGlvbkFzc29jaWF0aW9ucy5sZW5ndGggPiAwID8ge2Z1bmN0aW9uQXNzb2NpYXRpb25zfSA6IHt9KSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBydWxlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYmVoYXZpb3IgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBtYXRjaGluZyBpbmNvbWluZyByZXF1ZXN0cyBmb3IgdGhlIHN0YXRpYyBhc3NldHNcbiAgICAgKiB0byB0aGUgUzMgYnVja2V0IHRoYXQgaG9sZHMgdGhlc2Ugc3RhdGljIGFzc2V0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTdGF0aWNBc3NldHNSb3V0ZUJlaGF2aW9yKCk6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4ge1xuICAgICAgICBjb25zdCBzdGF0aWNBc3NldHNDYWNoZUNvbmZpZzogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgICAgICAgb3JpZ2luOiBTM0J1Y2tldE9yaWdpbi53aXRoT3JpZ2luQWNjZXNzSWRlbnRpdHkodGhpcy5zdGF0aWNBc3NldHNCdWNrZXQsIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uQXR0ZW1wdHM6IDIsXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMyksXG4gICAgICAgICAgICAgICAgb3JpZ2luQWNjZXNzSWRlbnRpdHk6IHRoaXMuY2RuQWNjZXNzSWRlbnRpdHksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZWRNZXRob2RzOiBDYWNoZWRNZXRob2RzLkNBQ0hFX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZVBvbGljeTogQ2FjaGVQb2xpY3kuQ0FDSElOR19PUFRJTUlaRUQsXG4gICAgICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcnVsZXM6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4gPSB7fTtcbiAgICAgICAgdGhpcy5zdGF0aWNBc3NldENvbmZpZ3MuZm9yRWFjaChhc3NldCA9PiB7XG4gICAgICAgICAgICBydWxlc1tgJHthc3NldC50YXJnZXR9JHthc3NldC5wYXR0ZXJufWBdID0gc3RhdGljQXNzZXRzQ2FjaGVDb25maWdcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gcnVsZXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYmVoYXZpb3IgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBtYXRjaGluZyBpbmNvbWluZyByZXF1ZXN0cyBmb3IgdGhlIHNpdGVtYXAgYXNzZXRzXG4gICAgICogdG8gdGhlIFMzIGJ1Y2tldCB0aGF0IGhvbGRzIHRoZXNlIHNpdGVtYXAgYXNzZXRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVNpdGVtYXBSb3V0ZUJlaGF2aW9yKCk6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4ge1xuICAgICAgICBpZiAoIXRoaXMuc2l0ZW1hcEJ1Y2tldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2l0ZW1hcCBidWNrZXQgbXVzdCBleGlzdCBiZWZvcmUgY3JlYXRpbmcgc2l0ZW1hcCByb3V0ZSBiZWhhdmlvci5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaXRlbWFwQ2FjaGVDb25maWc6IEJlaGF2aW9yT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG9yaWdpbjogUzNCdWNrZXRPcmlnaW4ud2l0aE9yaWdpbkFjY2Vzc0lkZW50aXR5KHRoaXMuc2l0ZW1hcEJ1Y2tldCwge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25BdHRlbXB0czogMixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogRHVyYXRpb24uc2Vjb25kcygzKSxcbiAgICAgICAgICAgICAgICBvcmlnaW5BY2Nlc3NJZGVudGl0eTogdGhpcy5jZG5BY2Nlc3NJZGVudGl0eSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICAgICAgICBhbGxvd2VkTWV0aG9kczogQWxsb3dlZE1ldGhvZHMuQUxMT1dfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgIGNhY2hlZE1ldGhvZHM6IENhY2hlZE1ldGhvZHMuQ0FDSEVfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgIGNhY2hlUG9saWN5OiBDYWNoZVBvbGljeS5DQUNISU5HX09QVElNSVpFRCxcbiAgICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQU1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJ1bGVzOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+ID0ge307XG4gICAgICAgIHJ1bGVzWycqc2l0ZW1hcC54bWwnXSA9IHNpdGVtYXBDYWNoZUNvbmZpZztcbiAgICAgICAgcnVsZXNbJypzaXRlbWFwLWdvbmUueG1sJ10gPSBzaXRlbWFwQ2FjaGVDb25maWc7XG4gICAgICAgIHJ1bGVzWycvc2l0ZW1hcHMvKiddID0gc2l0ZW1hcENhY2hlQ29uZmlnO1xuXG4gICAgICAgIHJldHVybiBydWxlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGxvYWRzIHRoZSBzdGF0aWMgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcCBhcyBkZWZpbmVkIGluIHtAc2VlIGdldE51eHRBcHBTdGF0aWNBc3NldENvbmZpZ3N9IHRvIHRoZSBzdGF0aWMgYXNzZXRzIFMzIGJ1Y2tldC5cbiAgICAgKiBJbiBvcmRlciB0byBlbmFibGUgYSB6ZXJvLWRvd250aW1lIGRlcGxveW1lbnQgd2l0aCBtaW5pbWFsIHN0b3JhZ2UgbG9hZCxcbiAgICAgKiB3ZSBkZXBsb3kgdGhlIHN0YXRpYyBhc3NldHMgb2YgZXZlcnkgZGVwbG95bWVudCBpbnRvIHRoZSBzYW1lIGZvbGRlciBidXQgbWFyayB0aGVtIHdpdGggYSBkZXBsb3ltZW50IHJldmlzaW9uLlxuICAgICAqIEJ5IGRvaW5nIHNvLCB0aGUgZmlsZXMgb2YgcHJldmlvdXMgZGVwbG95bWVudHMgYXJlIHJldGFpbmVkIHRvIGFsbG93IGNsaWVudHMgdG8gY29udGludWUgdG8gd29yayB3aXRoIGFuIG9sZGVyIHJldmlzaW9uXG4gICAgICogYnV0IGdldHMgY2xlYW5lZCB1cCBhZnRlciBhIHNwZWNpZmllZCBwZXJpb2Qgb2YgdGltZSB2aWEgdGhlIGNsZWFudXAgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY29uZmlndXJlRGVwbG95bWVudHMoKTogQnVja2V0RGVwbG95bWVudFtdIHtcbiAgICAgICAgY29uc3QgbG9nR3JvdXAgPSBuZXcgTG9nR3JvdXAodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hc3NldHMtZGVwbG95bWVudC1sb2dzYCwge1xuICAgICAgICAgICAgbG9nR3JvdXBOYW1lOiBgL2F3cy9sYW1iZGEvJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFzc2V0cy1kZXBsb3ltZW50YCxcbiAgICAgICAgICAgIHJldGVudGlvbjogUmV0ZW50aW9uRGF5cy5PTkVfREFZLFxuICAgICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZXR1cm5zIGEgZGVwbG95bWVudCBmb3IgZXZlcnkgY29uZmlndXJlZCBzdGF0aWMgYXNzZXQgdHlwZSB0byByZXNwZWN0IHRoZSBkaWZmZXJlbnQgY2FjaGUgc2V0dGluZ3NcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGljQXNzZXRDb25maWdzLmZpbHRlcihhc3NldCA9PiBleGlzdHNTeW5jKGFzc2V0LnNvdXJjZSkpLm1hcCgoYXNzZXQsIGFzc2V0SW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQnVja2V0RGVwbG95bWVudCh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFzc2V0cy1kZXBsb3ltZW50LSR7YXNzZXRJbmRleH1gLCB7XG4gICAgICAgICAgICAgICAgc291cmNlczogW1NvdXJjZS5hc3NldChhc3NldC5zb3VyY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZTogYXNzZXQuZXhjbHVkZSxcbiAgICAgICAgICAgICAgICB9KV0sXG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb25CdWNrZXQ6IHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LFxuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBhc3NldC50YXJnZXQucmVwbGFjZSgvXlxcLysvZywgJycpLCAvLyBSZW1vdmUgbGVhZGluZyBzbGFzaFxuICAgICAgICAgICAgICAgIHBydW5lOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzdG9yYWdlQ2xhc3M6IFN0b3JhZ2VDbGFzcy5TVEFOREFSRCxcbiAgICAgICAgICAgICAgICBleGNsdWRlOiBbJyonXSxcbiAgICAgICAgICAgICAgICBpbmNsdWRlOiBbYXNzZXQucGF0dGVybl0sXG4gICAgICAgICAgICAgICAgY2FjaGVDb250cm9sOiBhc3NldC5jYWNoZUNvbnRyb2wsXG4gICAgICAgICAgICAgICAgY29udGVudFR5cGU6IGFzc2V0LmNvbnRlbnRUeXBlLFxuICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbjogYXNzZXQuaW52YWxpZGF0ZU9uQ2hhbmdlID8gdGhpcy5jZG4gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uUGF0aHM6IGFzc2V0LmludmFsaWRhdGVPbkNoYW5nZSA/IFtgLyR7YXNzZXQucGF0dGVybn1gXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBsb2dHcm91cDogbG9nR3JvdXAsXG5cbiAgICAgICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSBidWlsZCByZXZpc2lvbiBvbiBldmVyeSBhc3NldCB0byBhbGxvdyBjbGVhbnVwIG9mIG91dGRhdGVkIGFzc2V0c1xuICAgICAgICAgICAgICAgICAgICByZXZpc2lvbjogdGhpcy5kZXBsb3ltZW50UmV2aXNpb24sXG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIC8vIFNvbWUgTnV4dCBhcHBsaWNhdGlvbnMgaGF2ZSBhIGxvdCBvZiBhc3NldHMgdG8gZGVwbG95IHdoZXJlYnkgdGhlIGZ1bmN0aW9uIG1pZ2h0IHJ1biBvdXQgb2YgbWVtb3J5LlxuICAgICAgICAgICAgICAgIC8vIEFkZGl0aW9uYWxseSwgYSBoaWdoIG1lbW9yeSBsaW1pdCBtaWdodCBzcGVlZCB1cCBkZXBsb3ltZW50cy5cbiAgICAgICAgICAgICAgICBtZW1vcnlMaW1pdDogMTc5MlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgdGhlIGhvc3RlZCB6b25lIGF0IHdoaWNoIHRoZSBETlMgcmVjb3JkcyBzaGFsbCBiZSBjcmVhdGVkIHRvIGFjY2VzcyB0aGUgTnV4dCBhcHAgb24gdGhlIGludGVybmV0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRIb3N0ZWRab25lKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IElIb3N0ZWRab25lIHtcbiAgICAgICAgY29uc3QgZG9tYWluUGFydHMgPSBwcm9wcy5kb21haW4uc3BsaXQoJy4nKTtcblxuICAgICAgICByZXR1cm4gSG9zdGVkWm9uZS5mcm9tSG9zdGVkWm9uZUF0dHJpYnV0ZXModGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1ob3N0ZWQtem9uZWAsIHtcbiAgICAgICAgICAgIGhvc3RlZFpvbmVJZDogcHJvcHMuaG9zdGVkWm9uZUlkLFxuICAgICAgICAgICAgem9uZU5hbWU6IGRvbWFpblBhcnRzW2RvbWFpblBhcnRzLmxlbmd0aCAtIDFdLCAvLyBTdXBwb3J0IHN1YmRvbWFpbnNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgRE5TIHJlY29yZHMgdG8gYWNjZXNzIHRoZSBOdXh0IGFwcCBvbiB0aGUgaW50ZXJuZXQgdmlhIHRoZSBjdXN0b20gZG9tYWluLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZURuc1JlY29yZHMocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGhvc3RlZFpvbmUgPSB0aGlzLmZpbmRIb3N0ZWRab25lKHByb3BzKTtcbiAgICAgICAgY29uc3QgZG5zVGFyZ2V0ID0gUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhuZXcgQ2xvdWRGcm9udFRhcmdldCh0aGlzLmNkbikpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIHJlY29yZCBmb3IgSVB2NFxuICAgICAgICBuZXcgQVJlY29yZCh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWlwdjQtcmVjb3JkYCwge1xuICAgICAgICAgICAgcmVjb3JkTmFtZTogcHJvcHMuZG9tYWluLFxuICAgICAgICAgICAgem9uZTogaG9zdGVkWm9uZSxcbiAgICAgICAgICAgIHRhcmdldDogZG5zVGFyZ2V0LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDcmVhdGUgYSByZWNvcmQgZm9yIElQdjZcbiAgICAgICAgbmV3IEFhYWFSZWNvcmQodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1pcHY2LXJlY29yZGAsIHtcbiAgICAgICAgICAgIHJlY29yZE5hbWU6IHByb3BzLmRvbWFpbixcbiAgICAgICAgICAgIHpvbmU6IGhvc3RlZFpvbmUsXG4gICAgICAgICAgICB0YXJnZXQ6IGRuc1RhcmdldCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNjaGVkdWxlZCBydWxlIHRvIHBpbmcgdGhlIE51eHQgYXBwIExhbWJkYSBmdW5jdGlvbiBldmVyeSA1IG1pbnV0ZXMgaW4gb3JkZXIgdG8ga2VlcCBpdCB3YXJtXG4gICAgICogYW5kIHNwZWVkIHVwIGluaXRpYWwgU1NSIHJlcXVlc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUFwcFBpbmdSdWxlKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IHZvaWQge1xuICAgICAgICBjb25zdCBmYWtlQXBpR2F0ZXdheUV2ZW50RGF0YSA9IHtcbiAgICAgICAgICAgIFwidmVyc2lvblwiOiBcIjIuMFwiLFxuICAgICAgICAgICAgXCJyb3V0ZUtleVwiOiBcIkdFVCAve3Byb3h5K31cIixcbiAgICAgICAgICAgIFwicmF3UGF0aFwiOiBcIi9cIixcbiAgICAgICAgICAgIFwicmF3UXVlcnlTdHJpbmdcIjogXCJcIixcbiAgICAgICAgICAgIFwiaGVhZGVyc1wiOiB7fSxcbiAgICAgICAgICAgIFwicmVxdWVzdENvbnRleHRcIjoge1xuICAgICAgICAgICAgICAgIFwiZG9tYWluTmFtZVwiOiBwcm9wcy5kb21haW4sXG4gICAgICAgICAgICAgICAgXCJodHRwXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJtZXRob2RcIjogXCJHRVRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJwYXRoXCI6IFwiL1wiLFxuICAgICAgICAgICAgICAgICAgICBcInByb3RvY29sXCI6IFwiSFRUUC8xLjFcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBuZXcgUnVsZSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXBpbmdlci1ydWxlYCwge1xuICAgICAgICAgICAgcnVsZU5hbWU6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tcGluZ2VyYCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgUGluZ3MgdGhlIExhbWJkYSBmdW5jdGlvbiBvZiB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IGFwcCBldmVyeSA1IG1pbnV0ZXMgdG8ga2VlcCBpdCB3YXJtLmAsXG4gICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgc2NoZWR1bGU6IFNjaGVkdWxlLnJhdGUoRHVyYXRpb24ubWludXRlcyg1KSksXG4gICAgICAgICAgICB0YXJnZXRzOiBbbmV3IExhbWJkYUZ1bmN0aW9uKHRoaXMuYXBwTGFtYmRhRnVuY3Rpb24sIHtcbiAgICAgICAgICAgICAgICBldmVudDogUnVsZVRhcmdldElucHV0LmZyb21PYmplY3QoZmFrZUFwaUdhdGV3YXlFdmVudERhdGEpXG4gICAgICAgICAgICB9KV0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNjaGVkdWxlZCBydWxlIHRoYXQgcnVucyBldmVyeSBUdWVzZGF5IGF0IDAzOjMwIEFNIEdNVCB0byB0cmlnZ2VyXG4gICAgICogb3VyIGNsZWFudXAgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNsZWFudXBUcmlnZ2VyUnVsZSgpOiB2b2lkIHtcbiAgICAgICAgbmV3IFJ1bGUodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1zY2hlZHVsZXItcnVsZWAsIHtcbiAgICAgICAgICAgIHJ1bGVOYW1lOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXNjaGVkdWxlcmAsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYFRyaWdnZXJzIGEgY2xlYW51cCBvZiB0aGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cyBhdCB0aGUgJHt0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXROYW1lfSBTMyBidWNrZXQuYCxcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICBzY2hlZHVsZTogU2NoZWR1bGUuY3Jvbih7d2Vla0RheTogJzInLCBob3VyOiAnMycsIG1pbnV0ZTogJzMwJ30pLFxuICAgICAgICAgICAgdGFyZ2V0czogW25ldyBMYW1iZGFGdW5jdGlvbih0aGlzLmNsZWFudXBMYW1iZGFGdW5jdGlvbildLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgUzMgYnVja2V0IHRvIHN0b3JlIHRoZSBhY2Nlc3MgbG9ncyBvZiB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBY2Nlc3NMb2dzQnVja2V0KCk6IEJ1Y2tldCB7XG4gICAgICAgIGNvbnN0IGJ1Y2tldE5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFjY2Vzcy1sb2dzYDtcbiAgICAgICAgY29uc3QgYnVja2V0ID0gbmV3IEJ1Y2tldCh0aGlzLCBidWNrZXROYW1lLCB7XG4gICAgICAgICAgICBidWNrZXROYW1lLFxuICAgICAgICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IEJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgICAgICAgIG9iamVjdE93bmVyc2hpcDogT2JqZWN0T3duZXJzaGlwLkJVQ0tFVF9PV05FUl9QUkVGRVJSRUQsXG4gICAgICAgICAgICAvLyBXaGVuIHRoZSBzdGFjayBpcyBkZXN0cm95ZWQsIHdlIGV4cGVjdCBldmVyeXRoaW5nIHRvIGJlIGRlbGV0ZWRcbiAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICBidWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5jZG5BY2Nlc3NJZGVudGl0eSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1Y2tldDtcbiAgICB9XG5cblxuICAgIHByaXZhdGUgY3JlYXRlQWNjZXNzTG9nc0FuYWx5c2lzKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuYWNjZXNzTG9nc0J1Y2tldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY2Nlc3MgYnVja2V0IG5vdCBzZXQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgQ2xvdWRGcm9udEFjY2Vzc0xvZ3NBbmFseXNpcyB9ID0gcmVxdWlyZSgnLi4vYWNjZXNzLWxvZ3MtYW5hbHlzaXMvQ2xvdWRGcm9udEFjY2Vzc0xvZ3NBbmFseXNpcycpO1xuXG4gICAgICAgIG5ldyBDbG91ZEZyb250QWNjZXNzTG9nc0FuYWx5c2lzKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYWNjZXNzLWxvZ3MtYW5hbHlzaXNgLCB7XG4gICAgICAgICAgICBidWNrZXQ6IHRoaXMuYWNjZXNzTG9nc0J1Y2tldCxcbiAgICAgICAgICAgIHJlc291cmNlUHJlZml4OiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFjY2Vzcy1sb2dzYCxcbiAgICAgICAgICAgIGFjY2Vzc0xvZ0Nvb2tpZXM6IHByb3BzLmFjY2Vzc0xvZ0Nvb2tpZXMsXG4gICAgICAgICAgICBhbm9ueW1pemVDbGllbnRJcDogcHJvcHMuYW5vbnltaXplQWNjZXNzTG9nQ2xpZW50SXAgPz8gdHJ1ZSxcbiAgICAgICAgICAgIGV4cGlyZVJhd0xvZ3NBZnRlcjogcHJvcHMuYWNjZXNzTG9nc1Jhd1JldGVudGlvbixcbiAgICAgICAgICAgIGV4cGlyZUludGVybWVkaWF0ZUxvZ3NBZnRlcjogcHJvcHMuYWNjZXNzTG9nc0ludGVybWVkaWF0ZVJldGVudGlvbixcbiAgICAgICAgICAgIGV4cGlyZVRyYW5zZm9ybWVkTG9nc0FmdGVyOiBwcm9wcy5hY2Nlc3NMb2dzVHJhbnNmb3JtZWRSZXRlbnRpb24sXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==
@@ -15,7 +15,9 @@ import {
15
15
  OriginProtocolPolicy, OriginRequestPolicy,
16
16
  PriceClass,
17
17
  SecurityPolicyProtocol,
18
- ViewerProtocolPolicy,OriginRequestCookieBehavior, OriginRequestHeaderBehavior, OriginRequestQueryStringBehavior
18
+ ViewerProtocolPolicy, OriginRequestCookieBehavior, OriginRequestHeaderBehavior, OriginRequestQueryStringBehavior,
19
+ FunctionEventType, type FunctionAssociation,
20
+ Function as CloudFrontFunction,
19
21
  } from "aws-cdk-lib/aws-cloudfront";
20
22
  import {Architecture, Code, Function, Runtime, Tracing} from "aws-cdk-lib/aws-lambda";
21
23
  import {
@@ -36,6 +38,7 @@ import {LambdaFunction} from "aws-cdk-lib/aws-events-targets";
36
38
  import * as path from "path";
37
39
  import {writeFileSync, mkdirSync, existsSync} from "fs";
38
40
  import {type NuxtServerAppStackProps} from "./NuxtServerAppStackProps";
41
+ import {type NuxtCloudFrontBehavior} from "./NuxtServerAppStackProps";
39
42
  import {HttpLambdaIntegration} from "aws-cdk-lib/aws-apigatewayv2-integrations";
40
43
  import {DomainName, EndpointType, HttpApi, HttpMethod, SecurityPolicy} from "aws-cdk-lib/aws-apigatewayv2";
41
44
 
@@ -449,6 +452,11 @@ export class NuxtServerAppStack extends Stack {
449
452
  routingBehaviours = {...routingBehaviours, ...this.createServerRouteBehavior(props.serverRoutes)};
450
453
  }
451
454
 
455
+ // Inject custom behaviors (cache policy overrides and/or CloudFront Functions) before static asset behaviors
456
+ if (props.additionalBehaviors && props.additionalBehaviors.length > 0) {
457
+ routingBehaviours = {...routingBehaviours, ...this.createAdditionalBehaviors(props.additionalBehaviors)};
458
+ }
459
+
452
460
  routingBehaviours = {...routingBehaviours, ...this.createStaticAssetsRouteBehavior()};
453
461
 
454
462
  return routingBehaviours;
@@ -528,6 +536,43 @@ export class NuxtServerAppStack extends Stack {
528
536
  return rules;
529
537
  }
530
538
 
539
+ /**
540
+ * Creates behaviors for the CloudFront distribution based on the consumer-supplied {@link NuxtCloudFrontBehavior} list.
541
+ * Each behavior can override the cache policy, attach a CloudFront Function, or both.
542
+ *
543
+ * When {@link NuxtCloudFrontBehavior.fnCode} is provided, this method creates the `cloudfront.Function`
544
+ * resource inside the stack itself so that it is always correctly scoped.
545
+ *
546
+ * The provided {@link NuxtCloudFrontBehavior.cachePolicy} is used when specified; otherwise the
547
+ * default Nuxt app cache policy ({@link appCachePolicy}) is used.
548
+ */
549
+ private createAdditionalBehaviors(behaviors: NuxtCloudFrontBehavior[]): Record<string, BehaviorOptions> {
550
+ const rules: Record<string, BehaviorOptions> = {};
551
+
552
+ behaviors.forEach((behavior, index) => {
553
+ let functionAssociations: FunctionAssociation[] = [];
554
+
555
+ if (behavior.fnCode) {
556
+ // Create the CloudFront Function inside the stack so it is always correctly scoped.
557
+ const cfFunction = new CloudFrontFunction(this, `${this.resourceIdPrefix}-behavior-fn-${index}`, {
558
+ code: behavior.fnCode,
559
+ });
560
+ functionAssociations = [{
561
+ function: cfFunction,
562
+ eventType: behavior.eventType ?? FunctionEventType.VIEWER_REQUEST,
563
+ }];
564
+ }
565
+
566
+ rules[behavior.pathPattern] = {
567
+ ...this.nuxtServerRouteBehavior,
568
+ cachePolicy: behavior.cachePolicy ?? this.appCachePolicy,
569
+ ...(functionAssociations.length > 0 ? {functionAssociations} : {}),
570
+ };
571
+ });
572
+
573
+ return rules;
574
+ }
575
+
531
576
  /**
532
577
  * Creates a behavior for the CloudFront distribution to route matching incoming requests for the static assets
533
578
  * to the S3 bucket that holds these static assets.
@@ -1,5 +1,49 @@
1
1
  import { type NuxtAppStackProps } from "../NuxtAppStackProps";
2
2
  import { Duration } from "aws-cdk-lib";
3
+ import { FunctionCode, FunctionEventType, ICachePolicy } from "aws-cdk-lib/aws-cloudfront";
4
+ /**
5
+ * Defines a custom CloudFront behavior attached to a specific path pattern targeting the Nuxt app origin.
6
+ * Use this to override the cache policy and/or attach a CloudFront Function for specific routes.
7
+ */
8
+ export interface NuxtCloudFrontBehavior {
9
+ /**
10
+ * The CloudFront distribution behavior path pattern to which this behavior shall be applied.
11
+ *
12
+ * @example '/posts/*'
13
+ */
14
+ readonly pathPattern: string;
15
+ /**
16
+ * The code of the CloudFront Function to associate with this behavior.
17
+ * The stack will create the CloudFront Function resource internally.
18
+ * The function will be invoked on VIEWER_REQUEST events by default.
19
+ * If omitted, no CloudFront Function is attached.
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * import { FunctionCode } from 'aws-cdk-lib/aws-cloudfront';
24
+ *
25
+ * fnCode: FunctionCode.fromInline(`
26
+ * function handler(event) {
27
+ * var request = event.request;
28
+ * request.uri = request.uri.replace(/\/+$/, '') || '/';
29
+ * return request;
30
+ * }
31
+ * `)
32
+ * ```
33
+ */
34
+ readonly fnCode?: FunctionCode;
35
+ /**
36
+ * The event type at which the CloudFront Function shall be invoked.
37
+ * Only relevant when {@link fnCode} is specified.
38
+ * Defaults to {@link FunctionEventType.VIEWER_REQUEST}.
39
+ */
40
+ readonly eventType?: FunctionEventType;
41
+ /**
42
+ * An optional cache policy to use for this behavior.
43
+ * Falls back to the default Nuxt app cache policy if not specified.
44
+ */
45
+ readonly cachePolicy?: ICachePolicy;
46
+ }
3
47
  /**
4
48
  * Defines the props required for the {@see NuxtServerAppStack}.
5
49
  */
@@ -198,6 +242,54 @@ export interface NuxtServerAppStackProps extends NuxtAppStackProps {
198
242
  * Examples: `['/sitemap.xml', '/robots.txt', '/__sitemap__/*', '/_ipx/*']`
199
243
  */
200
244
  readonly serverRoutes?: string[];
245
+ /**
246
+ * An array of custom CloudFront behaviors to inject into the CloudFront distribution for specific path patterns targeting the Nuxt app origin.
247
+ * Use this to override the cache policy and/or attach a CloudFront Function for specific routes.
248
+ *
249
+ * Each entry can independently define:
250
+ * - A custom cache policy (e.g., to disable caching for certain paths)
251
+ * - A CloudFront Function (e.g., for URI normalization at the edge)
252
+ * - Or both combined
253
+ *
254
+ * The behaviors are added to the distribution **before** the static-assets behaviors and in the order
255
+ * provided, so more specific patterns should be listed first.
256
+ *
257
+ * **Example – cache policy only:**
258
+ * ```typescript
259
+ * import { CachePolicy } from 'aws-cdk-lib/aws-cloudfront';
260
+ *
261
+ * additionalBehaviors: [
262
+ * { pathPattern: '/api/realtime/*', cachePolicy: CachePolicy.CACHING_DISABLED },
263
+ * ]
264
+ * ```
265
+ *
266
+ * **Example – CloudFront Function only:**
267
+ * ```typescript
268
+ * import { Function, FunctionCode } from 'aws-cdk-lib/aws-cloudfront';
269
+ *
270
+ * const normalizeUri = new Function(this, 'NormalizeUri', {
271
+ * code: FunctionCode.fromInline(`
272
+ * function handler(event) {
273
+ * var request = event.request;
274
+ * request.uri = request.uri.replace(/\\/+$/, '') || '/';
275
+ * return request;
276
+ * }
277
+ * `),
278
+ * });
279
+ *
280
+ * additionalBehaviors: [
281
+ * { pathPattern: '/users/*', fn: normalizeUri },
282
+ * ]
283
+ * ```
284
+ *
285
+ * **Example – both combined:**
286
+ * ```typescript
287
+ * additionalBehaviors: [
288
+ * { pathPattern: '/posts/*', fn: normalizeUri, cachePolicy: CachePolicy.CACHING_DISABLED },
289
+ * ]
290
+ * ```
291
+ */
292
+ readonly additionalBehaviors?: NuxtCloudFrontBehavior[];
201
293
  /**
202
294
  * The ARN of an existing AWS WAF Web ACL to associate with the CloudFront distribution.
203
295
  * This should be used with a separate CloudFrontWafStack deployed in us-east-1.
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJOdXh0U2VydmVyQXBwU3RhY2tQcm9wcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHt0eXBlIE51eHRBcHBTdGFja1Byb3BzfSBmcm9tIFwiLi4vTnV4dEFwcFN0YWNrUHJvcHNcIjtcbmltcG9ydCB7RHVyYXRpb259IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG4vKipcbiAqIERlZmluZXMgdGhlIHByb3BzIHJlcXVpcmVkIGZvciB0aGUge0BzZWUgTnV4dFNlcnZlckFwcFN0YWNrfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyBleHRlbmRzIE51eHRBcHBTdGFja1Byb3BzIHtcblxuICAgIC8qKlxuICAgICAqIFRoZSBBUk4gb2YgdGhlIGNlcnRpZmljYXRlIHRvIHVzZSBhdCB0aGUgQXBpR2F0ZXdheSBmb3IgdGhlIE51eHQgYXBwIHRvIG1ha2UgaXQgYWNjZXNzaWJsZSB2aWEgdGhlIGN1c3RvbSBkb21haW5cbiAgICAgKiBhbmQgdG8gcHJvdmlkZSB0aGUgY3VzdG9tIGRvbWFpbiB0byB0aGUgTnV4dCBhcHAgdmlhIHRoZSAnSG9zdCcgaGVhZGVyIGZvciBzZXJ2ZXIgc2lkZSByZW5kZXJpbmcgdXNlIGNhc2VzLlxuICAgICAqIFRoZSBjZXJ0aWZpY2F0ZSBtdXN0IGJlIGlzc3VlZCBpbiB0aGUgc2FtZSByZWdpb24gYXMgc3BlY2lmaWVkIHZpYSAnZW52LnJlZ2lvbicgYXMgQXBpR2F0ZXdheSB3b3JrcyByZWdpb25hbGx5LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHJlZ2lvbmFsVGxzQ2VydGlmaWNhdGVBcm46IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBmaWxlIG5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKSBvZiB0aGUgTGFtYmRhIGVudHJ5cG9pbnQgd2l0aGluIHRoZSAnc2VydmVyJyBkaXJlY3RvcnkgZXhwb3J0aW5nIGEgaGFuZGxlci5cbiAgICAgKiBEZWZhdWx0cyB0byBcImluZGV4XCIuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZW50cnlwb2ludD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEEgSlNPTiBzZXJpYWxpemVkIHN0cmluZyBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gcGFzcyB0byB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVudHJ5cG9pbnRFbnY/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWVtb3J5IHNpemUgdG8gYXBwbHkgdG8gdGhlIE51eHQgYXBwJ3MgTGFtYmRhLlxuICAgICAqIERlZmF1bHRzIHRvIDE3OTJNQiAob3B0aW1pemVkIGZvciBjb3N0cyBhbmQgcGVyZm9ybWFuY2UgZm9yIHN0YW5kYXJkIE51eHQgYXBwcykuXG4gICAgICovXG4gICAgcmVhZG9ubHkgbWVtb3J5U2l6ZT86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZW5hYmxlIEFXUyBYLVJheSBmb3IgdGhlIE51eHQgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVuYWJsZVRyYWNpbmc/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBlbmFibGUgYSBnbG9iYWwgU2l0ZW1hcCBidWNrZXQgd2hpY2ggaXMgcGVybWFuZW50bHkgYWNjZXNzaWJsZSB0aHJvdWdoIG11bHRpcGxlIGRlcGxveW1lbnRzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVuYWJsZVNpdGVtYXA/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBlbmFibGUgKEhUVFBTIG9ubHkpIEFQSSBhY2Nlc3MgdG8gdGhlIE51eHQgYXBwIHZpYSB0aGUgYC9hcGlgIHBhdGggd2hpY2ggc3VwcG9ydCBhbGwgSFRUUCBtZXRob2RzLlxuICAgICAqIFNlZSBodHRwczovL251eHQuY29tL2RvY3MvZ3VpZGUvZGlyZWN0b3J5LXN0cnVjdHVyZS9zZXJ2ZXIjcmVjaXBlcyBmb3IgZGV0YWlscy5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbmFibGVBcGk/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBlbmFibGUgcmVwb3J0aW5nIG9mIENsb3VkRnJvbnQgYWNjZXNzIGxvZ3MgdmlhIEF0aGVuYS5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbmFibGVBY2Nlc3NMb2dzQW5hbHlzaXM/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgY29va2llIG5hbWVzIHRvIGluY2x1ZGUgaW4gdGhlIGFjY2VzcyBsb2dzICh3aGl0ZWxpc3QpLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFjY2Vzc0xvZ0Nvb2tpZXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gYW5vbnltaXplIHRoZSBjbGllbnQgSVAgYWRkcmVzcyBpbiB0aGUgYWNjZXNzIGxvZ3MgYnkgcmVwbGFjaW5nIHRoZSBsYXN0IG9jdGV0IChJUHY0KVxuICAgICAqIG9yIHRoZSBsYXN0IGdyb3VwIChJUHY2KSB3aXRoICd4eHgnLlxuICAgICAqXG4gICAgICogKipEU0dWTy9MZWdhbCBub3RlOioqIElQIGFkZHJlc3NlcyBhcmUgY29uc2lkZXJlZCBwZXJzb25hbCBkYXRhIHVuZGVyIHRoZSBHRFBSIChjZi4gQ0pFVSBqdWRnbWVudCBD4oCRNTgyLzE0KS5cbiAgICAgKiBJZiB5b3Ugc2V0IHRoaXMgdG8gYGZhbHNlYCwgeW91IG11c3QgZW5zdXJlIGEgbGVnYWwgYmFzaXMgdW5kZXIgQXJ0LiA2IEdEUFIgKGUuZy4gbGVnaXRpbWF0ZSBpbnRlcmVzdCksXG4gICAgICogZG9jdW1lbnQgaXQgaW4geW91ciBwcml2YWN5IHBvbGljeSwgYW5kIGxpbWl0IHRoZSByZXRlbnRpb24gcGVyaW9kIHRvIHdoYXQgaXMgc3RyaWN0bHkgbmVjZXNzYXJ5LlxuICAgICAqIFdoZW4gaW4gZG91YnQsIGNvbnN1bHQgYSBkYXRhIHByb3RlY3Rpb24gb2ZmaWNlciBvciBsZWdhbCBjb3Vuc2VsIGJlZm9yZSBkaXNhYmxpbmcgdGhpcyBvcHRpb24uXG4gICAgICpcbiAgICAgKiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYW5vbnltaXplQWNjZXNzTG9nQ2xpZW50SXA/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGR1cmF0aW9uIGFmdGVyIHdoaWNoIHJhdyAodW5wcm9jZXNzZWQpIGFjY2VzcyBsb2dzIGFyZSBkZWxldGVkIGZyb20gUzMuXG4gICAgICogRGVmYXVsdHMgdG8gNyBkYXlzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFjY2Vzc0xvZ3NSYXdSZXRlbnRpb24/OiBEdXJhdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBhZnRlciB3aGljaCBpbnRlcm1lZGlhdGUgKGdyb3VwZWQtYnktZGF0ZSkgYWNjZXNzIGxvZ3MgYXJlIGRlbGV0ZWQgZnJvbSBTMy5cbiAgICAgKiBEZWZhdWx0cyB0byA3IGRheXMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYWNjZXNzTG9nc0ludGVybWVkaWF0ZVJldGVudGlvbj86IER1cmF0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGR1cmF0aW9uIGFmdGVyIHdoaWNoIHRyYW5zZm9ybWVkIChQYXJxdWV0KSBhY2Nlc3MgbG9ncyBhcmUgZGVsZXRlZCBmcm9tIFMzLlxuICAgICAqIERlZmF1bHRzIHRvIDE4MCBkYXlzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFjY2Vzc0xvZ3NUcmFuc2Zvcm1lZFJldGVudGlvbj86IER1cmF0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHRvIHJldGFpbiBzdGF0aWMgYXNzZXRzIG9mIG91dGRhdGVkIGRlcGxveW1lbnRzIGluIHRoZSBTMyBidWNrZXQuXG4gICAgICogVXNlZnVsIHRvIGFsbG93IHVzZXJzIHRvIHN0aWxsIGFjY2VzcyBvbGQgYXNzZXRzIGFmdGVyIGEgbmV3IGRlcGxveW1lbnQgd2hlbiB0aGV5IGFyZSBzdGlsbCBicm93c2luZyBvbiBhbiBvbGQgdmVyc2lvbi5cbiAgICAgKiBEZWZhdWx0cyB0byAzMCBkYXlzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG91dGRhdGVkQXNzZXRzUmV0ZW50aW9uRGF5cz86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEhUVFAgaGVhZGVycyB0byBmb3J3YXJkIHRvIHRoZSBOdXh0IGFwcCBvbiBvcmlnaW4gcmVxdWVzdHMgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNhY2hlIGtleSBhdCBDbG91ZEZyb250IGVkZ2UgbG9jYXRpb25zLlxuICAgICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgaGVhZGVycyB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIHJlc3BvbnNlLlxuICAgICAqXG4gICAgICogT25seSB0aGUgQ2xvdWRmcm9udCBkZWZhdWx0IGhlYWRlcnMgYXJlIGZvcndhcmRlZCBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy1vcmlnaW4tcmVxdWVzdHMuaHRtbH1cbiAgICAgKi9cbiAgICByZWFkb25seSBmb3J3YXJkSGVhZGVycz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgSFRUUCBoZWFkZXJzIHRvIGZvcndhcmQgdG8gdGhlIE51eHQgYXBwIGFuZCB0byBpbmNsdWRlIGluIHRoZSBjYWNoZSBrZXkgZm9yIG9iamVjdHMgdGhhdCBhcmUgY2FjaGVkIGF0IENsb3VkRnJvbnQgZWRnZSBsb2NhdGlvbnMuXG4gICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgaGVhZGVycyB0aGF0IG1pZ2h0IGFmZmVjdCB0aGUgcmVzcG9uc2UsIGUuZy4sICdBdXRob3JpemF0aW9uJy5cbiAgICAgKlxuICAgICAqIE9ubHkgdGhlIENsb3VkZnJvbnQgZGVmYXVsdCBoZWFkZXJzIGFyZSBmb3J3YXJkZWQsXG4gICAgICogYnV0IG5vIGhlYWRlcnMgYXJlIGluY2x1ZGVkIGluIHRoZSBjYWNoZSBrZXkgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctdGhlLWNhY2hlLWtleS5odG1sfVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNhY2hlS2V5SGVhZGVycz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgY29va2llcyB0byBmb3J3YXJkIHRvIHRoZSBOdXh0IGFwcCBvbiBvcmlnaW4gcmVxdWVzdHMgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNhY2hlIGtleSBhdCBDbG91ZEZyb250IGVkZ2UgbG9jYXRpb25zLlxuICAgICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgY29va2llcyB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIHJlc3BvbnNlLlxuICAgICAqXG4gICAgICogTm8gY29va2llcyBhcmUgZm9yd2FyZGVkIGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLW9yaWdpbi1yZXF1ZXN0cy5odG1sfVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGZvcndhcmRDb29raWVzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBjb29raWVzIHRvIGZvcndhcmQgdG8gdGhlIE51eHQgYXBwIGFuZCB0byBpbmNsdWRlIGluIHRoZSBjYWNoZSBrZXkgZm9yIG9iamVjdHMgdGhhdCBhcmUgY2FjaGVkIGF0IENsb3VkRnJvbnQgZWRnZSBsb2NhdGlvbnMuXG4gICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgY29va2llcyB0aGF0IG1pZ2h0IGFmZmVjdCB0aGUgcmVzcG9uc2UsIGUuZy4sIGF1dGhlbnRpY2F0aW9uIGNvb2tpZXMuXG4gICAgICpcbiAgICAgKiBObyBjb29raWVzIGFyZSBmb3J3YXJkZWQgb3IgaW5jbHVkZWQgaW4gdGhlIGNhY2hlIGtleSBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWx9XG4gICAgICovXG4gICAgcmVhZG9ubHkgY2FjaGVLZXlDb29raWVzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBxdWVyeSBwYXJhbXMgdG8gZm9yd2FyZCB0byB0aGUgTnV4dCBhcHAgb24gb3JpZ2luIHJlcXVlc3RzIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjYWNoZSBrZXkgYXQgQ2xvdWRGcm9udCBlZGdlIGxvY2F0aW9ucy5cbiAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHF1ZXJ5IHBhcmFtcyB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIHJlc3BvbnNlIGFuZCBhcmUgcmVxdWlyZWQgb24gU1NSIHJlcXVlc3RzLlxuICAgICAqXG4gICAgICogQWxsIHF1ZXJ5IHBhcmFtcyBhcmUgZm9yd2FyZGVkIGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLW9yaWdpbi1yZXF1ZXN0cy5odG1sfVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGZvcndhcmRRdWVyeVBhcmFtcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcXVlcnkgcGFyYW1zIHRvIGZvcndhcmQgdG8gdGhlIE51eHQgYXBwIGFuZCB0byBpbmNsdWRlIGluIHRoZSBjYWNoZSBrZXkgZm9yIG9iamVjdHMgdGhhdCBhcmUgY2FjaGVkIGF0IENsb3VkRnJvbnQgZWRnZSBsb2NhdGlvbnMuXG4gICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgcXVlcnkgcGFyYW1zIHRoYXQgYWZmZWN0IHRoZSByZXNwb25zZSBhbmQgYXJlIHJlcXVpcmVkIG9uIFNTUiByZXF1ZXN0cywgZS5nLiwgZmlsdGVycy5cbiAgICAgKlxuICAgICAqIEFsbCBxdWVyeSBwYXJhbXMgYXJlIGZvcndhcmRlZCBhbmQgaW5jbHVkZWQgaW4gdGhlIGNhY2hlIGtleSBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWx9XG4gICAgICovXG4gICAgcmVhZG9ubHkgY2FjaGVLZXlRdWVyeVBhcmFtcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcXVlcnkgcGFyYW1zIHRvIHByZXZlbnQgZm9yd2FyZGluZyB0byB0aGUgTnV4dCBhcHAgYW5kIHRvIG5vdCBpbmNsdWRlIGluIHRoZSBjYWNoZSBrZXkgZm9yIG9iamVjdHMgdGhhdCBhcmUgY2FjaGVkIGF0IENsb3VkRnJvbnQgZWRnZSBsb2NhdGlvbnMuXG4gICAgICogV2hlbiBzZXQsIGFsbCBxdWVyeSBwYXJhbXMgdGhhdCBhcmUgbm90IHNwZWNpZmllZCBpbiB0aGlzIGFycmF5IHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSBOdXh0IGFwcCBhbmQgaW5jbHVkZWQgaW4gdGhlIGNhY2hlIGtleS5cbiAgICAgKiBUaGlzIHNob3VsZCBiZSB1c2VkIGZvciBxdWVyeSBwYXJhbXMgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSByZXNwb25zZSBhbmQgYXJlIG5vdCByZXF1aXJlZCBvbiBTU1IgcmVxdWVzdHMsIGUuZy4sICdmYmNsaWQnIG9yICd1dG1fY2FtcGFpZ24nLlxuICAgICAqXG4gICAgICogSWYgYm90aCB7QHNlZSBjYWNoZUtleVF1ZXJ5UGFyYW1zfSBhbmQge0BzZWUgZGVueUNhY2hlS2V5UXVlcnlQYXJhbXN9IGFyZSBzcGVjaWZpZWQsIHRoZSB7QHNlZSBkZW55Q2FjaGVLZXlRdWVyeVBhcmFtc30gd2lsbCBiZSBpZ25vcmVkLlxuICAgICAqIEFsbCBxdWVyeSBwYXJhbXMgYXJlIGZvcndhcmRlZCBhbmQgaW5jbHVkZWQgaW4gdGhlIGNhY2hlIGtleSBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWx9XG4gICAgICovXG4gICAgcmVhZG9ubHkgZGVueUNhY2hlS2V5UXVlcnlQYXJhbXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGhlYWRlcnMgdG8gcGFzcyB0byB0aGUgTnV4dCBhcHAgb24gU1NSIHJlcXVlc3RzLlxuICAgICAqIFRoZSBtb3JlIGhlYWRlcnMgYXJlIHBhc3NlZCwgdGhlIHdlYWtlciB0aGUgY2FjaGUgcGVyZm9ybWFuY2Ugd2lsbCBiZSwgYXMgdGhlIGNhY2hlIGtleVxuICAgICAqIGlzIGJhc2VkIG9uIHRoZSBoZWFkZXJzLlxuICAgICAqIE5vIGhlYWRlcnMgYXJlIHBhc3NlZCBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAc2VlIGNhY2hlS2V5SGVhZGVyc30gaW5zdGVhZC5cbiAgICAgKi9cbiAgICByZWFkb25seSBhbGxvd0hlYWRlcnM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGNvb2tpZXMgdG8gcGFzcyB0byB0aGUgTnV4dCBhcHAgb24gU1NSIHJlcXVlc3RzLlxuICAgICAqIFRoZSBtb3JlIGNvb2tpZXMgYXJlIHBhc3NlZCwgdGhlIHdlYWtlciB0aGUgY2FjaGUgcGVyZm9ybWFuY2Ugd2lsbCBiZSwgYXMgdGhlIGNhY2hlIGtleVxuICAgICAqIGlzIGJhc2VkIG9uIHRoZSBjb29raWVzLlxuICAgICAqIE5vIGNvb2tpZXMgYXJlIHBhc3NlZCBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAc2VlIGNhY2hlS2V5Q29va2llc30gaW5zdGVhZC5cbiAgICAgKi9cbiAgICByZWFkb25seSBhbGxvd0Nvb2tpZXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHF1ZXJ5IHBhcmFtIGtleXMgdG8gcGFzcyB0byB0aGUgTnV4dCBhcHAgb24gU1NSIHJlcXVlc3RzLlxuICAgICAqIFRoZSBtb3JlIHF1ZXJ5IHBhcmFtcyBhcmUgcGFzc2VkLCB0aGUgd2Vha2VyIHRoZSBjYWNoZSBwZXJmb3JtYW5jZSB3aWxsIGJlLCBhcyB0aGUgY2FjaGUga2V5XG4gICAgICogaXMgYmFzZWQgb24gdGhlIHF1ZXJ5IHBhcmFtcy5cbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBjb25maWcgY2FuIG5vdCBiZSBjb21iaW5lZCB3aXRoIHtAc2VlIGRlbnlRdWVyeVBhcmFtc30uXG4gICAgICogSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGUge0BzZWUgZGVueVF1ZXJ5UGFyYW1zfSB3aWxsIGJlIGlnbm9yZWQuXG4gICAgICogQWxsIHF1ZXJ5IHBhcmFtcyBhcmUgcGFzc2VkIGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BzZWUgY2FjaGVLZXlRdWVyeVBhcmFtc30gaW5zdGVhZC5cbiAgICAgKi9cbiAgICByZWFkb25seSBhbGxvd1F1ZXJ5UGFyYW1zPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBxdWVyeSBwYXJhbSBrZXlzIHRvIGRlbnkgcGFzc2luZyB0byB0aGUgTnV4dCBhcHAgb24gU1NSIHJlcXVlc3RzLlxuICAgICAqIEl0IG1pZ2h0IGJlIHVzZWZ1bCB0byBwcmV2ZW50IHNwZWNpZmljIGV4dGVybmFsIHF1ZXJ5IHBhcmFtcywgZS5nLiwgZmJjbGlkLCB1dG1fY2FtcGFpZ24sIC4uLixcbiAgICAgKiB0byBpbXByb3ZlIGNhY2hlIHBlcmZvcm1hbmNlLCBhcyB0aGUgY2FjaGUga2V5IGlzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcXVlcnkgcGFyYW1zLlxuICAgICAqIE5vdGUgdGhhdCB0aGlzIGNvbmZpZyBjYW4gbm90IGJlIGNvbWJpbmVkIHdpdGgge0BzZWUgYWxsb3dRdWVyeVBhcmFtc30uXG4gICAgICogSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGUge0BzZWUgZGVueVF1ZXJ5UGFyYW1zfSB3aWxsIGJlIGlnbm9yZWQuXG4gICAgICogQWxsIHF1ZXJ5IHBhcmFtcyBhcmUgcGFzc2VkIGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BzZWUgZGVueUNhY2hlS2V5UXVlcnlQYXJhbXN9IGluc3RlYWQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZGVueVF1ZXJ5UGFyYW1zPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBwYXRoIHBhdHRlcm5zIGZvciBzZXJ2ZXIgZW5kcG9pbnRzIHRoYXQgc2hvdWxkIGJlIHJvdXRlZCB0byB0aGUgU1NSIG9yaWdpbiAoQVBJIEdhdGV3YXkg4oaSIExhbWJkYSlcbiAgICAgKiBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IFMzIFwiZmlsZVwiIGJlaGF2aW9yLlxuICAgICAqIFxuICAgICAqIFRoaXMgaXMgdXNlZnVsIGZvciBzZXJ2ZXIgcm91dGVzIHRoYXQgZ2VuZXJhdGUgZHluYW1pYyBjb250ZW50IGJ1dCB1c2UgZmlsZS1saWtlIFVSTHMuXG4gICAgICogRm9yIGV4YW1wbGUsIGBAbnV4dGpzL3NpdGVtYXBgIGNyZWF0ZXMgYSBgL3NpdGVtYXAueG1sYCBlbmRwb2ludCB0aGF0IGR5bmFtaWNhbGx5IGdlbmVyYXRlcyBYTUwgY29udGVudCxcbiAgICAgKiBhbmQgYEBudXh0L2ltYWdlYCB1c2VzIGZpbGUtbGlrZSBVUkxzIHRvIHNlcnZlIGR5bmFtaWNhbGx5IHByb2Nlc3NlZCBpbWFnZXMuXG4gICAgICogXG4gICAgICogTm90ZTogVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBgZW5hYmxlU2l0ZW1hcGAgd2hpY2ggc2VydmVzIHByZS1nZW5lcmF0ZWQgc3RhdGljIHNpdGVtYXAgZmlsZXMgZnJvbSBTMy5cbiAgICAgKiBVc2UgYHNlcnZlclJvdXRlc2Agd2hlbiB5b3UgbmVlZCB0aGUgTGFtYmRhIHRvIGhhbmRsZSByZXF1ZXN0cyBhbmQgZ2VuZXJhdGUgY29udGVudCBvbi10aGUtZmx5LlxuICAgICAqIFxuICAgICAqIEV4YW1wbGVzOiBgWycvc2l0ZW1hcC54bWwnLCAnL3JvYm90cy50eHQnLCAnL19fc2l0ZW1hcF9fLyonLCAnL19pcHgvKiddYFxuICAgICAqL1xuICAgIHJlYWRvbmx5IHNlcnZlclJvdXRlcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIEFSTiBvZiBhbiBleGlzdGluZyBBV1MgV0FGIFdlYiBBQ0wgdG8gYXNzb2NpYXRlIHdpdGggdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLlxuICAgICAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2l0aCBhIHNlcGFyYXRlIENsb3VkRnJvbnRXYWZTdGFjayBkZXBsb3llZCBpbiB1cy1lYXN0LTEuXG4gICAgICpcbiAgICAgKiBFeGFtcGxlOiAnYXJuOmF3czp3YWZ2Mjp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmdsb2JhbC93ZWJhY2wvbXktd2ViLWFjbC9hMWIyYzNkNC01Njc4LTkwYWItY2RlZi1FWEFNUExFMTExMTEnXG4gICAgICovXG4gICAgcmVhZG9ubHkgd2ViQWNsQXJuPzogc3RyaW5nO1xufSJdfQ==
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJOdXh0U2VydmVyQXBwU3RhY2tQcm9wcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHt0eXBlIE51eHRBcHBTdGFja1Byb3BzfSBmcm9tIFwiLi4vTnV4dEFwcFN0YWNrUHJvcHNcIjtcbmltcG9ydCB7RHVyYXRpb259IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtGdW5jdGlvbkNvZGUsIEZ1bmN0aW9uRXZlbnRUeXBlLCBJQ2FjaGVQb2xpY3l9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udFwiO1xuXG4vKipcbiAqIERlZmluZXMgYSBjdXN0b20gQ2xvdWRGcm9udCBiZWhhdmlvciBhdHRhY2hlZCB0byBhIHNwZWNpZmljIHBhdGggcGF0dGVybiB0YXJnZXRpbmcgdGhlIE51eHQgYXBwIG9yaWdpbi5cbiAqIFVzZSB0aGlzIHRvIG92ZXJyaWRlIHRoZSBjYWNoZSBwb2xpY3kgYW5kL29yIGF0dGFjaCBhIENsb3VkRnJvbnQgRnVuY3Rpb24gZm9yIHNwZWNpZmljIHJvdXRlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdXh0Q2xvdWRGcm9udEJlaGF2aW9yIHtcblxuICAgIC8qKlxuICAgICAqIFRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiBiZWhhdmlvciBwYXRoIHBhdHRlcm4gdG8gd2hpY2ggdGhpcyBiZWhhdmlvciBzaGFsbCBiZSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgJy9wb3N0cy8qJ1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHBhdGhQYXR0ZXJuOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29kZSBvZiB0aGUgQ2xvdWRGcm9udCBGdW5jdGlvbiB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIGJlaGF2aW9yLlxuICAgICAqIFRoZSBzdGFjayB3aWxsIGNyZWF0ZSB0aGUgQ2xvdWRGcm9udCBGdW5jdGlvbiByZXNvdXJjZSBpbnRlcm5hbGx5LlxuICAgICAqIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgb24gVklFV0VSX1JFUVVFU1QgZXZlbnRzIGJ5IGRlZmF1bHQuXG4gICAgICogSWYgb21pdHRlZCwgbm8gQ2xvdWRGcm9udCBGdW5jdGlvbiBpcyBhdHRhY2hlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGltcG9ydCB7IEZ1bmN0aW9uQ29kZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZGZyb250JztcbiAgICAgKlxuICAgICAqIGZuQ29kZTogRnVuY3Rpb25Db2RlLmZyb21JbmxpbmUoYFxuICAgICAqICAgZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgICAqICAgICB2YXIgcmVxdWVzdCA9IGV2ZW50LnJlcXVlc3Q7XG4gICAgICogICAgIHJlcXVlc3QudXJpID0gcmVxdWVzdC51cmkucmVwbGFjZSgvXFwvKyQvLCAnJykgfHwgJy8nO1xuICAgICAqICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICAgKiAgIH1cbiAgICAgKiBgKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHJlYWRvbmx5IGZuQ29kZT86IEZ1bmN0aW9uQ29kZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCB0eXBlIGF0IHdoaWNoIHRoZSBDbG91ZEZyb250IEZ1bmN0aW9uIHNoYWxsIGJlIGludm9rZWQuXG4gICAgICogT25seSByZWxldmFudCB3aGVuIHtAbGluayBmbkNvZGV9IGlzIHNwZWNpZmllZC5cbiAgICAgKiBEZWZhdWx0cyB0byB7QGxpbmsgRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1R9LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGV2ZW50VHlwZT86IEZ1bmN0aW9uRXZlbnRUeXBlO1xuXG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgY2FjaGUgcG9saWN5IHRvIHVzZSBmb3IgdGhpcyBiZWhhdmlvci5cbiAgICAgKiBGYWxscyBiYWNrIHRvIHRoZSBkZWZhdWx0IE51eHQgYXBwIGNhY2hlIHBvbGljeSBpZiBub3Qgc3BlY2lmaWVkLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNhY2hlUG9saWN5PzogSUNhY2hlUG9saWN5O1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHByb3BzIHJlcXVpcmVkIGZvciB0aGUge0BzZWUgTnV4dFNlcnZlckFwcFN0YWNrfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyBleHRlbmRzIE51eHRBcHBTdGFja1Byb3BzIHtcblxuICAgIC8qKlxuICAgICAqIFRoZSBBUk4gb2YgdGhlIGNlcnRpZmljYXRlIHRvIHVzZSBhdCB0aGUgQXBpR2F0ZXdheSBmb3IgdGhlIE51eHQgYXBwIHRvIG1ha2UgaXQgYWNjZXNzaWJsZSB2aWEgdGhlIGN1c3RvbSBkb21haW5cbiAgICAgKiBhbmQgdG8gcHJvdmlkZSB0aGUgY3VzdG9tIGRvbWFpbiB0byB0aGUgTnV4dCBhcHAgdmlhIHRoZSAnSG9zdCcgaGVhZGVyIGZvciBzZXJ2ZXIgc2lkZSByZW5kZXJpbmcgdXNlIGNhc2VzLlxuICAgICAqIFRoZSBjZXJ0aWZpY2F0ZSBtdXN0IGJlIGlzc3VlZCBpbiB0aGUgc2FtZSByZWdpb24gYXMgc3BlY2lmaWVkIHZpYSAnZW52LnJlZ2lvbicgYXMgQXBpR2F0ZXdheSB3b3JrcyByZWdpb25hbGx5LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHJlZ2lvbmFsVGxzQ2VydGlmaWNhdGVBcm46IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBmaWxlIG5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKSBvZiB0aGUgTGFtYmRhIGVudHJ5cG9pbnQgd2l0aGluIHRoZSAnc2VydmVyJyBkaXJlY3RvcnkgZXhwb3J0aW5nIGEgaGFuZGxlci5cbiAgICAgKiBEZWZhdWx0cyB0byBcImluZGV4XCIuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZW50cnlwb2ludD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEEgSlNPTiBzZXJpYWxpemVkIHN0cmluZyBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gcGFzcyB0byB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVudHJ5cG9pbnRFbnY/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWVtb3J5IHNpemUgdG8gYXBwbHkgdG8gdGhlIE51eHQgYXBwJ3MgTGFtYmRhLlxuICAgICAqIERlZmF1bHRzIHRvIDE3OTJNQiAob3B0aW1pemVkIGZvciBjb3N0cyBhbmQgcGVyZm9ybWFuY2UgZm9yIHN0YW5kYXJkIE51eHQgYXBwcykuXG4gICAgICovXG4gICAgcmVhZG9ubHkgbWVtb3J5U2l6ZT86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZW5hYmxlIEFXUyBYLVJheSBmb3IgdGhlIE51eHQgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVuYWJsZVRyYWNpbmc/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBlbmFibGUgYSBnbG9iYWwgU2l0ZW1hcCBidWNrZXQgd2hpY2ggaXMgcGVybWFuZW50bHkgYWNjZXNzaWJsZSB0aHJvdWdoIG11bHRpcGxlIGRlcGxveW1lbnRzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVuYWJsZVNpdGVtYXA/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBlbmFibGUgKEhUVFBTIG9ubHkpIEFQSSBhY2Nlc3MgdG8gdGhlIE51eHQgYXBwIHZpYSB0aGUgYC9hcGlgIHBhdGggd2hpY2ggc3VwcG9ydCBhbGwgSFRUUCBtZXRob2RzLlxuICAgICAqIFNlZSBodHRwczovL251eHQuY29tL2RvY3MvZ3VpZGUvZGlyZWN0b3J5LXN0cnVjdHVyZS9zZXJ2ZXIjcmVjaXBlcyBmb3IgZGV0YWlscy5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbmFibGVBcGk/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBlbmFibGUgcmVwb3J0aW5nIG9mIENsb3VkRnJvbnQgYWNjZXNzIGxvZ3MgdmlhIEF0aGVuYS5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbmFibGVBY2Nlc3NMb2dzQW5hbHlzaXM/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgY29va2llIG5hbWVzIHRvIGluY2x1ZGUgaW4gdGhlIGFjY2VzcyBsb2dzICh3aGl0ZWxpc3QpLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFjY2Vzc0xvZ0Nvb2tpZXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gYW5vbnltaXplIHRoZSBjbGllbnQgSVAgYWRkcmVzcyBpbiB0aGUgYWNjZXNzIGxvZ3MgYnkgcmVwbGFjaW5nIHRoZSBsYXN0IG9jdGV0IChJUHY0KVxuICAgICAqIG9yIHRoZSBsYXN0IGdyb3VwIChJUHY2KSB3aXRoICd4eHgnLlxuICAgICAqXG4gICAgICogKipEU0dWTy9MZWdhbCBub3RlOioqIElQIGFkZHJlc3NlcyBhcmUgY29uc2lkZXJlZCBwZXJzb25hbCBkYXRhIHVuZGVyIHRoZSBHRFBSIChjZi4gQ0pFVSBqdWRnbWVudCBD4oCRNTgyLzE0KS5cbiAgICAgKiBJZiB5b3Ugc2V0IHRoaXMgdG8gYGZhbHNlYCwgeW91IG11c3QgZW5zdXJlIGEgbGVnYWwgYmFzaXMgdW5kZXIgQXJ0LiA2IEdEUFIgKGUuZy4gbGVnaXRpbWF0ZSBpbnRlcmVzdCksXG4gICAgICogZG9jdW1lbnQgaXQgaW4geW91ciBwcml2YWN5IHBvbGljeSwgYW5kIGxpbWl0IHRoZSByZXRlbnRpb24gcGVyaW9kIHRvIHdoYXQgaXMgc3RyaWN0bHkgbmVjZXNzYXJ5LlxuICAgICAqIFdoZW4gaW4gZG91YnQsIGNvbnN1bHQgYSBkYXRhIHByb3RlY3Rpb24gb2ZmaWNlciBvciBsZWdhbCBjb3Vuc2VsIGJlZm9yZSBkaXNhYmxpbmcgdGhpcyBvcHRpb24uXG4gICAgICpcbiAgICAgKiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYW5vbnltaXplQWNjZXNzTG9nQ2xpZW50SXA/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGR1cmF0aW9uIGFmdGVyIHdoaWNoIHJhdyAodW5wcm9jZXNzZWQpIGFjY2VzcyBsb2dzIGFyZSBkZWxldGVkIGZyb20gUzMuXG4gICAgICogRGVmYXVsdHMgdG8gNyBkYXlzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFjY2Vzc0xvZ3NSYXdSZXRlbnRpb24/OiBEdXJhdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBhZnRlciB3aGljaCBpbnRlcm1lZGlhdGUgKGdyb3VwZWQtYnktZGF0ZSkgYWNjZXNzIGxvZ3MgYXJlIGRlbGV0ZWQgZnJvbSBTMy5cbiAgICAgKiBEZWZhdWx0cyB0byA3IGRheXMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYWNjZXNzTG9nc0ludGVybWVkaWF0ZVJldGVudGlvbj86IER1cmF0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGR1cmF0aW9uIGFmdGVyIHdoaWNoIHRyYW5zZm9ybWVkIChQYXJxdWV0KSBhY2Nlc3MgbG9ncyBhcmUgZGVsZXRlZCBmcm9tIFMzLlxuICAgICAqIERlZmF1bHRzIHRvIDE4MCBkYXlzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFjY2Vzc0xvZ3NUcmFuc2Zvcm1lZFJldGVudGlvbj86IER1cmF0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHRvIHJldGFpbiBzdGF0aWMgYXNzZXRzIG9mIG91dGRhdGVkIGRlcGxveW1lbnRzIGluIHRoZSBTMyBidWNrZXQuXG4gICAgICogVXNlZnVsIHRvIGFsbG93IHVzZXJzIHRvIHN0aWxsIGFjY2VzcyBvbGQgYXNzZXRzIGFmdGVyIGEgbmV3IGRlcGxveW1lbnQgd2hlbiB0aGV5IGFyZSBzdGlsbCBicm93c2luZyBvbiBhbiBvbGQgdmVyc2lvbi5cbiAgICAgKiBEZWZhdWx0cyB0byAzMCBkYXlzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG91dGRhdGVkQXNzZXRzUmV0ZW50aW9uRGF5cz86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEhUVFAgaGVhZGVycyB0byBmb3J3YXJkIHRvIHRoZSBOdXh0IGFwcCBvbiBvcmlnaW4gcmVxdWVzdHMgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNhY2hlIGtleSBhdCBDbG91ZEZyb250IGVkZ2UgbG9jYXRpb25zLlxuICAgICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgaGVhZGVycyB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIHJlc3BvbnNlLlxuICAgICAqXG4gICAgICogT25seSB0aGUgQ2xvdWRmcm9udCBkZWZhdWx0IGhlYWRlcnMgYXJlIGZvcndhcmRlZCBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy1vcmlnaW4tcmVxdWVzdHMuaHRtbH1cbiAgICAgKi9cbiAgICByZWFkb25seSBmb3J3YXJkSGVhZGVycz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgSFRUUCBoZWFkZXJzIHRvIGZvcndhcmQgdG8gdGhlIE51eHQgYXBwIGFuZCB0byBpbmNsdWRlIGluIHRoZSBjYWNoZSBrZXkgZm9yIG9iamVjdHMgdGhhdCBhcmUgY2FjaGVkIGF0IENsb3VkRnJvbnQgZWRnZSBsb2NhdGlvbnMuXG4gICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgaGVhZGVycyB0aGF0IG1pZ2h0IGFmZmVjdCB0aGUgcmVzcG9uc2UsIGUuZy4sICdBdXRob3JpemF0aW9uJy5cbiAgICAgKlxuICAgICAqIE9ubHkgdGhlIENsb3VkZnJvbnQgZGVmYXVsdCBoZWFkZXJzIGFyZSBmb3J3YXJkZWQsXG4gICAgICogYnV0IG5vIGhlYWRlcnMgYXJlIGluY2x1ZGVkIGluIHRoZSBjYWNoZSBrZXkgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctdGhlLWNhY2hlLWtleS5odG1sfVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNhY2hlS2V5SGVhZGVycz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgY29va2llcyB0byBmb3J3YXJkIHRvIHRoZSBOdXh0IGFwcCBvbiBvcmlnaW4gcmVxdWVzdHMgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNhY2hlIGtleSBhdCBDbG91ZEZyb250IGVkZ2UgbG9jYXRpb25zLlxuICAgICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgY29va2llcyB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIHJlc3BvbnNlLlxuICAgICAqXG4gICAgICogTm8gY29va2llcyBhcmUgZm9yd2FyZGVkIGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLW9yaWdpbi1yZXF1ZXN0cy5odG1sfVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGZvcndhcmRDb29raWVzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBjb29raWVzIHRvIGZvcndhcmQgdG8gdGhlIE51eHQgYXBwIGFuZCB0byBpbmNsdWRlIGluIHRoZSBjYWNoZSBrZXkgZm9yIG9iamVjdHMgdGhhdCBhcmUgY2FjaGVkIGF0IENsb3VkRnJvbnQgZWRnZSBsb2NhdGlvbnMuXG4gICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgY29va2llcyB0aGF0IG1pZ2h0IGFmZmVjdCB0aGUgcmVzcG9uc2UsIGUuZy4sIGF1dGhlbnRpY2F0aW9uIGNvb2tpZXMuXG4gICAgICpcbiAgICAgKiBObyBjb29raWVzIGFyZSBmb3J3YXJkZWQgb3IgaW5jbHVkZWQgaW4gdGhlIGNhY2hlIGtleSBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWx9XG4gICAgICovXG4gICAgcmVhZG9ubHkgY2FjaGVLZXlDb29raWVzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBxdWVyeSBwYXJhbXMgdG8gZm9yd2FyZCB0byB0aGUgTnV4dCBhcHAgb24gb3JpZ2luIHJlcXVlc3RzIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjYWNoZSBrZXkgYXQgQ2xvdWRGcm9udCBlZGdlIGxvY2F0aW9ucy5cbiAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHF1ZXJ5IHBhcmFtcyB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIHJlc3BvbnNlIGFuZCBhcmUgcmVxdWlyZWQgb24gU1NSIHJlcXVlc3RzLlxuICAgICAqXG4gICAgICogQWxsIHF1ZXJ5IHBhcmFtcyBhcmUgZm9yd2FyZGVkIGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLW9yaWdpbi1yZXF1ZXN0cy5odG1sfVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGZvcndhcmRRdWVyeVBhcmFtcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcXVlcnkgcGFyYW1zIHRvIGZvcndhcmQgdG8gdGhlIE51eHQgYXBwIGFuZCB0byBpbmNsdWRlIGluIHRoZSBjYWNoZSBrZXkgZm9yIG9iamVjdHMgdGhhdCBhcmUgY2FjaGVkIGF0IENsb3VkRnJvbnQgZWRnZSBsb2NhdGlvbnMuXG4gICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgcXVlcnkgcGFyYW1zIHRoYXQgYWZmZWN0IHRoZSByZXNwb25zZSBhbmQgYXJlIHJlcXVpcmVkIG9uIFNTUiByZXF1ZXN0cywgZS5nLiwgZmlsdGVycy5cbiAgICAgKlxuICAgICAqIEFsbCBxdWVyeSBwYXJhbXMgYXJlIGZvcndhcmRlZCBhbmQgaW5jbHVkZWQgaW4gdGhlIGNhY2hlIGtleSBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWx9XG4gICAgICovXG4gICAgcmVhZG9ubHkgY2FjaGVLZXlRdWVyeVBhcmFtcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcXVlcnkgcGFyYW1zIHRvIHByZXZlbnQgZm9yd2FyZGluZyB0byB0aGUgTnV4dCBhcHAgYW5kIHRvIG5vdCBpbmNsdWRlIGluIHRoZSBjYWNoZSBrZXkgZm9yIG9iamVjdHMgdGhhdCBhcmUgY2FjaGVkIGF0IENsb3VkRnJvbnQgZWRnZSBsb2NhdGlvbnMuXG4gICAgICogV2hlbiBzZXQsIGFsbCBxdWVyeSBwYXJhbXMgdGhhdCBhcmUgbm90IHNwZWNpZmllZCBpbiB0aGlzIGFycmF5IHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSBOdXh0IGFwcCBhbmQgaW5jbHVkZWQgaW4gdGhlIGNhY2hlIGtleS5cbiAgICAgKiBUaGlzIHNob3VsZCBiZSB1c2VkIGZvciBxdWVyeSBwYXJhbXMgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSByZXNwb25zZSBhbmQgYXJlIG5vdCByZXF1aXJlZCBvbiBTU1IgcmVxdWVzdHMsIGUuZy4sICdmYmNsaWQnIG9yICd1dG1fY2FtcGFpZ24nLlxuICAgICAqXG4gICAgICogSWYgYm90aCB7QHNlZSBjYWNoZUtleVF1ZXJ5UGFyYW1zfSBhbmQge0BzZWUgZGVueUNhY2hlS2V5UXVlcnlQYXJhbXN9IGFyZSBzcGVjaWZpZWQsIHRoZSB7QHNlZSBkZW55Q2FjaGVLZXlRdWVyeVBhcmFtc30gd2lsbCBiZSBpZ25vcmVkLlxuICAgICAqIEFsbCBxdWVyeSBwYXJhbXMgYXJlIGZvcndhcmRlZCBhbmQgaW5jbHVkZWQgaW4gdGhlIGNhY2hlIGtleSBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWx9XG4gICAgICovXG4gICAgcmVhZG9ubHkgZGVueUNhY2hlS2V5UXVlcnlQYXJhbXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGhlYWRlcnMgdG8gcGFzcyB0byB0aGUgTnV4dCBhcHAgb24gU1NSIHJlcXVlc3RzLlxuICAgICAqIFRoZSBtb3JlIGhlYWRlcnMgYXJlIHBhc3NlZCwgdGhlIHdlYWtlciB0aGUgY2FjaGUgcGVyZm9ybWFuY2Ugd2lsbCBiZSwgYXMgdGhlIGNhY2hlIGtleVxuICAgICAqIGlzIGJhc2VkIG9uIHRoZSBoZWFkZXJzLlxuICAgICAqIE5vIGhlYWRlcnMgYXJlIHBhc3NlZCBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAc2VlIGNhY2hlS2V5SGVhZGVyc30gaW5zdGVhZC5cbiAgICAgKi9cbiAgICByZWFkb25seSBhbGxvd0hlYWRlcnM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGNvb2tpZXMgdG8gcGFzcyB0byB0aGUgTnV4dCBhcHAgb24gU1NSIHJlcXVlc3RzLlxuICAgICAqIFRoZSBtb3JlIGNvb2tpZXMgYXJlIHBhc3NlZCwgdGhlIHdlYWtlciB0aGUgY2FjaGUgcGVyZm9ybWFuY2Ugd2lsbCBiZSwgYXMgdGhlIGNhY2hlIGtleVxuICAgICAqIGlzIGJhc2VkIG9uIHRoZSBjb29raWVzLlxuICAgICAqIE5vIGNvb2tpZXMgYXJlIHBhc3NlZCBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAc2VlIGNhY2hlS2V5Q29va2llc30gaW5zdGVhZC5cbiAgICAgKi9cbiAgICByZWFkb25seSBhbGxvd0Nvb2tpZXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHF1ZXJ5IHBhcmFtIGtleXMgdG8gcGFzcyB0byB0aGUgTnV4dCBhcHAgb24gU1NSIHJlcXVlc3RzLlxuICAgICAqIFRoZSBtb3JlIHF1ZXJ5IHBhcmFtcyBhcmUgcGFzc2VkLCB0aGUgd2Vha2VyIHRoZSBjYWNoZSBwZXJmb3JtYW5jZSB3aWxsIGJlLCBhcyB0aGUgY2FjaGUga2V5XG4gICAgICogaXMgYmFzZWQgb24gdGhlIHF1ZXJ5IHBhcmFtcy5cbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBjb25maWcgY2FuIG5vdCBiZSBjb21iaW5lZCB3aXRoIHtAc2VlIGRlbnlRdWVyeVBhcmFtc30uXG4gICAgICogSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGUge0BzZWUgZGVueVF1ZXJ5UGFyYW1zfSB3aWxsIGJlIGlnbm9yZWQuXG4gICAgICogQWxsIHF1ZXJ5IHBhcmFtcyBhcmUgcGFzc2VkIGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BzZWUgY2FjaGVLZXlRdWVyeVBhcmFtc30gaW5zdGVhZC5cbiAgICAgKi9cbiAgICByZWFkb25seSBhbGxvd1F1ZXJ5UGFyYW1zPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBxdWVyeSBwYXJhbSBrZXlzIHRvIGRlbnkgcGFzc2luZyB0byB0aGUgTnV4dCBhcHAgb24gU1NSIHJlcXVlc3RzLlxuICAgICAqIEl0IG1pZ2h0IGJlIHVzZWZ1bCB0byBwcmV2ZW50IHNwZWNpZmljIGV4dGVybmFsIHF1ZXJ5IHBhcmFtcywgZS5nLiwgZmJjbGlkLCB1dG1fY2FtcGFpZ24sIC4uLixcbiAgICAgKiB0byBpbXByb3ZlIGNhY2hlIHBlcmZvcm1hbmNlLCBhcyB0aGUgY2FjaGUga2V5IGlzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcXVlcnkgcGFyYW1zLlxuICAgICAqIE5vdGUgdGhhdCB0aGlzIGNvbmZpZyBjYW4gbm90IGJlIGNvbWJpbmVkIHdpdGgge0BzZWUgYWxsb3dRdWVyeVBhcmFtc30uXG4gICAgICogSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGUge0BzZWUgZGVueVF1ZXJ5UGFyYW1zfSB3aWxsIGJlIGlnbm9yZWQuXG4gICAgICogQWxsIHF1ZXJ5IHBhcmFtcyBhcmUgcGFzc2VkIGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BzZWUgZGVueUNhY2hlS2V5UXVlcnlQYXJhbXN9IGluc3RlYWQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZGVueVF1ZXJ5UGFyYW1zPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBwYXRoIHBhdHRlcm5zIGZvciBzZXJ2ZXIgZW5kcG9pbnRzIHRoYXQgc2hvdWxkIGJlIHJvdXRlZCB0byB0aGUgU1NSIG9yaWdpbiAoQVBJIEdhdGV3YXkg4oaSIExhbWJkYSlcbiAgICAgKiBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IFMzIFwiZmlsZVwiIGJlaGF2aW9yLlxuICAgICAqIFxuICAgICAqIFRoaXMgaXMgdXNlZnVsIGZvciBzZXJ2ZXIgcm91dGVzIHRoYXQgZ2VuZXJhdGUgZHluYW1pYyBjb250ZW50IGJ1dCB1c2UgZmlsZS1saWtlIFVSTHMuXG4gICAgICogRm9yIGV4YW1wbGUsIGBAbnV4dGpzL3NpdGVtYXBgIGNyZWF0ZXMgYSBgL3NpdGVtYXAueG1sYCBlbmRwb2ludCB0aGF0IGR5bmFtaWNhbGx5IGdlbmVyYXRlcyBYTUwgY29udGVudCxcbiAgICAgKiBhbmQgYEBudXh0L2ltYWdlYCB1c2VzIGZpbGUtbGlrZSBVUkxzIHRvIHNlcnZlIGR5bmFtaWNhbGx5IHByb2Nlc3NlZCBpbWFnZXMuXG4gICAgICogXG4gICAgICogTm90ZTogVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBgZW5hYmxlU2l0ZW1hcGAgd2hpY2ggc2VydmVzIHByZS1nZW5lcmF0ZWQgc3RhdGljIHNpdGVtYXAgZmlsZXMgZnJvbSBTMy5cbiAgICAgKiBVc2UgYHNlcnZlclJvdXRlc2Agd2hlbiB5b3UgbmVlZCB0aGUgTGFtYmRhIHRvIGhhbmRsZSByZXF1ZXN0cyBhbmQgZ2VuZXJhdGUgY29udGVudCBvbi10aGUtZmx5LlxuICAgICAqIFxuICAgICAqIEV4YW1wbGVzOiBgWycvc2l0ZW1hcC54bWwnLCAnL3JvYm90cy50eHQnLCAnL19fc2l0ZW1hcF9fLyonLCAnL19pcHgvKiddYFxuICAgICAqL1xuICAgIHJlYWRvbmx5IHNlcnZlclJvdXRlcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgY3VzdG9tIENsb3VkRnJvbnQgYmVoYXZpb3JzIHRvIGluamVjdCBpbnRvIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiBmb3Igc3BlY2lmaWMgcGF0aCBwYXR0ZXJucyB0YXJnZXRpbmcgdGhlIE51eHQgYXBwIG9yaWdpbi5cbiAgICAgKiBVc2UgdGhpcyB0byBvdmVycmlkZSB0aGUgY2FjaGUgcG9saWN5IGFuZC9vciBhdHRhY2ggYSBDbG91ZEZyb250IEZ1bmN0aW9uIGZvciBzcGVjaWZpYyByb3V0ZXMuXG4gICAgICpcbiAgICAgKiBFYWNoIGVudHJ5IGNhbiBpbmRlcGVuZGVudGx5IGRlZmluZTpcbiAgICAgKiAtIEEgY3VzdG9tIGNhY2hlIHBvbGljeSAoZS5nLiwgdG8gZGlzYWJsZSBjYWNoaW5nIGZvciBjZXJ0YWluIHBhdGhzKVxuICAgICAqIC0gQSBDbG91ZEZyb250IEZ1bmN0aW9uIChlLmcuLCBmb3IgVVJJIG5vcm1hbGl6YXRpb24gYXQgdGhlIGVkZ2UpXG4gICAgICogLSBPciBib3RoIGNvbWJpbmVkXG4gICAgICpcbiAgICAgKiBUaGUgYmVoYXZpb3JzIGFyZSBhZGRlZCB0byB0aGUgZGlzdHJpYnV0aW9uICoqYmVmb3JlKiogdGhlIHN0YXRpYy1hc3NldHMgYmVoYXZpb3JzIGFuZCBpbiB0aGUgb3JkZXJcbiAgICAgKiBwcm92aWRlZCwgc28gbW9yZSBzcGVjaWZpYyBwYXR0ZXJucyBzaG91bGQgYmUgbGlzdGVkIGZpcnN0LlxuICAgICAqXG4gICAgICogKipFeGFtcGxlIOKAkyBjYWNoZSBwb2xpY3kgb25seToqKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBpbXBvcnQgeyBDYWNoZVBvbGljeSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZGZyb250JztcbiAgICAgKlxuICAgICAqIGFkZGl0aW9uYWxCZWhhdmlvcnM6IFtcbiAgICAgKiAgIHsgcGF0aFBhdHRlcm46ICcvYXBpL3JlYWx0aW1lLyonLCBjYWNoZVBvbGljeTogQ2FjaGVQb2xpY3kuQ0FDSElOR19ESVNBQkxFRCB9LFxuICAgICAqIF1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqICoqRXhhbXBsZSDigJMgQ2xvdWRGcm9udCBGdW5jdGlvbiBvbmx5OioqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGltcG9ydCB7IEZ1bmN0aW9uLCBGdW5jdGlvbkNvZGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udCc7XG4gICAgICpcbiAgICAgKiBjb25zdCBub3JtYWxpemVVcmkgPSBuZXcgRnVuY3Rpb24odGhpcywgJ05vcm1hbGl6ZVVyaScsIHtcbiAgICAgKiAgIGNvZGU6IEZ1bmN0aW9uQ29kZS5mcm9tSW5saW5lKGBcbiAgICAgKiAgICAgZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgICAqICAgICAgIHZhciByZXF1ZXN0ID0gZXZlbnQucmVxdWVzdDtcbiAgICAgKiAgICAgICByZXF1ZXN0LnVyaSA9IHJlcXVlc3QudXJpLnJlcGxhY2UoL1xcXFwvKyQvLCAnJykgfHwgJy8nO1xuICAgICAqICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgICAqICAgICB9XG4gICAgICogICBgKSxcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGFkZGl0aW9uYWxCZWhhdmlvcnM6IFtcbiAgICAgKiAgIHsgcGF0aFBhdHRlcm46ICcvdXNlcnMvKicsIGZuOiBub3JtYWxpemVVcmkgfSxcbiAgICAgKiBdXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiAqKkV4YW1wbGUg4oCTIGJvdGggY29tYmluZWQ6KipcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogYWRkaXRpb25hbEJlaGF2aW9yczogW1xuICAgICAqICAgeyBwYXRoUGF0dGVybjogJy9wb3N0cy8qJywgZm46IG5vcm1hbGl6ZVVyaSwgY2FjaGVQb2xpY3k6IENhY2hlUG9saWN5LkNBQ0hJTkdfRElTQUJMRUQgfSxcbiAgICAgKiBdXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcmVhZG9ubHkgYWRkaXRpb25hbEJlaGF2aW9ycz86IE51eHRDbG91ZEZyb250QmVoYXZpb3JbXTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBBUk4gb2YgYW4gZXhpc3RpbmcgQVdTIFdBRiBXZWIgQUNMIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAgICAgKiBUaGlzIHNob3VsZCBiZSB1c2VkIHdpdGggYSBzZXBhcmF0ZSBDbG91ZEZyb250V2FmU3RhY2sgZGVwbG95ZWQgaW4gdXMtZWFzdC0xLlxuICAgICAqXG4gICAgICogRXhhbXBsZTogJ2Fybjphd3M6d2FmdjI6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpnbG9iYWwvd2ViYWNsL215LXdlYi1hY2wvYTFiMmMzZDQtNTY3OC05MGFiLWNkZWYtRVhBTVBMRTExMTExJ1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHdlYkFjbEFybj86IHN0cmluZztcbn0iXX0=
@@ -1,5 +1,54 @@
1
1
  import {type NuxtAppStackProps} from "../NuxtAppStackProps";
2
2
  import {Duration} from "aws-cdk-lib";
3
+ import {FunctionCode, FunctionEventType, ICachePolicy} from "aws-cdk-lib/aws-cloudfront";
4
+
5
+ /**
6
+ * Defines a custom CloudFront behavior attached to a specific path pattern targeting the Nuxt app origin.
7
+ * Use this to override the cache policy and/or attach a CloudFront Function for specific routes.
8
+ */
9
+ export interface NuxtCloudFrontBehavior {
10
+
11
+ /**
12
+ * The CloudFront distribution behavior path pattern to which this behavior shall be applied.
13
+ *
14
+ * @example '/posts/*'
15
+ */
16
+ readonly pathPattern: string;
17
+
18
+ /**
19
+ * The code of the CloudFront Function to associate with this behavior.
20
+ * The stack will create the CloudFront Function resource internally.
21
+ * The function will be invoked on VIEWER_REQUEST events by default.
22
+ * If omitted, no CloudFront Function is attached.
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * import { FunctionCode } from 'aws-cdk-lib/aws-cloudfront';
27
+ *
28
+ * fnCode: FunctionCode.fromInline(`
29
+ * function handler(event) {
30
+ * var request = event.request;
31
+ * request.uri = request.uri.replace(/\/+$/, '') || '/';
32
+ * return request;
33
+ * }
34
+ * `)
35
+ * ```
36
+ */
37
+ readonly fnCode?: FunctionCode;
38
+
39
+ /**
40
+ * The event type at which the CloudFront Function shall be invoked.
41
+ * Only relevant when {@link fnCode} is specified.
42
+ * Defaults to {@link FunctionEventType.VIEWER_REQUEST}.
43
+ */
44
+ readonly eventType?: FunctionEventType;
45
+
46
+ /**
47
+ * An optional cache policy to use for this behavior.
48
+ * Falls back to the default Nuxt app cache policy if not specified.
49
+ */
50
+ readonly cachePolicy?: ICachePolicy;
51
+ }
3
52
 
4
53
  /**
5
54
  * Defines the props required for the {@see NuxtServerAppStack}.
@@ -226,6 +275,55 @@ export interface NuxtServerAppStackProps extends NuxtAppStackProps {
226
275
  */
227
276
  readonly serverRoutes?: string[];
228
277
 
278
+ /**
279
+ * An array of custom CloudFront behaviors to inject into the CloudFront distribution for specific path patterns targeting the Nuxt app origin.
280
+ * Use this to override the cache policy and/or attach a CloudFront Function for specific routes.
281
+ *
282
+ * Each entry can independently define:
283
+ * - A custom cache policy (e.g., to disable caching for certain paths)
284
+ * - A CloudFront Function (e.g., for URI normalization at the edge)
285
+ * - Or both combined
286
+ *
287
+ * The behaviors are added to the distribution **before** the static-assets behaviors and in the order
288
+ * provided, so more specific patterns should be listed first.
289
+ *
290
+ * **Example – cache policy only:**
291
+ * ```typescript
292
+ * import { CachePolicy } from 'aws-cdk-lib/aws-cloudfront';
293
+ *
294
+ * additionalBehaviors: [
295
+ * { pathPattern: '/api/realtime/*', cachePolicy: CachePolicy.CACHING_DISABLED },
296
+ * ]
297
+ * ```
298
+ *
299
+ * **Example – CloudFront Function only:**
300
+ * ```typescript
301
+ * import { Function, FunctionCode } from 'aws-cdk-lib/aws-cloudfront';
302
+ *
303
+ * const normalizeUri = new Function(this, 'NormalizeUri', {
304
+ * code: FunctionCode.fromInline(`
305
+ * function handler(event) {
306
+ * var request = event.request;
307
+ * request.uri = request.uri.replace(/\\/+$/, '') || '/';
308
+ * return request;
309
+ * }
310
+ * `),
311
+ * });
312
+ *
313
+ * additionalBehaviors: [
314
+ * { pathPattern: '/users/*', fn: normalizeUri },
315
+ * ]
316
+ * ```
317
+ *
318
+ * **Example – both combined:**
319
+ * ```typescript
320
+ * additionalBehaviors: [
321
+ * { pathPattern: '/posts/*', fn: normalizeUri, cachePolicy: CachePolicy.CACHING_DISABLED },
322
+ * ]
323
+ * ```
324
+ */
325
+ readonly additionalBehaviors?: NuxtCloudFrontBehavior[];
326
+
229
327
  /**
230
328
  * The ARN of an existing AWS WAF Web ACL to associate with the CloudFront distribution.
231
329
  * This should be used with a separate CloudFrontWafStack deployed in us-east-1.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cdk-nuxt",
3
- "version": "2.23.0",
3
+ "version": "2.24.1",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",