@firestartr/cli 0.1.10 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.js CHANGED
@@ -226501,6 +226501,7 @@ const types_1 = __importDefault(__nccwpck_require__(30130));
226501
226501
  const environment_1 = __importDefault(__nccwpck_require__(92938));
226502
226502
  const defaults_1 = __importDefault(__nccwpck_require__(30195));
226503
226503
  const features_1 = __importDefault(__nccwpck_require__(69727));
226504
+ const policies_1 = __importDefault(__nccwpck_require__(8141));
226504
226505
  var github_1 = __nccwpck_require__(86666);
226505
226506
  Object.defineProperty(exports, "BranchStrategy", ({ enumerable: true, get: function () { return github_1.BranchStrategy; } }));
226506
226507
  exports["default"] = {
@@ -226509,7 +226510,8 @@ exports["default"] = {
226509
226510
  types: types_1.default,
226510
226511
  environment: environment_1.default,
226511
226512
  defaults: defaults_1.default,
226512
- features: features_1.default
226513
+ features: features_1.default,
226514
+ policies: policies_1.default
226513
226515
  };
226514
226516
 
226515
226517
 
@@ -227750,6 +227752,108 @@ function writeLogFile(fileName, log) {
227750
227752
  exports.writeLogFile = writeLogFile;
227751
227753
 
227752
227754
 
227755
+ /***/ }),
227756
+
227757
+ /***/ 8141:
227758
+ /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
227759
+
227760
+ "use strict";
227761
+
227762
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
227763
+ const policies_1 = __nccwpck_require__(43666);
227764
+ exports["default"] = {
227765
+ policiesAreCompatible: policies_1.policiesAreCompatible,
227766
+ getPolicyByName: policies_1.getPolicyByName,
227767
+ FIRESTARTR_POLICIES: policies_1.FIRESTARTR_POLICIES
227768
+ };
227769
+
227770
+
227771
+ /***/ }),
227772
+
227773
+ /***/ 43666:
227774
+ /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
227775
+
227776
+ "use strict";
227777
+
227778
+ var __importDefault = (this && this.__importDefault) || function (mod) {
227779
+ return (mod && mod.__esModule) ? mod : { "default": mod };
227780
+ };
227781
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
227782
+ exports.policiesAreCompatible = exports.getPolicyByName = exports.FIRESTARTR_POLICIES = void 0;
227783
+ const debug_1 = __importDefault(__nccwpck_require__(67984));
227784
+ const log = (0, debug_1.default)("firestartr:catalog_common:policies");
227785
+ exports.FIRESTARTR_POLICIES = [
227786
+ {
227787
+ name: "full-control",
227788
+ weight: 10,
227789
+ aliases: [],
227790
+ allowedOps: [
227791
+ "UPDATED",
227792
+ "CREATED",
227793
+ "RENAMED",
227794
+ "SYNC",
227795
+ "MARKED_TO_DELETION",
227796
+ "RETRY",
227797
+ "NOTHING"
227798
+ ]
227799
+ },
227800
+ {
227801
+ name: "apply",
227802
+ weight: 9,
227803
+ aliases: [
227804
+ "create-update-only"
227805
+ ],
227806
+ allowedOps: [
227807
+ "UPDATED",
227808
+ "CREATED",
227809
+ "RENAMED",
227810
+ "SYNC",
227811
+ "RETRY",
227812
+ "NOTHING"
227813
+ ]
227814
+ },
227815
+ {
227816
+ name: "observe",
227817
+ weight: 8,
227818
+ aliases: [
227819
+ "observe-only"
227820
+ ],
227821
+ allowedOps: [
227822
+ "SYNC"
227823
+ ]
227824
+ },
227825
+ {
227826
+ name: "create-only",
227827
+ weight: 8,
227828
+ aliases: [],
227829
+ allowedOps: [
227830
+ "CREATED",
227831
+ "RETRY",
227832
+ "SYNC",
227833
+ ]
227834
+ },
227835
+ ];
227836
+ function getPolicyByName(policyName) {
227837
+ return exports.FIRESTARTR_POLICIES.find(p => p.name === policyName || p.aliases.includes(policyName));
227838
+ }
227839
+ exports.getPolicyByName = getPolicyByName;
227840
+ function policiesAreCompatible(syncPolicy, generalPolicy) {
227841
+ log("Validating policy compatibility: %s %s", syncPolicy, generalPolicy);
227842
+ const syncPolicyWeight = getPolicyByName(syncPolicy)?.weight;
227843
+ const generalPolicyWeight = getPolicyByName(generalPolicy)?.weight;
227844
+ if (!syncPolicyWeight || !generalPolicyWeight) {
227845
+ throw new Error(`Policy ${syncPolicy} or ${generalPolicy} not found`);
227846
+ }
227847
+ if (generalPolicyWeight >= syncPolicyWeight) {
227848
+ log("Policies %s %s are compatible", syncPolicy, generalPolicy);
227849
+ return true;
227850
+ }
227851
+ log("Policies %s %s are not compatible", syncPolicy, generalPolicy);
227852
+ return false;
227853
+ }
227854
+ exports.policiesAreCompatible = policiesAreCompatible;
227855
+
227856
+
227753
227857
  /***/ }),
227754
227858
 
227755
227859
  /***/ 33591:
@@ -232157,6 +232261,10 @@ exports["default"] = {
232157
232261
  {
232158
232262
  "type": "object",
232159
232263
  "properties": {
232264
+ "policy": {
232265
+ "type": "string",
232266
+ "enum": ["apply", "create-only", "create-update-only", "full-control", "observe", "observe-only"]
232267
+ },
232160
232268
  "name": {
232161
232269
  "type": "string",
232162
232270
  },
@@ -232164,6 +232272,24 @@ exports["default"] = {
232164
232272
  "type": "string",
232165
232273
  "enum": ["remote", "inline", "Remote", "Inline"]
232166
232274
  },
232275
+ "sync": {
232276
+ "type": "object",
232277
+ "properties": {
232278
+ "enabled": {
232279
+ "type": "boolean"
232280
+ },
232281
+ "period": {
232282
+ "type": "string",
232283
+ "pattern": "^[0-9]+[smhd]$"
232284
+ },
232285
+ "policy": {
232286
+ "type": "string",
232287
+ "enum": ["apply", "observe"]
232288
+ }
232289
+ },
232290
+ "required": ["enabled"],
232291
+ "additionalProperties": false
232292
+ },
232167
232293
  "valuesSchema": {
232168
232294
  "type": "string",
232169
232295
  "description": "a locator for a json schema to validate values"
@@ -232211,7 +232337,7 @@ exports["default"] = {
232211
232337
  }
232212
232338
  }
232213
232339
  };
232214
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVycmFmb3JtLnNjaGVtYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jbGFpbXMvdGZ3b3Jrc3BhY2VzL3RlcnJhZm9ybS5zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQkFBZTtJQUVYLFNBQVMsRUFBRSx5Q0FBeUM7SUFFcEQsS0FBSyxFQUFFLG1CQUFtQjtJQUUxQixhQUFhLEVBQUU7UUFFYixtQkFBbUIsRUFBRTtZQUVuQixLQUFLLEVBQUUsOENBQThDO1lBRXJELE1BQU0sRUFBRSxRQUFRO1lBRWhCLGFBQWEsRUFBRSx1QkFBdUI7WUFFdEMsT0FBTyxFQUFFO2dCQUVQLEVBQUMsTUFBTSxFQUFFLCtDQUErQyxFQUFDO2dCQUV6RDtvQkFDRSxNQUFNLEVBQUUsUUFBUTtvQkFFaEIsWUFBWSxFQUFFO3dCQUVaLE1BQU0sRUFBRTs0QkFFTixNQUFNLEVBQUUsUUFBUTt5QkFDakI7d0JBRUQsUUFBUSxFQUFFOzRCQUVSLE1BQU0sRUFBRSxRQUFROzRCQUVoQixNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUM7eUJBRWpEO3dCQUVELGNBQWMsRUFBRTs0QkFFZCxNQUFNLEVBQUUsUUFBUTs0QkFFaEIsYUFBYSxFQUFFLGdEQUFnRDt5QkFFaEU7d0JBRUQsUUFBUSxFQUFDOzRCQUVQLE1BQU0sRUFBRSxRQUFROzRCQUVoQixZQUFZLEVBQUUsRUFBRTs0QkFFaEIsc0JBQXNCLEVBQUUsSUFBSTt5QkFFN0I7d0JBRUQsUUFBUSxFQUFFOzRCQUVSLE1BQU0sRUFBRSxRQUFRO3lCQUVqQjt3QkFFRCxTQUFTLEVBQUU7NEJBRVQsTUFBTSxFQUFFLFFBQVE7NEJBRWhCLFlBQVksRUFBRTtnQ0FFWixXQUFXLEVBQUU7b0NBRVgsTUFBTSxFQUFFLE9BQU87b0NBRWYsT0FBTyxFQUFFO3dDQUVQLE1BQU0sRUFBRSxRQUFRO3dDQUVoQixZQUFZLEVBQUU7NENBRVosTUFBTSxFQUFFO2dEQUVOLE1BQU0sRUFBRSxRQUFROzZDQUNqQjt5Q0FFRjt3Q0FFRCxzQkFBc0IsRUFBRSxLQUFLO3FDQUU5QjtpQ0FFRjtnQ0FFRCxTQUFTLEVBQUU7b0NBRVQsTUFBTSxFQUFFLFFBQVE7b0NBRWhCLFlBQVksRUFBRTt3Q0FFWixNQUFNLEVBQUU7NENBRU4sTUFBTSxFQUFFLFFBQVE7eUNBQ2pCO3FDQUVGO29DQUVELHNCQUFzQixFQUFFLEtBQUs7aUNBQzlCOzZCQUVGOzRCQUVELFVBQVUsRUFBRSxDQUFDLFdBQVcsQ0FBQzs0QkFFekIsc0JBQXNCLEVBQUUsS0FBSzt5QkFFOUI7cUJBRUY7b0JBRUQsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDO2lCQUVwRDthQUVGO1NBRUY7S0FDRjtDQUNKLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCB7XG5cbiAgICBcIiRzY2hlbWFcIjogXCJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSNcIixcblxuICAgIFwiJGlkXCI6IFwiVGVycmFmb3JtUHJvdmlkZXJcIixcblxuICAgIFwiZGVmaW5pdGlvbnNcIjoge1xuXG4gICAgICBcIlRlcnJhZm9ybVByb3ZpZGVyXCI6IHtcblxuICAgICAgICBcIiRpZFwiOiBcImZpcmVzdGFydHIuZGV2Oi8vdGVycmFmb3JtL1RlcnJhZm9ybVByb3ZpZGVyXCIsXG5cbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXG5cbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkEgdGVycmFmb3JtIHdvcmtzcGFjZVwiLFxuXG4gICAgICAgIFwiYWxsT2ZcIjogW1xuXG4gICAgICAgICAge1wiJHJlZlwiOiBcImZpcmVzdGFydHIuZGV2Oi8vY29tbW9uL0NsYWltUHJvdmlkZXJFbnZlbG9wZVwifSxcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxuXG4gICAgICAgICAgICBcInByb3BlcnRpZXNcIjoge1xuXG4gICAgICAgICAgICAgIFwibmFtZVwiOiB7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgIFwic291cmNlXCI6IHtcblxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuXG4gICAgICAgICAgICAgICAgXCJlbnVtXCI6IFtcInJlbW90ZVwiLCBcImlubGluZVwiLCBcIlJlbW90ZVwiLCBcIklubGluZVwiXVxuXG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgXCJ2YWx1ZXNTY2hlbWFcIjoge1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcblxuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJhIGxvY2F0b3IgZm9yIGEganNvbiBzY2hlbWEgdG8gdmFsaWRhdGUgdmFsdWVzXCJcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgXCJ2YWx1ZXNcIjp7XG5cbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcblxuICAgICAgICAgICAgICAgIFwicHJvcGVydGllc1wiOiB7fSxcblxuICAgICAgICAgICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZVxuXG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgXCJtb2R1bGVcIjoge1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICBcImNvbnRleHRcIjoge1xuXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXG5cbiAgICAgICAgICAgICAgICBcInByb3BlcnRpZXNcIjoge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXCJwcm92aWRlcnNcIjoge1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG5cbiAgICAgICAgICAgICAgICAgICAgXCJpdGVtc1wiOiB7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxuXG4gICAgICAgICAgICAgICAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICBcImJhY2tlbmRcIjoge1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxuXG4gICAgICAgICAgICAgICAgICAgIFwicHJvcGVydGllc1wiOiB7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBcInJlcXVpcmVkXCI6IFtcInByb3ZpZGVyc1wiXSxcblxuICAgICAgICAgICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogZmFsc2VcblxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogW1widmFsdWVzXCIsIFwiY29udGV4dFwiLCBcInNvdXJjZVwiLCBcIm5hbWVcIl1cblxuICAgICAgICAgIH1cblxuICAgICAgICBdXG5cbiAgICAgIH1cbiAgICB9XG59XG4iXX0=
232340
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVycmFmb3JtLnNjaGVtYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jbGFpbXMvdGZ3b3Jrc3BhY2VzL3RlcnJhZm9ybS5zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQkFBZTtJQUVYLFNBQVMsRUFBRSx5Q0FBeUM7SUFFcEQsS0FBSyxFQUFFLG1CQUFtQjtJQUUxQixhQUFhLEVBQUU7UUFFYixtQkFBbUIsRUFBRTtZQUVuQixLQUFLLEVBQUUsOENBQThDO1lBRXJELE1BQU0sRUFBRSxRQUFRO1lBRWhCLGFBQWEsRUFBRSx1QkFBdUI7WUFFdEMsT0FBTyxFQUFFO2dCQUVQLEVBQUMsTUFBTSxFQUFFLCtDQUErQyxFQUFDO2dCQUV6RDtvQkFDRSxNQUFNLEVBQUUsUUFBUTtvQkFFaEIsWUFBWSxFQUFFO3dCQUVaLFFBQVEsRUFBRTs0QkFFUixNQUFNLEVBQUUsUUFBUTs0QkFFaEIsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGNBQWMsQ0FBQzt5QkFFbEc7d0JBRUQsTUFBTSxFQUFFOzRCQUVOLE1BQU0sRUFBRSxRQUFRO3lCQUNqQjt3QkFFRCxRQUFRLEVBQUU7NEJBRVIsTUFBTSxFQUFFLFFBQVE7NEJBRWhCLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQzt5QkFFakQ7d0JBQ0QsTUFBTSxFQUFFOzRCQUVKLE1BQU0sRUFBRSxRQUFROzRCQUVoQixZQUFZLEVBQUU7Z0NBRVosU0FBUyxFQUFFO29DQUVULE1BQU0sRUFBRSxTQUFTO2lDQUVsQjtnQ0FFRCxRQUFRLEVBQUU7b0NBRVIsTUFBTSxFQUFFLFFBQVE7b0NBRWhCLFNBQVMsRUFBRSxnQkFBZ0I7aUNBRTVCO2dDQUVELFFBQVEsRUFBRTtvQ0FFUixNQUFNLEVBQUUsUUFBUTtvQ0FFaEIsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQztpQ0FFN0I7NkJBRUY7NEJBRUQsVUFBVSxFQUFFLENBQUMsU0FBUyxDQUFDOzRCQUV2QixzQkFBc0IsRUFBRSxLQUFLO3lCQUNoQzt3QkFFRCxjQUFjLEVBQUU7NEJBRWQsTUFBTSxFQUFFLFFBQVE7NEJBRWhCLGFBQWEsRUFBRSxnREFBZ0Q7eUJBRWhFO3dCQUVELFFBQVEsRUFBQzs0QkFFUCxNQUFNLEVBQUUsUUFBUTs0QkFFaEIsWUFBWSxFQUFFLEVBQUU7NEJBRWhCLHNCQUFzQixFQUFFLElBQUk7eUJBRTdCO3dCQUVELFFBQVEsRUFBRTs0QkFFUixNQUFNLEVBQUUsUUFBUTt5QkFFakI7d0JBRUQsU0FBUyxFQUFFOzRCQUVULE1BQU0sRUFBRSxRQUFROzRCQUVoQixZQUFZLEVBQUU7Z0NBRVosV0FBVyxFQUFFO29DQUVYLE1BQU0sRUFBRSxPQUFPO29DQUVmLE9BQU8sRUFBRTt3Q0FFUCxNQUFNLEVBQUUsUUFBUTt3Q0FFaEIsWUFBWSxFQUFFOzRDQUVaLE1BQU0sRUFBRTtnREFFTixNQUFNLEVBQUUsUUFBUTs2Q0FDakI7eUNBRUY7d0NBRUQsc0JBQXNCLEVBQUUsS0FBSztxQ0FFOUI7aUNBRUY7Z0NBRUQsU0FBUyxFQUFFO29DQUVULE1BQU0sRUFBRSxRQUFRO29DQUVoQixZQUFZLEVBQUU7d0NBRVosTUFBTSxFQUFFOzRDQUVOLE1BQU0sRUFBRSxRQUFRO3lDQUNqQjtxQ0FFRjtvQ0FFRCxzQkFBc0IsRUFBRSxLQUFLO2lDQUM5Qjs2QkFFRjs0QkFFRCxVQUFVLEVBQUUsQ0FBQyxXQUFXLENBQUM7NEJBRXpCLHNCQUFzQixFQUFFLEtBQUs7eUJBRTlCO3FCQUVGO29CQUVELFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQztpQkFFcEQ7YUFFRjtTQUVGO0tBQ0Y7Q0FDSixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQge1xuXG4gICAgXCIkc2NoZW1hXCI6IFwiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNy9zY2hlbWEjXCIsXG5cbiAgICBcIiRpZFwiOiBcIlRlcnJhZm9ybVByb3ZpZGVyXCIsXG5cbiAgICBcImRlZmluaXRpb25zXCI6IHtcblxuICAgICAgXCJUZXJyYWZvcm1Qcm92aWRlclwiOiB7XG5cbiAgICAgICAgXCIkaWRcIjogXCJmaXJlc3RhcnRyLmRldjovL3RlcnJhZm9ybS9UZXJyYWZvcm1Qcm92aWRlclwiLFxuXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxuXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJBIHRlcnJhZm9ybSB3b3Jrc3BhY2VcIixcblxuICAgICAgICBcImFsbE9mXCI6IFtcblxuICAgICAgICAgIHtcIiRyZWZcIjogXCJmaXJlc3RhcnRyLmRldjovL2NvbW1vbi9DbGFpbVByb3ZpZGVyRW52ZWxvcGVcIn0sXG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcblxuICAgICAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcblxuICAgICAgICAgICAgICBcInBvbGljeVwiOiB7XG5cbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcblxuICAgICAgICAgICAgICAgIFwiZW51bVwiOiBbXCJhcHBseVwiLCBcImNyZWF0ZS1vbmx5XCIsIFwiY3JlYXRlLXVwZGF0ZS1vbmx5XCIsIFwiZnVsbC1jb250cm9sXCIsIFwib2JzZXJ2ZVwiLCBcIm9ic2VydmUtb25seVwiXVxuXG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgXCJuYW1lXCI6IHtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgXCJzb3VyY2VcIjoge1xuXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXG5cbiAgICAgICAgICAgICAgICBcImVudW1cIjogW1wicmVtb3RlXCIsIFwiaW5saW5lXCIsIFwiUmVtb3RlXCIsIFwiSW5saW5lXCJdXG5cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJzeW5jXCI6IHtcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXG4gIFxuICAgICAgICAgICAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcbiAgXG4gICAgICAgICAgICAgICAgICAgIFwiZW5hYmxlZFwiOiB7XG4gIFxuICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIlxuICBcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgXG4gICAgICAgICAgICAgICAgICAgIFwicGVyaW9kXCI6IHtcbiAgXG4gICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXG4gIFxuICAgICAgICAgICAgICAgICAgICAgIFwicGF0dGVyblwiOiBcIl5bMC05XStbc21oZF0kXCJcbiAgXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gIFxuICAgICAgICAgICAgICAgICAgICBcInBvbGljeVwiOiB7XG4gIFxuICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuICBcbiAgICAgICAgICAgICAgICAgICAgICBcImVudW1cIjogW1wiYXBwbHlcIiwgXCJvYnNlcnZlXCJdXG4gIFxuICAgICAgICAgICAgICAgICAgICB9XG4gIFxuICAgICAgICAgICAgICAgICAgfSxcbiAgXG4gICAgICAgICAgICAgICAgICBcInJlcXVpcmVkXCI6IFtcImVuYWJsZWRcIl0sXG4gIFxuICAgICAgICAgICAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiBmYWxzZVxuICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgIFwidmFsdWVzU2NoZW1hXCI6IHtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXG5cbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYSBsb2NhdG9yIGZvciBhIGpzb24gc2NoZW1hIHRvIHZhbGlkYXRlIHZhbHVlc1wiXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgIFwidmFsdWVzXCI6e1xuXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXG5cbiAgICAgICAgICAgICAgICBcInByb3BlcnRpZXNcIjoge30sXG5cbiAgICAgICAgICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWVcblxuICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgIFwibW9kdWxlXCI6IHtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgXCJjb250ZXh0XCI6IHtcblxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxuXG4gICAgICAgICAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFwicHJvdmlkZXJzXCI6IHtcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxuXG4gICAgICAgICAgICAgICAgICAgIFwiaXRlbXNcIjoge1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcblxuICAgICAgICAgICAgICAgICAgICAgIFwicHJvcGVydGllc1wiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgICAgXCJiYWNrZW5kXCI6IHtcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcblxuICAgICAgICAgICAgICAgICAgICBcInByb3BlcnRpZXNcIjoge1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjoge1xuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogZmFsc2VcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiBbXCJwcm92aWRlcnNcIl0sXG5cbiAgICAgICAgICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IGZhbHNlXG5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IFtcInZhbHVlc1wiLCBcImNvbnRleHRcIiwgXCJzb3VyY2VcIiwgXCJuYW1lXCJdXG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgXVxuXG4gICAgICB9XG4gICAgfVxufVxuIl19
232215
232341
 
232216
232342
  /***/ }),
232217
232343
 
@@ -233767,13 +233893,17 @@ PolicyInitializer.applicableKinds = ["TFWorkspaceClaim"];
233767
233893
  /***/ }),
233768
233894
 
233769
233895
  /***/ 94227:
233770
- /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
233896
+ /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
233771
233897
 
233772
233898
  "use strict";
233773
233899
 
233900
+ var __importDefault = (this && this.__importDefault) || function (mod) {
233901
+ return (mod && mod.__esModule) ? mod : { "default": mod };
233902
+ };
233774
233903
  Object.defineProperty(exports, "__esModule", ({ value: true }));
233775
233904
  exports.SyncerInitializer = void 0;
233776
233905
  const base_1 = __nccwpck_require__(9204);
233906
+ const catalog_common_1 = __importDefault(__nccwpck_require__(74100));
233777
233907
  const patches_1 = __nccwpck_require__(74312);
233778
233908
  const PERIOD_VALIDATOR = new RegExp(/^\d+[smhd]$/);
233779
233909
  class SyncerInitializer extends base_1.InitializerPatches {
@@ -233789,6 +233919,16 @@ class SyncerInitializer extends base_1.InitializerPatches {
233789
233919
  }
233790
233920
  return [{
233791
233921
  validate(cr) {
233922
+ if (cr.metadata.annotations &&
233923
+ cr.metadata.annotations["firestartr.dev/sync-policy"] &&
233924
+ cr.metadata.annotations["firestartr.dev/policy"]) {
233925
+ const policy = cr.metadata.annotations["firestartr.dev/policy"];
233926
+ const syncPolicy = cr.metadata.annotations["firestartr.dev/sync-policy"];
233927
+ const policiesAreCompatible = catalog_common_1.default.policies.policiesAreCompatible(syncPolicy, policy);
233928
+ if (!policiesAreCompatible) {
233929
+ throw `${this.identify()}: incompatible policies '${policy}' and '${syncPolicy}' for ${cr.kind}/${cr.metadata.name}`;
233930
+ }
233931
+ }
233792
233932
  if (cr.metadata.annotations && cr.metadata.annotations["firestartr.dev/sync-period"]) {
233793
233933
  if (!PERIOD_VALIDATOR.test(cr.metadata.annotations["firestartr.dev/sync-period"])) {
233794
233934
  throw `${this.identify()}: period incorrect "${cr.metadata.annotations["firestartr.dev/sync-period"]}" for ${cr.kind}/${cr.metadata.name}`;
@@ -233807,6 +233947,10 @@ class SyncerInitializer extends base_1.InitializerPatches {
233807
233947
  cr.metadata.annotations = cr.metadata.annotations || {};
233808
233948
  cr.metadata.annotations["firestartr.dev/sync-period"] = syncInfo(this).period;
233809
233949
  }
233950
+ if (syncInfo(this).policy) {
233951
+ cr.metadata.annotations = cr.metadata.annotations || {};
233952
+ cr.metadata.annotations["firestartr.dev/sync-policy"] = syncInfo(this).policy;
233953
+ }
233810
233954
  }
233811
233955
  return cr;
233812
233956
  },
@@ -233817,8 +233961,8 @@ class SyncerInitializer extends base_1.InitializerPatches {
233817
233961
  }
233818
233962
  }
233819
233963
  exports.SyncerInitializer = SyncerInitializer;
233820
- SyncerInitializer.applicableKinds = ["ComponentClaim", "GroupClaim", "UserClaim"];
233821
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2luaXRpYWxpemVycy9zeW5jZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQTRDO0FBRTVDLHdDQUF1QztBQUV2QyxNQUFNLGdCQUFnQixHQUFHLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0FBRWxELE1BQWEsaUJBQWtCLFNBQVEseUJBQWtCO0lBQXpEOztRQUVFLHdCQUFtQixHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7SUFpRXBDLENBQUM7SUE3REMsS0FBSyxDQUFDLFVBQVUsS0FBSSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7SUFFbEMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFVLEVBQUUsV0FBZ0I7UUFFMUMsU0FBUyxRQUFRLENBQUMsR0FBTztZQUV2QixNQUFNLFFBQVEsR0FBVSxJQUFBLG1CQUFTLEVBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFBO1lBRS9DLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFBO1FBRTdDLENBQUM7UUFFRCxPQUFPLENBQUM7Z0JBRU4sUUFBUSxDQUFDLEVBQU07b0JBRWIsSUFBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyw0QkFBNEIsQ0FBQyxFQUFDO3dCQUVsRixJQUFHLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLDRCQUE0QixDQUFDLENBQUMsRUFBQzs0QkFFL0UsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLDRCQUE0QixDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFBO3lCQUUzSTt3QkFFRCxPQUFPLElBQUksQ0FBQTtxQkFDWjt5QkFDRzt3QkFFRixPQUFPLElBQUksQ0FBQTtxQkFDWjtnQkFFSCxDQUFDO2dCQUVELEtBQUssQ0FBQyxFQUFNO29CQUVWLElBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBQzt3QkFFeEIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO3dCQUV4RCxFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLE1BQU0sQ0FBQTt3QkFFL0QsSUFBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFDOzRCQUV2QixFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7NEJBRXhELEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLDRCQUE0QixDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQTt5QkFFOUU7cUJBRUY7b0JBRUQsT0FBTyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztnQkFFRCxRQUFRO29CQUVOLE9BQU8sZ0NBQWdDLENBQUM7Z0JBRTFDLENBQUM7YUFDRixDQUFDLENBQUE7SUFDSixDQUFDOztBQWxFSCw4Q0FtRUM7QUEvRFEsaUNBQWUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluaXRpYWxpemVyUGF0Y2hlcyB9IGZyb20gJy4vYmFzZSc7XG5cbmltcG9ydCB7IGhlbHBlckNUWCB9IGZyb20gJy4uL3BhdGNoZXMnO1xuXG5jb25zdCBQRVJJT0RfVkFMSURBVE9SID0gbmV3IFJlZ0V4cCgvXlxcZCtbc21oZF0kLylcblxuZXhwb3J0IGNsYXNzIFN5bmNlckluaXRpYWxpemVyIGV4dGVuZHMgSW5pdGlhbGl6ZXJQYXRjaGVzIHtcblxuICBhcHBsaWNhYmxlUHJvdmlkZXJzID0gW1wiXmNhdGFsb2dcIl1cblxuICBzdGF0aWMgYXBwbGljYWJsZUtpbmRzID0gW1wiQ29tcG9uZW50Q2xhaW1cIiwgXCJHcm91cENsYWltXCIsIFwiVXNlckNsYWltXCJdXG5cbiAgYXN5bmMgX192YWxpZGF0ZSgpeyByZXR1cm4gdHJ1ZTsgfVxuXG4gIGFzeW5jIF9fcGF0Y2hlcyhjbGFpbTogYW55LCBfcHJldmlvdXNDUjogYW55KXtcblxuICAgIGZ1bmN0aW9uIHN5bmNJbmZvKGN0eDphbnkpe1xuXG4gICAgICBjb25zdCBwcm92aWRlcjpzdHJpbmcgPSBoZWxwZXJDVFgoY3R4KS5wcm92aWRlclxuXG4gICAgICByZXR1cm4gY2xhaW0ucHJvdmlkZXJzW3Byb3ZpZGVyXS5zeW5jIHx8IHt9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gW3tcblxuICAgICAgdmFsaWRhdGUoY3I6YW55KXtcblxuICAgICAgICBpZihjci5tZXRhZGF0YS5hbm5vdGF0aW9ucyAmJiBjci5tZXRhZGF0YS5hbm5vdGF0aW9uc1tcImZpcmVzdGFydHIuZGV2L3N5bmMtcGVyaW9kXCJdKXtcblxuICAgICAgICAgIGlmKCFQRVJJT0RfVkFMSURBVE9SLnRlc3QoY3IubWV0YWRhdGEuYW5ub3RhdGlvbnNbXCJmaXJlc3RhcnRyLmRldi9zeW5jLXBlcmlvZFwiXSkpe1xuXG4gICAgICAgICAgICB0aHJvdyBgJHt0aGlzLmlkZW50aWZ5KCl9OiBwZXJpb2QgaW5jb3JyZWN0IFwiJHtjci5tZXRhZGF0YS5hbm5vdGF0aW9uc1tcImZpcmVzdGFydHIuZGV2L3N5bmMtcGVyaW9kXCJdfVwiIGZvciAke2NyLmtpbmR9LyR7Y3IubWV0YWRhdGEubmFtZX1gXG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgIH0sXG5cbiAgICAgIGFwcGx5KGNyOmFueSl7XG5cbiAgICAgICAgaWYoc3luY0luZm8odGhpcykuZW5hYmxlZCl7XG5cbiAgICAgICAgICBjci5tZXRhZGF0YS5hbm5vdGF0aW9ucyA9IGNyLm1ldGFkYXRhLmFubm90YXRpb25zIHx8IHt9O1xuXG4gICAgICAgICAgY3IubWV0YWRhdGEuYW5ub3RhdGlvbnNbXCJmaXJlc3RhcnRyLmRldi9zeW5jLWVuYWJsZWRcIl0gPSBcInRydWVcIlxuXG4gICAgICAgICAgaWYoc3luY0luZm8odGhpcykucGVyaW9kKXtcblxuICAgICAgICAgICAgY3IubWV0YWRhdGEuYW5ub3RhdGlvbnMgPSBjci5tZXRhZGF0YS5hbm5vdGF0aW9ucyB8fCB7fTtcblxuICAgICAgICAgICAgY3IubWV0YWRhdGEuYW5ub3RhdGlvbnNbXCJmaXJlc3RhcnRyLmRldi9zeW5jLXBlcmlvZFwiXSA9IHN5bmNJbmZvKHRoaXMpLnBlcmlvZFxuXG4gICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3I7XG4gICAgICB9LFxuXG4gICAgICBpZGVudGlmeSgpe1xuXG4gICAgICAgIHJldHVybiBcImluaXRpYWxpemVycy9TeW5jZXJJbml0aWFsaXplclwiO1xuXG4gICAgICB9XG4gICAgfV1cbiAgfVxufVxuIl19
233964
+ SyncerInitializer.applicableKinds = ["ComponentClaim", "GroupClaim", "UserClaim", "TFWorkspaceClaim"];
233965
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2luaXRpYWxpemVycy9zeW5jZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsaUNBQTRDO0FBQzVDLG9FQUFvQztBQUVwQyx3Q0FBdUM7QUFFdkMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQTtBQUVsRCxNQUFhLGlCQUFrQixTQUFRLHlCQUFrQjtJQUF6RDs7UUFFRSx3QkFBbUIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBcUdwQyxDQUFDO0lBakdDLEtBQUssQ0FBQyxVQUFVLEtBQUksT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRWxDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBVSxFQUFFLFdBQWdCO1FBRTFDLFNBQVMsUUFBUSxDQUFDLEdBQU87WUFFdkIsTUFBTSxRQUFRLEdBQVUsSUFBQSxtQkFBUyxFQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQTtZQUUvQyxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUU3QyxDQUFDO1FBRUQsT0FBTyxDQUFDO2dCQUVOLFFBQVEsQ0FBQyxFQUFNO29CQUViLElBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXO3dCQUV4QixFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyw0QkFBNEIsQ0FBQzt3QkFFckQsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsRUFFakQ7d0JBRUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsQ0FBQTt3QkFFL0QsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsNEJBQTRCLENBQUMsQ0FBQTt3QkFFeEUsTUFBTSxxQkFBcUIsR0FBRyx3QkFBTSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FFakUsVUFBVSxFQUVWLE1BQU0sQ0FFUCxDQUFBO3dCQUVELElBQUcsQ0FBQyxxQkFBcUIsRUFBQzs0QkFFeEIsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsNEJBQTRCLE1BQU0sVUFBVSxVQUFVLFNBQVMsRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFBO3lCQUVySDtxQkFFRjtvQkFFRCxJQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLDRCQUE0QixDQUFDLEVBQUM7d0JBRWxGLElBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxFQUFDOzRCQUUvRSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSx1QkFBdUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsNEJBQTRCLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUE7eUJBRTNJO3dCQUVELE9BQU8sSUFBSSxDQUFBO3FCQUNaO3lCQUNHO3dCQUVGLE9BQU8sSUFBSSxDQUFBO3FCQUNaO2dCQUVILENBQUM7Z0JBRUQsS0FBSyxDQUFDLEVBQU07b0JBRVYsSUFBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFDO3dCQUV4QixFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7d0JBRXhELEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLDZCQUE2QixDQUFDLEdBQUcsTUFBTSxDQUFBO3dCQUUvRCxJQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUM7NEJBRXZCLEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQzs0QkFFeEQsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsNEJBQTRCLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFBO3lCQUU5RTt3QkFFRCxJQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUM7NEJBRXZCLEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQzs0QkFFeEQsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsNEJBQTRCLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFBO3lCQUU5RTtxQkFFRjtvQkFFRCxPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDO2dCQUVELFFBQVE7b0JBRU4sT0FBTyxnQ0FBZ0MsQ0FBQztnQkFFMUMsQ0FBQzthQUNGLENBQUMsQ0FBQTtJQUNKLENBQUM7O0FBdEdILDhDQXVHQztBQW5HUSxpQ0FBZSxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5pdGlhbGl6ZXJQYXRjaGVzIH0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCBjb21tb24gZnJvbSBcImNhdGFsb2dfY29tbW9uXCI7XG5cbmltcG9ydCB7IGhlbHBlckNUWCB9IGZyb20gJy4uL3BhdGNoZXMnO1xuXG5jb25zdCBQRVJJT0RfVkFMSURBVE9SID0gbmV3IFJlZ0V4cCgvXlxcZCtbc21oZF0kLylcblxuZXhwb3J0IGNsYXNzIFN5bmNlckluaXRpYWxpemVyIGV4dGVuZHMgSW5pdGlhbGl6ZXJQYXRjaGVzIHtcblxuICBhcHBsaWNhYmxlUHJvdmlkZXJzID0gW1wiXmNhdGFsb2dcIl1cblxuICBzdGF0aWMgYXBwbGljYWJsZUtpbmRzID0gW1wiQ29tcG9uZW50Q2xhaW1cIiwgXCJHcm91cENsYWltXCIsIFwiVXNlckNsYWltXCIsIFwiVEZXb3Jrc3BhY2VDbGFpbVwiXVxuXG4gIGFzeW5jIF9fdmFsaWRhdGUoKXsgcmV0dXJuIHRydWU7IH1cblxuICBhc3luYyBfX3BhdGNoZXMoY2xhaW06IGFueSwgX3ByZXZpb3VzQ1I6IGFueSl7XG5cbiAgICBmdW5jdGlvbiBzeW5jSW5mbyhjdHg6YW55KXtcblxuICAgICAgY29uc3QgcHJvdmlkZXI6c3RyaW5nID0gaGVscGVyQ1RYKGN0eCkucHJvdmlkZXJcblxuICAgICAgcmV0dXJuIGNsYWltLnByb3ZpZGVyc1twcm92aWRlcl0uc3luYyB8fCB7fVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIFt7XG5cbiAgICAgIHZhbGlkYXRlKGNyOmFueSl7XG5cbiAgICAgICAgaWYoY3IubWV0YWRhdGEuYW5ub3RhdGlvbnMgJiYgXG4gICAgICAgICAgXG4gICAgICAgICAgY3IubWV0YWRhdGEuYW5ub3RhdGlvbnNbXCJmaXJlc3RhcnRyLmRldi9zeW5jLXBvbGljeVwiXSAmJlxuICAgICAgICAgIFxuICAgICAgICAgIGNyLm1ldGFkYXRhLmFubm90YXRpb25zW1wiZmlyZXN0YXJ0ci5kZXYvcG9saWN5XCJdIFxuICAgICAgICBcbiAgICAgICAgKXtcblxuICAgICAgICAgIGNvbnN0IHBvbGljeSA9IGNyLm1ldGFkYXRhLmFubm90YXRpb25zW1wiZmlyZXN0YXJ0ci5kZXYvcG9saWN5XCJdXG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3Qgc3luY1BvbGljeSA9IGNyLm1ldGFkYXRhLmFubm90YXRpb25zW1wiZmlyZXN0YXJ0ci5kZXYvc3luYy1wb2xpY3lcIl1cblxuICAgICAgICAgIGNvbnN0IHBvbGljaWVzQXJlQ29tcGF0aWJsZSA9IGNvbW1vbi5wb2xpY2llcy5wb2xpY2llc0FyZUNvbXBhdGlibGUoXG5cbiAgICAgICAgICAgIHN5bmNQb2xpY3ksXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHBvbGljeVxuXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgaWYoIXBvbGljaWVzQXJlQ29tcGF0aWJsZSl7XG5cbiAgICAgICAgICAgIHRocm93IGAke3RoaXMuaWRlbnRpZnkoKX06IGluY29tcGF0aWJsZSBwb2xpY2llcyAnJHtwb2xpY3l9JyBhbmQgJyR7c3luY1BvbGljeX0nIGZvciAke2NyLmtpbmR9LyR7Y3IubWV0YWRhdGEubmFtZX1gXG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGNyLm1ldGFkYXRhLmFubm90YXRpb25zICYmIGNyLm1ldGFkYXRhLmFubm90YXRpb25zW1wiZmlyZXN0YXJ0ci5kZXYvc3luYy1wZXJpb2RcIl0pe1xuXG4gICAgICAgICAgaWYoIVBFUklPRF9WQUxJREFUT1IudGVzdChjci5tZXRhZGF0YS5hbm5vdGF0aW9uc1tcImZpcmVzdGFydHIuZGV2L3N5bmMtcGVyaW9kXCJdKSl7XG5cbiAgICAgICAgICAgIHRocm93IGAke3RoaXMuaWRlbnRpZnkoKX06IHBlcmlvZCBpbmNvcnJlY3QgXCIke2NyLm1ldGFkYXRhLmFubm90YXRpb25zW1wiZmlyZXN0YXJ0ci5kZXYvc3luYy1wZXJpb2RcIl19XCIgZm9yICR7Y3Iua2luZH0vJHtjci5tZXRhZGF0YS5uYW1lfWBcblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcblxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgfSxcblxuICAgICAgYXBwbHkoY3I6YW55KXtcblxuICAgICAgICBpZihzeW5jSW5mbyh0aGlzKS5lbmFibGVkKXtcblxuICAgICAgICAgIGNyLm1ldGFkYXRhLmFubm90YXRpb25zID0gY3IubWV0YWRhdGEuYW5ub3RhdGlvbnMgfHwge307XG5cbiAgICAgICAgICBjci5tZXRhZGF0YS5hbm5vdGF0aW9uc1tcImZpcmVzdGFydHIuZGV2L3N5bmMtZW5hYmxlZFwiXSA9IFwidHJ1ZVwiXG5cbiAgICAgICAgICBpZihzeW5jSW5mbyh0aGlzKS5wZXJpb2Qpe1xuXG4gICAgICAgICAgICBjci5tZXRhZGF0YS5hbm5vdGF0aW9ucyA9IGNyLm1ldGFkYXRhLmFubm90YXRpb25zIHx8IHt9O1xuXG4gICAgICAgICAgICBjci5tZXRhZGF0YS5hbm5vdGF0aW9uc1tcImZpcmVzdGFydHIuZGV2L3N5bmMtcGVyaW9kXCJdID0gc3luY0luZm8odGhpcykucGVyaW9kXG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZihzeW5jSW5mbyh0aGlzKS5wb2xpY3kpe1xuXG4gICAgICAgICAgICBjci5tZXRhZGF0YS5hbm5vdGF0aW9ucyA9IGNyLm1ldGFkYXRhLmFubm90YXRpb25zIHx8IHt9O1xuXG4gICAgICAgICAgICBjci5tZXRhZGF0YS5hbm5vdGF0aW9uc1tcImZpcmVzdGFydHIuZGV2L3N5bmMtcG9saWN5XCJdID0gc3luY0luZm8odGhpcykucG9saWN5XG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjcjtcbiAgICAgIH0sXG5cbiAgICAgIGlkZW50aWZ5KCl7XG5cbiAgICAgICAgcmV0dXJuIFwiaW5pdGlhbGl6ZXJzL1N5bmNlckluaXRpYWxpemVyXCI7XG5cbiAgICAgIH1cbiAgICB9XVxuICB9XG59XG5cbiJdfQ==
233822
233966
 
233823
233967
  /***/ }),
233824
233968
 
@@ -235333,6 +235477,7 @@ const crawler_1 = __nccwpck_require__(26675);
235333
235477
  const fs_1 = __importDefault(__nccwpck_require__(57147));
235334
235478
  const path_1 = __importDefault(__nccwpck_require__(71017));
235335
235479
  const catalog_common_1 = __importDefault(__nccwpck_require__(74100));
235480
+ const github_1 = __importDefault(__nccwpck_require__(39759));
235336
235481
  const CLAIM_REF_ANNOTATION = "firestartr.dev/claim-ref";
235337
235482
  const log = (0, debug_1.default)("firestartr:renderer");
235338
235483
  /*
@@ -235390,7 +235535,21 @@ exports.render = render;
235390
235535
  * Function called when rendering Terraform workspaces Plans
235391
235536
  * based on the previous renderer Terraform workspaces
235392
235537
  */
235393
- async function renderWorkspacePlans(source, destiny, prLink, sha) {
235538
+ async function renderWorkspacePlans(source, destiny, prLink, sha, ghCli = github_1.default) {
235539
+ const [orgRepo, prNumber] = prLink.split("#");
235540
+ const [org, repo] = orgRepo.split("/");
235541
+ const { data: files } = await ghCli.pulls.getPrFiles(parseInt(prNumber), repo, org);
235542
+ if (files && files.length > 0 && files[0].status == "removed") {
235543
+ const content = await ghCli.repo.getContent(files[0].filename, repo, org);
235544
+ const workspace = catalog_common_1.default.io.fromYaml(content);
235545
+ workspace.kind = "FirestartrTerraformWorkspacePlan";
235546
+ workspace.metadata.annotations = Object.assign(Object.assign({}, workspace.metadata.annotations), { [catalog_common_1.default.generic.getFirestartrAnnotation("pull-request-plan")]: prLink, [catalog_common_1.default.generic.getFirestartrAnnotation("plan-sha")]: sha });
235547
+ workspace.metadata.annotations[catalog_common_1.default.generic.getFirestartrAnnotation("policy")] = "destroy";
235548
+ const workspacePlan = catalog_common_1.default.io.toYaml(Object.assign({}, workspace), { quotingType: '"', lineWidth: -1 });
235549
+ const fileName = path_1.default.join(destiny, path_1.default.basename(files[0].filename));
235550
+ fs_1.default.writeFileSync(fileName, workspacePlan);
235551
+ return;
235552
+ }
235394
235553
  // Iterate over the source folder and get the list of Terraform workspaces
235395
235554
  await (0, crawler_1.crawl)(source, () => true, (entry, data) => {
235396
235555
  const fileName = path_1.default.join(destiny, path_1.default.basename(entry));
@@ -235582,7 +235741,7 @@ function getPreviousCRfromClaim(claim, previousCRs) {
235582
235741
  function isExcludedFromPreviousCR(crKind) {
235583
235742
  return ["FirestartrGithubRepositoryFeature"].includes(crKind);
235584
235743
  }
235585
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxxQ0FBa0Q7QUFDbEQsaURBQWtDO0FBQ2xDLGtEQUEwQjtBQUUxQixpQ0FBdUQ7QUFFdkQscUVBQTBFO0FBRzFFLHlEQUF1SDtBQUN2SCwrQ0FBa0Q7QUFDbEQscUNBQW1FO0FBRW5FLHdEQUFpRTtBQUNqRSx1Q0FBa0M7QUFDbEMsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4QixvRUFBb0M7QUFDcEMsTUFBTSxvQkFBb0IsR0FBRywwQkFBMEIsQ0FBQTtBQUd2RCxNQUFNLEdBQUcsR0FBRyxJQUFBLGVBQUssRUFBQyxxQkFBcUIsQ0FBQyxDQUFBO0FBcUN4Qzs7Ozs7Ozs7Ozs7R0FXRztBQUNJLEtBQUssVUFBVSxpQkFBaUIsQ0FFckMsWUFBMEIsRUFFMUIsTUFBVyxFQUFFLEVBRWIsbUJBQTJCLGVBQWUsRUFFMUMsY0FBc0IsaUJBQWlCO0lBSXZDLE1BQU0sWUFBWSxHQUFHLElBQUksV0FBRyxDQUFDO1FBRTNCLE1BQU0sRUFBRSxnQkFBZ0I7UUFFeEIsbUJBQW1CLEVBQUUsT0FBTztRQUU1QixjQUFjLEVBQUUsc0JBQWMsQ0FBQyxpQkFBaUI7S0FFakQsQ0FBQyxDQUFBO0lBRUYsTUFBTSxlQUFlLEdBQUcsSUFBSSxXQUFHLENBQUM7UUFFOUIsTUFBTSxFQUFFLFdBQVc7UUFFbkIsbUJBQW1CLEVBQUUsT0FBTztRQUU1QixjQUFjLEVBQUUsc0JBQWMsQ0FBQyxpQkFBaUI7S0FFakQsQ0FBQyxDQUFBO0lBRUYsTUFBTSxNQUFNLEdBQVEsTUFBTSxhQUFhLENBRXJDLFlBQVksRUFFWixlQUFlLEVBRWY7UUFDRSxZQUFZO1FBRVosR0FBRztRQUVILE9BQU8sRUFBRSxFQUFFO0tBQ1osQ0FDRixDQUFBO0lBRUQsZUFBZSxDQUFDLEtBQUssRUFBRSxD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QWEsSUFBSSxlQUFlLEVBQUM7UUFFekMsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRTdDLElBQUcsSUFBQSw0QkFBZSxFQUFDLFVBQVUsQ0FBQztZQUFFLFNBQVE7UUFFeEMsSUFBRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQUUsU0FBUTtRQUV0RCxJQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBQztZQUV6RixPQUFPLFVBQVUsQ0FBQTtTQUVsQjtLQUVGO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFFZCxDQUFDO0FBR0QsU0FBUyx3QkFBd0IsQ0FBQyxNQUFjO0lBRzlDLE9BQU8sQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUcvRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IElSZW5hbWVSZXN1bHQsIGxvYWRBbGwgfSBmcm9tIFwiLi9sb2FkZXJcIjtcbmltcG9ydCAqIGFzIGNoYXJ0cyBmcm9tIFwiLi9jaGFydHNcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiO1xuaW1wb3J0IHsgQmFzZUNoYXJ0IH0gZnJvbSBcIi4vY2hhcnRzL2Jhc2VcIjtcbmltcG9ydCB7IEFwaU9iamVjdCwgQXBwLCBZYW1sT3V0cHV0VHlwZSB9IGZyb20gXCJjZGs4c1wiO1xuaW1wb3J0IHsgR2xvYmFsU2VjdGlvbiB9IGZyb20gXCIuL2dsb2JhbHMvYmFzZVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVGZWF0dXJlc1BhdGNoZXMgfSBmcm9tIFwiLi9jaGFydHMvZ2l0aHViL2ZlYXR1cmVSZW5kZXJlclwiO1xuaW1wb3J0IHsgT3ZlcnJpZGVyUGF0Y2hlcyB9IGZyb20gXCIuL292ZXJyaWRlcnMvYmFzZVwiO1xuaW1wb3J0IHsgSUN1c3RvbVJlc291cmNlUGF0Y2ggfSBmcm9tIFwiLi9wYXRjaGVzXCI7XG5pbXBvcnQgeyBpc0NhdGFsb2dFbnRpdHksIHZhbGlkYXRlUmVmZXJlbnRpYWxJbnRlZ3JpdHksIHZhbGlkYXRlVGZTdGF0ZUtleVVuaXF1ZW5lc3MgfSBmcm9tIFwiLi92YWxpZGF0aW9ucy9yZWZlcmVuY2VzXCI7XG5pbXBvcnQgeyAgc2V0UmVuZGVyZWRDbGFpbSB9IGZyb20gXCIuL3JlZnJlc29sdmVyXCI7XG5pbXBvcnQgeyBBbGxvd2VkUHJvdmlkZXJzLCBnZXRDb25maWd1cmVkUHJvdmlkZXIgfSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB7IE5vcm1hbGl6ZXIgfSBmcm9tIFwiLi9ub3JtYWxpemVycy9iYXNlXCI7XG5pbXBvcnQgeyBzb3J0UmVuZGVyQ2xhaW1zQnlLaW5kIH0gZnJvbSBcIi4vcmVmc1NvcnRlci9yZWZzU29ydGVyXCI7XG5pbXBvcnQgeyBjcmF3bCB9IGZyb20gXCIuL2NyYXdsZXJcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgY29tbW9uIGZyb20gXCJjYXRhbG9nX2NvbW1vblwiO1xuY29uc3QgQ0xBSU1fUkVGX0FOTk9UQVRJT04gPSBcImZpcmVzdGFydHIuZGV2L2NsYWltLXJlZlwiXG5cblxuY29uc3QgbG9nID0gRGVidWcoXCJmaXJlc3RhcnRyOnJlbmRlcmVyXCIpXG5cbmV4cG9ydCB0eXBlIFJlbmRlckNsYWltRGF0YSA9IHtcblxuICBjbGFpbTogYW55XG5cbiAgY2xhaW1QYXRoPzogc3RyaW5nXG5cbiAgaW5pdGlhbGl6ZXJzOiBhbnkgW11cblxuICBvdmVycmlkZXM6IE92ZXJyaWRlclBhdGNoZXNbXVxuXG4gIGdsb2JhbHM6IEdsb2JhbFNlY3Rpb25bXSxcblxuICBub3JtYWxpemVyczogTm9ybWFsaXplcltdXG5cbn1cblxudHlwZSBDbGFpbUtpbmQgPSBzdHJpbmc7XG50eXBlIENsYWltTmFtZSA9IHN0cmluZztcbmV4cG9ydCB0eXBlIFJlbmRlckNsYWltS2V5ID0gYCR7Q2xhaW1LaW5kfS0ke0NsYWltTmFtZX1gXG5cbnR5cGUgQ1JLaW5kID0gc3RyaW5nO1xudHlwZSBDUk5hbWUgPSBzdHJpbmc7XG50eXBlIFJlbmRlckNSS2V5ID0gYCR7Q1JLaW5kfS0ke0NSTmFtZX1gXG5cbmV4cG9ydCB0eXBlIFJlbmRlcmVkQ3JNYXAgPSB7XG5cbiAgW2tleTogUmVuZGVyQ1JLZXldOiBBcGlPYmplY3Rcbn1cblxuZXhwb3J0IHR5cGUgUmVuZGVyQ2xhaW1zID0ge1xuXG4gIFtrZXk6IFJlbmRlckNsYWltS2V5XTogUmVuZGVyQ2xhaW1EYXRhXG5cbn1cblxuLypcbiAqIEZ1bmN0aW9uIGNhbGxlZCB3aGVuIHJlbmRlcmluZyBmcm9tIHRoZSBpbXBvcnRlciBjbGFzcy5cbiAqXG4gKiBJbnB1dDpcbiAqIC0gcmVuZGVyQ2xhaW1zOiBhIFJlbmRlckNsYWltcyBvYmplY3QsIHdoaWNoIGNvbnRhaW5zIHRoZSBsaXN0IG9mIGNsYWltc1xuICogICB3ZSB3YW50IHRvIHJlbmRlclxuICpcbiAqIFJldHVybjpcbiAqIC0gVGhlIHJlc3VsdCBvZiByZW5kZXJpbmcgdGhlIHJlbmRlckNsYWltcyBvYmplY3QsIHBsdXMgdGhlXG4gKiAgIHJlbmRlcmVkIGZpcmVzdGFydHItYWxsIGdyb3VwXG4gKlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyRnJvbUltcG9ydHMoXG5cbiAgcmVuZGVyQ2xhaW1zOiBSZW5kZXJDbGFpbXMsXG5cbiAgY3JzOiBhbnkgPSB7fSxcblxuICBjYXRhbG9nT3V0cHV0RGlyOiBzdHJpbmcgPSBcIi90bXAvLmNhdGFsb2dcIixcblxuICBjck91dHB1dERpcjogc3RyaW5nID0gXCIvdG1wLy5yZXNvdXJjZXNcIixcblxuKSB7XG5cbiAgY29uc3QgY2F0YWxvZ1Njb3BlID0gbmV3IEFwcCh7XG5cbiAgICBvdXRkaXI6IGNhdGFsb2dPdXRwdXREaXIsXG5cbiAgICBvdXRwdXRGaWxlRXh0ZW5zaW9uOiBcIi55YW1sXCIsXG5cbiAgICB5YW1sT3V0cHV0VHlwZTogWWFtbE91dHB1dFR5cGUuRklMRV9QRVJfUkVTT1VSQ0UsXG5cbiAgfSlcblxuICBjb25zdCBmaXJlc3RhcnRyU2NvcGUgPSBuZXcgQXBwKHtcblxuICAgIG91dGRpcjogY3JPdXRwdXREaXIsXG5cbiAgICBvdXRwdXRGaWxlRXh0ZW5zaW9uOiBcIi55YW1sXCIsXG5cbiAgICB5YW1sT3V0cHV0VHlwZTogWWFtbE91dHB1dFR5cGUuRklMRV9QRVJfUkVTT1VSQ0UsXG5cbiAgfSlcblxuICBjb25zdCByZXN1bHQ6IGFueSA9IGF3YWl0IGZSZW5kZXJDbGFpbXMoXG5cbiAgICBjYXRhbG9nU2NvcGUsXG5cbiAgICBmaXJlc3RhcnRyU2NvcGUsXG5cbiAgICB7XG4gICAgICByZW5kZXJDbGFpbXMsXG5cbiAgICAgIGNycyxcblxuICAgICAgcmVuYW1lczogW11cbiAgICB9LFxuICApXG5cbiAgZmlyZXN0YXJ0clNjb3BlLnN5bnRoKClcblxuICByZXR1cm4gcmVzdWx0XG5cbn1cblxuXG4vKlxuICogRnVuY3Rpb24gY2FsbGVkIHdoZW4gcmVuZGVyaW5nIGJ1dCBub3QgaW1wb3J0aW5nXG4gKlxuICogSW5wdXQ6XG4gKiAtIHNjb3BlOiBhbiBvYmplY3QsIHVzZWQgdG8gcmVwcmVzZW50IENES1RGJ3MgZXhlY3V0aW9uIHNjb3BlXG4gKlxuICogUmV0dXJuOlxuICogLSBUaGUgcmVzdWx0IG9mIHJlbmRlcmluZyB0aGUgcmVuZGVyQ2xhaW1zIG9iamVjdCwgcGx1cyB0aGVcbiAqICAgcmVuZGVyZWQgZmlyZXN0YXJ0ci1hbGwgZ3JvdXBcbiAqXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXIoXG5cbiAgY2F0YWxvZ1Njb3BlOiBDb25zdHJ1Y3QsXG5cbiAgZmlyZXN0YXJ0clNjb3BlOiBDb25zdHJ1Y3QsXG5cbiAgKTogUHJvbWlzZTxSZW5kZXJlZENyTWFwPiB7XG5cbiAgY29uc3QgZGF0YToge1xuXG4gICAgcmVuZGVyQ2xhaW1zOiBSZW5kZXJDbGFpbXMsXG5cbiAgICBjcnM6IGFueSxcblxuICAgIHJlbmFtZXM/OiBJUmVuYW1lUmVzdWx0W11cblxuICB9ID0gYXdhaXQgbG9hZEFsbCgpXG5cbiAgY29uc3QgcmVzdWx0OiBhbnkgPSBhd2FpdCBmUmVuZGVyQ2xhaW1zKGNhdGFsb2dTY29wZSwgZmlyZXN0YXJ0clNjb3BlLCBkYXRhKVxuXG4gIHZhbGlkYXRlUmVmZXJlbnRpYWxJbnRlZ3JpdHkocmVzdWx0KVxuXG4gIHZhbGlkYXRlVGZTdGF0ZUtleVVuaXF1ZW5lc3MocmVzdWx0KVxuXG4gIHJldHVybiByZXN1bHRcblxufVxuXG4vKlxuICogRnVuY3Rpb24gY2FsbGVkIHdoZW4gcmVuZGVyaW5nIFRlcnJhZm9ybSB3b3Jrc3BhY2VzIFBsYW5zXG4gKiBiYXNlZCBvbiB0aGUgcHJldmlvdXMgcmVuZGVyZXIgVGVycmFmb3JtIHdvcmtzcGFjZXNcbiovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyV29ya3NwYWNlUGxhbnMoc291cmNlOiBzdHJpbmcsIGRlc3Rpbnk6IHN0cmluZywgcHJMaW5rOiBzdHJpbmcsIHNoYTogc3RyaW5nKSB7XG5cbiAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBzb3VyY2UgZm9sZGVyIGFuZCBnZXQgdGhlIGxpc3Qgb2YgVGVycmFmb3JtIHdvcmtzcGFjZXNcblxuICBhd2FpdCBjcmF3bChzb3VyY2UsICgpID0+IHRydWUsIChlbnRyeTogc3RyaW5nLCBkYXRhOiBhbnkpID0+IHtcblxuICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5qb2luKGRlc3RpbnksIHBhdGguYmFzZW5hbWUoZW50cnkpKVxuXG4gICAgY29uc3Qgd29ya3NwYWNlOiBhbnkgPSBjb21tb24uaW8uZnJvbVlhbWwoZGF0YSlcblxuICAgIHdvcmtzcGFjZS5raW5kID0gXCJGaXJlc3RhcnRyVGVycmFmb3JtV29ya3NwYWNlUGxhblwiXG4gICAgd29ya3NwYWNlLm1ldGFkYXRhLmFubm90YXRpb25zID0ge1xuICAgICAgLi4ud29ya3NwYWNlLm1ldGFkYXRhLmFubm90YXRpb25zLFxuICAgICAgW2NvbW1vbi5nZW5lcmljLmdldEZpcmVzdGFydHJBbm5vdGF0aW9uKFwicHVsbC1yZXF1ZXN0LXBsYW5cIildOiBwckxpbmssXG4gICAgICBbY29tbW9uLmdlbmVyaWMuZ2V0RmlyZXN0YXJ0ckFubm90YXRpb24oXCJwbGFuLXNoYVwiKV06IHNoYVxuICAgIH1cblxuICAgIGNvbnN0IHdvcmtzcGFjZVBsYW4gPSBjb21tb24uaW8udG9ZYW1sKHtcbiAgICAgIC4uLndvcmtzcGFjZVxuICAgIH0sIHsgcXVvdGluZ1R5cGU6ICdcIicsIGxpbmVXaWR0aDogLTEgfSlcblxuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZU5hbWUsIHdvcmtzcGFjZVBsYW4pXG5cbiAgfSlcblxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkTGFzdFN0YXRlQW5kTGFzdENsYWltQW5ub3RhdGlvbnMoXG4gIGZpbGVQYXRoOiBzdHJpbmcsIGxhc3RTdGF0ZVBSTGluazogc3RyaW5nLCBsYXN0Q2xhaW1QUkxpbms6IHN0cmluZ1xuKSB7XG5cbiAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBzb3VyY2UgZm9sZGVyIGFuZCBnZXQgdGhlIGxpc3Qgb2YgVGVycmFmb3JtIHdvcmtzcGFjZXNcblxuICBjb25zdCB3b3Jrc3BhY2U6IGFueSA9IGNvbW1vbi5pby5mcm9tWWFtbChmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmLThcIikpO1xuXG4gIGNvbnN0IHN0YXRlTGlua0FzQXJyYXk6IHN0cmluZ1tdID0gbGFzdFN0YXRlUFJMaW5rLnNwbGl0KFwiL1wiKTtcbiAgY29uc3Qgc3RhdGVBbm5vdGF0aW9uVmFsdWU6IHN0cmluZyA9IGAke3N0YXRlTGlua0FzQXJyYXlbM119LyR7c3RhdGVMaW5rQXNBcnJheVs0XX0jJHtzdGF0ZUxpbmtBc0FycmF5WzZdfWBcblxuICBjb25zdCBjbGFpbUxpbmtBc0FycmF5OiBzdHJpbmdbXSA9IGxhc3RDbGFpbVBSTGluay5zcGxpdChcIi9cIik7XG4gIGNvbnN0IGNsYWltQW5ub3RhdGlvblZhbHVlOiBzdHJpbmcgPSBgJHtjbGFpbUxpbmtBc0FycmF5WzNdfS8ke2NsYWltTGlua0FzQXJyYXlbNF19IyR7Y2xhaW1MaW5rQXNBcnJheVs2XX1gXG5cbiAgd29ya3NwYWNlLm1ldGFkYXRhLmFubm90YXRpb25zID0ge1xuICAgIC4uLndvcmtzcGFjZS5tZXRhZGF0YS5hbm5vdGF0aW9ucyxcbiAgICBbY29tbW9uLmdlbmVyaWMuZ2V0RmlyZXN0YXJ0ckFubm90YXRpb24oXCJsYXN0LXN0YXRlLXByXCIpXTogc3RhdGVBbm5vdGF0aW9uVmFsdWUsXG4gICAgW2NvbW1vbi5nZW5lcmljLmdldEZpcmVzdGFydHJBbm5vdGF0aW9uKFwibGFzdC1jbGFpbS1wclwiKV06IGNsYWltQW5ub3RhdGlvblZhbHVlXG4gIH1cblxuICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBjb21tb24uaW8udG9ZYW1sKFxuICAgIHsgLi4ud29ya3NwYWNlIH0sIHsgcXVvdGluZ1R5cGU6ICdcIicsIGxpbmVXaWR0aDogLTEgfVxuICApKVxuXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZSZW5kZXJDbGFpbXMoXG5cbiAgY2F0YWxvZ1Njb3BlOiBDb25zdHJ1Y3QsXG5cbiAgZmlyZXN0YXJ0clNjb3BlOiBDb25zdHJ1Y3QsXG5cbiAgZGF0YToge1xuXG4gICAgcmVuZGVyQ2xhaW1zOiBSZW5kZXJDbGFpbXMsXG5cbiAgICBjcnM6IGFueSxcblxuICAgIHJlbmFtZXM/OiBJUmVuYW1lUmVzdWx0W11cblxuICB9LFxuXG4pOiBQcm9taXNlPFJlbmRlcmVkQ3JNYXA+IHtcblxuICBjb25zdCByZXN1bHQ6IFJlbmRlcmVkQ3JNYXAgPSB7fVxuXG4gIGNvbnN0IHsgcmVuZGVyQ2xhaW1zLCBjcnMgfSA9IGRhdGFcblxuICBjb25zdCBzb3J0ZWRLaW5kcyA9IHNvcnRLaW5kcyhbXCJVc2VyQ2xhaW1cIiwgXCJHcm91cENsYWltXCIsIFwiQ29tcG9uZW50Q2xhaW1cIiwgXCJEb21haW5DbGFpbVwiLCBcIlN5c3RlbUNsYWltXCIsIFwiVEZXb3Jrc3BhY2VDbGFpbVwiLCBcIkFyZ29EZXBsb3lDbGFpbVwiXSwgcmVuZGVyQ2xhaW1zKVxuXG4gIGZvciAoY29uc3QgcmVuZGVyQ2xhaW1zIG9mIHNvcnRlZEtpbmRzKSB7XG5cbiAgICBmb3IgKGNvbnN0IGNsYWltS2V5IG9mIE9iamVjdC5rZXlzKHJlbmRlckNsYWltcykpIHtcblxuICAgICAgY29uc3QgY2xhaW0gPSByZW5kZXJDbGFpbXNbY2xhaW1LZXkgYXMgUmVuZGVyQ2xhaW1LZXldLmNsYWltXG5cbiAgICAgIGNvbnN0IGNvbmZpZ3VyZWRQcm92aWRlciA9IGdldENvbmZpZ3VyZWRQcm92aWRlcigpLnRvU3RyaW5nKClcblxuICAgICAgbGV0IHByb3ZpZGVycyA9IE9iamVjdC5rZXlzKGNsYWltLnByb3ZpZGVycylcblxuICAgICAgaWYoY29uZmlndXJlZFByb3ZpZGVyICE9IEFsbG93ZWRQcm92aWRlcnMuYWxsLnRvU3RyaW5nKCkpe1xuXG4gICAgICAgIHByb3ZpZGVycyA9IHByb3ZpZGVycy5maWx0ZXIoXG5cbiAgICAgICAgICAocHJvdmlkZXI6IHN0cmluZykgPT4gcHJvdmlkZXIgPT09IGNvbmZpZ3VyZWRQcm92aWRlclxuXG4gICAgICAgIClcblxuICAgICAgfVxuXG5cbiAgICAgIGNvbnN0IHByZXZpb3VzQ1IgPSBnZXRQcmV2aW91c0NSZnJvbUNsYWltKGNsYWltLCBjcnMpXG5cbiAgICAgIGNvbnN0IHBhdGNoZXMgPSBhd2FpdCBleHRyYWN0UGF0Y2hlcyhyZW5kZXJDbGFpbXNbY2xhaW1LZXkgYXMgUmVuZGVyQ2xhaW1LZXldLCBwcmV2aW91c0NSKVxuXG4gICAgICBpZiAoIXByZXZpb3VzQ1IpIHtcblxuICAgICAgICBsb2coYE5vIENSIGZvdW5kIGZvciBjbGFpbSAke2NsYWltS2V5fSwgaXQgd2lsbCBiZSByZW5kZXJlZCBmcm9tIHNjcmF0Y2hgKVxuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtmaXJlc3RhcnRyRW50aXR5LCBleHRyYUNoYXJ0cywgY2F0YWxvZ0VudGl0eX0gID0gYXdhaXQgcmVuZGVyQ2xhaW0oXG5cbiAgICAgICAgY2F0YWxvZ1Njb3BlLFxuXG4gICAgICAgIGZpcmVzdGFydHJTY29wZSxcblxuICAgICAgICBjbGFpbSxcblxuICAgICAgICBwYXRjaGVzLFxuXG4gICAgICAgIHByZXZpb3VzQ1IsXG5cbiAgICAgIClcblxuICAgICAgaWYoY2F0YWxvZ0VudGl0eSkge1xuXG4gICAgICAgIHJlc3VsdFtgJHtjYXRhbG9nRW50aXR5LmtpbmR9LSR7Y2F0YWxvZ0VudGl0eS5tZXRhZGF0YS5uYW1lfWBdID0gY2F0YWxvZ0VudGl0eS50b0pzb24oKVxuICAgICAgXG4gICAgICB9XG5cbiAgICAgIC8qKlxuXG4gICAgICAqIElmIHRoZXJlIGlzIG5vIHByb3ZpZGVyIGRvbid0IHN0b3JlIHRoZSBDUiBpbiB0aGUgbWFwXG5cbiAgICAgICovXG5cbiAgICAgIGlmICghZmlyZXN0YXJ0ckVudGl0eSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGZpcmVzdGFydHJFbnRpdHlKc29uID0gZmlyZXN0YXJ0ckVudGl0eS50b0pzb24oKVxuXG4gICAgICBzZXRSZW5kZXJlZENsYWltKGNsYWltLCBmaXJlc3RhcnRyRW50aXR5SnNvbilcblxuICAgICAgZm9yKGNvbnN0IGV4dHJhQ2hhcnQgb2YgZXh0cmFDaGFydHMpe1xuXG4gICAgICAgIGNvbnN0IHtjbGFpbSwgY2hhcnR9ID0gZXh0cmFDaGFydFxuXG4gICAgICAgIHNldFJlbmRlcmVkQ2xhaW0oY2xhaW0sIGNoYXJ0LnRvSnNvbigpKVxuXG4gICAgICAgIHJlc3VsdFtgJHtjaGFydC5raW5kfS0ke2NoYXJ0Lm1ldGFkYXRhLm5hbWV9YF0gPSBjaGFydC50b0pzb24oKVxuXG4gICAgICB9XG5cbiAgICAgIGlmKCFmaXJlc3RhcnRyRW50aXR5SnNvbi5tZXRhZGF0YS5hbm5vdGF0aW9ucyB8fCAhZmlyZXN0YXJ0ckVudGl0eUpzb24ubWV0YWRhdGEubmFtZSkgdGhyb3cgZmlyZXN0YXJ0ckVudGl0eUpzb25cblxuICAgICAgcmVzdWx0W2Ake2ZpcmVzdGFydHJFbnRpdHkua2luZH0tJHtmaXJlc3RhcnRyRW50aXR5SnNvbi5tZXRhZGF0YS5uYW1lfWBdID0gZmlyZXN0YXJ0ckVudGl0eUpzb25cblxuICAgIH1cblxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxuXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RQYXRjaGVzKFxuXG4gIGNsYWltVG9SZW5kZXJEYXRhOiBSZW5kZXJDbGFpbURhdGEsIHByZXZpb3VzQ1I6IGFueVxuXG4pOiBQcm9taXNlPElDdXN0b21SZXNvdXJjZVBhdGNoW10+IHtcblxuICBsZXQgdG90YWxQYXRjaGVzOiBJQ3VzdG9tUmVzb3VyY2VQYXRjaFtdID0gW11cblxuXG4gIGZvciAoY29uc3Qgbm9ybWFsaXplciBvZiBjbGFpbVRvUmVuZGVyRGF0YS5ub3JtYWxpemVycykge1xuXG4gICAgY29uc3QgcGF0Y2hlcyA9IGF3YWl0IG5vcm1hbGl6ZXIucGF0Y2hlcyhjbGFpbVRvUmVuZGVyRGF0YVtcImNsYWltXCJdLCBwcmV2aW91c0NSKVxuXG4gICAgdG90YWxQYXRjaGVzID0gdG90YWxQYXRjaGVzLmNvbmNhdChwYXRjaGVzKS5mbGF0KClcblxuICB9XG5cbiAgZm9yIChjb25zdCBpbml0aWFsaXplciBvZiBjbGFpbVRvUmVuZGVyRGF0YS5pbml0aWFsaXplcnMpIHtcblxuICAgIGNvbnN0IHBhdGNoZXMgPSBhd2FpdCBpbml0aWFsaXplci5wYXRjaGVzKGNsYWltVG9SZW5kZXJEYXRhW1wiY2xhaW1cIl0sIHByZXZpb3VzQ1IpXG5cbiAgICB0b3RhbFBhdGNoZXMgPSB0b3RhbFBhdGNoZXMuY29uY2F0KHBhdGNoZXMpLmZsYXQoKVxuXG4gIH1cblxuICBmb3IgKGNvbnN0IG92ZXJyaWRlciBvZiBjbGFpbVRvUmVuZGVyRGF0YS5vdmVycmlkZXMpIHtcblxuICAgIGNvbnN0IHBhdGNoZXMgPSBhd2FpdCBvdmVycmlkZXIucGF0Y2hlcyhjbGFpbVRvUmVuZGVyRGF0YVtcImNsYWltXCJdLCBwcmV2aW91c0NSKVxuXG4gICAgdG90YWxQYXRjaGVzID0gdG90YWxQYXRjaGVzLmNvbmNhdChwYXRjaGVzKS5mbGF0KClcblxuICB9XG5cblxuICBpZiAoY2xhaW1Ub1JlbmRlckRhdGEuY2xhaW0ua2luZCA9PT0gXCJDb21wb25lbnRDbGFpbVwiKSB7XG5cbiAgICB0b3RhbFBhdGNoZXMgPSB0b3RhbFBhdGNoZXMuY29uY2F0KChhd2FpdCBnZW5lcmF0ZUZlYXR1cmVzUGF0Y2hlcyhjbGFpbVRvUmVuZGVyRGF0YS5jbGFpbSkpKS5mbGF0KClcblxuICB9XG5cblxuICBmb3IgKGNvbnN0IGdsb2JhbCBvZiBjbGFpbVRvUmVuZGVyRGF0YS5nbG9iYWxzKSB7XG5cbiAgICBjb25zdCBwYXRjaGVzID0gYXdhaXQgZ2xvYmFsLnBhdGNoZXMoY2xhaW1Ub1JlbmRlckRhdGEuY2xhaW0sIHByZXZpb3VzQ1IpXG5cbiAgICB0b3RhbFBhdGNoZXMgPSB0b3RhbFBhdGNoZXMuY29uY2F0KHBhdGNoZXMpLmZsYXQoKVxuXG4gIH1cblxuICByZXR1cm4gdG90YWxQYXRjaGVzXG5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUmVuZGVyQ2xhaW1SZXN1bHQge1xuICBjYXRhbG9nRW50aXR5PzogQXBpT2JqZWN0O1xuICBmaXJlc3RhcnRyRW50aXR5PzogQXBpT2JqZWN0O1xuICBleHRyYUNoYXJ0czogeyBjbGFpbToge2tpbmQ6IHN0cmluZywgbmFtZTogc3RyaW5nfSwgY2hhcnQ6IEFwaU9iamVjdH1bXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVuZGVyQ2xhaW0oXG5cbiAgY2F0YWxvZ1Njb3BlOiBDb25zdHJ1Y3QsXG5cbiAgZmlyZXN0YXJ0clNjb3BlOiBDb25zdHJ1Y3QsXG5cbiAgY2xhaW06IGFueSxcblxuICBwYXRjaGVzOiBJQ3VzdG9tUmVzb3VyY2VQYXRjaFtdLFxuXG4gIHByZXZpb3VzQ1I6IGFueSB8IG51bGwgPSBudWxsXG5cbiAgKTogUHJvbWlzZTxJUmVuZGVyQ2xhaW1SZXN1bHQ+IHtcblxuICBsZXQgY2F0YWxvZ0VudGl0eTogQmFzZUNoYXJ0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBsZXQgZmlyZXN0YXJ0ckVudGl0eTogQmFzZUNoYXJ0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGNoYXJ0SWQgPSBgJHtjbGFpbS5raW5kfS0ke2NsYWltLm5hbWV9YC50b0xvd2VyQ2FzZSgpO1xuXG4gIGxldCBmaXJlc3RhcnRySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGlmIChwcmV2aW91c0NSKSB7XG5cbiAgICBmaXJlc3RhcnRySWQgPSBwcmV2aW91c0NSPy5zcGVjPy5maXJlc3RhcnRyPy50ZlN0YXRlS2V5IHx8IG51bGw7XG5cbiAgfVxuXG4gIGNvbnN0IHJlbmRlclBhdGNoZXMgPSBwYXRjaGVzLmZpbHRlcigocGF0Y2g6IGFueSkgPT4gIXBhdGNoLmlzUG9zdFBhdGNoKVxuICBjb25zdCBwb3N0UGF0Y2hlcyA9IHBhdGNoZXMuZmlsdGVyKChwYXRjaDphbnkpID0+IHBhdGNoLmlzUG9zdFBhdGNoKVxuXG4gIGNvbnN0IHByb3ZpZGVyID0gZ2V0Q29uZmlndXJlZFByb3ZpZGVyKClcblxuICBzd2l0Y2ggKGNsYWltLmtpbmQpIHtcblxuICAgIGNhc2UgXCJEb21haW5DbGFpbVwiOlxuXG4gICAgICBjYXRhbG9nRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LkNhdGFsb2dEb21haW5DaGFydChcbiAgICAgICAgY2F0YWxvZ1Njb3BlLCBcbiAgICAgICAgYGNhdGFsb2ctJHtjaGFydElkfWAsIFxuICAgICAgICBmaXJlc3RhcnRySWQsIFxuICAgICAgICBjbGFpbSwgXG4gICAgICAgIHJlbmRlclBhdGNoZXNcbiAgICAgICk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIlN5c3RlbUNsYWltXCI6XG5cbiAgICAgIGNhdGFsb2dFbnRpdHkgPSBuZXcgY2hhcnRzLmRlZmF1bHQuQ2F0YWxvZ1N5c3RlbUNoYXJ0KFxuICAgICAgICBjYXRhbG9nU2NvcGUsIFxuICAgICAgICBgY2F0YWxvZy0ke2NoYXJ0SWR9YCwgXG4gICAgICAgIGZpcmVzdGFydHJJZCwgXG4gICAgICAgIGNsYWltLCBcbiAgICAgICAgcmVuZGVyUGF0Y2hlc1xuICAgICAgKTtcblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiR3JvdXBDbGFpbVwiOlxuXG4gICAgICBjYXRhbG9nRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LkNhdGFsb2dHcm91cENoYXJ0KGNhdGFsb2dTY29wZSwgYGNhdGFsb2ctJHtjaGFydElkfWAsIGZpcmVzdGFydHJJZCwgY2xhaW0sIHJlbmRlclBhdGNoZXMpO1xuXG4gICAgICBpZiAoY2xhaW0ucHJvdmlkZXJzLmdpdGh1YiAmJiAocHJvdmlkZXIgPT09IEFsbG93ZWRQcm92aWRlcnMuZ2l0aHViIHx8IHByb3ZpZGVyID09PSBBbGxvd2VkUHJvdmlkZXJzLmFsbCkpIHtcblxuICAgICAgICBmaXJlc3RhcnRyRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LkdpdGh1Ykdyb3VwQ2hhcnQoXG4gICAgICAgICAgZmlyZXN0YXJ0clNjb3BlLFxuICAgICAgICAgIGBnaXRodWItJHtjaGFydElkfWAsXG4gICAgICAgICAgZmlyZXN0YXJ0cklkLFxuICAgICAgICAgIGNsYWltLFxuICAgICAgICAgIHJlbmRlclBhdGNoZXNcbiAgICAgICAgKTtcblxuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJVc2VyQ2xhaW1cIjpcblxuICAgICAgY2F0YWxvZ0VudGl0eSA9IG5ldyBjaGFydHMuZGVmYXVsdC5DYXRhbG9nVXNlckNoYXJ0KGNhdGFsb2dTY29wZSwgY2hhcnRJZCwgZmlyZXN0YXJ0cklkLCBjbGFpbSwgcmVuZGVyUGF0Y2hlcyk7XG5cbiAgICAgIGlmIChjbGFpbS5wcm92aWRlcnMuZ2l0aHViICYmIChwcm92aWRlciA9PT0gQWxsb3dlZFByb3ZpZGVycy5naXRodWIgfHwgcHJvdmlkZXIgPT09IEFsbG93ZWRQcm92aWRlcnMuYWxsKSkge1xuXG4gICAgICAgIGZpcmVzdGFydHJFbnRpdHkgPSBuZXcgY2hhcnRzLmRlZmF1bHQuR2l0aHViTWVtYmVyc2hpcENoYXJ0KFxuICAgICAgICAgIGZpcmVzdGFydHJTY29wZSxcbiAgICAgICAgICBgZ2l0aHViLSR7Y2hhcnRJZH1gLFxuICAgICAgICAgIGZpcmVzdGFydHJJZCxcbiAgICAgICAgICBjbGFpbSxcbiAgICAgICAgICByZW5kZXJQYXRjaGVzXG4gICAgICAgICk7XG5cbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiQ29tcG9uZW50Q2xhaW1cIjpcblxuICAgICAgaWYgKGNsYWltLnByb3ZpZGVycy5naXRodWIgJiYgKHByb3ZpZGVyID09PSBBbGxvd2VkUHJvdmlkZXJzLmdpdGh1YiB8fCBwcm92aWRlciA9PT0gQWxsb3dlZFByb3ZpZGVycy5hbGwpKSB7XG5cbiAgICAgICAgZmlyZXN0YXJ0ckVudGl0eSA9IG5ldyBjaGFydHMuZGVmYXVsdC5HaXRodWJSZXBvc2l0b3J5Q2hhcnQoXG4gICAgICAgICAgZmlyZXN0YXJ0clNjb3BlLFxuICAgICAgICAgIGBnaXRodWItJHtjaGFydElkfWAsXG4gICAgICAgICAgZmlyZXN0YXJ0cklkLFxuICAgICAgICAgIGNsYWltLFxuICAgICAgICAgIHJlbmRlclBhdGNoZXNcbiAgICAgICAgKTtcblxuICAgICAgfVxuICAgICAgY2F0YWxvZ0VudGl0eSA9IG5ldyBjaGFydHMuZGVmYXVsdC5DYXRhbG9nQ29tcG9uZW50Q2hhcnQoXG4gICAgICAgIGNhdGFsb2dTY29wZSwgY2hhcnRJZCwgZmlyZXN0YXJ0cklkLCBjbGFpbSwgcmVuZGVyUGF0Y2hlc1xuICAgICAgKTtcblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiVEZXb3Jrc3BhY2VDbGFpbVwiOlxuXG4gICAgICBpZiAoY2xhaW0ucHJvdmlkZXJzLnRlcnJhZm9ybSAmJiAocHJvdmlkZXIgPT09IEFsbG93ZWRQcm92aWRlcnMudGVycmFmb3JtIHx8IHByb3ZpZGVyID09PSBBbGxvd2VkUHJvdmlkZXJzLmFsbCkpIHtcblxuICAgICAgICBmaXJlc3RhcnRyRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LlRGV29ya3NwYWNlQ2hhcnQoXG4gICAgICAgICAgZmlyZXN0YXJ0clNjb3BlLCBcbiAgICAgICAgICBgdGVycmFmb3JtLSR7Y2hhcnRJZH1gLCBcbiAgICAgICAgICBmaXJlc3RhcnRySWQsXG4gICAgICAgICAgY2xhaW0sXG4gICAgICAgICAgcmVuZGVyUGF0Y2hlc1xuICAgICAgICApO1xuXG4gICAgICB9XG4gICAgICBjYXRhbG9nRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LkNhdGFsb2dURldvcmtzcGFjZUNoYXJ0KFxuICAgICAgICBjYXRhbG9nU2NvcGUsIGNoYXJ0SWQsIGZpcmVzdGFydHJJZCwgY2xhaW0sIHJlbmRlclBhdGNoZXNcbiAgICAgICk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkFyZ29EZXBsb3lDbGFpbVwiOlxuXG4gICAgICBpZiAoY2xhaW0ucHJvdmlkZXJzLmFyZ29jZCAmJiAocHJvdmlkZXIgPT09IEFsbG93ZWRQcm92aWRlcnMuYXJnb2NkIHx8IHByb3ZpZGVyID09PSBBbGxvd2VkUHJvdmlkZXJzLmFsbCkpIHtcblxuICAgICAgICBmaXJlc3RhcnRyRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LkFyZ29EZXBsb3lDaGFydChcbiAgICAgICAgICBmaXJlc3RhcnRyU2NvcGUsIFxuICAgICAgICAgIGBhcmdvY2QtJHtjaGFydElkfWAsIFxuICAgICAgICAgIGZpcmVzdGFydHJJZCxcbiAgICAgICAgICBjbGFpbSxcbiAgICAgICAgICByZW5kZXJQYXRjaGVzXG4gICAgICAgICk7XG5cbiAgICAgIH1cbiAgICAgIFxuICAgICAgY2F0YWxvZ0VudGl0eSA9IG5ldyBjaGFydHMuZGVmYXVsdC5DYXRhbG9nQXJnb0RlcGxveUNoYXJ0KFxuICAgICAgICBjYXRhbG9nU2NvcGUsIGNoYXJ0SWQsIGZpcmVzdGFydHJJZCwgY2xhaW0sIHJlbmRlclBhdGNoZXNcbiAgICAgICk7XG5cbiAgICAgIGJyZWFrO1xuXG5cbiAgICBkZWZhdWx0OlxuXG4gICAgICBjb25zb2xlLmVycm9yKGBVbmtub3duIGNsYWltIGtpbmQ6ICR7Y2xhaW0ua2luZH1gKTtcblxuICAgICAgYnJlYWs7XG4gIH1cblxuICAvKipcbiAgICogVGhlcmUgaXMgdGhlIHBvc3NpYmlsaXR5IHRvIG9ubHkgcmVuZGVyIHRoZSBjYXRhbG9nIGVudGl0eSwgYnV0IG5vdCB0aGUgb3RoZXIgd2F5IGFyb3VuZFxuICAgKi9cbiAgaWYgKCFjYXRhbG9nRW50aXR5KSB7XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byByZW5kZXIgY2xhaW0gJHtjbGFpbS5raW5kfS0ke2NsYWltLm5hbWV9YCk7XG5cbiAgfVxuXG4gIC8qXG4gICAqXG4gICAqIFJlbmRlciBwaGFzZVxuICAgKlxuICAgKi9cbiAgY29uc3QgW2NhdGFsb2dDaGFydCwgZmlyZXN0YXJ0ckVudGl0eUNoYXJ0XSA9IGF3YWl0IFByb21pc2UuYWxsKFxuXG4gICAgW1xuICAgICAgcHJvdmlkZXIgPT09IEFsbG93ZWRQcm92aWRlcnMuYWxsID8gY2F0YWxvZ0VudGl0eS5yZW5kZXIoKSA6IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpLFxuXG4gICAgICBmaXJlc3RhcnRyRW50aXR5Py5yZW5kZXIoKSxcblxuICAgIF1cblxuICApXG5cbiAgLypcbiAgICpcbiAgICogUG9zdCByZW5kZXIgcGhhc2UgKGFuZCByZXR1cm4pXG4gICAqXG4gICAqL1xuICByZXR1cm4ge1xuXG4gICAgY2F0YWxvZ0VudGl0eTogY2F0YWxvZ0NoYXJ0ID8gYXdhaXQgY2F0YWxvZ0NoYXJ0LnBvc3RSZW5kZXJlcihwb3N0UGF0Y2hlcykgOiB1bmRlZmluZWQsXG5cbiAgICBmaXJlc3RhcnRyRW50aXR5OiBhd2FpdCAoZmlyZXN0YXJ0ckVudGl0eUNoYXJ0ID8gZmlyZXN0YXJ0ckVudGl0eUNoYXJ0LnBvc3RSZW5kZXJlcihwb3N0UGF0Y2hlcykgOiB1bmRlZmluZWQpLFxuXG4gICAgZXh0cmFDaGFydHM6IGF3YWl0IGZpcmVzdGFydHJFbnRpdHk/LmV4dHJhQ2hhcnRzKCkgfHwgW11cbiAgfTtcblxufVxuXG5cblxuZnVuY3Rpb24gc29ydEtpbmRzKG9yZGVyZWRLaW5kczogc3RyaW5nW10sIGNsYWltczogUmVuZGVyQ2xhaW1zKSB7XG5cbiAgY29uc3QgcmVzdWx0OiBSZW5kZXJDbGFpbXNbXSA9IFtdXG5cbiAgZm9yIChjb25zdCBraW5kIG9mIG9yZGVyZWRLaW5kcykge1xuXG4gICAgY29uc3Qga2luZFJlbmRlckNsYWltczogYW55ID0gc29ydFJlbmRlckNsYWltc0J5S2luZChjbGFpbXMsIFtraW5kXSlcblxuICAgIHJlc3VsdC5wdXNoKGtpbmRSZW5kZXJDbGFpbXMpXG5cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcblxufVxuXG5cblxuXG5cbmZ1bmN0aW9uIGdldFByZXZpb3VzQ1Jmcm9tQ2xhaW0oY2xhaW06IGFueSwgcHJldmlvdXNDUnM6IGFueSkge1xuXG4gIGNvbnN0IHByZXZpb3VzQ1JzS2V5cyA9IE9iamVjdC5rZXlzKHByZXZpb3VzQ1JzKVxuXG4gIGZvcihjb25zdCBwcmV2aW91c0NSS2V5IG9mIHByZXZpb3VzQ1JzS2V5cyl7XG5cbiAgICBjb25zdCBwcmV2aW91c0NSID0gcHJldmlvdXNDUnNbcHJldmlvdXNDUktleV1cblxuICAgIGlmKGlzQ2F0YWxvZ0VudGl0eShwcmV2aW91c0NSKSkgY29udGludWVcblxuICAgIGlmKGlzRXhjbHVkZWRGcm9tUHJldmlvdXNDUihwcmV2aW91c0NSLmtpbmQpKSBjb250aW51ZVxuXG4gICAgaWYocHJldmlvdXNDUi5tZXRhZGF0YS5hbm5vdGF0aW9uc1tDTEFJTV9SRUZfQU5OT1RBVElPTl0gPT09IGAke2NsYWltLmtpbmR9LyR7Y2xhaW0ubmFtZX1gKXtcblxuICAgICAgcmV0dXJuIHByZXZpb3VzQ1JcblxuICAgIH1cblxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG5cbn1cblxuXG5mdW5jdGlvbiBpc0V4Y2x1ZGVkRnJvbVByZXZpb3VzQ1IoY3JLaW5kOiBzdHJpbmcpe1xuXG5cbiAgcmV0dXJuIFtcIkZpcmVzdGFydHJHaXRodWJSZXBvc2l0b3J5RmVhdHVyZVwiXS5pbmNsdWRlcyhjcktpbmQpXG5cblxufVxuIl19
235744
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxxQ0FBa0Q7QUFDbEQsaURBQWtDO0FBQ2xDLGtEQUEwQjtBQUUxQixpQ0FBdUQ7QUFFdkQscUVBQTBFO0FBRzFFLHlEQUF1SDtBQUN2SCwrQ0FBa0Q7QUFDbEQscUNBQW1FO0FBRW5FLHdEQUFpRTtBQUNqRSx1Q0FBa0M7QUFDbEMsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4QixvRUFBb0M7QUFDcEMsb0RBQTRCO0FBQzVCLE1BQU0sb0JBQW9CLEdBQUcsMEJBQTBCLENBQUE7QUFHdkQsTUFBTSxHQUFHLEdBQUcsSUFBQSxlQUFLLEVBQUMscUJBQXFCLENBQUMsQ0FBQTtBQXFDeEM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSSxLQUFLLFVBQVUsaUJBQWlCLENBRXJDLFlBQTBCLEVBRTFCLE1BQVcsRUFBRSxFQUViLG1CQUEyQixlQUFlLEVBRTFDLGNBQXNCLGlCQUFpQjtJQUl2QyxNQUFNLFlBQVksR0FBRyxJQUFJLFdBQUcsQ0FBQztRQUUzQixNQUFNLEVBQUUsZ0JBQWdCO1FBRXhCLG1CQUFtQixFQUFFLE9BQU87UUFFNUIsY0FBYyxFQUFFLHNCQUFjLENBQUMsaUJBQWlCO0tBRWpELENBQUMsQ0FBQTtJQUVGLE1BQU0sZUFBZSxHQUFHLElBQUksV0FBRyxDQUFDO1FBRTlCLE1BQU0sRUFBRSxXQUFXO1FBRW5CLG1CQUFtQixFQUFFLE9BQU87UUFFNUIsY0FBYyxFQUFFLHNCQUFjLENBQUMsaUJBQWlCO0tBRWpELENBQUMsQ0FBQTtJQUVGLE1BQU0sTUFBTSxHQUFRLE1BQU0sYUFBYSxDQUVyQyxZQUFZLEVBRVosZUFBZSxFQUVmO1FBQ0UsWUFBWTtRQUVaLEdBQUc7UUFFSCxPQUFPLEVBQUUsRUFBRTtLQUNaLENBQ0YsQ0FBQTtJQUVELGVBQWUsQ0FB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RUFBRSxNQUFvQjtJQUU3RCxNQUFNLE1BQU0sR0FBbUIsRUFBRSxDQUFBO0lBRWpDLEtBQUssTUFBTSxJQUFJLElBQUksWUFBWSxFQUFFO1FBRS9CLE1BQU0sZ0JBQWdCLEdBQVEsSUFBQSxtQ0FBc0IsRUFBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBRXBFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtLQUU5QjtJQUVELE9BQU8sTUFBTSxDQUFBO0FBRWYsQ0FBQztBQU1ELFNBQVMsc0JBQXNCLENBQUMsS0FBVSxFQUFFLFdBQWdCO0lBRTFELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7SUFFaEQsS0FBSSxNQUFNLGFBQWEsSUFBSSxlQUFlLEVBQUM7UUFFekMsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRTdDLElBQUcsSUFBQSw0QkFBZSxFQUFDLFVBQVUsQ0FBQztZQUFFLFNBQVE7UUFFeEMsSUFBRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQUUsU0FBUTtRQUV0RCxJQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBQztZQUV6RixPQUFPLFVBQVUsQ0FBQTtTQUVsQjtLQUVGO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFFZCxDQUFDO0FBR0QsU0FBUyx3QkFBd0IsQ0FBQyxNQUFjO0lBRzlDLE9BQU8sQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUcvRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IElSZW5hbWVSZXN1bHQsIGxvYWRBbGwgfSBmcm9tIFwiLi9sb2FkZXJcIjtcbmltcG9ydCAqIGFzIGNoYXJ0cyBmcm9tIFwiLi9jaGFydHNcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiO1xuaW1wb3J0IHsgQmFzZUNoYXJ0IH0gZnJvbSBcIi4vY2hhcnRzL2Jhc2VcIjtcbmltcG9ydCB7IEFwaU9iamVjdCwgQXBwLCBZYW1sT3V0cHV0VHlwZSB9IGZyb20gXCJjZGs4c1wiO1xuaW1wb3J0IHsgR2xvYmFsU2VjdGlvbiB9IGZyb20gXCIuL2dsb2JhbHMvYmFzZVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVGZWF0dXJlc1BhdGNoZXMgfSBmcm9tIFwiLi9jaGFydHMvZ2l0aHViL2ZlYXR1cmVSZW5kZXJlclwiO1xuaW1wb3J0IHsgT3ZlcnJpZGVyUGF0Y2hlcyB9IGZyb20gXCIuL292ZXJyaWRlcnMvYmFzZVwiO1xuaW1wb3J0IHsgSUN1c3RvbVJlc291cmNlUGF0Y2ggfSBmcm9tIFwiLi9wYXRjaGVzXCI7XG5pbXBvcnQgeyBpc0NhdGFsb2dFbnRpdHksIHZhbGlkYXRlUmVmZXJlbnRpYWxJbnRlZ3JpdHksIHZhbGlkYXRlVGZTdGF0ZUtleVVuaXF1ZW5lc3MgfSBmcm9tIFwiLi92YWxpZGF0aW9ucy9yZWZlcmVuY2VzXCI7XG5pbXBvcnQgeyAgc2V0UmVuZGVyZWRDbGFpbSB9IGZyb20gXCIuL3JlZnJlc29sdmVyXCI7XG5pbXBvcnQgeyBBbGxvd2VkUHJvdmlkZXJzLCBnZXRDb25maWd1cmVkUHJvdmlkZXIgfSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB7IE5vcm1hbGl6ZXIgfSBmcm9tIFwiLi9ub3JtYWxpemVycy9iYXNlXCI7XG5pbXBvcnQgeyBzb3J0UmVuZGVyQ2xhaW1zQnlLaW5kIH0gZnJvbSBcIi4vcmVmc1NvcnRlci9yZWZzU29ydGVyXCI7XG5pbXBvcnQgeyBjcmF3bCB9IGZyb20gXCIuL2NyYXdsZXJcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgY29tbW9uIGZyb20gXCJjYXRhbG9nX2NvbW1vblwiO1xuaW1wb3J0IGdpdGh1YiBmcm9tIFwiZ2l0aHViXCI7XG5jb25zdCBDTEFJTV9SRUZfQU5OT1RBVElPTiA9IFwiZmlyZXN0YXJ0ci5kZXYvY2xhaW0tcmVmXCJcblxuXG5jb25zdCBsb2cgPSBEZWJ1ZyhcImZpcmVzdGFydHI6cmVuZGVyZXJcIilcblxuZXhwb3J0IHR5cGUgUmVuZGVyQ2xhaW1EYXRhID0ge1xuXG4gIGNsYWltOiBhbnlcblxuICBjbGFpbVBhdGg/OiBzdHJpbmdcblxuICBpbml0aWFsaXplcnM6IGFueSBbXVxuXG4gIG92ZXJyaWRlczogT3ZlcnJpZGVyUGF0Y2hlc1tdXG5cbiAgZ2xvYmFsczogR2xvYmFsU2VjdGlvbltdLFxuXG4gIG5vcm1hbGl6ZXJzOiBOb3JtYWxpemVyW11cblxufVxuXG50eXBlIENsYWltS2luZCA9IHN0cmluZztcbnR5cGUgQ2xhaW1OYW1lID0gc3RyaW5nO1xuZXhwb3J0IHR5cGUgUmVuZGVyQ2xhaW1LZXkgPSBgJHtDbGFpbUtpbmR9LSR7Q2xhaW1OYW1lfWBcblxudHlwZSBDUktpbmQgPSBzdHJpbmc7XG50eXBlIENSTmFtZSA9IHN0cmluZztcbnR5cGUgUmVuZGVyQ1JLZXkgPSBgJHtDUktpbmR9LSR7Q1JOYW1lfWBcblxuZXhwb3J0IHR5cGUgUmVuZGVyZWRDck1hcCA9IHtcblxuICBba2V5OiBSZW5kZXJDUktleV06IEFwaU9iamVjdFxufVxuXG5leHBvcnQgdHlwZSBSZW5kZXJDbGFpbXMgPSB7XG5cbiAgW2tleTogUmVuZGVyQ2xhaW1LZXldOiBSZW5kZXJDbGFpbURhdGFcblxufVxuXG4vKlxuICogRnVuY3Rpb24gY2FsbGVkIHdoZW4gcmVuZGVyaW5nIGZyb20gdGhlIGltcG9ydGVyIGNsYXNzLlxuICpcbiAqIElucHV0OlxuICogLSByZW5kZXJDbGFpbXM6IGEgUmVuZGVyQ2xhaW1zIG9iamVjdCwgd2hpY2ggY29udGFpbnMgdGhlIGxpc3Qgb2YgY2xhaW1zXG4gKiAgIHdlIHdhbnQgdG8gcmVuZGVyXG4gKlxuICogUmV0dXJuOlxuICogLSBUaGUgcmVzdWx0IG9mIHJlbmRlcmluZyB0aGUgcmVuZGVyQ2xhaW1zIG9iamVjdCwgcGx1cyB0aGVcbiAqICAgcmVuZGVyZWQgZmlyZXN0YXJ0ci1hbGwgZ3JvdXBcbiAqXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJGcm9tSW1wb3J0cyhcblxuICByZW5kZXJDbGFpbXM6IFJlbmRlckNsYWltcyxcblxuICBjcnM6IGFueSA9IHt9LFxuXG4gIGNhdGFsb2dPdXRwdXREaXI6IHN0cmluZyA9IFwiL3RtcC8uY2F0YWxvZ1wiLFxuXG4gIGNyT3V0cHV0RGlyOiBzdHJpbmcgPSBcIi90bXAvLnJlc291cmNlc1wiLFxuXG4pIHtcblxuICBjb25zdCBjYXRhbG9nU2NvcGUgPSBuZXcgQXBwKHtcblxuICAgIG91dGRpcjogY2F0YWxvZ091dHB1dERpcixcblxuICAgIG91dHB1dEZpbGVFeHRlbnNpb246IFwiLnlhbWxcIixcblxuICAgIHlhbWxPdXRwdXRUeXBlOiBZYW1sT3V0cHV0VHlwZS5GSUxFX1BFUl9SRVNPVVJDRSxcblxuICB9KVxuXG4gIGNvbnN0IGZpcmVzdGFydHJTY29wZSA9IG5ldyBBcHAoe1xuXG4gICAgb3V0ZGlyOiBjck91dHB1dERpcixcblxuICAgIG91dHB1dEZpbGVFeHRlbnNpb246IFwiLnlhbWxcIixcblxuICAgIHlhbWxPdXRwdXRUeXBlOiBZYW1sT3V0cHV0VHlwZS5GSUxFX1BFUl9SRVNPVVJDRSxcblxuICB9KVxuXG4gIGNvbnN0IHJlc3VsdDogYW55ID0gYXdhaXQgZlJlbmRlckNsYWltcyhcblxuICAgIGNhdGFsb2dTY29wZSxcblxuICAgIGZpcmVzdGFydHJTY29wZSxcblxuICAgIHtcbiAgICAgIHJlbmRlckNsYWltcyxcblxuICAgICAgY3JzLFxuXG4gICAgICByZW5hbWVzOiBbXVxuICAgIH0sXG4gIClcblxuICBmaXJlc3RhcnRyU2NvcGUuc3ludGgoKVxuXG4gIHJldHVybiByZXN1bHRcblxufVxuXG5cbi8qXG4gKiBGdW5jdGlvbiBjYWxsZWQgd2hlbiByZW5kZXJpbmcgYnV0IG5vdCBpbXBvcnRpbmdcbiAqXG4gKiBJbnB1dDpcbiAqIC0gc2NvcGU6IGFuIG9iamVjdCwgdXNlZCB0byByZXByZXNlbnQgQ0RLVEYncyBleGVjdXRpb24gc2NvcGVcbiAqXG4gKiBSZXR1cm46XG4gKiAtIFRoZSByZXN1bHQgb2YgcmVuZGVyaW5nIHRoZSByZW5kZXJDbGFpbXMgb2JqZWN0LCBwbHVzIHRoZVxuICogICByZW5kZXJlZCBmaXJlc3RhcnRyLWFsbCBncm91cFxuICpcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlcihcblxuICBjYXRhbG9nU2NvcGU6IENvbnN0cnVjdCxcblxuICBmaXJlc3RhcnRyU2NvcGU6IENvbnN0cnVjdCxcblxuICApOiBQcm9taXNlPFJlbmRlcmVkQ3JNYXA+IHtcblxuICBjb25zdCBkYXRhOiB7XG5cbiAgICByZW5kZXJDbGFpbXM6IFJlbmRlckNsYWltcyxcblxuICAgIGNyczogYW55LFxuXG4gICAgcmVuYW1lcz86IElSZW5hbWVSZXN1bHRbXVxuXG4gIH0gPSBhd2FpdCBsb2FkQWxsKClcblxuICBjb25zdCByZXN1bHQ6IGFueSA9IGF3YWl0IGZSZW5kZXJDbGFpbXMoY2F0YWxvZ1Njb3BlLCBmaXJlc3RhcnRyU2NvcGUsIGRhdGEpXG5cbiAgdmFsaWRhdGVSZWZlcmVudGlhbEludGVncml0eShyZXN1bHQpXG5cbiAgdmFsaWRhdGVUZlN0YXRlS2V5VW5pcXVlbmVzcyhyZXN1bHQpXG5cbiAgcmV0dXJuIHJlc3VsdFxuXG59XG5cbi8qXG4gKiBGdW5jdGlvbiBjYWxsZWQgd2hlbiByZW5kZXJpbmcgVGVycmFmb3JtIHdvcmtzcGFjZXMgUGxhbnNcbiAqIGJhc2VkIG9uIHRoZSBwcmV2aW91cyByZW5kZXJlciBUZXJyYWZvcm0gd29ya3NwYWNlc1xuKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJXb3Jrc3BhY2VQbGFucyhzb3VyY2U6IHN0cmluZywgZGVzdGlueTogc3RyaW5nLCBwckxpbms6IHN0cmluZywgc2hhOiBzdHJpbmcsIGdoQ2xpOiBhbnkgPSBnaXRodWIpIHtcblxuICBjb25zdCBbb3JnUmVwbywgcHJOdW1iZXJdID0gcHJMaW5rLnNwbGl0KFwiI1wiKVxuXG4gIGNvbnN0IFsgb3JnLCByZXBvIF0gPSBvcmdSZXBvLnNwbGl0KFwiL1wiKVxuXG4gIGNvbnN0IHsgZGF0YTogZmlsZXMgfSA9IGF3YWl0IGdoQ2xpLnB1bGxzLmdldFByRmlsZXMoXG4gICAgcGFyc2VJbnQocHJOdW1iZXIpLFxuICAgIHJlcG8sXG4gICAgb3JnXG4gIClcblxuICBpZihmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwICYmIGZpbGVzWzBdLnN0YXR1cyA9PSBcInJlbW92ZWRcIil7XG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZ2hDbGkucmVwby5nZXRDb250ZW50KFxuICAgIFxuICAgICAgZmlsZXNbMF0uZmlsZW5hbWUsXG4gICAgXG4gICAgICByZXBvLFxuICAgIFxuICAgICAgb3JnLFxuICAgIFxuICAgIClcblxuICAgIGNvbnN0IHdvcmtzcGFjZTogYW55ID0gY29tbW9uLmlvLmZyb21ZYW1sKGNvbnRlbnQpXG5cbiAgICB3b3Jrc3BhY2Uua2luZCA9IFwiRmlyZXN0YXJ0clRlcnJhZm9ybVdvcmtzcGFjZVBsYW5cIlxuICAgIFxuICAgIHdvcmtzcGFjZS5tZXRhZGF0YS5hbm5vdGF0aW9ucyA9IHtcbiAgICBcbiAgICAgIC4uLndvcmtzcGFjZS5tZXRhZGF0YS5hbm5vdGF0aW9ucyxcbiAgICAgIFxuICAgICAgW2NvbW1vbi5nZW5lcmljLmdldEZpcmVzdGFydHJBbm5vdGF0aW9uKFwicHVsbC1yZXF1ZXN0LXBsYW5cIildOiBwckxpbmssXG4gICAgICBcbiAgICAgIFtjb21tb24uZ2VuZXJpYy5nZXRGaXJlc3RhcnRyQW5ub3RhdGlvbihcInBsYW4tc2hhXCIpXTogc2hhLFxuICAgIFxuICAgIH1cbiAgICBcbiAgICB3b3Jrc3BhY2UubWV0YWRhdGEuYW5ub3RhdGlvbnNbXG4gICAgXG4gICAgICBjb21tb24uZ2VuZXJpYy5nZXRGaXJlc3RhcnRyQW5ub3RhdGlvbihcInBvbGljeVwiKVxuICAgIFxuICAgIF0gPSBcImRlc3Ryb3lcIlxuXG4gICAgY29uc3Qgd29ya3NwYWNlUGxhbiA9IGNvbW1vbi5pby50b1lhbWwoXG4gICAgXG4gICAgICB7Li4ud29ya3NwYWNlfSwgXG4gICAgXG4gICAgICB7IHF1b3RpbmdUeXBlOiAnXCInLCBsaW5lV2lkdGg6IC0xIH1cbiAgICBcbiAgICApXG4gICAgXG4gICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmpvaW4oZGVzdGlueSwgcGF0aC5iYXNlbmFtZShmaWxlc1swXS5maWxlbmFtZSkpXG4gICAgXG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlTmFtZSwgd29ya3NwYWNlUGxhbilcbiAgICBcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIEl0ZXJhdGUgb3ZlciB0aGUgc291cmNlIGZvbGRlciBhbmQgZ2V0IHRoZSBsaXN0IG9mIFRlcnJhZm9ybSB3b3Jrc3BhY2VzXG4gIGF3YWl0IGNyYXdsKHNvdXJjZSwgKCkgPT4gdHJ1ZSwgKGVudHJ5OiBzdHJpbmcsIGRhdGE6IGFueSkgPT4ge1xuXG4gICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmpvaW4oZGVzdGlueSwgcGF0aC5iYXNlbmFtZShlbnRyeSkpXG5cbiAgICBjb25zdCB3b3Jrc3BhY2U6IGFueSA9IGNvbW1vbi5pby5mcm9tWWFtbChkYXRhKVxuXG4gICAgd29ya3NwYWNlLmtpbmQgPSBcIkZpcmVzdGFydHJUZXJyYWZvcm1Xb3Jrc3BhY2VQbGFuXCJcbiAgICB3b3Jrc3BhY2UubWV0YWRhdGEuYW5ub3RhdGlvbnMgPSB7XG4gICAgICAuLi53b3Jrc3BhY2UubWV0YWRhdGEuYW5ub3RhdGlvbnMsXG4gICAgICBbY29tbW9uLmdlbmVyaWMuZ2V0RmlyZXN0YXJ0ckFubm90YXRpb24oXCJwdWxsLXJlcXVlc3QtcGxhblwiKV06IHByTGluayxcbiAgICAgIFtjb21tb24uZ2VuZXJpYy5nZXRGaXJlc3RhcnRyQW5ub3RhdGlvbihcInBsYW4tc2hhXCIpXTogc2hhXG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHdvcmtzcGFjZVBsYW4gPSBjb21tb24uaW8udG9ZYW1sKHtcbiAgICAgIC4uLndvcmtzcGFjZVxuICAgIH0sIHsgcXVvdGluZ1R5cGU6ICdcIicsIGxpbmVXaWR0aDogLTEgfSlcblxuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZU5hbWUsIHdvcmtzcGFjZVBsYW4pXG5cbiAgfSlcblxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkTGFzdFN0YXRlQW5kTGFzdENsYWltQW5ub3RhdGlvbnMoXG4gIGZpbGVQYXRoOiBzdHJpbmcsIGxhc3RTdGF0ZVBSTGluazogc3RyaW5nLCBsYXN0Q2xhaW1QUkxpbms6IHN0cmluZ1xuKSB7XG5cbiAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBzb3VyY2UgZm9sZGVyIGFuZCBnZXQgdGhlIGxpc3Qgb2YgVGVycmFmb3JtIHdvcmtzcGFjZXNcblxuICBjb25zdCB3b3Jrc3BhY2U6IGFueSA9IGNvbW1vbi5pby5mcm9tWWFtbChmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmLThcIikpO1xuXG4gIGNvbnN0IHN0YXRlTGlua0FzQXJyYXk6IHN0cmluZ1tdID0gbGFzdFN0YXRlUFJMaW5rLnNwbGl0KFwiL1wiKTtcbiAgY29uc3Qgc3RhdGVBbm5vdGF0aW9uVmFsdWU6IHN0cmluZyA9IGAke3N0YXRlTGlua0FzQXJyYXlbM119LyR7c3RhdGVMaW5rQXNBcnJheVs0XX0jJHtzdGF0ZUxpbmtBc0FycmF5WzZdfWBcblxuICBjb25zdCBjbGFpbUxpbmtBc0FycmF5OiBzdHJpbmdbXSA9IGxhc3RDbGFpbVBSTGluay5zcGxpdChcIi9cIik7XG4gIGNvbnN0IGNsYWltQW5ub3RhdGlvblZhbHVlOiBzdHJpbmcgPSBgJHtjbGFpbUxpbmtBc0FycmF5WzNdfS8ke2NsYWltTGlua0FzQXJyYXlbNF19IyR7Y2xhaW1MaW5rQXNBcnJheVs2XX1gXG5cbiAgd29ya3NwYWNlLm1ldGFkYXRhLmFubm90YXRpb25zID0ge1xuICAgIC4uLndvcmtzcGFjZS5tZXRhZGF0YS5hbm5vdGF0aW9ucyxcbiAgICBbY29tbW9uLmdlbmVyaWMuZ2V0RmlyZXN0YXJ0ckFubm90YXRpb24oXCJsYXN0LXN0YXRlLXByXCIpXTogc3RhdGVBbm5vdGF0aW9uVmFsdWUsXG4gICAgW2NvbW1vbi5nZW5lcmljLmdldEZpcmVzdGFydHJBbm5vdGF0aW9uKFwibGFzdC1jbGFpbS1wclwiKV06IGNsYWltQW5ub3RhdGlvblZhbHVlXG4gIH1cblxuICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBjb21tb24uaW8udG9ZYW1sKFxuICAgIHsgLi4ud29ya3NwYWNlIH0sIHsgcXVvdGluZ1R5cGU6ICdcIicsIGxpbmVXaWR0aDogLTEgfVxuICApKVxuXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZSZW5kZXJDbGFpbXMoXG5cbiAgY2F0YWxvZ1Njb3BlOiBDb25zdHJ1Y3QsXG5cbiAgZmlyZXN0YXJ0clNjb3BlOiBDb25zdHJ1Y3QsXG5cbiAgZGF0YToge1xuXG4gICAgcmVuZGVyQ2xhaW1zOiBSZW5kZXJDbGFpbXMsXG5cbiAgICBjcnM6IGFueSxcblxuICAgIHJlbmFtZXM/OiBJUmVuYW1lUmVzdWx0W11cblxuICB9LFxuXG4pOiBQcm9taXNlPFJlbmRlcmVkQ3JNYXA+IHtcblxuICBjb25zdCByZXN1bHQ6IFJlbmRlcmVkQ3JNYXAgPSB7fVxuXG4gIGNvbnN0IHsgcmVuZGVyQ2xhaW1zLCBjcnMgfSA9IGRhdGFcblxuICBjb25zdCBzb3J0ZWRLaW5kcyA9IHNvcnRLaW5kcyhbXCJVc2VyQ2xhaW1cIiwgXCJHcm91cENsYWltXCIsIFwiQ29tcG9uZW50Q2xhaW1cIiwgXCJEb21haW5DbGFpbVwiLCBcIlN5c3RlbUNsYWltXCIsIFwiVEZXb3Jrc3BhY2VDbGFpbVwiLCBcIkFyZ29EZXBsb3lDbGFpbVwiXSwgcmVuZGVyQ2xhaW1zKVxuXG4gIGZvciAoY29uc3QgcmVuZGVyQ2xhaW1zIG9mIHNvcnRlZEtpbmRzKSB7XG5cbiAgICBmb3IgKGNvbnN0IGNsYWltS2V5IG9mIE9iamVjdC5rZXlzKHJlbmRlckNsYWltcykpIHtcblxuICAgICAgY29uc3QgY2xhaW0gPSByZW5kZXJDbGFpbXNbY2xhaW1LZXkgYXMgUmVuZGVyQ2xhaW1LZXldLmNsYWltXG5cbiAgICAgIGNvbnN0IGNvbmZpZ3VyZWRQcm92aWRlciA9IGdldENvbmZpZ3VyZWRQcm92aWRlcigpLnRvU3RyaW5nKClcblxuICAgICAgbGV0IHByb3ZpZGVycyA9IE9iamVjdC5rZXlzKGNsYWltLnByb3ZpZGVycylcblxuICAgICAgaWYoY29uZmlndXJlZFByb3ZpZGVyICE9IEFsbG93ZWRQcm92aWRlcnMuYWxsLnRvU3RyaW5nKCkpe1xuXG4gICAgICAgIHByb3ZpZGVycyA9IHByb3ZpZGVycy5maWx0ZXIoXG5cbiAgICAgICAgICAocHJvdmlkZXI6IHN0cmluZykgPT4gcHJvdmlkZXIgPT09IGNvbmZpZ3VyZWRQcm92aWRlclxuXG4gICAgICAgIClcblxuICAgICAgfVxuXG5cbiAgICAgIGNvbnN0IHByZXZpb3VzQ1IgPSBnZXRQcmV2aW91c0NSZnJvbUNsYWltKGNsYWltLCBjcnMpXG5cbiAgICAgIGNvbnN0IHBhdGNoZXMgPSBhd2FpdCBleHRyYWN0UGF0Y2hlcyhyZW5kZXJDbGFpbXNbY2xhaW1LZXkgYXMgUmVuZGVyQ2xhaW1LZXldLCBwcmV2aW91c0NSKVxuXG4gICAgICBpZiAoIXByZXZpb3VzQ1IpIHtcblxuICAgICAgICBsb2coYE5vIENSIGZvdW5kIGZvciBjbGFpbSAke2NsYWltS2V5fSwgaXQgd2lsbCBiZSByZW5kZXJlZCBmcm9tIHNjcmF0Y2hgKVxuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtmaXJlc3RhcnRyRW50aXR5LCBleHRyYUNoYXJ0cywgY2F0YWxvZ0VudGl0eX0gID0gYXdhaXQgcmVuZGVyQ2xhaW0oXG5cbiAgICAgICAgY2F0YWxvZ1Njb3BlLFxuXG4gICAgICAgIGZpcmVzdGFydHJTY29wZSxcblxuICAgICAgICBjbGFpbSxcblxuICAgICAgICBwYXRjaGVzLFxuXG4gICAgICAgIHByZXZpb3VzQ1IsXG5cbiAgICAgIClcblxuICAgICAgaWYoY2F0YWxvZ0VudGl0eSkge1xuXG4gICAgICAgIHJlc3VsdFtgJHtjYXRhbG9nRW50aXR5LmtpbmR9LSR7Y2F0YWxvZ0VudGl0eS5tZXRhZGF0YS5uYW1lfWBdID0gY2F0YWxvZ0VudGl0eS50b0pzb24oKVxuICAgICAgXG4gICAgICB9XG5cbiAgICAgIC8qKlxuXG4gICAgICAqIElmIHRoZXJlIGlzIG5vIHByb3ZpZGVyIGRvbid0IHN0b3JlIHRoZSBDUiBpbiB0aGUgbWFwXG5cbiAgICAgICovXG5cbiAgICAgIGlmICghZmlyZXN0YXJ0ckVudGl0eSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGZpcmVzdGFydHJFbnRpdHlKc29uID0gZmlyZXN0YXJ0ckVudGl0eS50b0pzb24oKVxuXG4gICAgICBzZXRSZW5kZXJlZENsYWltKGNsYWltLCBmaXJlc3RhcnRyRW50aXR5SnNvbilcblxuICAgICAgZm9yKGNvbnN0IGV4dHJhQ2hhcnQgb2YgZXh0cmFDaGFydHMpe1xuXG4gICAgICAgIGNvbnN0IHtjbGFpbSwgY2hhcnR9ID0gZXh0cmFDaGFydFxuXG4gICAgICAgIHNldFJlbmRlcmVkQ2xhaW0oY2xhaW0sIGNoYXJ0LnRvSnNvbigpKVxuXG4gICAgICAgIHJlc3VsdFtgJHtjaGFydC5raW5kfS0ke2NoYXJ0Lm1ldGFkYXRhLm5hbWV9YF0gPSBjaGFydC50b0pzb24oKVxuXG4gICAgICB9XG5cbiAgICAgIGlmKCFmaXJlc3RhcnRyRW50aXR5SnNvbi5tZXRhZGF0YS5hbm5vdGF0aW9ucyB8fCAhZmlyZXN0YXJ0ckVudGl0eUpzb24ubWV0YWRhdGEubmFtZSkgdGhyb3cgZmlyZXN0YXJ0ckVudGl0eUpzb25cblxuICAgICAgcmVzdWx0W2Ake2ZpcmVzdGFydHJFbnRpdHkua2luZH0tJHtmaXJlc3RhcnRyRW50aXR5SnNvbi5tZXRhZGF0YS5uYW1lfWBdID0gZmlyZXN0YXJ0ckVudGl0eUpzb25cblxuICAgIH1cblxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxuXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RQYXRjaGVzKFxuXG4gIGNsYWltVG9SZW5kZXJEYXRhOiBSZW5kZXJDbGFpbURhdGEsIHByZXZpb3VzQ1I6IGFueVxuXG4pOiBQcm9taXNlPElDdXN0b21SZXNvdXJjZVBhdGNoW10+IHtcblxuICBsZXQgdG90YWxQYXRjaGVzOiBJQ3VzdG9tUmVzb3VyY2VQYXRjaFtdID0gW11cblxuXG4gIGZvciAoY29uc3Qgbm9ybWFsaXplciBvZiBjbGFpbVRvUmVuZGVyRGF0YS5ub3JtYWxpemVycykge1xuXG4gICAgY29uc3QgcGF0Y2hlcyA9IGF3YWl0IG5vcm1hbGl6ZXIucGF0Y2hlcyhjbGFpbVRvUmVuZGVyRGF0YVtcImNsYWltXCJdLCBwcmV2aW91c0NSKVxuXG4gICAgdG90YWxQYXRjaGVzID0gdG90YWxQYXRjaGVzLmNvbmNhdChwYXRjaGVzKS5mbGF0KClcblxuICB9XG5cbiAgZm9yIChjb25zdCBpbml0aWFsaXplciBvZiBjbGFpbVRvUmVuZGVyRGF0YS5pbml0aWFsaXplcnMpIHtcblxuICAgIGNvbnN0IHBhdGNoZXMgPSBhd2FpdCBpbml0aWFsaXplci5wYXRjaGVzKGNsYWltVG9SZW5kZXJEYXRhW1wiY2xhaW1cIl0sIHByZXZpb3VzQ1IpXG5cbiAgICB0b3RhbFBhdGNoZXMgPSB0b3RhbFBhdGNoZXMuY29uY2F0KHBhdGNoZXMpLmZsYXQoKVxuXG4gIH1cblxuICBmb3IgKGNvbnN0IG92ZXJyaWRlciBvZiBjbGFpbVRvUmVuZGVyRGF0YS5vdmVycmlkZXMpIHtcblxuICAgIGNvbnN0IHBhdGNoZXMgPSBhd2FpdCBvdmVycmlkZXIucGF0Y2hlcyhjbGFpbVRvUmVuZGVyRGF0YVtcImNsYWltXCJdLCBwcmV2aW91c0NSKVxuXG4gICAgdG90YWxQYXRjaGVzID0gdG90YWxQYXRjaGVzLmNvbmNhdChwYXRjaGVzKS5mbGF0KClcblxuICB9XG5cblxuICBpZiAoY2xhaW1Ub1JlbmRlckRhdGEuY2xhaW0ua2luZCA9PT0gXCJDb21wb25lbnRDbGFpbVwiKSB7XG5cbiAgICB0b3RhbFBhdGNoZXMgPSB0b3RhbFBhdGNoZXMuY29uY2F0KChhd2FpdCBnZW5lcmF0ZUZlYXR1cmVzUGF0Y2hlcyhjbGFpbVRvUmVuZGVyRGF0YS5jbGFpbSkpKS5mbGF0KClcblxuICB9XG5cblxuICBmb3IgKGNvbnN0IGdsb2JhbCBvZiBjbGFpbVRvUmVuZGVyRGF0YS5nbG9iYWxzKSB7XG5cbiAgICBjb25zdCBwYXRjaGVzID0gYXdhaXQgZ2xvYmFsLnBhdGNoZXMoY2xhaW1Ub1JlbmRlckRhdGEuY2xhaW0sIHByZXZpb3VzQ1IpXG5cbiAgICB0b3RhbFBhdGNoZXMgPSB0b3RhbFBhdGNoZXMuY29uY2F0KHBhdGNoZXMpLmZsYXQoKVxuXG4gIH1cblxuICByZXR1cm4gdG90YWxQYXRjaGVzXG5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUmVuZGVyQ2xhaW1SZXN1bHQge1xuICBjYXRhbG9nRW50aXR5PzogQXBpT2JqZWN0O1xuICBmaXJlc3RhcnRyRW50aXR5PzogQXBpT2JqZWN0O1xuICBleHRyYUNoYXJ0czogeyBjbGFpbToge2tpbmQ6IHN0cmluZywgbmFtZTogc3RyaW5nfSwgY2hhcnQ6IEFwaU9iamVjdH1bXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVuZGVyQ2xhaW0oXG5cbiAgY2F0YWxvZ1Njb3BlOiBDb25zdHJ1Y3QsXG5cbiAgZmlyZXN0YXJ0clNjb3BlOiBDb25zdHJ1Y3QsXG5cbiAgY2xhaW06IGFueSxcblxuICBwYXRjaGVzOiBJQ3VzdG9tUmVzb3VyY2VQYXRjaFtdLFxuXG4gIHByZXZpb3VzQ1I6IGFueSB8IG51bGwgPSBudWxsXG5cbiAgKTogUHJvbWlzZTxJUmVuZGVyQ2xhaW1SZXN1bHQ+IHtcblxuICBsZXQgY2F0YWxvZ0VudGl0eTogQmFzZUNoYXJ0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBsZXQgZmlyZXN0YXJ0ckVudGl0eTogQmFzZUNoYXJ0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGNoYXJ0SWQgPSBgJHtjbGFpbS5raW5kfS0ke2NsYWltLm5hbWV9YC50b0xvd2VyQ2FzZSgpO1xuXG4gIGxldCBmaXJlc3RhcnRySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGlmIChwcmV2aW91c0NSKSB7XG5cbiAgICBmaXJlc3RhcnRySWQgPSBwcmV2aW91c0NSPy5zcGVjPy5maXJlc3RhcnRyPy50ZlN0YXRlS2V5IHx8IG51bGw7XG5cbiAgfVxuXG4gIGNvbnN0IHJlbmRlclBhdGNoZXMgPSBwYXRjaGVzLmZpbHRlcigocGF0Y2g6IGFueSkgPT4gIXBhdGNoLmlzUG9zdFBhdGNoKVxuICBjb25zdCBwb3N0UGF0Y2hlcyA9IHBhdGNoZXMuZmlsdGVyKChwYXRjaDphbnkpID0+IHBhdGNoLmlzUG9zdFBhdGNoKVxuXG4gIGNvbnN0IHByb3ZpZGVyID0gZ2V0Q29uZmlndXJlZFByb3ZpZGVyKClcblxuICBzd2l0Y2ggKGNsYWltLmtpbmQpIHtcblxuICAgIGNhc2UgXCJEb21haW5DbGFpbVwiOlxuXG4gICAgICBjYXRhbG9nRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LkNhdGFsb2dEb21haW5DaGFydChcbiAgICAgICAgY2F0YWxvZ1Njb3BlLCBcbiAgICAgICAgYGNhdGFsb2ctJHtjaGFydElkfWAsIFxuICAgICAgICBmaXJlc3RhcnRySWQsIFxuICAgICAgICBjbGFpbSwgXG4gICAgICAgIHJlbmRlclBhdGNoZXNcbiAgICAgICk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIlN5c3RlbUNsYWltXCI6XG5cbiAgICAgIGNhdGFsb2dFbnRpdHkgPSBuZXcgY2hhcnRzLmRlZmF1bHQuQ2F0YWxvZ1N5c3RlbUNoYXJ0KFxuICAgICAgICBjYXRhbG9nU2NvcGUsIFxuICAgICAgICBgY2F0YWxvZy0ke2NoYXJ0SWR9YCwgXG4gICAgICAgIGZpcmVzdGFydHJJZCwgXG4gICAgICAgIGNsYWltLCBcbiAgICAgICAgcmVuZGVyUGF0Y2hlc1xuICAgICAgKTtcblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiR3JvdXBDbGFpbVwiOlxuXG4gICAgICBjYXRhbG9nRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LkNhdGFsb2dHcm91cENoYXJ0KGNhdGFsb2dTY29wZSwgYGNhdGFsb2ctJHtjaGFydElkfWAsIGZpcmVzdGFydHJJZCwgY2xhaW0sIHJlbmRlclBhdGNoZXMpO1xuXG4gICAgICBpZiAoY2xhaW0ucHJvdmlkZXJzLmdpdGh1YiAmJiAocHJvdmlkZXIgPT09IEFsbG93ZWRQcm92aWRlcnMuZ2l0aHViIHx8IHByb3ZpZGVyID09PSBBbGxvd2VkUHJvdmlkZXJzLmFsbCkpIHtcblxuICAgICAgICBmaXJlc3RhcnRyRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LkdpdGh1Ykdyb3VwQ2hhcnQoXG4gICAgICAgICAgZmlyZXN0YXJ0clNjb3BlLFxuICAgICAgICAgIGBnaXRodWItJHtjaGFydElkfWAsXG4gICAgICAgICAgZmlyZXN0YXJ0cklkLFxuICAgICAgICAgIGNsYWltLFxuICAgICAgICAgIHJlbmRlclBhdGNoZXNcbiAgICAgICAgKTtcblxuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJVc2VyQ2xhaW1cIjpcblxuICAgICAgY2F0YWxvZ0VudGl0eSA9IG5ldyBjaGFydHMuZGVmYXVsdC5DYXRhbG9nVXNlckNoYXJ0KGNhdGFsb2dTY29wZSwgY2hhcnRJZCwgZmlyZXN0YXJ0cklkLCBjbGFpbSwgcmVuZGVyUGF0Y2hlcyk7XG5cbiAgICAgIGlmIChjbGFpbS5wcm92aWRlcnMuZ2l0aHViICYmIChwcm92aWRlciA9PT0gQWxsb3dlZFByb3ZpZGVycy5naXRodWIgfHwgcHJvdmlkZXIgPT09IEFsbG93ZWRQcm92aWRlcnMuYWxsKSkge1xuXG4gICAgICAgIGZpcmVzdGFydHJFbnRpdHkgPSBuZXcgY2hhcnRzLmRlZmF1bHQuR2l0aHViTWVtYmVyc2hpcENoYXJ0KFxuICAgICAgICAgIGZpcmVzdGFydHJTY29wZSxcbiAgICAgICAgICBgZ2l0aHViLSR7Y2hhcnRJZH1gLFxuICAgICAgICAgIGZpcmVzdGFydHJJZCxcbiAgICAgICAgICBjbGFpbSxcbiAgICAgICAgICByZW5kZXJQYXRjaGVzXG4gICAgICAgICk7XG5cbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiQ29tcG9uZW50Q2xhaW1cIjpcblxuICAgICAgaWYgKGNsYWltLnByb3ZpZGVycy5naXRodWIgJiYgKHByb3ZpZGVyID09PSBBbGxvd2VkUHJvdmlkZXJzLmdpdGh1YiB8fCBwcm92aWRlciA9PT0gQWxsb3dlZFByb3ZpZGVycy5hbGwpKSB7XG5cbiAgICAgICAgZmlyZXN0YXJ0ckVudGl0eSA9IG5ldyBjaGFydHMuZGVmYXVsdC5HaXRodWJSZXBvc2l0b3J5Q2hhcnQoXG4gICAgICAgICAgZmlyZXN0YXJ0clNjb3BlLFxuICAgICAgICAgIGBnaXRodWItJHtjaGFydElkfWAsXG4gICAgICAgICAgZmlyZXN0YXJ0cklkLFxuICAgICAgICAgIGNsYWltLFxuICAgICAgICAgIHJlbmRlclBhdGNoZXNcbiAgICAgICAgKTtcblxuICAgICAgfVxuICAgICAgY2F0YWxvZ0VudGl0eSA9IG5ldyBjaGFydHMuZGVmYXVsdC5DYXRhbG9nQ29tcG9uZW50Q2hhcnQoXG4gICAgICAgIGNhdGFsb2dTY29wZSwgY2hhcnRJZCwgZmlyZXN0YXJ0cklkLCBjbGFpbSwgcmVuZGVyUGF0Y2hlc1xuICAgICAgKTtcblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiVEZXb3Jrc3BhY2VDbGFpbVwiOlxuXG4gICAgICBpZiAoY2xhaW0ucHJvdmlkZXJzLnRlcnJhZm9ybSAmJiAocHJvdmlkZXIgPT09IEFsbG93ZWRQcm92aWRlcnMudGVycmFmb3JtIHx8IHByb3ZpZGVyID09PSBBbGxvd2VkUHJvdmlkZXJzLmFsbCkpIHtcblxuICAgICAgICBmaXJlc3RhcnRyRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LlRGV29ya3NwYWNlQ2hhcnQoXG4gICAgICAgICAgZmlyZXN0YXJ0clNjb3BlLCBcbiAgICAgICAgICBgdGVycmFmb3JtLSR7Y2hhcnRJZH1gLCBcbiAgICAgICAgICBmaXJlc3RhcnRySWQsXG4gICAgICAgICAgY2xhaW0sXG4gICAgICAgICAgcmVuZGVyUGF0Y2hlc1xuICAgICAgICApO1xuXG4gICAgICB9XG4gICAgICBjYXRhbG9nRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LkNhdGFsb2dURldvcmtzcGFjZUNoYXJ0KFxuICAgICAgICBjYXRhbG9nU2NvcGUsIGNoYXJ0SWQsIGZpcmVzdGFydHJJZCwgY2xhaW0sIHJlbmRlclBhdGNoZXNcbiAgICAgICk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkFyZ29EZXBsb3lDbGFpbVwiOlxuXG4gICAgICBpZiAoY2xhaW0ucHJvdmlkZXJzLmFyZ29jZCAmJiAocHJvdmlkZXIgPT09IEFsbG93ZWRQcm92aWRlcnMuYXJnb2NkIHx8IHByb3ZpZGVyID09PSBBbGxvd2VkUHJvdmlkZXJzLmFsbCkpIHtcblxuICAgICAgICBmaXJlc3RhcnRyRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LkFyZ29EZXBsb3lDaGFydChcbiAgICAgICAgICBmaXJlc3RhcnRyU2NvcGUsIFxuICAgICAgICAgIGBhcmdvY2QtJHtjaGFydElkfWAsIFxuICAgICAgICAgIGZpcmVzdGFydHJJZCxcbiAgICAgICAgICBjbGFpbSxcbiAgICAgICAgICByZW5kZXJQYXRjaGVzXG4gICAgICAgICk7XG5cbiAgICAgIH1cbiAgICAgIFxuICAgICAgY2F0YWxvZ0VudGl0eSA9IG5ldyBjaGFydHMuZGVmYXVsdC5DYXRhbG9nQXJnb0RlcGxveUNoYXJ0KFxuICAgICAgICBjYXRhbG9nU2NvcGUsIGNoYXJ0SWQsIGZpcmVzdGFydHJJZCwgY2xhaW0sIHJlbmRlclBhdGNoZXNcbiAgICAgICk7XG5cbiAgICAgIGJyZWFrO1xuXG5cbiAgICBkZWZhdWx0OlxuXG4gICAgICBjb25zb2xlLmVycm9yKGBVbmtub3duIGNsYWltIGtpbmQ6ICR7Y2xhaW0ua2luZH1gKTtcblxuICAgICAgYnJlYWs7XG4gIH1cblxuICAvKipcbiAgICogVGhlcmUgaXMgdGhlIHBvc3NpYmlsaXR5IHRvIG9ubHkgcmVuZGVyIHRoZSBjYXRhbG9nIGVudGl0eSwgYnV0IG5vdCB0aGUgb3RoZXIgd2F5IGFyb3VuZFxuICAgKi9cbiAgaWYgKCFjYXRhbG9nRW50aXR5KSB7XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byByZW5kZXIgY2xhaW0gJHtjbGFpbS5raW5kfS0ke2NsYWltLm5hbWV9YCk7XG5cbiAgfVxuXG4gIC8qXG4gICAqXG4gICAqIFJlbmRlciBwaGFzZVxuICAgKlxuICAgKi9cbiAgY29uc3QgW2NhdGFsb2dDaGFydCwgZmlyZXN0YXJ0ckVudGl0eUNoYXJ0XSA9IGF3YWl0IFByb21pc2UuYWxsKFxuXG4gICAgW1xuICAgICAgcHJvdmlkZXIgPT09IEFsbG93ZWRQcm92aWRlcnMuYWxsID8gY2F0YWxvZ0VudGl0eS5yZW5kZXIoKSA6IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpLFxuXG4gICAgICBmaXJlc3RhcnRyRW50aXR5Py5yZW5kZXIoKSxcblxuICAgIF1cblxuICApXG5cbiAgLypcbiAgICpcbiAgICogUG9zdCByZW5kZXIgcGhhc2UgKGFuZCByZXR1cm4pXG4gICAqXG4gICAqL1xuICByZXR1cm4ge1xuXG4gICAgY2F0YWxvZ0VudGl0eTogY2F0YWxvZ0NoYXJ0ID8gYXdhaXQgY2F0YWxvZ0NoYXJ0LnBvc3RSZW5kZXJlcihwb3N0UGF0Y2hlcykgOiB1bmRlZmluZWQsXG5cbiAgICBmaXJlc3RhcnRyRW50aXR5OiBhd2FpdCAoZmlyZXN0YXJ0ckVudGl0eUNoYXJ0ID8gZmlyZXN0YXJ0ckVudGl0eUNoYXJ0LnBvc3RSZW5kZXJlcihwb3N0UGF0Y2hlcykgOiB1bmRlZmluZWQpLFxuXG4gICAgZXh0cmFDaGFydHM6IGF3YWl0IGZpcmVzdGFydHJFbnRpdHk/LmV4dHJhQ2hhcnRzKCkgfHwgW11cbiAgfTtcblxufVxuXG5cblxuZnVuY3Rpb24gc29ydEtpbmRzKG9yZGVyZWRLaW5kczogc3RyaW5nW10sIGNsYWltczogUmVuZGVyQ2xhaW1zKSB7XG5cbiAgY29uc3QgcmVzdWx0OiBSZW5kZXJDbGFpbXNbXSA9IFtdXG5cbiAgZm9yIChjb25zdCBraW5kIG9mIG9yZGVyZWRLaW5kcykge1xuXG4gICAgY29uc3Qga2luZFJlbmRlckNsYWltczogYW55ID0gc29ydFJlbmRlckNsYWltc0J5S2luZChjbGFpbXMsIFtraW5kXSlcblxuICAgIHJlc3VsdC5wdXNoKGtpbmRSZW5kZXJDbGFpbXMpXG5cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcblxufVxuXG5cblxuXG5cbmZ1bmN0aW9uIGdldFByZXZpb3VzQ1Jmcm9tQ2xhaW0oY2xhaW06IGFueSwgcHJldmlvdXNDUnM6IGFueSkge1xuXG4gIGNvbnN0IHByZXZpb3VzQ1JzS2V5cyA9IE9iamVjdC5rZXlzKHByZXZpb3VzQ1JzKVxuXG4gIGZvcihjb25zdCBwcmV2aW91c0NSS2V5IG9mIHByZXZpb3VzQ1JzS2V5cyl7XG5cbiAgICBjb25zdCBwcmV2aW91c0NSID0gcHJldmlvdXNDUnNbcHJldmlvdXNDUktleV1cblxuICAgIGlmKGlzQ2F0YWxvZ0VudGl0eShwcmV2aW91c0NSKSkgY29udGludWVcblxuICAgIGlmKGlzRXhjbHVkZWRGcm9tUHJldmlvdXNDUihwcmV2aW91c0NSLmtpbmQpKSBjb250aW51ZVxuXG4gICAgaWYocHJldmlvdXNDUi5tZXRhZGF0YS5hbm5vdGF0aW9uc1tDTEFJTV9SRUZfQU5OT1RBVElPTl0gPT09IGAke2NsYWltLmtpbmR9LyR7Y2xhaW0ubmFtZX1gKXtcblxuICAgICAgcmV0dXJuIHByZXZpb3VzQ1JcblxuICAgIH1cblxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG5cbn1cblxuXG5mdW5jdGlvbiBpc0V4Y2x1ZGVkRnJvbVByZXZpb3VzQ1IoY3JLaW5kOiBzdHJpbmcpe1xuXG5cbiAgcmV0dXJuIFtcIkZpcmVzdGFydHJHaXRodWJSZXBvc2l0b3J5RmVhdHVyZVwiXS5pbmNsdWRlcyhjcktpbmQpXG5cblxufVxuIl19
235586
235745
 
235587
235746
  /***/ }),
235588
235747
 
@@ -237086,7 +237245,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
237086
237245
  return (mod && mod.__esModule) ? mod : { "default": mod };
237087
237246
  };
237088
237247
  Object.defineProperty(exports, "__esModule", ({ value: true }));
237089
- exports.commentInPR = void 0;
237248
+ exports.getPrFiles = exports.commentInPR = void 0;
237090
237249
  const auth_1 = __nccwpck_require__(7745);
237091
237250
  const debug_1 = __importDefault(__nccwpck_require__(67984));
237092
237251
  const messageLog = (0, debug_1.default)('firestartr:github:pull_request');
@@ -237098,7 +237257,39 @@ async function commentInPR(comment, pr_number, repo, owner = "prefapp") {
237098
237257
  });
237099
237258
  }
237100
237259
  exports.commentInPR = commentInPR;
237101
- exports["default"] = { commentInPR };
237260
+ async function getPrFiles(pr_number, repo, owner = "prefapp") {
237261
+ messageLog(`Getting PR details of PR ${pr_number} of ${owner}/${repo}`);
237262
+ const octokit = await (0, auth_1.getOctokitForOrg)(owner);
237263
+ return await octokit.rest.pulls.listFiles({
237264
+ owner, repo, pull_number: pr_number
237265
+ });
237266
+ }
237267
+ exports.getPrFiles = getPrFiles;
237268
+ async function filterPrBy(filter, opts) {
237269
+ let foundPr = null;
237270
+ let retries = 0;
237271
+ const { title, state, repo, owner, userType } = filter;
237272
+ const { maxRetries } = opts;
237273
+ const octokit = await (0, auth_1.getOctokitForOrg)(owner);
237274
+ while (retries < maxRetries) {
237275
+ const resp = await octokit.rest.pulls.list({
237276
+ owner,
237277
+ repo,
237278
+ state,
237279
+ per_page: 100,
237280
+ page: retries
237281
+ });
237282
+ foundPr = resp.data.find(pr => {
237283
+ return pr.title
237284
+ .includes(title) &&
237285
+ pr?.user?.type === userType;
237286
+ });
237287
+ if (foundPr)
237288
+ return foundPr;
237289
+ retries++;
237290
+ }
237291
+ }
237292
+ exports["default"] = { commentInPR, getPrFiles, filterPrBy };
237102
237293
 
237103
237294
 
237104
237295
  /***/ }),
@@ -237145,7 +237336,9 @@ async function listReleases(repo, owner = "prefapp") {
237145
237336
  const octokit = await (0, auth_1.getOctokitForOrg)(owner);
237146
237337
  const response = await octokit.rest.repos.listReleases({
237147
237338
  owner,
237148
- repo
237339
+ repo,
237340
+ per_page: 100,
237341
+ page: 0
237149
237342
  });
237150
237343
  return response.data;
237151
237344
  }
@@ -239100,7 +239293,7 @@ const informer_1 = __nccwpck_require__(41151);
239100
239293
  const dummy_1 = __nccwpck_require__(73490);
239101
239294
  const processItem_1 = __nccwpck_require__(84766);
239102
239295
  const cdktf_1 = __nccwpck_require__(10805);
239103
- const processOperation_1 = __nccwpck_require__(53014);
239296
+ const process_operation_1 = __nccwpck_require__(3937);
239104
239297
  const leader_election_1 = __nccwpck_require__(29856);
239105
239298
  const catalog_common_1 = __importDefault(__nccwpck_require__(74100));
239106
239299
  const processOperationPlan_1 = __nccwpck_require__(79980);
@@ -239164,7 +239357,7 @@ function getProvisionImplementation(plural) {
239164
239357
  let implementation = undefined;
239165
239358
  switch (plural) {
239166
239359
  case "terraformworkspaces":
239167
- implementation = processOperation_1.processOperation;
239360
+ implementation = process_operation_1.processOperation;
239168
239361
  break;
239169
239362
  case "terraformworkspaceplans":
239170
239363
  implementation = processOperationPlan_1.processOperationPlan;
@@ -240193,7 +240386,7 @@ async function inform(pluralKind, item, op, lastWorkItem = null) {
240193
240386
  };
240194
240387
  return workItem;
240195
240388
  case "onRename":
240196
- if (await (0, status_1.needsProvisioningOnCreate)(itemPath(pluralKind, item), item)) {
240389
+ if (await (0, status_1.needsProvisioningOnCreate)(item)) {
240197
240390
  log("onRename - needsProvisioningOnCreate true %s", item.metadata.name);
240198
240391
  workItem = {
240199
240392
  operation: OperationType.RENAMED,
@@ -240217,7 +240410,7 @@ async function inform(pluralKind, item, op, lastWorkItem = null) {
240217
240410
  return workItem;
240218
240411
  case "onAdd":
240219
240412
  log("onAdd %s", item.metadata.name);
240220
- if (await (0, status_1.needsProvisioningOnCreate)(itemPath(pluralKind, item), item)) {
240413
+ if (await (0, status_1.needsProvisioningOnCreate)(item)) {
240221
240414
  workItem = {
240222
240415
  operation: OperationType.CREATED,
240223
240416
  item,
@@ -240734,11 +240927,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
240734
240927
  Object.defineProperty(exports, "__esModule", ({ value: true }));
240735
240928
  exports.observe = void 0;
240736
240929
  const ctl_1 = __nccwpck_require__(46679);
240737
- const fast_json_patch_1 = __importDefault(__nccwpck_require__(75177));
240738
240930
  const debug_1 = __importDefault(__nccwpck_require__(67984));
240739
240931
  const catalog_common_1 = __importDefault(__nccwpck_require__(74100));
240740
240932
  const log = (0, debug_1.default)('firestartr:operator:reflector');
240741
240933
  const k8s = __importStar(__nccwpck_require__(54851));
240934
+ const store_1 = __nccwpck_require__(87432);
240742
240935
  /**
240743
240936
  * Execute the callbacks for each item in the store
240744
240937
  * @param {string} kind - Kind to observe
@@ -240749,7 +240942,7 @@ const k8s = __importStar(__nccwpck_require__(54851));
240749
240942
  * @param {Function} onRename - Function to call when an item is renamed
240750
240943
  */
240751
240944
  async function observe(kind, namespace, onAdd, onChange, onDelete, _onRename) {
240752
- const store = new Store(kind);
240945
+ const store = new store_1.Store(kind);
240753
240946
  const { kc } = await (0, ctl_1.getConnection)();
240754
240947
  try {
240755
240948
  const k8sApi = kc.makeApiClient(k8s.CustomObjectsApi);
@@ -240761,29 +240954,37 @@ async function observe(kind, namespace, onAdd, onChange, onDelete, _onRename) {
240761
240954
  };
240762
240955
  const informer = k8s.makeInformer(kc, apiPaths, listFn);
240763
240956
  informer.on('add', (obj) => {
240764
- log(`informer: ADDED ${obj.metadata.name}`);
240765
240957
  store.add(obj);
240766
- onAdd(obj);
240958
+ if (store.hasDeletionTimestamp(obj)) {
240959
+ log(`informer (on add): The item ${obj.metadata.name} has a deletion timestamp, marking for deletion`);
240960
+ store.markToDelete(obj);
240961
+ onDelete(obj);
240962
+ }
240963
+ else {
240964
+ log(`informer (on add): The item ${obj.metadata.name} has been added`);
240965
+ onAdd(obj);
240966
+ }
240767
240967
  });
240768
240968
  informer.on('update', (obj) => {
240769
- log(`informer: UPDATE %O`, obj);
240770
- if (store.getItem(obj).markedToDelete) {
240771
- }
240772
- else if (store.isMarkedToDelete(obj)) {
240969
+ log(`informer (on update): The item ${obj.kind}: ${obj.metadata.name} has been updated`);
240970
+ if (!store.getItem(obj).markedToDelete &&
240971
+ store.hasDeletionTimestamp(obj) &&
240972
+ (store.hasBeenMarkedToDelete(obj) || store.modified(obj))) {
240973
+ log(`informer (on update): The item ${obj.kind}: ${obj.metadata.name} has a deletion timestamp, marking for deletion`);
240773
240974
  store.markToDelete(obj);
240774
240975
  onDelete(obj);
240775
240976
  }
240776
240977
  else if (store.modified(obj)) {
240978
+ log(`informer (on update): The item ${obj.kind}: ${obj.metadata.name} has been modified`);
240777
240979
  onChange(obj);
240778
240980
  }
240779
240981
  });
240780
240982
  informer.on('delete', (obj) => {
240781
- log(`informer: DELETED ${obj.metadata.name}`);
240983
+ log(`informer (on delete): The item ${obj.metadata.name} :${obj.metadata.name} has been deleted from etcd`);
240782
240984
  store.remove(obj);
240783
240985
  });
240784
240986
  informer.on('error', (err) => {
240785
- console.error(err);
240786
- // Restart informer after 5sec
240987
+ log(`informer (on error): ERROR %O`, err);
240787
240988
  setTimeout(() => {
240788
240989
  informer.start();
240789
240990
  }, 5000);
@@ -240797,52 +240998,6 @@ async function observe(kind, namespace, onAdd, onChange, onDelete, _onRename) {
240797
240998
  }
240798
240999
  }
240799
241000
  exports.observe = observe;
240800
- class Store {
240801
- kind;
240802
- store = {};
240803
- constructor(kind) {
240804
- this.kind = kind;
240805
- }
240806
- add(item) {
240807
- this.store[itemPath(this.kind, item)] = {
240808
- item
240809
- };
240810
- }
240811
- isMarkedToDelete(item) {
240812
- return "deletionTimestamp" in item.metadata;
240813
- }
240814
- markToDelete(item) {
240815
- this.store[itemPath(this.kind, item)] = {
240816
- item,
240817
- markedToDelete: true
240818
- };
240819
- }
240820
- modified(item) {
240821
- const oldItem = this.getItem(item).item;
240822
- const patches = fast_json_patch_1.default.compare(item, oldItem);
240823
- let updated = false;
240824
- for (const patch of patches) {
240825
- if (patch.path.match(/^\/spec/) || patch.path.match(/\/metadata.*annotations/)) {
240826
- updated = true;
240827
- break;
240828
- }
240829
- }
240830
- this.store[itemPath(this.kind, item)] = {
240831
- item
240832
- };
240833
- console.log(Object.keys(this.store));
240834
- return updated;
240835
- }
240836
- remove(item) {
240837
- delete this.store[itemPath(this.kind, item)];
240838
- }
240839
- getItem(item) {
240840
- return this.store[itemPath(this.kind, item)];
240841
- }
240842
- }
240843
- function itemPath(kind, item) {
240844
- return `${item.metadata.namespace}/${kind}/${item.metadata.name}`;
240845
- }
240846
241001
 
240847
241002
 
240848
241003
  /***/ }),
@@ -240991,7 +241146,7 @@ const ctl_1 = __nccwpck_require__(46679);
240991
241146
  const debug_1 = __importDefault(__nccwpck_require__(67984));
240992
241147
  const log = (0, debug_1.default)('firestartr:operator:retry');
240993
241148
  const NEXT_RETRY_SECS = 1000 * 60;
240994
- const MAXRETRY = 10;
241149
+ const MAXRETRY = 5;
240995
241150
  const retryWatchers = {};
240996
241151
  async function initRetry(enqueue) {
240997
241152
  loop(enqueue);
@@ -241011,6 +241166,9 @@ exports.initRetry = initRetry;
241011
241166
  function retry(itemPath) {
241012
241167
  if (retryWatchers[itemPath]) {
241013
241168
  retryWatchers[itemPath].retryCounter++;
241169
+ log(`🔁 Retrying failed for: ${itemPath}, increasing retry counter to ${retryWatchers[itemPath].retryCounter}`);
241170
+ log(`🔁 Remaining retries for ${itemPath}: ${MAXRETRY - retryWatchers[itemPath].retryCounter}`);
241171
+ log(`🔁 Next retry for ${itemPath} in ${NEXT_RETRY_SECS * retryWatchers[itemPath].retryCounter} seconds`);
241014
241172
  retryWatchers[itemPath].retry = false;
241015
241173
  retryWatchers[itemPath].nextRetry = setTimeout(() => {
241016
241174
  if (itemPath in retryWatchers)
@@ -241090,67 +241248,47 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
241090
241248
  return (mod && mod.__esModule) ? mod : { "default": mod };
241091
241249
  };
241092
241250
  Object.defineProperty(exports, "__esModule", ({ value: true }));
241093
- exports.updateTransition = exports.needsProvisioningOnUpdate = exports.needsProvisioningOnCreate = void 0;
241251
+ exports.updateTransition = exports.needsProvisioningOnCreate = void 0;
241094
241252
  const ctl_1 = __nccwpck_require__(46679);
241095
241253
  const debug_1 = __importDefault(__nccwpck_require__(67984));
241096
241254
  const log = (0, debug_1.default)('firestartr:operator:status');
241097
- const catalog_common_1 = __importDefault(__nccwpck_require__(74100));
241098
- async function needsProvisioningOnCreate(itemPath, item) {
241099
- const k8sItem = item;
241100
- if (!("status" in k8sItem) || !("conditions" in k8sItem.status))
241101
- return true;
241102
- try {
241103
- const errorCondition = getConditionByType(k8sItem.status.conditions, "ERROR");
241104
- if (errorCondition.status === "True" &&
241105
- errorCondition.observedGeneration >= k8sItem.metadata.generation) {
241106
- return true;
241107
- }
241108
- }
241109
- catch (e) {
241110
- catalog_common_1.default.io.writeFunctionLog("needsProvisioningOnCreate", `Error getting error condition: ${e}`);
241111
- }
241112
- try {
241113
- const provisionedCondition = getConditionByType(k8sItem.status.conditions, "PROVISIONED");
241114
- if (provisionedCondition.status === "True" &&
241115
- provisionedCondition.observedGeneration >= k8sItem.metadata.generation) {
241116
- return false;
241117
- }
241255
+ async function needsProvisioningOnCreate(cr) {
241256
+ const fCrLog = (cr) => `The item ${cr.kind}: ${cr.metadata.name}`;
241257
+ // NO STATUS
241258
+ if (!("status" in cr) || !("conditions" in cr.status)) {
241259
+ log(`${fCrLog(cr)} has no status or conditions, provisioning...`);
241118
241260
  return true;
241119
241261
  }
241120
- catch (e) {
241121
- console.log("error getting provisioned condition");
241122
- return true;
241262
+ // ERROR
241263
+ const errCond = getConditionByType(cr.status.conditions, "ERROR");
241264
+ if (errCond && errCond.status === "True") {
241265
+ log(`${fCrLog(cr)} has an error condition, skipping provisioning...`);
241266
+ return false;
241123
241267
  }
241124
- }
241125
- exports.needsProvisioningOnCreate = needsProvisioningOnCreate;
241126
- async function needsProvisioningOnUpdate(itemPath) {
241127
- const k8sItem = await (0, ctl_1.getItemByItemPath)(itemPath);
241128
- if (!("status" in k8sItem) || !("conditions" in k8sItem.status))
241129
- return true;
241130
- try {
241131
- const errorCondition = getConditionByType(k8sItem.status.conditions, "ERROR");
241132
- if (errorCondition.status === "True" &&
241133
- errorCondition.observedGeneration >= k8sItem.metadata.generation) {
241134
- return true;
241135
- }
241268
+ // PROVISIONED
241269
+ const provCond = getConditionByType(cr.status.conditions, "PROVISIONED");
241270
+ if (provCond && provCond.status === "True" && provCond.observedGeneration >= cr.metadata.generation) {
241271
+ log(`${fCrLog(cr)} has already been provisioned, skipping provisioning...`);
241272
+ return false;
241136
241273
  }
241137
- catch (e) { }
241138
- try {
241139
- const provisionedCondition = getConditionByType(k8sItem.status.conditions, "PROVISIONED");
241140
- if (provisionedCondition.status === "True" &&
241141
- provisionedCondition.observedGeneration >= k8sItem.metadata.generation) {
241142
- return false;
241143
- }
241144
- const provisioningCondition = getConditionByType(k8sItem.status.conditions, "PROVISIONING");
241145
- return provisioningCondition.status !== "True";
241274
+ // DELETED
241275
+ const delCond = getConditionByType(cr.status.conditions, "DELETED");
241276
+ if (delCond && delCond.status === "True" && delCond.observedGeneration >= cr.metadata.generation) {
241277
+ log(`${fCrLog(cr)} has been deleted, skipping provisioning`);
241278
+ return false;
241146
241279
  }
241147
- catch (e) {
241280
+ // PROVISIONING
241281
+ const provisioningCondition = getConditionByType(cr.status.conditions, "PROVISIONING");
241282
+ if (provisioningCondition && provisioningCondition.status === "True") {
241283
+ log(`${fCrLog(cr)} is in PROVISIONING state, it was not finished, provisioning again...`);
241148
241284
  return true;
241149
241285
  }
241286
+ log(`${fCrLog(cr)} is in a not handled state, skipping provisioning...`);
241287
+ return false;
241150
241288
  }
241151
- exports.needsProvisioningOnUpdate = needsProvisioningOnUpdate;
241289
+ exports.needsProvisioningOnCreate = needsProvisioningOnCreate;
241152
241290
  async function updateTransition(itemPath, reason, type, statusValue, message = "", updateStatusOnly = false) {
241153
- log("UPDATE TRANSITION");
241291
+ log("Update transition for item: %s, reason: %s, type: %s, status: %s, message: %s, updateStatusOnly: %s", itemPath, reason, type, statusValue, message, updateStatusOnly);
241154
241292
  const k8sItem = await (0, ctl_1.getItemByItemPath)(itemPath);
241155
241293
  if (!("status" in k8sItem))
241156
241294
  k8sItem.status = {};
@@ -241169,20 +241307,18 @@ async function updateTransition(itemPath, reason, type, statusValue, message = "
241169
241307
  }
241170
241308
  exports.updateTransition = updateTransition;
241171
241309
  function getRelevantCondition(conditionList, type) {
241172
- try {
241173
- return getConditionByType(conditionList, type);
241174
- }
241175
- catch (e) {
241176
- return {
241177
- "lastTransitionTime": new Date().toJSON(),
241178
- "lastUpdateTime": new Date().toJSON(),
241179
- "message": "",
241180
- "observedGeneration": -1,
241181
- "reason": "",
241182
- "status": "",
241183
- "type": type,
241184
- };
241185
- }
241310
+ const condition = getConditionByType(conditionList, type);
241311
+ if (condition)
241312
+ return condition;
241313
+ return {
241314
+ "lastTransitionTime": new Date().toJSON(),
241315
+ "lastUpdateTime": new Date().toJSON(),
241316
+ "message": "",
241317
+ "observedGeneration": -1,
241318
+ "reason": "",
241319
+ "status": "",
241320
+ "type": type,
241321
+ };
241186
241322
  }
241187
241323
  function updateCondition(condition, reason, status, message, generation) {
241188
241324
  condition.lastUpdateTime = new Date().toJSON();
@@ -241197,7 +241333,7 @@ function getConditionByType(conditionList, type) {
241197
241333
  if (conditionList[i].type === type)
241198
241334
  return conditionList[i];
241199
241335
  }
241200
- throw new Error(`getConditionByType: Type ${type} not found in condition list`);
241336
+ return false;
241201
241337
  }
241202
241338
  function updateConditionByType(conditionList, type, newCondition) {
241203
241339
  let typeFound = false;
@@ -241213,6 +241349,82 @@ function updateConditionByType(conditionList, type, newCondition) {
241213
241349
  }
241214
241350
 
241215
241351
 
241352
+ /***/ }),
241353
+
241354
+ /***/ 87432:
241355
+ /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
241356
+
241357
+ "use strict";
241358
+
241359
+ var __importDefault = (this && this.__importDefault) || function (mod) {
241360
+ return (mod && mod.__esModule) ? mod : { "default": mod };
241361
+ };
241362
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
241363
+ exports.itemPath = exports.Store = void 0;
241364
+ const fast_json_patch_1 = __importDefault(__nccwpck_require__(75177));
241365
+ const debug_1 = __importDefault(__nccwpck_require__(67984));
241366
+ const log = (0, debug_1.default)('firestartr:operator:store');
241367
+ class Store {
241368
+ kind;
241369
+ store = {};
241370
+ constructor(kind) {
241371
+ this.kind = kind;
241372
+ }
241373
+ add(item) {
241374
+ this.store[itemPath(this.kind, item)] = {
241375
+ item
241376
+ };
241377
+ }
241378
+ hasDeletionTimestamp(item) {
241379
+ return "deletionTimestamp" in item.metadata;
241380
+ }
241381
+ markToDelete(item) {
241382
+ this.store[itemPath(this.kind, item)] = {
241383
+ item,
241384
+ markedToDelete: true
241385
+ };
241386
+ }
241387
+ hasBeenMarkedToDelete(item) {
241388
+ const oldItem = this.getItem(item).item;
241389
+ const patches = fast_json_patch_1.default.compare(item, oldItem);
241390
+ let updated = false;
241391
+ for (const patch of patches) {
241392
+ if (patch.path.match(/^\/metadata\/deletionTimestamp/)) {
241393
+ updated = true;
241394
+ break;
241395
+ }
241396
+ }
241397
+ return updated;
241398
+ }
241399
+ modified(item) {
241400
+ const oldItem = this.getItem(item).item;
241401
+ const patches = fast_json_patch_1.default.compare(item, oldItem);
241402
+ let updated = false;
241403
+ for (const patch of patches) {
241404
+ if (patch.path.match(/^\/spec/) || patch.path.match(/\/metadata.*annotations/)) {
241405
+ updated = true;
241406
+ break;
241407
+ }
241408
+ }
241409
+ this.store[itemPath(this.kind, item)] = {
241410
+ item
241411
+ };
241412
+ return updated;
241413
+ }
241414
+ remove(item) {
241415
+ delete this.store[itemPath(this.kind, item)];
241416
+ }
241417
+ getItem(item) {
241418
+ return this.store[itemPath(this.kind, item)];
241419
+ }
241420
+ }
241421
+ exports.Store = Store;
241422
+ function itemPath(kind, item) {
241423
+ return `${item.metadata.namespace}/${kind}/${item.metadata.name}`;
241424
+ }
241425
+ exports.itemPath = itemPath;
241426
+
241427
+
241216
241428
  /***/ }),
241217
241429
 
241218
241430
  /***/ 74298:
@@ -241383,7 +241595,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
241383
241595
  };
241384
241596
  Object.defineProperty(exports, "__esModule", ({ value: true }));
241385
241597
  exports.buildProvisionerContext = exports.processOperationPlan = void 0;
241386
- const informer_1 = __nccwpck_require__(41151);
241387
241598
  const debug_1 = __importDefault(__nccwpck_require__(67984));
241388
241599
  const terraform_provisioner_1 = __nccwpck_require__(6777);
241389
241600
  const github_1 = __importDefault(__nccwpck_require__(39759));
@@ -241394,12 +241605,15 @@ const TF_PROJECTS_PATH = "/tmp/tfworkspaces";
241394
241605
  function processOperationPlan(item, op, handler) {
241395
241606
  try {
241396
241607
  clearLocalTfProjects();
241397
- switch (op) {
241398
- case informer_1.OperationType.UPDATED:
241399
- case informer_1.OperationType.CREATED:
241400
- return plan(item, op, handler);
241401
- default:
241402
- return nothing(item, op, handler);
241608
+ const policy = getPolicy(item);
241609
+ if (policy === "observe" || policy === "apply") {
241610
+ return plan(item, op, handler);
241611
+ }
241612
+ else if (policy === "destroy") {
241613
+ return plan(item, op, handler, "plain-text", "plan-destroy");
241614
+ }
241615
+ else {
241616
+ return nothing(item, op, handler);
241403
241617
  }
241404
241618
  }
241405
241619
  catch (e) {
@@ -241408,7 +241622,7 @@ function processOperationPlan(item, op, handler) {
241408
241622
  }
241409
241623
  }
241410
241624
  exports.processOperationPlan = processOperationPlan;
241411
- async function* nothing(item, op, handler) {
241625
+ async function* nothing(item, op, _handler) {
241412
241626
  yield {
241413
241627
  item,
241414
241628
  reason: op,
@@ -241417,19 +241631,19 @@ async function* nothing(item, op, handler) {
241417
241631
  message: "NOTHING"
241418
241632
  };
241419
241633
  }
241420
- async function* plan(item, op, handler, format = "plain-text") {
241634
+ async function* plan(item, op, handler, format = "plain-text", action = "plan") {
241421
241635
  if (format == "plain-text") {
241422
- for await (const transition of doPlanPlainTextFormat(item, op, handler)) {
241636
+ for await (const transition of doPlanPlainTextFormat(item, op, handler, action)) {
241423
241637
  yield transition;
241424
241638
  }
241425
241639
  }
241426
241640
  else if (format == "json") {
241427
- for await (const transition of doPlanJSONFormat(item, op, handler)) {
241641
+ for await (const transition of doPlanJSONFormat(item, op, handler, action)) {
241428
241642
  yield transition;
241429
241643
  }
241430
241644
  }
241431
241645
  }
241432
- async function* doPlanPlainTextFormat(item, op, handler) {
241646
+ async function* doPlanPlainTextFormat(item, op, handler, action) {
241433
241647
  try {
241434
241648
  yield {
241435
241649
  item,
@@ -241455,7 +241669,7 @@ async function* doPlanPlainTextFormat(item, op, handler) {
241455
241669
  const deps = await handler.resolveReferences();
241456
241670
  log('Item %s has the following dependencies: %O', item.metadata.name, deps);
241457
241671
  const context = buildProvisionerContext(item, deps);
241458
- const tfPlanOutput = await (0, terraform_provisioner_1.runTerraformProvisioner)(context, "plan");
241672
+ const tfPlanOutput = await (0, terraform_provisioner_1.runTerraformProvisioner)(context, action);
241459
241673
  await publishPlan(item, tfPlanOutput);
241460
241674
  yield {
241461
241675
  item,
@@ -241509,7 +241723,7 @@ async function* doPlanPlainTextFormat(item, op, handler) {
241509
241723
  }
241510
241724
  }
241511
241725
  }
241512
- async function* doPlanJSONFormat(item, op, handler) {
241726
+ async function* doPlanJSONFormat(item, op, handler, action) {
241513
241727
  try {
241514
241728
  yield {
241515
241729
  item,
@@ -241535,7 +241749,7 @@ async function* doPlanJSONFormat(item, op, handler) {
241535
241749
  const deps = await handler.resolveReferences();
241536
241750
  log('Item %s has the following dependencies: %O', item.metadata.name, deps);
241537
241751
  const context = buildProvisionerContext(item, deps);
241538
- const tfPlan = await (0, terraform_provisioner_1.runTerraformProvisioner)(context, "plan-json");
241752
+ const tfPlan = await (0, terraform_provisioner_1.runTerraformProvisioner)(context, action);
241539
241753
  if (tfPlan.summary.hasChanges()) {
241540
241754
  yield {
241541
241755
  item,
@@ -241843,6 +242057,11 @@ async function publishPlan(item, planOutput) {
241843
242057
  console.error(e);
241844
242058
  }
241845
242059
  }
242060
+ function getPolicy(item) {
242061
+ const policy = item.metadata.annotations && item.metadata.annotations["firestartr.dev/policy"];
242062
+ if (policy)
242063
+ return policy;
242064
+ }
241846
242065
 
241847
242066
 
241848
242067
  /***/ }),
@@ -241941,7 +242160,7 @@ const terraform_provisioner_1 = __nccwpck_require__(6777);
241941
242160
  const ctl_1 = __nccwpck_require__(46679);
241942
242161
  const ctx_1 = __nccwpck_require__(15284);
241943
242162
  const resolver_1 = __nccwpck_require__(31022);
241944
- const processOperation_1 = __nccwpck_require__(53014);
242163
+ const process_operation_1 = __nccwpck_require__(3937);
241945
242164
  const cdk8s_renderer_1 = __importDefault(__nccwpck_require__(80318));
241946
242165
  const ctl_2 = __nccwpck_require__(59018);
241947
242166
  const debug_1 = __importDefault(__nccwpck_require__(67984));
@@ -241988,7 +242207,7 @@ async function buildContext(claim, namespace, command) {
241988
242207
  };
241989
242208
  compute["runProvision"] = async () => {
241990
242209
  infolog("🔁 Running terraform process...");
241991
- const data = await (0, processOperation_1.buildProvisionerContext)(cr, deps);
242210
+ const data = await (0, process_operation_1.buildProvisionerContext)(cr, deps);
241992
242211
  const result = await (0, terraform_provisioner_1.runTerraformProvisioner)(data, command);
241993
242212
  infolog("✅ Terraform process finished");
241994
242213
  return result;
@@ -242000,7 +242219,64 @@ exports.buildContext = buildContext;
242000
242219
 
242001
242220
  /***/ }),
242002
242221
 
242003
- /***/ 53014:
242222
+ /***/ 31058:
242223
+ /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
242224
+
242225
+ "use strict";
242226
+
242227
+ var __importDefault = (this && this.__importDefault) || function (mod) {
242228
+ return (mod && mod.__esModule) ? mod : { "default": mod };
242229
+ };
242230
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
242231
+ exports.errorPolicyCompatibility = exports.policyAllowsOp = void 0;
242232
+ const informer_1 = __nccwpck_require__(41151);
242233
+ const debug_1 = __importDefault(__nccwpck_require__(67984));
242234
+ const user_feedback_ops_1 = __nccwpck_require__(36322);
242235
+ const catalog_common_1 = __importDefault(__nccwpck_require__(74100));
242236
+ const log = (0, debug_1.default)("firestartr:operator:tfworkspaces:policies");
242237
+ function policyAllowsOp(policy, op, item) {
242238
+ const foundPolicy = catalog_common_1.default.policies.getPolicyByName(policy);
242239
+ if (op === informer_1.OperationType.RETRY.toString() && foundPolicy?.allowedOps.includes(op)) {
242240
+ if ("deletionTimestamp" in item.metadata && "full-control" !== policy) {
242241
+ return false;
242242
+ }
242243
+ else {
242244
+ return true;
242245
+ }
242246
+ }
242247
+ if (!foundPolicy)
242248
+ return false;
242249
+ return foundPolicy.allowedOps.includes(op);
242250
+ }
242251
+ exports.policyAllowsOp = policyAllowsOp;
242252
+ async function* errorPolicyCompatibility(syncPolicy, generalPolicy, item, op) {
242253
+ const message = `Conflict: 'sync-policy': ${syncPolicy} and 'policy': ${generalPolicy} are not compatible`;
242254
+ for (const typeStatus of [
242255
+ ["ERROR", "True"],
242256
+ ["PROVISIONED", "False"],
242257
+ ["PROVISIONING", "False"],
242258
+ ["OUT_OF_SYNC", "False"],
242259
+ ["DELETED", "False"],
242260
+ ["PLANNING", "False"],
242261
+ ["DELETING", "False"],
242262
+ ]) {
242263
+ const [type, status] = typeStatus;
242264
+ yield {
242265
+ item,
242266
+ reason: op,
242267
+ type,
242268
+ status,
242269
+ message
242270
+ };
242271
+ }
242272
+ await (0, user_feedback_ops_1.tryPublishError)(item, op, message);
242273
+ }
242274
+ exports.errorPolicyCompatibility = errorPolicyCompatibility;
242275
+
242276
+
242277
+ /***/ }),
242278
+
242279
+ /***/ 3937:
242004
242280
  /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
242005
242281
 
242006
242282
  "use strict";
@@ -242036,38 +242312,41 @@ exports.buildProvisionerContext = exports.processOperation = void 0;
242036
242312
  const informer_1 = __nccwpck_require__(41151);
242037
242313
  const debug_1 = __importDefault(__nccwpck_require__(67984));
242038
242314
  const terraform_provisioner_1 = __nccwpck_require__(6777);
242039
- const log = (0, debug_1.default)('firestartr:operator:terraform');
242040
- const github_1 = __importDefault(__nccwpck_require__(39759));
242041
242315
  const fs = __importStar(__nccwpck_require__(57147));
242042
242316
  const path = __importStar(__nccwpck_require__(71017));
242043
- const __1 = __nccwpck_require__(79622);
242317
+ const user_feedback_ops_1 = __nccwpck_require__(36322);
242318
+ const policies_1 = __nccwpck_require__(31058);
242319
+ const catalog_common_1 = __importDefault(__nccwpck_require__(74100));
242320
+ const log = (0, debug_1.default)('firestartr:operator:terraform');
242044
242321
  const TF_PROJECTS_PATH = "/tmp/tfworkspaces";
242045
242322
  function processOperation(item, op, handler) {
242046
242323
  try {
242047
242324
  clearLocalTfProjects();
242048
- const policy = getPolicy(item);
242049
- if (policy === "observe" || (0, __1.isObserveModeActive)()) {
242325
+ const policy = getPolicy(item, "firestartr.dev/policy");
242326
+ const syncPolicy = getPolicy(item, "firestartr.dev/sync-policy");
242327
+ if (!policy || policy === "observe" || policy === "observe-only") {
242050
242328
  return observe(item, op, handler);
242051
242329
  }
242052
- else if (policy === "apply") {
242053
- switch (op) {
242054
- case informer_1.OperationType.UPDATED:
242055
- return updated(item, op, handler);
242056
- case informer_1.OperationType.CREATED:
242057
- return created(item, op, handler);
242058
- case informer_1.OperationType.RENAMED:
242059
- return renamed(item, op, handler);
242060
- case informer_1.OperationType.SYNC:
242061
- return sync(item, op, handler);
242062
- case informer_1.OperationType.MARKED_TO_DELETION:
242063
- return markedToDeletion(item, op, handler);
242064
- case informer_1.OperationType.RETRY:
242065
- return retry(item, op, handler);
242066
- case informer_1.OperationType.NOTHING:
242067
- return nothing(item, op, handler);
242068
- default:
242069
- throw new Error(`Operation ${op} not supported`);
242070
- }
242330
+ if (!(0, policies_1.policyAllowsOp)(policy, op, item)) {
242331
+ return errorPolicyNotAllowsOp(item, op, policy, handler);
242332
+ }
242333
+ switch (op) {
242334
+ case informer_1.OperationType.UPDATED:
242335
+ return updated(item, op, handler);
242336
+ case informer_1.OperationType.CREATED:
242337
+ return created(item, op, handler);
242338
+ case informer_1.OperationType.RENAMED:
242339
+ return renamed(item, op, handler);
242340
+ case informer_1.OperationType.SYNC:
242341
+ return sync(item, op, handler, syncPolicy, policy);
242342
+ case informer_1.OperationType.MARKED_TO_DELETION:
242343
+ return markedToDeletion(item, op, handler);
242344
+ case informer_1.OperationType.RETRY:
242345
+ return retry(item, op, handler);
242346
+ case informer_1.OperationType.NOTHING:
242347
+ return nothing(item, op, handler);
242348
+ default:
242349
+ throw new Error(`Operation ${op} not supported`);
242071
242350
  }
242072
242351
  }
242073
242352
  catch (e) {
@@ -242107,7 +242386,11 @@ async function* doPlanJSONFormat(item, op, handler) {
242107
242386
  const deps = await handler.resolveReferences();
242108
242387
  log('Item %s has the following dependencies: %O', item.metadata.name, deps);
242109
242388
  const context = buildProvisionerContext(item, deps);
242110
- const tfPlan = await (0, terraform_provisioner_1.runTerraformProvisioner)(context, "plan-json");
242389
+ let planType = "plan-json";
242390
+ if ("deletionTimestamp" in item.metadata) {
242391
+ planType = "plan-destroy-json";
242392
+ }
242393
+ const tfPlan = await (0, terraform_provisioner_1.runTerraformProvisioner)(context, planType);
242111
242394
  if (tfPlan.summary.hasChanges()) {
242112
242395
  yield {
242113
242396
  item,
@@ -242116,6 +242399,7 @@ async function* doPlanJSONFormat(item, op, handler) {
242116
242399
  status: "False",
242117
242400
  message: "Plan has changes"
242118
242401
  };
242402
+ policies_1.policyAllowsOp;
242119
242403
  yield {
242120
242404
  item,
242121
242405
  reason: op,
@@ -242202,8 +242486,8 @@ async function* renamed(item, op, handler) {
242202
242486
  yield transition;
242203
242487
  }
242204
242488
  }
242205
- function getPolicy(item) {
242206
- const policy = item.metadata.annotations && item.metadata.annotations["firestartr.dev/policy"];
242489
+ function getPolicy(item, annotation) {
242490
+ const policy = item.metadata.annotations && item.metadata.annotations[annotation];
242207
242491
  if (policy)
242208
242492
  return policy;
242209
242493
  }
@@ -242213,7 +242497,7 @@ async function* updated(item, op, handler) {
242213
242497
  }
242214
242498
  }
242215
242499
  async function* retry(item, op, handler) {
242216
- if ("deletionTimestamp" in item.metadata) {
242500
+ if (isDestroyRetry(item)) {
242217
242501
  for await (const transition of markedToDeletion(item, op, handler)) {
242218
242502
  yield transition;
242219
242503
  }
@@ -242224,28 +242508,71 @@ async function* retry(item, op, handler) {
242224
242508
  }
242225
242509
  }
242226
242510
  }
242227
- async function* sync(item, op, handler) {
242511
+ function isDestroyRetry(item) {
242512
+ if ("deletionTimestamp" in item.metadata) {
242513
+ return true;
242514
+ }
242515
+ return false;
242516
+ }
242517
+ async function* sync(item, op, handler, syncPolicy, generalPolicy) {
242228
242518
  yield {
242229
242519
  item,
242230
242520
  reason: op,
242231
242521
  type: "SYNCHRONIZED",
242232
242522
  status: "False",
242233
- message: "Synth CDKTF"
242523
+ message: "Sync process started"
242234
242524
  };
242235
- for await (const transition of doApply(item, op, handler)) {
242236
- yield transition;
242525
+ if (!syncPolicy) {
242526
+ log("No sync policy defined, allowing operation by default (observe)");
242527
+ yield* doPlanJSONFormat(item, op, handler);
242528
+ return;
242529
+ }
242530
+ else if (!catalog_common_1.default.policies.policiesAreCompatible(syncPolicy, generalPolicy)) {
242531
+ yield* (0, policies_1.errorPolicyCompatibility)(syncPolicy, generalPolicy, item, op);
242532
+ return;
242533
+ }
242534
+ else {
242535
+ switch (syncPolicy) {
242536
+ case "apply": {
242537
+ yield* doApply(item, op, handler);
242538
+ break;
242539
+ }
242540
+ case "observe": {
242541
+ yield* doPlanJSONFormat(item, op, handler);
242542
+ break;
242543
+ }
242544
+ default: {
242545
+ log("Policy %s not supported, switching to observe", syncPolicy);
242546
+ yield* doPlanJSONFormat(item, op, handler);
242547
+ break;
242548
+ }
242549
+ }
242237
242550
  }
242238
242551
  yield {
242239
242552
  item,
242240
242553
  reason: op,
242241
242554
  type: "SYNCHRONIZED",
242242
242555
  status: "True",
242243
- message: "terraform execution finished"
242556
+ message: "Sync process finished"
242244
242557
  };
242245
242558
  }
242246
242559
  async function* markedToDeletion(item, op, handler) {
242247
242560
  try {
242248
242561
  let type = "DELETING";
242562
+ yield {
242563
+ item,
242564
+ reason: op,
242565
+ type: "PROVISIONING",
242566
+ status: "False",
242567
+ message: "markedToDeletion"
242568
+ };
242569
+ yield {
242570
+ item,
242571
+ reason: op,
242572
+ type: "DELETED",
242573
+ status: "False",
242574
+ message: "markedToDeletion"
242575
+ };
242249
242576
  yield {
242250
242577
  item,
242251
242578
  reason: op,
@@ -242284,7 +242611,7 @@ async function* markedToDeletion(item, op, handler) {
242284
242611
  const deps = await handler.resolveReferences();
242285
242612
  const context = buildProvisionerContext(item, deps);
242286
242613
  const destroyOutput = await (0, terraform_provisioner_1.runTerraformProvisioner)(context, "destroy");
242287
- await tryPublishApply(item, destroyOutput);
242614
+ await (0, user_feedback_ops_1.tryPublishDestroy)(item, destroyOutput);
242288
242615
  yield {
242289
242616
  item,
242290
242617
  reason: op,
@@ -242292,6 +242619,13 @@ async function* markedToDeletion(item, op, handler) {
242292
242619
  status: "False",
242293
242620
  message: "Destroying process finished"
242294
242621
  };
242622
+ yield {
242623
+ item,
242624
+ reason: op,
242625
+ type: "DELETED",
242626
+ status: "True",
242627
+ message: "destroyed"
242628
+ };
242295
242629
  await handler.finalize(handler.pluralKind, item.metadata.namespace, item, "firestartr.dev/finalizer");
242296
242630
  await handler.writeTerraformOutputInTfResult(item, destroyOutput);
242297
242631
  handler.success();
@@ -242325,6 +242659,13 @@ async function* nothing(item, op, handler) {
242325
242659
  */
242326
242660
  async function* doApply(item, op, handler) {
242327
242661
  try {
242662
+ yield {
242663
+ item,
242664
+ reason: op,
242665
+ type: "DELETED",
242666
+ status: "False",
242667
+ message: "markedToDeletion"
242668
+ };
242328
242669
  yield {
242329
242670
  item,
242330
242671
  reason: op,
@@ -242366,7 +242707,7 @@ async function* doApply(item, op, handler) {
242366
242707
  log('Item %s has the following dependencies: %O', item.metadata.name, deps);
242367
242708
  const context = buildProvisionerContext(item, deps);
242368
242709
  const applyOutput = await (0, terraform_provisioner_1.runTerraformProvisioner)(context, "apply");
242369
- await tryPublishApply(item, applyOutput);
242710
+ await (0, user_feedback_ops_1.tryPublishApply)(item, applyOutput);
242370
242711
  const terraformOutputJson = await (0, terraform_provisioner_1.runTerraformProvisioner)(context, "output");
242371
242712
  if (!terraformOutputJson) {
242372
242713
  throw new Error(`Terraform output is empty for ${item.kind}/${item.metadata.name}`);
@@ -242399,7 +242740,7 @@ async function* doApply(item, op, handler) {
242399
242740
  }
242400
242741
  catch (e) {
242401
242742
  console.error(e);
242402
- await tryPublishApply(item, e);
242743
+ await (0, user_feedback_ops_1.tryPublishApply)(item, e);
242403
242744
  log("Error applying item %s: %O", item.metadata.name, e);
242404
242745
  yield {
242405
242746
  item,
@@ -242428,6 +242769,73 @@ async function* doApply(item, op, handler) {
242428
242769
  }
242429
242770
  }
242430
242771
  }
242772
+ async function* errorPolicyNotAllowsOp(item, op, policy, handler) {
242773
+ const fSearchAllowedPoliciesForOp = (op) => {
242774
+ let allowedPolicies = [];
242775
+ for (const policy of catalog_common_1.default.policies.FIRESTARTR_POLICIES) {
242776
+ if (policy.allowedOps.includes(op)) {
242777
+ allowedPolicies.push(policy.name);
242778
+ }
242779
+ }
242780
+ if (allowedPolicies.length > 0)
242781
+ return allowedPolicies.join(", ");
242782
+ return "none";
242783
+ };
242784
+ const errorMessage = `Operation ${op} not allowed by policy \`${policy}\`, to allow this operation, switch to one of the following policies: \`${fSearchAllowedPoliciesForOp(op)}\``;
242785
+ const reason = "POLICY CONFLICT";
242786
+ await (0, user_feedback_ops_1.tryPublishError)(item, reason, errorMessage);
242787
+ yield {
242788
+ item,
242789
+ reason: op,
242790
+ type: "ERROR",
242791
+ status: "True",
242792
+ message: errorMessage
242793
+ };
242794
+ yield {
242795
+ item,
242796
+ reason: op,
242797
+ type: "PROVISIONED",
242798
+ status: "False",
242799
+ message: errorMessage
242800
+ };
242801
+ yield {
242802
+ item,
242803
+ reason: op,
242804
+ type: "PROVISIONING",
242805
+ status: "False",
242806
+ message: errorMessage
242807
+ };
242808
+ yield {
242809
+ item,
242810
+ reason: op,
242811
+ type: "OUT_OF_SYNC",
242812
+ status: "False",
242813
+ message: errorMessage
242814
+ };
242815
+ yield {
242816
+ item,
242817
+ reason: op,
242818
+ type: "DELETED",
242819
+ status: "False",
242820
+ message: errorMessage
242821
+ };
242822
+ yield {
242823
+ item,
242824
+ reason: op,
242825
+ type: "PLANNING",
242826
+ status: "False",
242827
+ message: errorMessage
242828
+ };
242829
+ yield {
242830
+ item,
242831
+ reason: op,
242832
+ type: "DELETING",
242833
+ status: "False",
242834
+ message: errorMessage
242835
+ };
242836
+ await handler.writeTerraformOutputInTfResult(item, errorMessage);
242837
+ handler.error();
242838
+ }
242431
242839
  /**
242432
242840
  * @description Adapts the CR to the format expected by the terraform provisioner
242433
242841
  * @param item - CR to be applied
@@ -242619,6 +243027,23 @@ function getErrorOutputMessage(cr, key, ref) {
242619
243027
  throw new Error(`❌ Source ${cr.spec.source} not supported`);
242620
243028
  }
242621
243029
  }
243030
+
243031
+
243032
+ /***/ }),
243033
+
243034
+ /***/ 36322:
243035
+ /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
243036
+
243037
+ "use strict";
243038
+
243039
+ var __importDefault = (this && this.__importDefault) || function (mod) {
243040
+ return (mod && mod.__esModule) ? mod : { "default": mod };
243041
+ };
243042
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
243043
+ exports.publishError = exports.tryPublishError = exports.publishApply = exports.tryPublishDestroy = exports.tryPublishApply = void 0;
243044
+ const github_1 = __importDefault(__nccwpck_require__(39759));
243045
+ const debug_1 = __importDefault(__nccwpck_require__(67984));
243046
+ const log = (0, debug_1.default)('firestartr:operator:terraform');
242622
243047
  async function tryPublishApply(item, planOutput) {
242623
243048
  try {
242624
243049
  if (!("firestartr.dev/last-state-pr" in item.metadata.annotations)) {
@@ -242631,7 +243056,63 @@ async function tryPublishApply(item, planOutput) {
242631
243056
  log(`Error publishing apply: ${e}`);
242632
243057
  }
242633
243058
  }
243059
+ exports.tryPublishApply = tryPublishApply;
243060
+ async function tryPublishDestroy(item, destroyOutput) {
243061
+ try {
243062
+ log("Trying to publish destroy");
243063
+ const { repo, org } = extractPrInfo(item);
243064
+ const lastPr = await github_1.default.pulls.filterPrBy({
243065
+ title: `hydrate: ${item.metadata.name}`,
243066
+ state: 'closed',
243067
+ repo,
243068
+ owner: org,
243069
+ userType: 'Bot'
243070
+ }, {
243071
+ maxRetries: 3
243072
+ });
243073
+ if (!lastPr) {
243074
+ log(`CR ${item.metadata.name} has no last state PR. Skipping terraform destroy publish.`);
243075
+ return;
243076
+ }
243077
+ const comment = `<h1>
243078
+ <img width="25" src="https://static-00.iconduck.com/assets.00/file-type-terraform-icon-1821x2048-mbxeegff.png"> Terraform destroy
243079
+ </h1>
243080
+ <p><b>TFWorkspace: </b>${item.metadata.name}</p>
243081
+
243082
+ <details id=github>
243083
+ <summary>DESTROY LOGS</summary>
243084
+
243085
+ \`\`\`shell
243086
+ ${destroyOutput}
243087
+ \`\`\`
243088
+ </details>`;
243089
+ log("Publishing comment in PR number: ", lastPr.number);
243090
+ await github_1.default.pulls.commentInPR(comment, lastPr.number, repo, org);
243091
+ log("Published destroy comment in PR number: ", lastPr.number);
243092
+ }
243093
+ catch (e) {
243094
+ log(`Error publishing apply: ${e}`);
243095
+ }
243096
+ }
243097
+ exports.tryPublishDestroy = tryPublishDestroy;
242634
243098
  async function publishApply(item, applyOutput) {
243099
+ const { prNumber, repo, org } = extractPrInfo(item);
243100
+ const comment = `<h1>
243101
+ <img width="25" src="https://static-00.iconduck.com/assets.00/file-type-terraform-icon-1821x2048-mbxeegff.png"> Terraform apply
243102
+ </h1>
243103
+ <p><b>TFWorkspace: </b>${item.metadata.name}</p>
243104
+
243105
+ <details id=github>
243106
+ <summary>APPLY LOGS</summary>
243107
+
243108
+ \`\`\`shell
243109
+ ${applyOutput}
243110
+ \`\`\`
243111
+ </details>`;
243112
+ await github_1.default.pulls.commentInPR(comment, parseInt(prNumber), repo, org);
243113
+ }
243114
+ exports.publishApply = publishApply;
243115
+ function extractPrInfo(item) {
242635
243116
  const prInfo = item.metadata.annotations["firestartr.dev/last-state-pr"];
242636
243117
  const prNumber = prInfo.split("#")[1];
242637
243118
  if (!prNumber)
@@ -242642,20 +243123,27 @@ async function publishApply(item, applyOutput) {
242642
243123
  const repo = prInfo.split("#")[0].split("/")[1];
242643
243124
  if (!repo)
242644
243125
  throw new Error("No repo found in CR");
242645
- const comment = `<h1>
242646
- <img width="25" src="https://static-00.iconduck.com/assets.00/file-type-terraform-icon-1821x2048-mbxeegff.png"> Terraform apply
242647
- </h1>
242648
- <p><b>TFWorkspace: </b>${item.metadata.name}</p>
242649
-
242650
- <details id=github>
242651
- <summary>APPLY LOGS</summary>
242652
-
242653
- \`\`\`shell
242654
- ${applyOutput}
242655
- \`\`\`
242656
- </details>`;
243126
+ return { prNumber, repo, org };
243127
+ }
243128
+ async function tryPublishError(item, reason, message) {
243129
+ try {
243130
+ await publishError(item, reason, message);
243131
+ }
243132
+ catch (e) {
243133
+ log(`Error publishing warning: ${e}`);
243134
+ }
243135
+ }
243136
+ exports.tryPublishError = tryPublishError;
243137
+ async function publishError(item, reason, message) {
243138
+ const { prNumber, repo, org } = extractPrInfo(item);
243139
+ const comment = `# ❌ Error on claim ${item.metadata.annotations["firestartr.dev/claim-ref"].split("/")[1]}
243140
+ ### 📝 Reason: ${reason}
243141
+ #### â„šī¸ Details:
243142
+ ${message}
243143
+ `;
242657
243144
  await github_1.default.pulls.commentInPR(comment, parseInt(prNumber), repo, org);
242658
243145
  }
243146
+ exports.publishError = publishError;
242659
243147
 
242660
243148
 
242661
243149
  /***/ }),
@@ -243864,6 +244352,12 @@ async function execCommand(command, tfProject) {
243864
244352
  case "apply":
243865
244353
  await tfProject.apply();
243866
244354
  break;
244355
+ case "plan-destroy":
244356
+ await tfProject.planDestroy("human");
244357
+ break;
244358
+ case "plan-destroy-json":
244359
+ await tfProject.planDestroy("json");
244360
+ break;
243867
244361
  case "destroy":
243868
244362
  await tfProject.destroy();
243869
244363
  break;
@@ -243965,6 +244459,12 @@ class TFProjectManager {
243965
244459
  this.tfOutput = null;
243966
244460
  this.tfOutput = await (0, utils_1.plan)(this.projectPath, this.secrets, format);
243967
244461
  }
244462
+ async planDestroy(format) {
244463
+ await this.__init();
244464
+ if (format == "json")
244465
+ this.tfOutput = null;
244466
+ this.tfOutput = await (0, utils_1.plan)(this.projectPath, this.secrets, format, ["plan", "-destroy"]);
244467
+ }
243968
244468
  async apply() {
243969
244469
  await this.__init();
243970
244470
  this.tfOutput += await (0, utils_1.apply)(this.projectPath, this.secrets);
@@ -244389,8 +244889,8 @@ async function initFromModule(path, source, secrets) {
244389
244889
  ], secrets, []);
244390
244890
  }
244391
244891
  exports.initFromModule = initFromModule;
244392
- async function plan(path, secrets, format) {
244393
- const plan = await tfExec(path, ["plan"]
244892
+ async function plan(path, secrets, format, args = ["plan"]) {
244893
+ const plan = await tfExec(path, args
244394
244894
  .concat(format == "json" ?
244395
244895
  ["-json"]
244396
244896
  :
@@ -244419,7 +244919,7 @@ async function tfExec(path, args, secrets, extraArgs = ["-input=false"]) {
244419
244919
  for (const secret of secrets) {
244420
244920
  process.env[`${secret.key}`] = secret.value;
244421
244921
  }
244422
- process.env["TF_PLUGIN_CACHE_DIR"] = "/tmp/terraform-plugins-cache";
244922
+ process.env["TF_PLUGIN_CACHE_DIR"] = "/home/terraform-plugins-cache";
244423
244923
  return new Promise((ok, ko) => {
244424
244924
  const tfProcess = (0, child_process_1.spawn)("terraform", args.concat(extraArgs), { cwd: path });
244425
244925
  tfProcess.stdout.pipe(process.stdout);