@hmcts/ccd-case-ui-toolkit 7.2.59-exui-3053-1 → 7.2.59-markdown-add-validation

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.
@@ -52,10 +52,15 @@ export class FormValidatorsService {
52
52
  return validator;
53
53
  }
54
54
  static markDownPatternValidator() {
55
- const pattern = /(\[[^\]]{0,500}\]\([^)]{0,500}\)|!\[[^\]]{0,500}\]\([^)]{0,500}\)|<img[^>]{0,500}>|<a[^>]{0,500}>.*?<\/a>)/;
55
+ // Matches: [text](url), ![alt](url), <img ...>, <a ...>...</a>
56
+ const inlineMarkdownPattern = /(?:!?\[[^\]]{0,500}\]\([^)]{0,500}\)|<(?:img\b[^>]{0,500}>|a\b[^>]{0,500}>[\s\S]*?<\/a>))/i;
57
+ // Matches: [text][id], ![alt][id], and the collapsed form [text][]
58
+ const referenceBoxPattern = /(!)?\[((?:[^[\]\\]|\\.){0,500})\]\s*\[([^\]]{0,100})\]/;
59
+ // Matches: autolinks such as <http://example.com>
60
+ const autolinkPattern = /<(?:[A-Za-z][A-Za-z0-9+.-]*:[^ <>\n]*|[A-Za-z0-9.!#$%&'*+/=?^_`{|}~-]+@[A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)+)>/;
56
61
  return (control) => {
57
62
  const value = control?.value?.toString().trim();
58
- return (value && pattern.test(value)) ? { markDownPattern: {} } : null;
63
+ return (value && (inlineMarkdownPattern.test(value) || referenceBoxPattern.test(value) || this.matchesReferenceUrlDef(value) || autolinkPattern.test(value) || this.hasMultiBracket(value))) ? { markDownPattern: {} } : null;
59
64
  };
60
65
  }
61
66
  // TODO: Strip this out as it's only here for the moment because
@@ -73,10 +78,78 @@ export class FormValidatorsService {
73
78
  }
74
79
  return control;
75
80
  }
81
+ // Check for multi-bracket markdown links and validate destination URL
82
+ static hasMultiBracket(value) {
83
+ // Sonar-friendly detector: opening-run + text + first closing ']'
84
+ const openingTextClosePattern = /\[{1,10}[^[\]\n]{1,60}\]/;
85
+ // Can add an additional RegEx for additional URL validation rules if needed here
86
+ let scanIndex = 0;
87
+ const totalLength = value.length;
88
+ while (scanIndex < totalLength) {
89
+ const seg = this.findOpeningTextClose(value, scanIndex, openingTextClosePattern);
90
+ if (!seg) {
91
+ return false; // no candidate -> no match
92
+ }
93
+ const runs = this.extendClosingRunAndRequireParen(value, seg.absStart, seg.afterFirstClose);
94
+ // if there is more than one opening '[' and there is at least a matching number of closing ']'
95
+ if (runs && runs.openingRunCount > 1 && runs.openingRunCount === runs.closingRunCount) {
96
+ // If there were additional validation rules, they would be applied here
97
+ return true;
98
+ }
99
+ // Advance to avoid stalling on overlaps
100
+ scanIndex = seg.absStart + 1;
101
+ }
102
+ return false;
103
+ }
104
+ // Find opening '[' run, text, and first closing ']'
105
+ static findOpeningTextClose(source, fromIndex, pattern) {
106
+ const slice = source.slice(fromIndex);
107
+ const match = pattern.exec(slice);
108
+ if (!match) {
109
+ return null;
110
+ }
111
+ const absStart = fromIndex + match.index;
112
+ const afterFirstClose = absStart + match[0].length; // index just after the first ']'
113
+ return { absStart, afterFirstClose };
114
+ }
115
+ // Count opening '[' run, extend the ']' run, and require '(' right after the full ']' run
116
+ static extendClosingRunAndRequireParen(source, absStart, afterFirstClose) {
117
+ const n = source.length;
118
+ // Count opening '[' run (e.g., '[[[')
119
+ let openingRunCount = 0;
120
+ for (let i = absStart; i < n && source[i] === '['; i++) {
121
+ openingRunCount++;
122
+ }
123
+ // Extend closing ']' run forward from the first one
124
+ let closingRunCount = 1;
125
+ let afterClosingRun = afterFirstClose;
126
+ while (afterClosingRun < n && source[afterClosingRun] === ']') {
127
+ closingRunCount++;
128
+ afterClosingRun++;
129
+ }
130
+ return { openingRunCount, closingRunCount, afterOpenParen: afterClosingRun + 1 };
131
+ }
132
+ static isValidReferenceUrlTitleTail(tail) {
133
+ const possibleTitle = tail.trim();
134
+ // Accept exactly one of: "title", 'title', (title) — bounded and single-line.
135
+ if (!possibleTitle || /^"[^"\r\n]{0,300}"$/.test(possibleTitle) || /^'[^'\r\n]{0,300}'$/.test(possibleTitle) || /^\([^)\r\n]{0,300}\)$/.test(possibleTitle)) {
136
+ return true;
137
+ }
138
+ return false;
139
+ }
140
+ static matchesReferenceUrlDef(line) {
141
+ // Single-line, pragmatic CommonMark-style reference definition e.g. [text]: http://example.com
142
+ const baseReferenceUrlPattern = /^[ \t]{0,3}\[([^\]]{1,100})\]:[ \t]*<?([^\s>]{1,2048})>?[ \t]*([^ \t\r\n].*)?$/m;
143
+ const mainRegEx = baseReferenceUrlPattern.exec(line);
144
+ if (!mainRegEx)
145
+ return false;
146
+ const tail = mainRegEx[3] ?? "";
147
+ return this.isValidReferenceUrlTitleTail(tail);
148
+ }
76
149
  static ɵfac = function FormValidatorsService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FormValidatorsService)(); };
77
150
  static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: FormValidatorsService, factory: FormValidatorsService.ɵfac });
78
151
  }
79
152
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FormValidatorsService, [{
80
153
  type: Injectable
81
154
  }], null, null); })();
82
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS12YWxpZGF0b3JzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jY2QtY2FzZS11aS10b29sa2l0L3NyYy9saWIvc2hhcmVkL3NlcnZpY2VzL2Zvcm0vZm9ybS12YWxpZGF0b3JzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWtELFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFLcEQsTUFBTSxPQUFPLHFCQUFxQjtJQUN4QixNQUFNLENBQVUsc0JBQXNCLEdBQW9CO1FBQ2hFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGNBQWM7S0FDNUMsQ0FBQztJQUNNLE1BQU0sQ0FBVSxrQkFBa0IsR0FBRyxNQUFNLENBQUM7SUFDNUMsTUFBTSxDQUFVLHNCQUFzQixHQUFHLFdBQVcsQ0FBQztJQUV0RCxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQW9CLEVBQUUsT0FBd0I7UUFDeEUsSUFDRSxTQUFTLENBQUMsZUFBZSxLQUFLLFNBQVMsQ0FBQyxTQUFTO1lBQ2pELHFCQUFxQixDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUN0RixDQUFDO1lBQ0QsTUFBTSxVQUFVLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekMsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDekMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDNUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO2dCQUMvRSxDQUFDO3FCQUFNLENBQUM7b0JBQ04sVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztnQkFDekMsQ0FBQztnQkFDRCxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUMvRSxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNsRSxDQUFDO2dCQUNELElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLFFBQVEsQ0FBQyxFQUFFLENBQUM7b0JBQy9FLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xFLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDN0MsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztnQkFDdkMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELENBQUM7WUFFRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDdEIsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckMsQ0FBQztZQUNELE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsQ0FBQzthQUFNLElBQUksU0FBUyxDQUFDLGVBQWUsS0FBSyxVQUFVLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDO2VBQ3RJLENBQUMsU0FBUyxDQUFDLGVBQWUsS0FBSyxTQUFTLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN4RixPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTSxNQUFNLENBQUMsY0FBYztRQUMxQixNQUFNLFNBQVMsR0FBRyxDQUFDLE9BQXdCLEVBQTBCLEVBQUU7WUFDckUsSUFBSSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUMxQixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUM7UUFDRixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU0sTUFBTSxDQUFDLHdCQUF3QjtRQUNwQyxNQUFNLE9BQU8sR0FBRyw0R0FBNEcsQ0FBQztRQUU3SCxPQUFPLENBQUMsT0FBd0IsRUFBMkIsRUFBRTtZQUMzRCxNQUFNLEtBQUssR0FBRyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2hELE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3pFLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCxnRUFBZ0U7SUFDaEUsa0VBQWtFO0lBQ2xFLGlFQUFpRTtJQUNqRSxzQkFBc0I7SUFDZixhQUFhLENBQUMsU0FBb0IsRUFBRSxPQUF3QjtRQUNqRSxPQUFPLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVNLHFCQUFxQixDQUFDLFNBQTBCLEVBQUUsV0FBbUI7UUFDMUUsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osT0FBTyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUM7WUFDeEUsT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDbkMsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7K0dBL0VVLHFCQUFxQjtnRUFBckIscUJBQXFCLFdBQXJCLHFCQUFxQjs7aUZBQXJCLHFCQUFxQjtjQURqQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vY29tbW9ucy9jb25zdGFudHMnO1xuaW1wb3J0IHsgQ2FzZUZpZWxkIH0gZnJvbSAnLi4vLi4vZG9tYWluL2RlZmluaXRpb24vY2FzZS1maWVsZC5tb2RlbCc7XG5pbXBvcnQgeyBGaWVsZFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZG9tYWluL2RlZmluaXRpb24vZmllbGQtdHlwZS1lbnVtLm1vZGVsJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZvcm1WYWxpZGF0b3JzU2VydmljZSB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENVU1RPTV9WQUxJREFURURfVFlQRVM6IEZpZWxkVHlwZUVudW1bXSA9IFtcbiAgICAnRGF0ZScsICdNb25leUdCUCcsICdMYWJlbCcsICdKdWRpY2lhbFVzZXInXG4gIF07XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfSU5QVVRfVEVYVCA9ICd0ZXh0JztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9JTlBVVF9URVhUQVJFQSA9ICd0ZXh0QXJlYXMnO1xuXG4gIHB1YmxpYyBzdGF0aWMgYWRkVmFsaWRhdG9ycyhjYXNlRmllbGQ6IENhc2VGaWVsZCwgY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICBpZiAoXG4gICAgICBjYXNlRmllbGQuZGlzcGxheV9jb250ZXh0ID09PSBDb25zdGFudHMuTUFOREFUT1JZICYmXG4gICAgICBGb3JtVmFsaWRhdG9yc1NlcnZpY2UuQ1VTVE9NX1ZBTElEQVRFRF9UWVBFUy5pbmRleE9mKGNhc2VGaWVsZC5maWVsZF90eXBlLnR5cGUpID09PSAtMVxuICAgICkge1xuICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IFtWYWxpZGF0b3JzLnJlcXVpcmVkXTtcbiAgICAgIGlmIChjYXNlRmllbGQuZmllbGRfdHlwZS50eXBlID09PSAnVGV4dCcpIHtcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKHRoaXMubWFya0Rvd25QYXR0ZXJuVmFsaWRhdG9yKCkpO1xuICAgICAgICBpZiAoY2FzZUZpZWxkLmZpZWxkX3R5cGUucmVndWxhcl9leHByZXNzaW9uKSB7XG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucGF0dGVybihjYXNlRmllbGQuZmllbGRfdHlwZS5yZWd1bGFyX2V4cHJlc3Npb24pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2godGhpcy5lbXB0eVZhbGlkYXRvcigpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FzZUZpZWxkLmZpZWxkX3R5cGUubWluICYmICh0eXBlb2YgY2FzZUZpZWxkLmZpZWxkX3R5cGUubWluID09PSAnbnVtYmVyJykpIHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgoY2FzZUZpZWxkLmZpZWxkX3R5cGUubWluKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhc2VGaWVsZC5maWVsZF90eXBlLm1heCAmJiAodHlwZW9mIGNhc2VGaWVsZC5maWVsZF90eXBlLm1heCA9PT0gJ251bWJlcicpKSB7XG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKGNhc2VGaWVsZC5maWVsZF90eXBlLm1heCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjYXNlRmllbGQuZmllbGRfdHlwZS50eXBlID09PSAnVGV4dEFyZWEnKSB7XG4gICAgICAgIHZhbGlkYXRvcnMucHVzaCh0aGlzLmVtcHR5VmFsaWRhdG9yKCkpO1xuICAgICAgICB2YWxpZGF0b3JzLnB1c2godGhpcy5tYXJrRG93blBhdHRlcm5WYWxpZGF0b3IoKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb250cm9sLnZhbGlkYXRvcikge1xuICAgICAgICB2YWxpZGF0b3JzLnB1c2goY29udHJvbC52YWxpZGF0b3IpO1xuICAgICAgfVxuICAgICAgY29udHJvbC5zZXRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpO1xuICAgIH0gZWxzZSBpZiAoY2FzZUZpZWxkLmRpc3BsYXlfY29udGV4dCA9PT0gJ09QVElPTkFMJyAmJiAoY2FzZUZpZWxkLmZpZWxkX3R5cGUudHlwZSA9PT0gJ1RleHQnIHx8IGNhc2VGaWVsZC5maWVsZF90eXBlLnR5cGUgPT09ICdUZXh0QXJlYScpXG4gICAgfHwgKGNhc2VGaWVsZC5kaXNwbGF5X2NvbnRleHQgPT09ICdDT01QTEVYJyAmJiBjYXNlRmllbGQuZmllbGRfdHlwZS50eXBlID09PSAnQ29tcGxleCcpKSB7XG4gICAgICBjb250cm9sLnNldFZhbGlkYXRvcnModGhpcy5tYXJrRG93blBhdHRlcm5WYWxpZGF0b3IoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRyb2w7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGVtcHR5VmFsaWRhdG9yKCk6IFZhbGlkYXRvckZuIHtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTpWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICBpZiAoY29udHJvbD8udmFsdWU/LnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4geyByZXF1aXJlZDoge30gfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIHZhbGlkYXRvcjtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgbWFya0Rvd25QYXR0ZXJuVmFsaWRhdG9yKCk6IFZhbGlkYXRvckZuIHtcbiAgICBjb25zdCBwYXR0ZXJuID0gLyhcXFtbXlxcXV17MCw1MDB9XFxdXFwoW14pXXswLDUwMH1cXCl8IVxcW1teXFxdXXswLDUwMH1cXF1cXChbXildezAsNTAwfVxcKXw8aW1nW14+XXswLDUwMH0+fDxhW14+XXswLDUwMH0+Lio/PFxcL2E+KS87XG5cbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udHJvbD8udmFsdWU/LnRvU3RyaW5nKCkudHJpbSgpO1xuICAgICAgcmV0dXJuICh2YWx1ZSAmJiBwYXR0ZXJuLnRlc3QodmFsdWUpKSA/IHsgbWFya0Rvd25QYXR0ZXJuOiB7fSB9IDogbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgLy8gVE9ETzogU3RyaXAgdGhpcyBvdXQgYXMgaXQncyBvbmx5IGhlcmUgZm9yIHRoZSBtb21lbnQgYmVjYXVzZVxuICAvLyB0aGUgc2VydmljZSBpcyBiZWluZyBpbmplY3RlZCBhbGwgb3ZlciB0aGUgcGxhY2UgYnV0IGl0IGRvZXNuJ3RcbiAgLy8gbmVlZCB0byBiZSBhcyBGb3JtVmFsaWRhdG9yc1NlcnZpY2UuYWRkVmFsaWRhdG9ycyBpcyBwZXJmZWN0bHlcbiAgLy8gaGFwcHkgYmVpbmcgc3RhdGljLlxuICBwdWJsaWMgYWRkVmFsaWRhdG9ycyhjYXNlRmllbGQ6IENhc2VGaWVsZCwgY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gRm9ybVZhbGlkYXRvcnNTZXJ2aWNlLmFkZFZhbGlkYXRvcnMoY2FzZUZpZWxkLCBjb250cm9sKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNYXJrRG93blZhbGlkYXRvcnMoZm9ybUdyb3VwOiBBYnN0cmFjdENvbnRyb2wsIGNvbnRyb2xQYXRoOiBzdHJpbmcpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KGNvbnRyb2xQYXRoKTtcbiAgICBpZiAoY29udHJvbCkge1xuICAgICAgY29udHJvbC5zZXRWYWxpZGF0b3JzKEZvcm1WYWxpZGF0b3JzU2VydmljZS5tYXJrRG93blBhdHRlcm5WYWxpZGF0b3IoKSk7XG4gICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyb2w7XG4gIH1cbn1cbiJdfQ==
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS12YWxpZGF0b3JzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jY2QtY2FzZS11aS10b29sa2l0L3NyYy9saWIvc2hhcmVkL3NlcnZpY2VzL2Zvcm0vZm9ybS12YWxpZGF0b3JzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWtELFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFLcEQsTUFBTSxPQUFPLHFCQUFxQjtJQUN4QixNQUFNLENBQVUsc0JBQXNCLEdBQW9CO1FBQ2hFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGNBQWM7S0FDNUMsQ0FBQztJQUNNLE1BQU0sQ0FBVSxrQkFBa0IsR0FBRyxNQUFNLENBQUM7SUFDNUMsTUFBTSxDQUFVLHNCQUFzQixHQUFHLFdBQVcsQ0FBQztJQUV0RCxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQW9CLEVBQUUsT0FBd0I7UUFDeEUsSUFDRSxTQUFTLENBQUMsZUFBZSxLQUFLLFNBQVMsQ0FBQyxTQUFTO1lBQ2pELHFCQUFxQixDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUN0RixDQUFDO1lBQ0QsTUFBTSxVQUFVLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekMsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDekMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsa0JB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Q0FBQztJQUdPLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxJQUFZO1FBQ2hELCtGQUErRjtRQUMvRixNQUFNLHVCQUF1QixHQUFHLGlGQUFpRixDQUFDO1FBRWxILE1BQU0sU0FBUyxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzdCLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEMsT0FBTyxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakQsQ0FBQzsrR0FqTFUscUJBQXFCO2dFQUFyQixxQkFBcUIsV0FBckIscUJBQXFCOztpRkFBckIscUJBQXFCO2NBRGpDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuLi8uLi9jb21tb25zL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBDYXNlRmllbGQgfSBmcm9tICcuLi8uLi9kb21haW4vZGVmaW5pdGlvbi9jYXNlLWZpZWxkLm1vZGVsJztcbmltcG9ydCB7IEZpZWxkVHlwZUVudW0gfSBmcm9tICcuLi8uLi9kb21haW4vZGVmaW5pdGlvbi9maWVsZC10eXBlLWVudW0ubW9kZWwnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRm9ybVZhbGlkYXRvcnNTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ1VTVE9NX1ZBTElEQVRFRF9UWVBFUzogRmllbGRUeXBlRW51bVtdID0gW1xuICAgICdEYXRlJywgJ01vbmV5R0JQJywgJ0xhYmVsJywgJ0p1ZGljaWFsVXNlcidcbiAgXTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9JTlBVVF9URVhUID0gJ3RleHQnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0lOUFVUX1RFWFRBUkVBID0gJ3RleHRBcmVhcyc7XG5cbiAgcHVibGljIHN0YXRpYyBhZGRWYWxpZGF0b3JzKGNhc2VGaWVsZDogQ2FzZUZpZWxkLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIGlmIChcbiAgICAgIGNhc2VGaWVsZC5kaXNwbGF5X2NvbnRleHQgPT09IENvbnN0YW50cy5NQU5EQVRPUlkgJiZcbiAgICAgIEZvcm1WYWxpZGF0b3JzU2VydmljZS5DVVNUT01fVkFMSURBVEVEX1RZUEVTLmluZGV4T2YoY2FzZUZpZWxkLmZpZWxkX3R5cGUudHlwZSkgPT09IC0xXG4gICAgKSB7XG4gICAgICBjb25zdCB2YWxpZGF0b3JzID0gW1ZhbGlkYXRvcnMucmVxdWlyZWRdO1xuICAgICAgaWYgKGNhc2VGaWVsZC5maWVsZF90eXBlLnR5cGUgPT09ICdUZXh0Jykge1xuICAgICAgICB2YWxpZGF0b3JzLnB1c2godGhpcy5tYXJrRG93blBhdHRlcm5WYWxpZGF0b3IoKSk7XG4gICAgICAgIGlmIChjYXNlRmllbGQuZmllbGRfdHlwZS5yZWd1bGFyX2V4cHJlc3Npb24pIHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5wYXR0ZXJuKGNhc2VGaWVsZC5maWVsZF90eXBlLnJlZ3VsYXJfZXhwcmVzc2lvbikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaCh0aGlzLmVtcHR5VmFsaWRhdG9yKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYXNlRmllbGQuZmllbGRfdHlwZS5taW4gJiYgKHR5cGVvZiBjYXNlRmllbGQuZmllbGRfdHlwZS5taW4gPT09ICdudW1iZXInKSkge1xuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aChjYXNlRmllbGQuZmllbGRfdHlwZS5taW4pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FzZUZpZWxkLmZpZWxkX3R5cGUubWF4ICYmICh0eXBlb2YgY2FzZUZpZWxkLmZpZWxkX3R5cGUubWF4ID09PSAnbnVtYmVyJykpIHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgoY2FzZUZpZWxkLmZpZWxkX3R5cGUubWF4KSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNhc2VGaWVsZC5maWVsZF90eXBlLnR5cGUgPT09ICdUZXh0QXJlYScpIHtcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKHRoaXMuZW1wdHlWYWxpZGF0b3IoKSk7XG4gICAgICAgIHZhbGlkYXRvcnMucHVzaCh0aGlzLm1hcmtEb3duUGF0dGVyblZhbGlkYXRvcigpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnRyb2wudmFsaWRhdG9yKSB7XG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChjb250cm9sLnZhbGlkYXRvcik7XG4gICAgICB9XG4gICAgICBjb250cm9sLnNldFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XG4gICAgfSBlbHNlIGlmIChjYXNlRmllbGQuZGlzcGxheV9jb250ZXh0ID09PSAnT1BUSU9OQUwnICYmIChjYXNlRmllbGQuZmllbGRfdHlwZS50eXBlID09PSAnVGV4dCcgfHwgY2FzZUZpZWxkLmZpZWxkX3R5cGUudHlwZSA9PT0gJ1RleHRBcmVhJylcbiAgICAgIHx8IChjYXNlRmllbGQuZGlzcGxheV9jb250ZXh0ID09PSAnQ09NUExFWCcgJiYgY2FzZUZpZWxkLmZpZWxkX3R5cGUudHlwZSA9PT0gJ0NvbXBsZXgnKSkge1xuICAgICAgY29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMubWFya0Rvd25QYXR0ZXJuVmFsaWRhdG9yKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250cm9sO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBlbXB0eVZhbGlkYXRvcigpOiBWYWxpZGF0b3JGbiB7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIGlmIChjb250cm9sPy52YWx1ZT8udG9TdHJpbmcoKS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB7IHJlcXVpcmVkOiB7fSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICByZXR1cm4gdmFsaWRhdG9yO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBtYXJrRG93blBhdHRlcm5WYWxpZGF0b3IoKTogVmFsaWRhdG9yRm4ge1xuICAgIC8vIE1hdGNoZXM6IFt0ZXh0XSh1cmwpLCAhW2FsdF0odXJsKSwgPGltZyAuLi4+LCA8YSAuLi4+Li4uPC9hPlxuICAgIGNvbnN0IGlubGluZU1hcmtkb3duUGF0dGVybiA9IC8oPzohP1xcW1teXFxdXXswLDUwMH1cXF1cXChbXildezAsNTAwfVxcKXw8KD86aW1nXFxiW14+XXswLDUwMH0+fGFcXGJbXj5dezAsNTAwfT5bXFxzXFxTXSo/PFxcL2E+KSkvaTtcblxuICAgIC8vIE1hdGNoZXM6IFt0ZXh0XVtpZF0sICFbYWx0XVtpZF0sIGFuZCB0aGUgY29sbGFwc2VkIGZvcm0gW3RleHRdW11cbiAgICBjb25zdCByZWZlcmVuY2VCb3hQYXR0ZXJuID0gLyghKT9cXFsoKD86W15bXFxdXFxcXF18XFxcXC4pezAsNTAwfSlcXF1cXHMqXFxbKFteXFxdXXswLDEwMH0pXFxdLztcblxuICAgIC8vIE1hdGNoZXM6IGF1dG9saW5rcyBzdWNoIGFzIDxodHRwOi8vZXhhbXBsZS5jb20+XG4gICAgY29uc3QgYXV0b2xpbmtQYXR0ZXJuID0gLzwoPzpbQS1aYS16XVtBLVphLXowLTkrLi1dKjpbXiA8Plxcbl0qfFtBLVphLXowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rQFtBLVphLXowLTktXSsoPzpcXC5bQS1aYS16MC05LV0rKSspPi87XG5cbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udHJvbD8udmFsdWU/LnRvU3RyaW5nKCkudHJpbSgpO1xuICAgICAgcmV0dXJuICh2YWx1ZSAmJiAoaW5saW5lTWFya2Rvd25QYXR0ZXJuLnRlc3QodmFsdWUpIHx8IHJlZmVyZW5jZUJveFBhdHRlcm4udGVzdCh2YWx1ZSkgfHwgdGhpcy5tYXRjaGVzUmVmZXJlbmNlVXJsRGVmKHZhbHVlKSB8fCBhdXRvbGlua1BhdHRlcm4udGVzdCh2YWx1ZSkgfHwgdGhpcy5oYXNNdWx0aUJyYWNrZXQodmFsdWUgYXMgc3RyaW5nKSkpID8geyBtYXJrRG93blBhdHRlcm46IHt9IH0gOiBudWxsO1xuICAgIH07XG4gIH1cblxuICAvLyBUT0RPOiBTdHJpcCB0aGlzIG91dCBhcyBpdCdzIG9ubHkgaGVyZSBmb3IgdGhlIG1vbWVudCBiZWNhdXNlXG4gIC8vIHRoZSBzZXJ2aWNlIGlzIGJlaW5nIGluamVjdGVkIGFsbCBvdmVyIHRoZSBwbGFjZSBidXQgaXQgZG9lc24ndFxuICAvLyBuZWVkIHRvIGJlIGFzIEZvcm1WYWxpZGF0b3JzU2VydmljZS5hZGRWYWxpZGF0b3JzIGlzIHBlcmZlY3RseVxuICAvLyBoYXBweSBiZWluZyBzdGF0aWMuXG4gIHB1YmxpYyBhZGRWYWxpZGF0b3JzKGNhc2VGaWVsZDogQ2FzZUZpZWxkLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIHJldHVybiBGb3JtVmFsaWRhdG9yc1NlcnZpY2UuYWRkVmFsaWRhdG9ycyhjYXNlRmllbGQsIGNvbnRyb2wpO1xuICB9XG5cbiAgcHVibGljIGFkZE1hcmtEb3duVmFsaWRhdG9ycyhmb3JtR3JvdXA6IEFic3RyYWN0Q29udHJvbCwgY29udHJvbFBhdGg6IHN0cmluZyk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgY29uc3QgY29udHJvbCA9IGZvcm1Hcm91cC5nZXQoY29udHJvbFBhdGgpO1xuICAgIGlmIChjb250cm9sKSB7XG4gICAgICBjb250cm9sLnNldFZhbGlkYXRvcnMoRm9ybVZhbGlkYXRvcnNTZXJ2aWNlLm1hcmtEb3duUGF0dGVyblZhbGlkYXRvcigpKTtcbiAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbDtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBtdWx0aS1icmFja2V0IG1hcmtkb3duIGxpbmtzIGFuZCB2YWxpZGF0ZSBkZXN0aW5hdGlvbiBVUkxcbiAgcHJpdmF0ZSBzdGF0aWMgaGFzTXVsdGlCcmFja2V0KHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcblxuICAgIC8vIFNvbmFyLWZyaWVuZGx5IGRldGVjdG9yOiBvcGVuaW5nLXJ1biArIHRleHQgKyBmaXJzdCBjbG9zaW5nICddJ1xuICAgIGNvbnN0IG9wZW5pbmdUZXh0Q2xvc2VQYXR0ZXJuID0gL1xcW3sxLDEwfVteW1xcXVxcbl17MSw2MH1cXF0vO1xuXG4gICAgLy8gQ2FuIGFkZCBhbiBhZGRpdGlvbmFsIFJlZ0V4IGZvciBhZGRpdGlvbmFsIFVSTCB2YWxpZGF0aW9uIHJ1bGVzIGlmIG5lZWRlZCBoZXJlXG5cbiAgICBsZXQgc2NhbkluZGV4ID0gMDtcbiAgICBjb25zdCB0b3RhbExlbmd0aCA9IHZhbHVlLmxlbmd0aDtcblxuICAgIHdoaWxlIChzY2FuSW5kZXggPCB0b3RhbExlbmd0aCkge1xuICAgICAgY29uc3Qgc2VnID0gdGhpcy5maW5kT3BlbmluZ1RleHRDbG9zZSh2YWx1ZSwgc2NhbkluZGV4LCBvcGVuaW5nVGV4dENsb3NlUGF0dGVybik7XG4gICAgICBpZiAoIXNlZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG5vIGNhbmRpZGF0ZSAtPiBubyBtYXRjaFxuICAgICAgfVxuXG4gICAgICBjb25zdCBydW5zID0gdGhpcy5leHRlbmRDbG9zaW5nUnVuQW5kUmVxdWlyZVBhcmVuKHZhbHVlLCBzZWcuYWJzU3RhcnQsIHNlZy5hZnRlckZpcnN0Q2xvc2UpO1xuICAgICAgLy8gaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBvcGVuaW5nICdbJyBhbmQgdGhlcmUgaXMgYXQgbGVhc3QgYSBtYXRjaGluZyBudW1iZXIgb2YgY2xvc2luZyAnXSdcbiAgICAgIGlmIChydW5zICYmIHJ1bnMub3BlbmluZ1J1bkNvdW50ID4gMSAmJiBydW5zLm9wZW5pbmdSdW5Db3VudCA9PT0gcnVucy5jbG9zaW5nUnVuQ291bnQpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUgd2VyZSBhZGRpdGlvbmFsIHZhbGlkYXRpb24gcnVsZXMsIHRoZXkgd291bGQgYmUgYXBwbGllZCBoZXJlXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBBZHZhbmNlIHRvIGF2b2lkIHN0YWxsaW5nIG9uIG92ZXJsYXBzXG4gICAgICBzY2FuSW5kZXggPSBzZWcuYWJzU3RhcnQgKyAxO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBGaW5kIG9wZW5pbmcgJ1snIHJ1biwgdGV4dCwgYW5kIGZpcnN0IGNsb3NpbmcgJ10nXG4gIHByaXZhdGUgc3RhdGljIGZpbmRPcGVuaW5nVGV4dENsb3NlKFxuICAgIHNvdXJjZTogc3RyaW5nLFxuICAgIGZyb21JbmRleDogbnVtYmVyLFxuICAgIHBhdHRlcm46IFJlZ0V4cFxuICApOiB7IGFic1N0YXJ0OiBudW1iZXI7IGFmdGVyRmlyc3RDbG9zZTogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCBzbGljZSA9IHNvdXJjZS5zbGljZShmcm9tSW5kZXgpO1xuICAgIGNvbnN0IG1hdGNoID0gcGF0dGVybi5leGVjKHNsaWNlKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgYWJzU3RhcnQgPSBmcm9tSW5kZXggKyBtYXRjaC5pbmRleDtcbiAgICBjb25zdCBhZnRlckZpcnN0Q2xvc2UgPSBhYnNTdGFydCArIG1hdGNoWzBdLmxlbmd0aDsgLy8gaW5kZXgganVzdCBhZnRlciB0aGUgZmlyc3QgJ10nXG4gICAgcmV0dXJuIHsgYWJzU3RhcnQsIGFmdGVyRmlyc3RDbG9zZSB9O1xuICB9XG5cbiAgLy8gQ291bnQgb3BlbmluZyAnWycgcnVuLCBleHRlbmQgdGhlICddJyBydW4sIGFuZCByZXF1aXJlICcoJyByaWdodCBhZnRlciB0aGUgZnVsbCAnXScgcnVuXG4gIHByaXZhdGUgc3RhdGljIGV4dGVuZENsb3NpbmdSdW5BbmRSZXF1aXJlUGFyZW4oXG4gICAgc291cmNlOiBzdHJpbmcsXG4gICAgYWJzU3RhcnQ6IG51bWJlcixcbiAgICBhZnRlckZpcnN0Q2xvc2U6IG51bWJlclxuICApOiB7IG9wZW5pbmdSdW5Db3VudDogbnVtYmVyOyBjbG9zaW5nUnVuQ291bnQ6IG51bWJlcjsgYWZ0ZXJPcGVuUGFyZW46IG51bWJlciB9IHwgbnVsbCB7XG4gICAgY29uc3QgbiA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgICAvLyBDb3VudCBvcGVuaW5nICdbJyBydW4gKGUuZy4sICdbW1snKVxuICAgIGxldCBvcGVuaW5nUnVuQ291bnQgPSAwO1xuICAgIGZvciAobGV0IGkgPSBhYnNTdGFydDsgaSA8IG4gJiYgc291cmNlW2ldID09PSAnWyc7IGkrKykge1xuICAgICAgb3BlbmluZ1J1bkNvdW50Kys7XG4gICAgfVxuXG4gICAgLy8gRXh0ZW5kIGNsb3NpbmcgJ10nIHJ1biBmb3J3YXJkIGZyb20gdGhlIGZpcnN0IG9uZVxuICAgIGxldCBjbG9zaW5nUnVuQ291bnQgPSAxO1xuICAgIGxldCBhZnRlckNsb3NpbmdSdW4gPSBhZnRlckZpcnN0Q2xvc2U7XG4gICAgd2hpbGUgKGFmdGVyQ2xvc2luZ1J1biA8IG4gJiYgc291cmNlW2FmdGVyQ2xvc2luZ1J1bl0gPT09ICddJykge1xuICAgICAgY2xvc2luZ1J1bkNvdW50Kys7XG4gICAgICBhZnRlckNsb3NpbmdSdW4rKztcbiAgICB9XG5cbiAgICByZXR1cm4geyBvcGVuaW5nUnVuQ291bnQsIGNsb3NpbmdSdW5Db3VudCwgYWZ0ZXJPcGVuUGFyZW46IGFmdGVyQ2xvc2luZ1J1biArIDEgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGlzVmFsaWRSZWZlcmVuY2VVcmxUaXRsZVRhaWwodGFpbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcG9zc2libGVUaXRsZSA9IHRhaWwudHJpbSgpO1xuICAgIC8vIEFjY2VwdCBleGFjdGx5IG9uZSBvZjogXCJ0aXRsZVwiLCAndGl0bGUnLCAodGl0bGUpIOKAlCBib3VuZGVkIGFuZCBzaW5nbGUtbGluZS5cbiAgICBpZiAoIXBvc3NpYmxlVGl0bGUgfHwgL15cIlteXCJcXHJcXG5dezAsMzAwfVwiJC8udGVzdChwb3NzaWJsZVRpdGxlKSB8fCAvXidbXidcXHJcXG5dezAsMzAwfSckLy50ZXN0KHBvc3NpYmxlVGl0bGUpIHx8IC9eXFwoW14pXFxyXFxuXXswLDMwMH1cXCkkLy50ZXN0KHBvc3NpYmxlVGl0bGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cblxuICBwcml2YXRlIHN0YXRpYyBtYXRjaGVzUmVmZXJlbmNlVXJsRGVmKGxpbmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIFNpbmdsZS1saW5lLCBwcmFnbWF0aWMgQ29tbW9uTWFyay1zdHlsZSByZWZlcmVuY2UgZGVmaW5pdGlvbiBlLmcuIFt0ZXh0XTogaHR0cDovL2V4YW1wbGUuY29tXG4gICAgY29uc3QgYmFzZVJlZmVyZW5jZVVybFBhdHRlcm4gPSAvXlsgXFx0XXswLDN9XFxbKFteXFxdXXsxLDEwMH0pXFxdOlsgXFx0XSo8PyhbXlxccz5dezEsMjA0OH0pPj9bIFxcdF0qKFteIFxcdFxcclxcbl0uKik/JC9tO1xuXG4gICAgY29uc3QgbWFpblJlZ0V4ID0gYmFzZVJlZmVyZW5jZVVybFBhdHRlcm4uZXhlYyhsaW5lKTtcbiAgICBpZiAoIW1haW5SZWdFeCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHRhaWwgPSBtYWluUmVnRXhbM10gPz8gXCJcIjtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkUmVmZXJlbmNlVXJsVGl0bGVUYWlsKHRhaWwpO1xuICB9XG59XG4iXX0=
@@ -5093,10 +5093,15 @@ class FormValidatorsService {
5093
5093
  return validator;
5094
5094
  }
5095
5095
  static markDownPatternValidator() {
5096
- const pattern = /(\[[^\]]{0,500}\]\([^)]{0,500}\)|!\[[^\]]{0,500}\]\([^)]{0,500}\)|<img[^>]{0,500}>|<a[^>]{0,500}>.*?<\/a>)/;
5096
+ // Matches: [text](url), ![alt](url), <img ...>, <a ...>...</a>
5097
+ const inlineMarkdownPattern = /(?:!?\[[^\]]{0,500}\]\([^)]{0,500}\)|<(?:img\b[^>]{0,500}>|a\b[^>]{0,500}>[\s\S]*?<\/a>))/i;
5098
+ // Matches: [text][id], ![alt][id], and the collapsed form [text][]
5099
+ const referenceBoxPattern = /(!)?\[((?:[^[\]\\]|\\.){0,500})\]\s*\[([^\]]{0,100})\]/;
5100
+ // Matches: autolinks such as <http://example.com>
5101
+ const autolinkPattern = /<(?:[A-Za-z][A-Za-z0-9+.-]*:[^ <>\n]*|[A-Za-z0-9.!#$%&'*+/=?^_`{|}~-]+@[A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)+)>/;
5097
5102
  return (control) => {
5098
5103
  const value = control?.value?.toString().trim();
5099
- return (value && pattern.test(value)) ? { markDownPattern: {} } : null;
5104
+ return (value && (inlineMarkdownPattern.test(value) || referenceBoxPattern.test(value) || this.matchesReferenceUrlDef(value) || autolinkPattern.test(value) || this.hasMultiBracket(value))) ? { markDownPattern: {} } : null;
5100
5105
  };
5101
5106
  }
5102
5107
  // TODO: Strip this out as it's only here for the moment because
@@ -5114,6 +5119,74 @@ class FormValidatorsService {
5114
5119
  }
5115
5120
  return control;
5116
5121
  }
5122
+ // Check for multi-bracket markdown links and validate destination URL
5123
+ static hasMultiBracket(value) {
5124
+ // Sonar-friendly detector: opening-run + text + first closing ']'
5125
+ const openingTextClosePattern = /\[{1,10}[^[\]\n]{1,60}\]/;
5126
+ // Can add an additional RegEx for additional URL validation rules if needed here
5127
+ let scanIndex = 0;
5128
+ const totalLength = value.length;
5129
+ while (scanIndex < totalLength) {
5130
+ const seg = this.findOpeningTextClose(value, scanIndex, openingTextClosePattern);
5131
+ if (!seg) {
5132
+ return false; // no candidate -> no match
5133
+ }
5134
+ const runs = this.extendClosingRunAndRequireParen(value, seg.absStart, seg.afterFirstClose);
5135
+ // if there is more than one opening '[' and there is at least a matching number of closing ']'
5136
+ if (runs && runs.openingRunCount > 1 && runs.openingRunCount === runs.closingRunCount) {
5137
+ // If there were additional validation rules, they would be applied here
5138
+ return true;
5139
+ }
5140
+ // Advance to avoid stalling on overlaps
5141
+ scanIndex = seg.absStart + 1;
5142
+ }
5143
+ return false;
5144
+ }
5145
+ // Find opening '[' run, text, and first closing ']'
5146
+ static findOpeningTextClose(source, fromIndex, pattern) {
5147
+ const slice = source.slice(fromIndex);
5148
+ const match = pattern.exec(slice);
5149
+ if (!match) {
5150
+ return null;
5151
+ }
5152
+ const absStart = fromIndex + match.index;
5153
+ const afterFirstClose = absStart + match[0].length; // index just after the first ']'
5154
+ return { absStart, afterFirstClose };
5155
+ }
5156
+ // Count opening '[' run, extend the ']' run, and require '(' right after the full ']' run
5157
+ static extendClosingRunAndRequireParen(source, absStart, afterFirstClose) {
5158
+ const n = source.length;
5159
+ // Count opening '[' run (e.g., '[[[')
5160
+ let openingRunCount = 0;
5161
+ for (let i = absStart; i < n && source[i] === '['; i++) {
5162
+ openingRunCount++;
5163
+ }
5164
+ // Extend closing ']' run forward from the first one
5165
+ let closingRunCount = 1;
5166
+ let afterClosingRun = afterFirstClose;
5167
+ while (afterClosingRun < n && source[afterClosingRun] === ']') {
5168
+ closingRunCount++;
5169
+ afterClosingRun++;
5170
+ }
5171
+ return { openingRunCount, closingRunCount, afterOpenParen: afterClosingRun + 1 };
5172
+ }
5173
+ static isValidReferenceUrlTitleTail(tail) {
5174
+ const possibleTitle = tail.trim();
5175
+ // Accept exactly one of: "title", 'title', (title) — bounded and single-line.
5176
+ if (!possibleTitle || /^"[^"\r\n]{0,300}"$/.test(possibleTitle) || /^'[^'\r\n]{0,300}'$/.test(possibleTitle) || /^\([^)\r\n]{0,300}\)$/.test(possibleTitle)) {
5177
+ return true;
5178
+ }
5179
+ return false;
5180
+ }
5181
+ static matchesReferenceUrlDef(line) {
5182
+ // Single-line, pragmatic CommonMark-style reference definition e.g. [text]: http://example.com
5183
+ const baseReferenceUrlPattern = /^[ \t]{0,3}\[([^\]]{1,100})\]:[ \t]*<?([^\s>]{1,2048})>?[ \t]*([^ \t\r\n].*)?$/m;
5184
+ const mainRegEx = baseReferenceUrlPattern.exec(line);
5185
+ if (!mainRegEx)
5186
+ return false;
5187
+ const tail = mainRegEx[3] ?? "";
5188
+ return this.isValidReferenceUrlTitleTail(tail);
5189
+ }
5117
5190
  static ɵfac = function FormValidatorsService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FormValidatorsService)(); };
5118
5191
  static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: FormValidatorsService, factory: FormValidatorsService.ɵfac });
5119
5192
  }