ngx-mask 16.0.4 → 16.0.5
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.
|
@@ -450,7 +450,8 @@ class NgxMaskApplierService {
|
|
|
450
450
|
maskExpression !== '099.099.099.099' &&
|
|
451
451
|
maskExpression !== '000.000.000-00' &&
|
|
452
452
|
maskExpression !== '00.000.000/0000-00' &&
|
|
453
|
-
!maskExpression.match(/^9+\.0+$/)
|
|
453
|
+
!maskExpression.match(/^9+\.0+$/) &&
|
|
454
|
+
maskExpression[cursor] !== '9') {
|
|
454
455
|
result += inputArray[cursor];
|
|
455
456
|
}
|
|
456
457
|
cursor++;
|
|
@@ -569,4 +570,4 @@ export { NgxMaskApplierService };
|
|
|
569
570
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: NgxMaskApplierService, decorators: [{
|
|
570
571
|
type: Injectable
|
|
571
572
|
}] });
|
|
572
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1hc2stYXBwbGllci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hc2stbGliL3NyYy9saWIvbmd4LW1hc2stYXBwbGllci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQVcsTUFBTSxtQkFBbUIsQ0FBQzs7QUFFN0QsTUFDYSxxQkFBcUI7SUFEbEM7UUFFYyxZQUFPLEdBQUcsTUFBTSxDQUFVLGVBQWUsQ0FBQyxDQUFDO1FBRTlDLDBCQUFxQixHQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDO1FBRWhDLGdCQUFXLEdBQTJCLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBSS9ELG9CQUFlLEdBQStCLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO1FBRTNFLHNCQUFpQixHQUFpQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1FBRWpGLGFBQVEsR0FBd0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFFdEQsV0FBTSxHQUFzQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUVoRCxXQUFNLEdBQXNCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBRWhELHNCQUFpQixHQUFpQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1FBRWpGLGtCQUFhLEdBQTZCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBSXJFLGtCQUFhLEdBQTZCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBRXJFLHlCQUFvQixHQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDO1FBRS9CLGVBQVUsR0FBMEIsSUFBSSxDQUFDLE9BQU8s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QUMsTUFBTSxLQUFLLENBQUM7WUFDckIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBYSxFQUFFLEtBQWEsRUFBRSxFQUFFO2dCQUM1QyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssS0FBSyxHQUFHLENBQUMsRUFBRTtvQkFDL0IsT0FBTyxLQUFLLEtBQUssRUFBRSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUM7aUJBQzlDO2dCQUNELE9BQU8sS0FBSyxLQUFLLEVBQUUsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDL0QsQ0FBQyxDQUFDLENBQ0wsQ0FBQztJQUNOLENBQUM7OEdBMXNCUSxxQkFBcUI7a0hBQXJCLHFCQUFxQjs7U0FBckIscUJBQXFCOzJGQUFyQixxQkFBcUI7a0JBRGpDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HWF9NQVNLX0NPTkZJRywgSUNvbmZpZyB9IGZyb20gJy4vbmd4LW1hc2suY29uZmlnJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5neE1hc2tBcHBsaWVyU2VydmljZSB7XG4gICAgcHJvdGVjdGVkIF9jb25maWcgPSBpbmplY3Q8SUNvbmZpZz4oTkdYX01BU0tfQ09ORklHKTtcblxuICAgIHB1YmxpYyBkcm9wU3BlY2lhbENoYXJhY3RlcnM6IElDb25maWdbJ2Ryb3BTcGVjaWFsQ2hhcmFjdGVycyddID1cbiAgICAgICAgdGhpcy5fY29uZmlnLmRyb3BTcGVjaWFsQ2hhcmFjdGVycztcblxuICAgIHB1YmxpYyBoaWRkZW5JbnB1dDogSUNvbmZpZ1snaGlkZGVuSW5wdXQnXSA9IHRoaXMuX2NvbmZpZy5oaWRkZW5JbnB1dDtcblxuICAgIHB1YmxpYyBzaG93VGVtcGxhdGUhOiBJQ29uZmlnWydzaG93VGVtcGxhdGUnXTtcblxuICAgIHB1YmxpYyBjbGVhcklmTm90TWF0Y2g6IElDb25maWdbJ2NsZWFySWZOb3RNYXRjaCddID0gdGhpcy5fY29uZmlnLmNsZWFySWZOb3RNYXRjaDtcblxuICAgIHB1YmxpYyBzcGVjaWFsQ2hhcmFjdGVyczogSUNvbmZpZ1snc3BlY2lhbENoYXJhY3RlcnMnXSA9IHRoaXMuX2NvbmZpZy5zcGVjaWFsQ2hhcmFjdGVycztcblxuICAgIHB1YmxpYyBwYXR0ZXJuczogSUNvbmZpZ1sncGF0dGVybnMnXSA9IHRoaXMuX2NvbmZpZy5wYXR0ZXJucztcblxuICAgIHB1YmxpYyBwcmVmaXg6IElDb25maWdbJ3ByZWZpeCddID0gdGhpcy5fY29uZmlnLnByZWZpeDtcblxuICAgIHB1YmxpYyBzdWZmaXg6IElDb25maWdbJ3N1ZmZpeCddID0gdGhpcy5fY29uZmlnLnN1ZmZpeDtcblxuICAgIHB1YmxpYyB0aG91c2FuZFNlcGFyYXRvcjogSUNvbmZpZ1sndGhvdXNhbmRTZXBhcmF0b3InXSA9IHRoaXMuX2NvbmZpZy50aG91c2FuZFNlcGFyYXRvcjtcblxuICAgIHB1YmxpYyBkZWNpbWFsTWFya2VyOiBJQ29uZmlnWydkZWNpbWFsTWFya2VyJ10gPSB0aGlzLl9jb25maWcuZGVjaW1hbE1hcmtlcjtcblxuICAgIHB1YmxpYyBjdXN0b21QYXR0ZXJuITogSUNvbmZpZ1sncGF0dGVybnMnXTtcblxuICAgIHB1YmxpYyBzaG93TWFza1R5cGVkOiBJQ29uZmlnWydzaG93TWFza1R5cGVkJ10gPSB0aGlzLl9jb25maWcuc2hvd01hc2tUeXBlZDtcblxuICAgIHB1YmxpYyBwbGFjZUhvbGRlckNoYXJhY3RlcjogSUNvbmZpZ1sncGxhY2VIb2xkZXJDaGFyYWN0ZXInXSA9XG4gICAgICAgIHRoaXMuX2NvbmZpZy5wbGFjZUhvbGRlckNoYXJhY3RlcjtcblxuICAgIHB1YmxpYyB2YWxpZGF0aW9uOiBJQ29uZmlnWyd2YWxpZGF0aW9uJ10gPSB0aGlzLl9jb25maWcudmFsaWRhdGlvbjtcblxuICAgIHB1YmxpYyBzZXBhcmF0b3JMaW1pdDogSUNvbmZpZ1snc2VwYXJhdG9yTGltaXQnXSA9IHRoaXMuX2NvbmZpZy5zZXBhcmF0b3JMaW1pdDtcblxuICAgIHB1YmxpYyBhbGxvd05lZ2F0aXZlTnVtYmVyczogSUNvbmZpZ1snYWxsb3dOZWdhdGl2ZU51bWJlcnMnXSA9XG4gICAgICAgIHRoaXMuX2NvbmZpZy5hbGxvd05lZ2F0aXZlTnVtYmVycztcblxuICAgIHB1YmxpYyBsZWFkWmVyb0RhdGVUaW1lOiBJQ29uZmlnWydsZWFkWmVyb0RhdGVUaW1lJ10gPSB0aGlzLl9jb25maWcubGVhZFplcm9EYXRlVGltZTtcblxuICAgIHByaXZhdGUgX3NoaWZ0OiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQoKTtcblxuICAgIHB1YmxpYyBtYXNrRXhwcmVzc2lvbiA9ICcnO1xuXG4gICAgcHVibGljIGFjdHVhbFZhbHVlID0gJyc7XG5cbiAgICBwdWJsaWMgc2hvd25NYXNrRXhwcmVzc2lvbiA9ICcnO1xuXG4gICAgcHVibGljIGlwRXJyb3I/OiBib29sZWFuO1xuXG4gICAgcHVibGljIGNwZkNucGpFcnJvcj86IGJvb2xlYW47XG4gICAgcHVibGljIGFwcGx5TWFza1dpdGhQYXR0ZXJuKFxuICAgICAgICBpbnB1dFZhbHVlOiBzdHJpbmcsXG4gICAgICAgIG1hc2tBbmRQYXR0ZXJuOiBbc3RyaW5nLCBJQ29uZmlnWydwYXR0ZXJucyddXVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IFttYXNrLCBjdXN0b21QYXR0ZXJuXSA9IG1hc2tBbmRQYXR0ZXJuO1xuICAgICAgICB0aGlzLmN1c3RvbVBhdHRlcm4gPSBjdXN0b21QYXR0ZXJuO1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBseU1hc2soaW5wdXRWYWx1ZSwgbWFzayk7XG4gICAgfVxuXG4gICAgcHVibGljIGFwcGx5TWFzayhcbiAgICAgICAgaW5wdXRWYWx1ZTogc3RyaW5nIHwgb2JqZWN0IHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgICAgIG1hc2tFeHByZXNzaW9uOiBzdHJpbmcsXG4gICAgICAgIHBvc2l0aW9uID0gMCxcbiAgICAgICAganVzdFBhc3RlZCA9IGZhbHNlLFxuICAgICAgICBiYWNrc3BhY2VkID0gZmFsc2UsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb24sIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY2I6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID0gKCkgPT4ge31cbiAgICApOiBzdHJpbmcge1xuICAgICAgICBpZiAoIW1hc2tFeHByZXNzaW9uIHx8IHR5cGVvZiBpbnB1dFZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjdXJzb3IgPSAwO1xuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgICAgIGxldCBtdWx0aSA9IGZhbHNlO1xuICAgICAgICBsZXQgYmFja3NwYWNlU2hpZnQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHNoaWZ0ID0gMTtcbiAgICAgICAgbGV0IHN0ZXBCYWNrID0gZmFsc2U7XG4gICAgICAgIGlmIChpbnB1dFZhbHVlLnNsaWNlKDAsIHRoaXMucHJlZml4Lmxlbmd0aCkgPT09IHRoaXMucHJlZml4KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIGlucHV0VmFsdWUgPSBpbnB1dFZhbHVlLnNsaWNlKHRoaXMucHJlZml4Lmxlbmd0aCwgaW5wdXRWYWx1ZS5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghIXRoaXMuc3VmZml4ICYmIGlucHV0VmFsdWU/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IHRoaXMuY2hlY2tBbmRSZW1vdmVTdWZmaXgoaW5wdXRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5wdXRBcnJheTogc3RyaW5nW10gPSBpbnB1dFZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoJycpO1xuICAgICAgICBpZiAodGhpcy5hbGxvd05lZ2F0aXZlTnVtYmVycyAmJiBpbnB1dFZhbHVlLnNsaWNlKGN1cnNvciwgY3Vyc29yICsgMSkgPT09ICctJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICByZXN1bHQgKz0gaW5wdXRWYWx1ZS5zbGljZShjdXJzb3IsIGN1cnNvciArIDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXNrRXhwcmVzc2lvbiA9PT0gJ0lQJykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVzSVAgPSBpbnB1dFZhbHVlLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICB0aGlzLmlwRXJyb3IgPSB0aGlzLl92YWxpZElQKHZhbHVlc0lQKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgbWFza0V4cHJlc3Npb24gPSAnMDk5LjA5OS4wOTkuMDk5JztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcnI6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGlucHV0VmFsdWVbaV0/Lm1hdGNoKCdcXFxcZCcpKSB7XG4gICAgICAgICAgICAgICAgYXJyLnB1c2goaW5wdXRWYWx1ZVtpXSA/PyAnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hc2tFeHByZXNzaW9uID09PSAnQ1BGX0NOUEonKSB7XG4gICAgICAgICAgICB0aGlzLmNwZkNucGpFcnJvciA9IGFyci5sZW5ndGggIT09IDExICYmIGFyci5sZW5ndGggIT09IDE0O1xuICAgICAgICAgICAgaWYgKGFyci5sZW5ndGggPiAxMSkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIG1hc2tFeHByZXNzaW9uID0gJzAwLjAwMC4wMDAvMDAwMC0wMCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIG1hc2tFeHByZXNzaW9uID0gJzAwMC4wMDAuMDAwLTAwJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWFza0V4cHJlc3Npb24uc3RhcnRzV2l0aCgncGVyY2VudCcpKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaW5wdXRWYWx1ZS5tYXRjaCgnW2Etel18W0EtWl0nKSB8fFxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICAgICAgICAgICAgICAgIGlucHV0VmFsdWUubWF0Y2goL1stISQlXiYqKClfK3x+PWB7fVxcW1xcXTpcIjsnPD4/LFxcLy5dLylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLl9zdHJpcFRvRGVjaW1hbChpbnB1dFZhbHVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmVjaXNpb246IG51bWJlciA9IHRoaXMuZ2V0UHJlY2lzaW9uKG1hc2tFeHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gdGhpcy5jaGVja0lucHV0UHJlY2lzaW9uKGlucHV0VmFsdWUsIHByZWNpc2lvbiwgdGhpcy5kZWNpbWFsTWFya2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlLmluZGV4T2YoJy4nKSA+IDAgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy5wZXJjZW50YWdlKGlucHV0VmFsdWUuc3Vic3RyaW5nKDAsIGlucHV0VmFsdWUuaW5kZXhPZignLicpKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGxldCBiYXNlOiBzdHJpbmcgPSBpbnB1dFZhbHVlLnN1YnN0cmluZygwLCBpbnB1dFZhbHVlLmluZGV4T2YoJy4nKSAtIDEpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFsbG93TmVnYXRpdmVOdW1iZXJzICYmIGlucHV0VmFsdWUuc2xpY2UoY3Vyc29yLCBjdXJzb3IgKyAxKSA9PT0gJy0nKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhc2UgPSBpbnB1dFZhbHVlLnN1YnN0cmluZygwLCBpbnB1dFZhbHVlLmluZGV4T2YoJy4nKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSBgJHtiYXNlfSR7aW5wdXRWYWx1ZS5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUuaW5kZXhPZignLicpLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlLmxlbmd0aFxuICAgICAgICAgICAgICAgICl9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB2YWx1ZSA9ICcnO1xuICAgICAgICAgICAgdGhpcy5hbGxvd05lZ2F0aXZlTnVtYmVycyAmJiBpbnB1dFZhbHVlLnNsaWNlKGN1cnNvciwgY3Vyc29yICsgMSkgPT09ICctJ1xuICAgICAgICAgICAgICAgID8gKHZhbHVlID0gaW5wdXRWYWx1ZS5zbGljZShjdXJzb3IgKyAxLCBjdXJzb3IgKyBpbnB1dFZhbHVlLmxlbmd0aCkpXG4gICAgICAgICAgICAgICAgOiAodmFsdWUgPSBpbnB1dFZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBlcmNlbnRhZ2UodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaW5wdXRWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaW5wdXRWYWx1ZS5zdWJzdHJpbmcoMCwgaW5wdXRWYWx1ZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChtYXNrRXhwcmVzc2lvbi5zdGFydHNXaXRoKCdzZXBhcmF0b3InKSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGlucHV0VmFsdWUubWF0Y2goJ1t30LAt0Y/QkC3Qr10nKSB8fFxuICAgICAgICAgICAgICAgIGlucHV0VmFsdWUubWF0Y2goJ1vQgdGR0JAt0Y9dJykgfHxcbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlLm1hdGNoKCdbYS16XXxbQS1aXScpIHx8XG4gICAgICAgICAgICAgICAgaW5wdXRWYWx1ZS5tYXRjaCgvWy1AIyEkJVxcXFxeJiooKV/Co8KsJyt8fj1ge31cXF06XCI7PD4uPy9dLykgfHxcbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlLm1hdGNoKCdbXkEtWmEtejAtOSxdJylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLl9zdHJpcFRvRGVjaW1hbChpbnB1dFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgaW5wdXRWYWx1ZSA9XG4gICAgICAgICAgICAgICAgaW5wdXRWYWx1ZS5sZW5ndGggPiAxICYmXG4gICAgICAgICAgICAgICAgaW5wdXRWYWx1ZVswXSA9PT0gJzAnICYmXG4gICAgICAgICAgICAgICAgaW5wdXRWYWx1ZVsxXSAhPT0gdGhpcy50aG91c2FuZFNlcGFyYXRvciAmJlxuICAgICAgICAgICAgICAgICF0aGlzLl9jb21wYXJlT3JJbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZVsxXSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWNpbWFsTWFya2VyLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRob3VzYW5kU2VwYXJhdG9yXG4gICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICFiYWNrc3BhY2VkXG4gICAgICAgICAgICAgICAgICAgID8gaW5wdXRWYWx1ZS5zbGljZSgwLCBpbnB1dFZhbHVlLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAgICAgICAgIDogaW5wdXRWYWx1ZTtcbiAgICAgICAgICAgIGlmIChiYWNrc3BhY2VkKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IHRoaXMuX2NvbXBhcmVPckluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlW2lucHV0VmFsdWUubGVuZ3RoIC0gMV0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVjaW1hbE1hcmtlcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aG91c2FuZFNlcGFyYXRvclxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgPyBpbnB1dFZhbHVlLnNsaWNlKDAsIGlucHV0VmFsdWUubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgOiBpbnB1dFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVE9ETzogd2UgaGFkIGRpZmZlcmVudCByZXhleHBzIGhlcmUgZm9yIHRoZSBkaWZmZXJlbnQgY2FzZXMuLi4gYnV0IHRlc3RzIGRvbnQgc2VhbSB0byBib3RoZXIgLSBjaGVjayB0aGlzXG4gICAgICAgICAgICAvLyAgc2VwYXJhdG9yOiBubyBDT01NQSwgZG90LXNlcDogbm8gU1BBQ0UsIENPTU1BIE9LLCBjb21tYS1zZXA6IG5vIFNQQUNFLCBDT01NQSBPS1xuXG4gICAgICAgICAgICBjb25zdCB0aG91c2FuZFNlcGFyYXRvckNoYXJFc2NhcGVkOiBzdHJpbmcgPSB0aGlzLl9jaGFyVG9SZWdFeHBFeHByZXNzaW9uKFxuICAgICAgICAgICAgICAgIHRoaXMudGhvdXNhbmRTZXBhcmF0b3JcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgaW52YWxpZENoYXJzOiBzdHJpbmcgPSAnQCMhJCVeJiooKV8rfH49YHt9XFxcXFtcXFxcXTpcXFxccyxcXFxcLlwiOzw+P1xcXFwvJy5yZXBsYWNlKFxuICAgICAgICAgICAgICAgIHRob3VzYW5kU2VwYXJhdG9yQ2hhckVzY2FwZWQsXG4gICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLy5yZXBsYWNlKGRlY2ltYWxNYXJrZXJFc2NhcGVkLCAnJyk7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRlY2ltYWxNYXJrZXIpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXJrZXIgb2YgdGhpcy5kZWNpbWFsTWFya2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIGludmFsaWRDaGFycyA9IGludmFsaWRDaGFycy5yZXBsYWNlKHRoaXMuX2NoYXJUb1JlZ0V4cEV4cHJlc3Npb24obWFya2VyKSwgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW52YWxpZENoYXJzID0gaW52YWxpZENoYXJzLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJUb1JlZ0V4cEV4cHJlc3Npb24odGhpcy5kZWNpbWFsTWFya2VyKSxcbiAgICAgICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpbnZhbGlkQ2hhclJlZ2V4cCA9IG5ldyBSZWdFeHAoJ1snICsgaW52YWxpZENoYXJzICsgJ10nKTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGlucHV0VmFsdWUubWF0Y2goaW52YWxpZENoYXJSZWdleHApIHx8XG4gICAgICAgICAgICAgICAgKGlucHV0VmFsdWUubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbXBhcmVPckluY2x1ZGVzKGlucHV0VmFsdWUsIHRoaXMuZGVjaW1hbE1hcmtlciwgdGhpcy50aG91c2FuZFNlcGFyYXRvcikpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gaW5wdXRWYWx1ZS5zdWJzdHJpbmcoMCwgaW5wdXRWYWx1ZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcHJlY2lzaW9uOiBudW1iZXIgPSB0aGlzLmdldFByZWNpc2lvbihtYXNrRXhwcmVzc2lvbik7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLmNoZWNrSW5wdXRQcmVjaXNpb24oaW5wdXRWYWx1ZSwgcHJlY2lzaW9uLCB0aGlzLmRlY2ltYWxNYXJrZXIpO1xuICAgICAgICAgICAgY29uc3Qgc3RyRm9yU2VwOiBzdHJpbmcgPSBpbnB1dFZhbHVlLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgbmV3IFJlZ0V4cCh0aG91c2FuZFNlcGFyYXRvckNoYXJFc2NhcGVkLCAnZycpLFxuICAgICAgICAgICAgICAgICcnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5fZm9ybWF0V2l0aFNlcGFyYXRvcnMoXG4gICAgICAgICAgICAgICAgc3RyRm9yU2VwLFxuICAgICAgICAgICAgICAgIHRoaXMudGhvdXNhbmRTZXBhcmF0b3IsXG4gICAgICAgICAgICAgICAgdGhpcy5kZWNpbWFsTWFya2VyLFxuICAgICAgICAgICAgICAgIHByZWNpc2lvblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1hU2hpZnQ6IG51bWJlciA9IHJlc3VsdC5pbmRleE9mKCcsJykgLSBpbnB1dFZhbHVlLmluZGV4T2YoJywnKTtcbiAgICAgICAgICAgIGNvbnN0IHNoaWZ0U3RlcDogbnVtYmVyID0gcmVzdWx0Lmxlbmd0aCAtIGlucHV0VmFsdWUubGVuZ3RoO1xuXG4gICAgICAgICAgICBpZiAoc2hpZnRTdGVwID4gMCAmJiByZXN1bHRbcG9zaXRpb25dICE9PSAnLCcpIHtcbiAgICAgICAgICAgICAgICBiYWNrc3BhY2VTaGlmdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgbGV0IF9zaGlmdCA9IDA7XG4gICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGlmdC5hZGQocG9zaXRpb24gKyBfc2hpZnQpO1xuICAgICAgICAgICAgICAgICAgICBfc2hpZnQrKztcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChfc2hpZnQgPCBzaGlmdFN0ZXApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAoY29tbWFTaGlmdCAhPT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgIShyZXN1bHQuaW5kZXhPZignLCcpID49IHBvc2l0aW9uICYmIHBvc2l0aW9uID4gMykpIHx8XG4gICAgICAgICAgICAgICAgKCEocmVzdWx0LmluZGV4T2YoJy4nKSA+PSBwb3NpdGlvbiAmJiBwb3NpdGlvbiA+IDMpICYmIHNoaWZ0U3RlcCA8PSAwKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hpZnQuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICBiYWNrc3BhY2VTaGlmdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgc2hpZnQgPSBzaGlmdFN0ZXA7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgcG9zaXRpb24gKz0gc2hpZnRTdGVwO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NoaWZ0LmFkZChwb3NpdGlvbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NoaWZ0LmNsZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgIGxldCBpOiBudW1iZXIgPSAwLCBpbnB1dFN5bWJvbDogc3RyaW5nID0gaW5wdXRBcnJheVswXSE7XG4gICAgICAgICAgICAgICAgaSA8IGlucHV0QXJyYXkubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGkrKywgaW5wdXRTeW1ib2wgPSBpbnB1dEFycmF5W2ldID8/ICcnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yID09PSBtYXNrRXhwcmVzc2lvbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tTeW1ib2xNYXNrKGlucHV0U3ltYm9sLCBtYXNrRXhwcmVzc2lvbltjdXJzb3JdID8/ICcnKSAmJlxuICAgICAgICAgICAgICAgICAgICBtYXNrRXhwcmVzc2lvbltjdXJzb3IgKyAxXSA9PT0gJz8nXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBpbnB1dFN5bWJvbDtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yICs9IDI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgbWFza0V4cHJlc3Npb25bY3Vyc29yICsgMV0gPT09ICcqJyAmJlxuICAgICAgICAgICAgICAgICAgICBtdWx0aSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1N5bWJvbE1hc2soaW5wdXRTeW1ib2wsIG1hc2tFeHByZXNzaW9uW2N1cnNvciArIDJdID8/ICcnKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gaW5wdXRTeW1ib2w7XG4gICAgICAgICAgICAgICAgICAgIGN1cnNvciArPSAzO1xuICAgICAgICAgICAgICAgICAgICBtdWx0aSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrU3ltYm9sTWFzayhpbnB1dFN5bWJvbCwgbWFza0V4cHJlc3Npb25bY3Vyc29yXSA/PyAnJykgJiZcbiAgICAgICAgICAgICAgICAgICAgbWFza0V4cHJlc3Npb25bY3Vyc29yICsgMV0gPT09ICcqJ1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gaW5wdXRTeW1ib2w7XG4gICAgICAgICAgICAgICAgICAgIG11bHRpID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICBtYXNrRXhwcmVzc2lvbltjdXJzb3IgKyAxXSA9PT0gJz8nICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrU3ltYm9sTWFzayhpbnB1dFN5bWJvbCwgbWFza0V4cHJlc3Npb25bY3Vyc29yICsgMl0gPz8gJycpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBpbnB1dFN5bWJvbDtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yICs9IDM7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9jaGVja1N5bWJvbE1hc2soaW5wdXRTeW1ib2wsIG1hc2tFeHByZXNzaW9uW2N1cnNvcl0gPz8gJycpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXNrRXhwcmVzc2lvbltjdXJzb3JdID09PSAnSCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOdW1iZXIoaW5wdXRTeW1ib2wpID4gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvciArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoaWZ0U3RlcChtYXNrRXhwcmVzc2lvbiwgY3Vyc29yLCBpbnB1dEFycmF5Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxlYWRaZXJvRGF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcwJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hc2tFeHByZXNzaW9uW2N1cnNvcl0gPT09ICdoJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHQgPT09ICcyJyAmJiBOdW1iZXIoaW5wdXRTeW1ib2wpID4gMykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJlc3VsdC5zbGljZShjdXJzb3IgLSAyLCBjdXJzb3IpID09PSAnMicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNsaWNlKGN1cnNvciAtIDMsIGN1cnNvcikgPT09ICcyJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2xpY2UoY3Vyc29yIC0gNCwgY3Vyc29yKSA9PT0gJzInIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zbGljZShjdXJzb3IgLSAxLCBjdXJzb3IpID09PSAnMicpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlcihpbnB1dFN5bWJvbCkgPiAzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvciA+IDEwKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXNrRXhwcmVzc2lvbltjdXJzb3JdID09PSAnbScgfHwgbWFza0V4cHJlc3Npb25bY3Vyc29yXSA9PT0gJ3MnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTnVtYmVyKGlucHV0U3ltYm9sKSA+IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGlmdFN0ZXAobWFza0V4cHJlc3Npb24sIGN1cnNvciwgaW5wdXRBcnJheS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sZWFkWmVyb0RhdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnMCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRheXNDb3VudCA9IDMxO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dFZhbHVlQ3Vyc29yID0gaW5wdXRWYWx1ZVtjdXJzb3JdIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRWYWx1ZUN1cnNvclBsdXNPbmUgPSBpbnB1dFZhbHVlW2N1cnNvciArIDFdIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRWYWx1ZUN1cnNvclBsdXNUd28gPSBpbnB1dFZhbHVlW2N1cnNvciArIDJdIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRWYWx1ZUN1cnNvck1pbnVzT25lID0gaW5wdXRWYWx1ZVtjdXJzb3IgLSAxXSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0VmFsdWVDdXJzb3JNaW51c1R3byA9IGlucHV0VmFsdWVbY3Vyc29yIC0gMl0gYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dFZhbHVlQ3Vyc29yTWludXNUaHJlZSA9IGlucHV0VmFsdWVbY3Vyc29yIC0gM10gYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dFZhbHVlU2xpY2VNaW51c1RocmVlTWludXNPbmUgPSBpbnB1dFZhbHVlLnNsaWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yIC0gMyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvciAtIDFcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRWYWx1ZVNsaWNlTWludXNPbmVQbHVzT25lID0gaW5wdXRWYWx1ZS5zbGljZShjdXJzb3IgLSAxLCBjdXJzb3IgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRWYWx1ZVNsaWNlQ3Vyc29yUGx1c1R3byA9IGlucHV0VmFsdWUuc2xpY2UoY3Vyc29yLCBjdXJzb3IgKyAyKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRWYWx1ZVNsaWNlTWludXNUd29DdXJzb3IgPSBpbnB1dFZhbHVlLnNsaWNlKGN1cnNvciAtIDIsIGN1cnNvcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXNrRXhwcmVzc2lvbltjdXJzb3JdID09PSAnZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hc2tTdGFydFdpdGhNb250aCA9IG1hc2tFeHByZXNzaW9uLnNsaWNlKDAsIDIpID09PSAnTTAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRXaXRoTW9udGhJbnB1dDogYm9vbGVhbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza0V4cHJlc3Npb24uc2xpY2UoMCwgMikgPT09ICdNMCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLmluY2x1ZGVzKGlucHV0VmFsdWVDdXJzb3JNaW51c1R3byk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE51bWJlcihpbnB1dFN5bWJvbCkgPiAzICYmIHRoaXMubGVhZFplcm9EYXRlVGltZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW1hc2tTdGFydFdpdGhNb250aCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTnVtYmVyKGlucHV0VmFsdWVTbGljZUN1cnNvclBsdXNUd28pID4gZGF5c0NvdW50IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIoaW5wdXRWYWx1ZVNsaWNlTWludXNPbmVQbHVzT25lKSA+IGRheXNDb3VudCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsQ2hhcmFjdGVycy5pbmNsdWRlcyhpbnB1dFZhbHVlQ3Vyc29yUGx1c09uZSkpKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGFydFdpdGhNb250aElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTnVtYmVyKGlucHV0VmFsdWVTbGljZU1pbnVzT25lUGx1c09uZSkgPiBkYXlzQ291bnQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIXRoaXMuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoaW5wdXRWYWx1ZUN1cnNvcikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsQ2hhcmFjdGVycy5pbmNsdWRlcyhpbnB1dFZhbHVlQ3Vyc29yUGx1c1R3bykpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsQ2hhcmFjdGVycy5pbmNsdWRlcyhpbnB1dFZhbHVlQ3Vyc29yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE51bWJlcihpbnB1dFZhbHVlU2xpY2VDdXJzb3JQbHVzVHdvKSA+IGRheXNDb3VudCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoaW5wdXRWYWx1ZUN1cnNvclBsdXNPbmUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hpZnRTdGVwKG1hc2tFeHByZXNzaW9uLCBjdXJzb3IsIGlucHV0QXJyYXkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGVhZFplcm9EYXRlVGltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJzAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobWFza0V4cHJlc3Npb25bY3Vyc29yXSA9PT0gJ00nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtb250aHNDb3VudCA9IDEyO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFzayB3aXRob3V0IGRheVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2l0aG91dERheXM6IGJvb2xlYW4gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvciA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOdW1iZXIoaW5wdXRTeW1ib2wpID4gMiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIoaW5wdXRWYWx1ZVNsaWNlQ3Vyc29yUGx1c1R3bykgPiBtb250aHNDb3VudCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLmluY2x1ZGVzKGlucHV0VmFsdWVDdXJzb3JQbHVzT25lKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXk8MTAgJiYgbW9udGg8MTIgZm9yIGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcGVjaWFsQ2hhcnQgPSBtYXNrRXhwcmVzc2lvbi5zbGljZShjdXJzb3IgKyAyLCBjdXJzb3IgKyAzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRheTFtb250aElucHV0OiBib29sZWFuID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlU2xpY2VNaW51c1RocmVlTWludXNPbmUuaW5jbHVkZXMoc3BlY2lhbENoYXJ0KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodGhpcy5zcGVjaWFsQ2hhcmFjdGVycy5pbmNsdWRlcyhpbnB1dFZhbHVlQ3Vyc29yTWludXNUd28pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlcihpbnB1dFZhbHVlU2xpY2VNaW51c09uZVBsdXNPbmUpID4gbW9udGhzQ291bnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoaW5wdXRWYWx1ZUN1cnNvcikpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoaW5wdXRWYWx1ZUN1cnNvcikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoaW5wdXRWYWx1ZUN1cnNvck1pbnVzVGhyZWUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIoaW5wdXRWYWx1ZVNsaWNlTWludXNUd29DdXJzb3IpID4gbW9udGhzQ291bnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLmluY2x1ZGVzKGlucHV0VmFsdWVDdXJzb3JNaW51c09uZSkpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoaW5wdXRWYWx1ZUN1cnNvck1pbnVzT25lKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgbW9udGg8MTIgJiYgZGF5PDEwIGZvciBpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF5Mm1vbnRoSW5wdXQ6IGJvb2xlYW4gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlcihpbnB1dFZhbHVlU2xpY2VNaW51c1RocmVlTWludXNPbmUpIDw9IGRheXNDb3VudCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlU2xpY2VNaW51c1RocmVlTWludXNPbmUgYXMgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoaW5wdXRWYWx1ZUN1cnNvck1pbnVzT25lKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOdW1iZXIoaW5wdXRWYWx1ZVNsaWNlQ3Vyc29yUGx1c1R3bykgPiBtb250aHNDb3VudCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLmluY2x1ZGVzKGlucHV0VmFsdWVDdXJzb3JQbHVzT25lKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJzb3IgPT09IDUgJiYgd2l0aG91dCBkYXlzXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXkybW9udGhJbnB1dERvdDogYm9vbGVhbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE51bWJlcihpbnB1dFZhbHVlU2xpY2VDdXJzb3JQbHVzVHdvKSA+IG1vbnRoc0NvdW50ICYmIGN1cnNvciA9PT0gNSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5zcGVjaWFsQ2hhcmFjdGVycy5pbmNsdWRlcyhpbnB1dFZhbHVlQ3Vyc29yUGx1c09uZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yID09PSA1KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIC8vIGRheTwxMCAmJiBtb250aDwxMiBmb3IgcGFzdGUgd2hvbGUgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF5MW1vbnRoUGFzdGU6IGJvb2xlYW4gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlcihpbnB1dFZhbHVlU2xpY2VNaW51c1RocmVlTWludXNPbmUpID4gZGF5c0NvdW50ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWVTbGljZU1pbnVzVGhyZWVNaW51c09uZSBhcyBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWVTbGljZU1pbnVzVHdvQ3Vyc29yIGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIoaW5wdXRWYWx1ZVNsaWNlTWludXNUd29DdXJzb3IpID4gbW9udGhzQ291bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAxMDxkYXk8MzEgJiYgbW9udGg8MTIgZm9yIHBhc3RlIHdob2xlIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRheTJtb250aFBhc3RlOiBib29sZWFuID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIoaW5wdXRWYWx1ZVNsaWNlTWludXNUaHJlZU1pbnVzT25lKSA8PSBkYXlzQ291bnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5zcGVjaWFsQ2hhcmFjdGVycy5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZVNsaWNlTWludXNUaHJlZU1pbnVzT25lIGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5zcGVjaWFsQ2hhcmFjdGVycy5pbmNsdWRlcyhpbnB1dFZhbHVlQ3Vyc29yTWludXNPbmUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyKGlucHV0VmFsdWVTbGljZU1pbnVzT25lUGx1c09uZSkgPiBtb250aHNDb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTnVtYmVyKGlucHV0U3ltYm9sKSA+IDEgJiYgdGhpcy5sZWFkWmVyb0RhdGVUaW1lKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXREYXlzIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5MW1vbnRoSW5wdXQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkybW9udGhQYXN0ZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheTFtb250aFBhc3RlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5Mm1vbnRoSW5wdXQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkybW9udGhJbnB1dERvdFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hpZnRTdGVwKG1hc2tFeHByZXNzaW9uLCBjdXJzb3IsIGlucHV0QXJyYXkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGVhZFplcm9EYXRlVGltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJzAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gaW5wdXRTeW1ib2w7XG4gICAgICAgICAgICAgICAgICAgIGN1cnNvcisrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXRTeW1ib2wgPT09ICcgJyAmJiBtYXNrRXhwcmVzc2lvbltjdXJzb3JdID09PSAnICcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGlucHV0U3ltYm9sO1xuICAgICAgICAgICAgICAgICAgICBjdXJzb3IrKztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3BlY2lhbENoYXJhY3RlcnMuaW5kZXhPZihtYXNrRXhwcmVzc2lvbltjdXJzb3JdID8/ICcnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IG1hc2tFeHByZXNzaW9uW2N1cnNvcl07XG4gICAgICAgICAgICAgICAgICAgIGN1cnNvcisrO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGlmdFN0ZXAobWFza0V4cHJlc3Npb24sIGN1cnNvciwgaW5wdXRBcnJheS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXNrRXhwcmVzc2lvbltjdXJzb3JdID09PSAnOScgJiYgdGhpcy5zaG93TWFza1R5cGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoaWZ0U3RlcChtYXNrRXhwcmVzc2lvbiwgY3Vyc29yLCBpbnB1dEFycmF5Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsQ2hhcmFjdGVycy5pbmRleE9mKGlucHV0U3ltYm9sKSA+IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGF0dGVybnNbbWFza0V4cHJlc3Npb25bY3Vyc29yXSA/PyAnJ10gJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXR0ZXJuc1ttYXNrRXhwcmVzc2lvbltjdXJzb3JdID8/ICcnXT8ub3B0aW9uYWxcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgISFpbnB1dEFycmF5W2N1cnNvcl0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tFeHByZXNzaW9uICE9PSAnMDk5LjA5OS4wOTkuMDk5JyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbWFza0V4cHJlc3Npb24gIT09ICcwMDAuMDAwLjAwMC0wMCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tFeHByZXNzaW9uICE9PSAnMDAuMDAwLjAwMC8wMDAwLTAwJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIW1hc2tFeHByZXNzaW9uLm1hdGNoKC9eOStcXC4wKyQvKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBpbnB1dEFycmF5W2N1cnNvcl07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hc2tFeHByZXNzaW9uW2N1cnNvciArIDFdID09PSAnKicgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmluZFNwZWNpYWxDaGFyKHRoaXMubWFza0V4cHJlc3Npb25bY3Vyc29yICsgMl0gPz8gJycpICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmRTcGVjaWFsQ2hhcihpbnB1dFN5bWJvbCkgPT09IHRoaXMubWFza0V4cHJlc3Npb25bY3Vyc29yICsgMl0gJiZcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yICs9IDM7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBpbnB1dFN5bWJvbDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hc2tFeHByZXNzaW9uW2N1cnNvciArIDFdID09PSAnPycgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmluZFNwZWNpYWxDaGFyKHRoaXMubWFza0V4cHJlc3Npb25bY3Vyc29yICsgMl0gPz8gJycpICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmRTcGVjaWFsQ2hhcihpbnB1dFN5bWJvbCkgPT09IHRoaXMubWFza0V4cHJlc3Npb25bY3Vyc29yICsgMl0gJiZcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yICs9IDM7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBpbnB1dFN5bWJvbDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dNYXNrVHlwZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsQ2hhcmFjdGVycy5pbmRleE9mKGlucHV0U3ltYm9sKSA8IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRTeW1ib2wgIT09IHRoaXMucGxhY2VIb2xkZXJDaGFyYWN0ZXJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgc3RlcEJhY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICByZXN1bHQubGVuZ3RoICsgMSA9PT0gbWFza0V4cHJlc3Npb24ubGVuZ3RoICYmXG4gICAgICAgICAgICB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLmluZGV4T2YobWFza0V4cHJlc3Npb25bbWFza0V4cHJlc3Npb24ubGVuZ3RoIC0gMV0gPz8gJycpICE9PSAtMVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBtYXNrRXhwcmVzc2lvblttYXNrRXhwcmVzc2lvbi5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV3UG9zaXRpb246IG51bWJlciA9IHBvc2l0aW9uICsgMTtcblxuICAgICAgICB3aGlsZSAodGhpcy5fc2hpZnQuaGFzKG5ld1Bvc2l0aW9uKSkge1xuICAgICAgICAgICAgc2hpZnQrKztcbiAgICAgICAgICAgIG5ld1Bvc2l0aW9uKys7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWN0dWFsU2hpZnQ6IG51bWJlciA9XG4gICAgICAgICAgICBqdXN0UGFzdGVkICYmICFtYXNrRXhwcmVzc2lvbi5zdGFydHNXaXRoKCdzZXBhcmF0b3InKVxuICAgICAgICAgICAgICAgID8gY3Vyc29yXG4gICAgICAgICAgICAgICAgOiB0aGlzLl9zaGlmdC5oYXMocG9zaXRpb24pXG4gICAgICAgICAgICAgICAgPyBzaGlmdFxuICAgICAgICAgICAgICAgIDogMDtcbiAgICAgICAgaWYgKHN0ZXBCYWNrKSB7XG4gICAgICAgICAgICBhY3R1YWxTaGlmdC0tO1xuICAgICAgICB9XG5cbiAgICAgICAgY2IoYWN0dWFsU2hpZnQsIGJhY2tzcGFjZVNoaWZ0KTtcbiAgICAgICAgaWYgKHNoaWZ0IDwgMCkge1xuICAgICAgICAgICAgdGhpcy5fc2hpZnQuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb25seVNwZWNpYWwgPSBmYWxzZTtcbiAgICAgICAgaWYgKGJhY2tzcGFjZWQpIHtcbiAgICAgICAgICAgIG9ubHlTcGVjaWFsID0gaW5wdXRBcnJheS5ldmVyeSgoY2hhcikgPT4gdGhpcy5zcGVjaWFsQ2hhcmFjdGVycy5pbmNsdWRlcyhjaGFyKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlcyA9IGAke3RoaXMucHJlZml4fSR7b25seVNwZWNpYWwgPyAnJyA6IHJlc3VsdH0ke3RoaXMuc3VmZml4fWA7XG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXMgPSBgJHt0aGlzLnByZWZpeH0ke3Jlc3VsdH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgcHVibGljIF9maW5kU3BlY2lhbENoYXIoaW5wdXRTeW1ib2w6IHN0cmluZyk6IHVuZGVmaW5lZCB8IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLmZpbmQoKHZhbDogc3RyaW5nKSA9PiB2YWwgPT09IGlucHV0U3ltYm9sKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2NoZWNrU3ltYm9sTWFzayhpbnB1dFN5bWJvbDogc3RyaW5nLCBtYXNrU3ltYm9sOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgdGhpcy5wYXR0ZXJucyA9IHRoaXMuY3VzdG9tUGF0dGVybiA/IHRoaXMuY3VzdG9tUGF0dGVybiA6IHRoaXMucGF0dGVybnM7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAodGhpcy5wYXR0ZXJuc1ttYXNrU3ltYm9sXT8ucGF0dGVybiAmJlxuICAgICAgICAgICAgICAgIHRoaXMucGF0dGVybnNbbWFza1N5bWJvbF0/LnBhdHRlcm4udGVzdChpbnB1dFN5bWJvbCkpID8/XG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2Zvcm1hdFdpdGhTZXBhcmF0b3JzID0gKFxuICAgICAgICBzdHI6IHN0cmluZyxcbiAgICAgICAgdGhvdXNhbmRTZXBhcmF0b3JDaGFyOiBzdHJpbmcsXG4gICAgICAgIGRlY2ltYWxDaGFyczogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgICAgIHByZWNpc2lvbjogbnVtYmVyXG4gICAgKSA9PiB7XG4gICAgICAgIGxldCB4OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgZGVjaW1hbENoYXIgPSAnJztcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGVjaW1hbENoYXJzKSkge1xuICAgICAgICAgICAgY29uc3QgcmVnRXhwID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICBkZWNpbWFsQ2hhcnMubWFwKCh2KSA9PiAoJ1tcXFxcXiQufD8qKygpJy5pbmRleE9mKHYpID49IDAgPyBgXFxcXCR7dn1gIDogdikpLmpvaW4oJ3wnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHggPSBzdHIuc3BsaXQocmVnRXhwKTtcbiAgICAgICAgICAgIGRlY2ltYWxDaGFyID0gc3RyLm1hdGNoKHJlZ0V4cCk/LlswXSA/PyAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHggPSBzdHIuc3BsaXQoZGVjaW1hbENoYXJzKTtcbiAgICAgICAgICAgIGRlY2ltYWxDaGFyID0gZGVjaW1hbENoYXJzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlY2ltYWxzOiBzdHJpbmcgPSB4Lmxlbmd0aCA+IDEgPyBgJHtkZWNpbWFsQ2hhcn0ke3hbMV19YCA6ICcnO1xuICAgICAgICBsZXQgcmVzOiBzdHJpbmcgPSB4WzBdID8/ICcnO1xuICAgICAgICBjb25zdCBzZXBhcmF0b3JMaW1pdDogc3RyaW5nID0gdGhpcy5zZXBhcmF0b3JMaW1pdC5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgICAgICBpZiAoc2VwYXJhdG9yTGltaXQgJiYgK3NlcGFyYXRvckxpbWl0KSB7XG4gICAgICAgICAgICBpZiAocmVzWzBdID09PSAnLScpIHtcbiAgICAgICAgICAgICAgICByZXMgPSBgLSR7cmVzLnNsaWNlKDEsIHJlcy5sZW5ndGgpLnNsaWNlKDAsIHNlcGFyYXRvckxpbWl0Lmxlbmd0aCl9YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzID0gcmVzLnNsaWNlKDAsIHNlcGFyYXRvckxpbWl0Lmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgcmd4ID0gLyhcXGQrKShcXGR7M30pLztcblxuICAgICAgICB3aGlsZSAodGhvdXNhbmRTZXBhcmF0b3JDaGFyICYmIHJneC50ZXN0KHJlcykpIHtcbiAgICAgICAgICAgIHJlcyA9IHJlcy5yZXBsYWNlKHJneCwgJyQxJyArIHRob3VzYW5kU2VwYXJhdG9yQ2hhciArICckMicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzICsgZGVjaW1hbHM7XG4gICAgICAgIH0gZWxzZSBpZiAocHJlY2lzaW9uID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXMgKyBkZWNpbWFscy5zdWJzdHJpbmcoMCwgcHJlY2lzaW9uICsgMSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgcGVyY2VudGFnZSA9IChzdHI6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgICAgICByZXR1cm4gTnVtYmVyKHN0cikgPj0gMCAmJiBOdW1iZXIoc3RyKSA8PSAxMDA7XG4gICAgfTtcblxuICAgIHByaXZhdGUgZ2V0UHJlY2lzaW9uID0gKG1hc2tFeHByZXNzaW9uOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICAgICAgICBjb25zdCB4OiBzdHJpbmdbXSA9IG1hc2tFeHByZXNzaW9uLnNwbGl0KCcuJyk7XG4gICAgICAgIGlmICh4Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIoeFt4Lmxlbmd0aCAtIDFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBjaGVja0FuZFJlbW92ZVN1ZmZpeCA9IChpbnB1dFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5zdWZmaXg/Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJzdHIgPSB0aGlzLnN1ZmZpeC5zdWJzdHJpbmcoaSwgdGhpcy5zdWZmaXg/Lmxlbmd0aCk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaW5wdXRWYWx1ZS5pbmNsdWRlcyhzdWJzdHIpICYmXG4gICAgICAgICAgICAgICAgaSAhPT0gdGhpcy5zdWZmaXg/Lmxlbmd0aCAtIDEgJiZcbiAgICAgICAgICAgICAgICAoaSAtIDEgPCAwIHx8XG4gICAgICAgICAgICAgICAgICAgICFpbnB1dFZhbHVlLmluY2x1ZGVzKHRoaXMuc3VmZml4LnN1YnN0cmluZyhpIC0gMSwgdGhpcy5zdWZmaXg/Lmxlbmd0aCkpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0VmFsdWUucmVwbGFjZShzdWJzdHIsICcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBjaGVja0lucHV0UHJlY2lzaW9uID0gKFxuICAgICAgICBpbnB1dFZhbHVlOiBzdHJpbmcsXG4gICAgICAgIHByZWNpc2lvbjogbnVtYmVyLFxuICAgICAgICBkZWNpbWFsTWFya2VyOiBJQ29uZmlnWydkZWNpbWFsTWFya2VyJ11cbiAgICApOiBzdHJpbmcgPT4ge1xuICAgICAgICBpZiAocHJlY2lzaW9uIDwgSW5maW5pdHkpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gbmVlZCB0aGluayBhYm91dCBkZWNpbWFsTWFya2VyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkZWNpbWFsTWFya2VyKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IGRlY2ltYWxNYXJrZXIuZmluZCgoZG0pID0+IGRtICE9PSB0aGlzLnRob3VzYW5kU2VwYXJhdG9yKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBkZWNpbWFsTWFya2VyID0gbWFya2VyID8gbWFya2VyIDogZGVjaW1hbE1hcmtlclswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHByZWNpc2lvblJlZ0V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFyVG9SZWdFeHBFeHByZXNzaW9uKGRlY2ltYWxNYXJrZXIpICsgYFxcXFxkeyR7cHJlY2lzaW9ufX0uKiRgXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBwcmVjaXNpb25NYXRjaDogUmVnRXhwTWF0Y2hBcnJheSB8IG51bGwgPSBpbnB1dFZhbHVlLm1hdGNoKHByZWNpc2lvblJlZ0V4KTtcbiAgICAgICAgICAgIGNvbnN0IHByZWNpc2lvbk1hdGNoTGVuZ3RoOiBudW1iZXIgPSAocHJlY2lzaW9uTWF0Y2ggJiYgcHJlY2lzaW9uTWF0Y2hbMF0/Lmxlbmd0aCkgPz8gMDtcbiAgICAgICAgICAgIGlmIChwcmVjaXNpb25NYXRjaExlbmd0aCAtIDEgPiBwcmVjaXNpb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaWZmID0gcHJlY2lzaW9uTWF0Y2hMZW5ndGggLSAxIC0gcHJlY2lzaW9uO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSBpbnB1dFZhbHVlLnN1YnN0cmluZygwLCBpbnB1dFZhbHVlLmxlbmd0aCAtIGRpZmYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHByZWNpc2lvbiA9PT0gMCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbXBhcmVPckluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlW2lucHV0VmFsdWUubGVuZ3RoIC0gMV0sXG4gICAgICAgICAgICAgICAgICAgIGRlY2ltYWxNYXJrZXIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGhvdXNhbmRTZXBhcmF0b3JcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gaW5wdXRWYWx1ZS5zdWJzdHJpbmcoMCwgaW5wdXRWYWx1ZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBfc3RyaXBUb0RlY2ltYWwoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gc3RyXG4gICAgICAgICAgICAuc3BsaXQoJycpXG4gICAgICAgICAgICAuZmlsdGVyKChpOiBzdHJpbmcsIGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNEZWNpbWFsTWFya2VyID1cbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMuZGVjaW1hbE1hcmtlciA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgICAgID8gaSA9PT0gdGhpcy5kZWNpbWFsTWFya2VyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IC8vIFRPRE8gKGluZXBpcGVua28pIHVzZSB1dGlsaXR5IHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWNpbWFsTWFya2VyLmluY2x1ZGVzKGkgYXMgJywnIHwgJy4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBpLm1hdGNoKCdeLT9cXFxcZCcpIHx8XG4gICAgICAgICAgICAgICAgICAgIGkgPT09IHRoaXMudGhvdXNhbmRTZXBhcmF0b3IgfHxcbiAgICAgICAgICAgICAgICAgICAgaXNEZWNpbWFsTWFya2VyIHx8XG4gICAgICAgICAgICAgICAgICAgIChpID09PSAnLScgJiYgaWR4ID09PSAwICYmIHRoaXMuYWxsb3dOZWdhdGl2ZU51bWJlcnMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2hhclRvUmVnRXhwRXhwcmVzc2lvbihjaGFyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICAvLyBpZiAoQXJyYXkuaXNBcnJheShjaGFyKSkge1xuICAgICAgICAvLyBcdHJldHVybiBjaGFyLm1hcCgodikgPT4gKCdbXFxcXF4kLnw/KisoKScuaW5kZXhPZih2KSA+PSAwID8gYFxcXFwke3Z9YCA6IHYpKS5qb2luKCd8Jyk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgaWYgKGNoYXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXJzVG9Fc2NhcGUgPSAnW1xcXFxeJC58PyorKCknO1xuICAgICAgICAgICAgcmV0dXJuIGNoYXIgPT09ICcgJyA/ICdcXFxccycgOiBjaGFyc1RvRXNjYXBlLmluZGV4T2YoY2hhcikgPj0gMCA/IGBcXFxcJHtjaGFyfWAgOiBjaGFyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFyO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NoaWZ0U3RlcChtYXNrRXhwcmVzc2lvbjogc3RyaW5nLCBjdXJzb3I6IG51bWJlciwgaW5wdXRMZW5ndGg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBzaGlmdFN0ZXA6IG51bWJlciA9IC9bKj9dL2cudGVzdChtYXNrRXhwcmVzc2lvbi5zbGljZSgwLCBjdXJzb3IpKVxuICAgICAgICAgICAgPyBpbnB1dExlbmd0aFxuICAgICAgICAgICAgOiBjdXJzb3I7XG4gICAgICAgIHRoaXMuX3NoaWZ0LmFkZChzaGlmdFN0ZXAgKyB0aGlzLnByZWZpeC5sZW5ndGggfHwgMCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9jb21wYXJlT3JJbmNsdWRlczxUPih2YWx1ZTogVCwgY29tcGFyZWRWYWx1ZTogVCB8IFRbXSwgZXhjbHVkZWRWYWx1ZTogVCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShjb21wYXJlZFZhbHVlKVxuICAgICAgICAgICAgPyBjb21wYXJlZFZhbHVlLmZpbHRlcigodikgPT4gdiAhPT0gZXhjbHVkZWRWYWx1ZSkuaW5jbHVkZXModmFsdWUpXG4gICAgICAgICAgICA6IHZhbHVlID09PSBjb21wYXJlZFZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ZhbGlkSVAodmFsdWVzSVA6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhKFxuICAgICAgICAgICAgdmFsdWVzSVAubGVuZ3RoID09PSA0ICYmXG4gICAgICAgICAgICAhdmFsdWVzSVAuc29tZSgodmFsdWU6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNJUC5sZW5ndGggIT09IGluZGV4ICsgMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09ICcnIHx8IE51bWJlcih2YWx1ZSkgPiAyNTU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gJycgfHwgTnVtYmVyKHZhbHVlLnN1YnN0cmluZygwLCAzKSkgPiAyNTU7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==
|
|
573
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1hc2stYXBwbGllci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hc2stbGliL3NyYy9saWIvbmd4LW1hc2stYXBwbGllci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQVcsTUFBTSxtQkFBbUIsQ0FBQzs7QUFFN0QsTUFDYSxxQkFBcUI7SUFEbEM7UUFFYyxZQUFPLEdBQUcsTUFBTSxDQUFVLGVBQWUsQ0FBQyxDQUFDO1FBRTlDLDBCQUFxQixHQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDO1FBRWhDLGdCQUFXLEdBQTJCLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBSS9ELG9CQUFlLEdBQStCLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO1FBRTNFLHNCQUFpQixHQUFpQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1FBRWpGLGFBQVEsR0FBd0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFFdEQsV0FBTSxHQUFzQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUVoRCxXQUFNLEdBQXNCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBRWhELHNCQUFpQixHQUFpQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1FBRWpGLGtCQUFhLEdBQTZCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBSXJFLGtCQUFhLEdBQTZCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBRXJFLHlCQUFvQixHQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDO1FBRS9CLGVBQVUsR0FBMEIsSUFBSSxDQUFDLE9BQU8s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QUMsUUFBa0I7UUFDL0IsT0FBTyxDQUFDLENBQ0osUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3JCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQWEsRUFBRSxLQUFhLEVBQUUsRUFBRTtnQkFDNUMsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLEtBQUssR0FBRyxDQUFDLEVBQUU7b0JBQy9CLE9BQU8sS0FBSyxLQUFLLEVBQUUsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDO2lCQUM5QztnQkFDRCxPQUFPLEtBQUssS0FBSyxFQUFFLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQy9ELENBQUMsQ0FBQyxDQUNMLENBQUM7SUFDTixDQUFDOzhHQTNzQlEscUJBQXFCO2tIQUFyQixxQkFBcUI7O1NBQXJCLHFCQUFxQjsyRkFBckIscUJBQXFCO2tCQURqQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR1hfTUFTS19DT05GSUcsIElDb25maWcgfSBmcm9tICcuL25neC1tYXNrLmNvbmZpZyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOZ3hNYXNrQXBwbGllclNlcnZpY2Uge1xuICAgIHByb3RlY3RlZCBfY29uZmlnID0gaW5qZWN0PElDb25maWc+KE5HWF9NQVNLX0NPTkZJRyk7XG5cbiAgICBwdWJsaWMgZHJvcFNwZWNpYWxDaGFyYWN0ZXJzOiBJQ29uZmlnWydkcm9wU3BlY2lhbENoYXJhY3RlcnMnXSA9XG4gICAgICAgIHRoaXMuX2NvbmZpZy5kcm9wU3BlY2lhbENoYXJhY3RlcnM7XG5cbiAgICBwdWJsaWMgaGlkZGVuSW5wdXQ6IElDb25maWdbJ2hpZGRlbklucHV0J10gPSB0aGlzLl9jb25maWcuaGlkZGVuSW5wdXQ7XG5cbiAgICBwdWJsaWMgc2hvd1RlbXBsYXRlITogSUNvbmZpZ1snc2hvd1RlbXBsYXRlJ107XG5cbiAgICBwdWJsaWMgY2xlYXJJZk5vdE1hdGNoOiBJQ29uZmlnWydjbGVhcklmTm90TWF0Y2gnXSA9IHRoaXMuX2NvbmZpZy5jbGVhcklmTm90TWF0Y2g7XG5cbiAgICBwdWJsaWMgc3BlY2lhbENoYXJhY3RlcnM6IElDb25maWdbJ3NwZWNpYWxDaGFyYWN0ZXJzJ10gPSB0aGlzLl9jb25maWcuc3BlY2lhbENoYXJhY3RlcnM7XG5cbiAgICBwdWJsaWMgcGF0dGVybnM6IElDb25maWdbJ3BhdHRlcm5zJ10gPSB0aGlzLl9jb25maWcucGF0dGVybnM7XG5cbiAgICBwdWJsaWMgcHJlZml4OiBJQ29uZmlnWydwcmVmaXgnXSA9IHRoaXMuX2NvbmZpZy5wcmVmaXg7XG5cbiAgICBwdWJsaWMgc3VmZml4OiBJQ29uZmlnWydzdWZmaXgnXSA9IHRoaXMuX2NvbmZpZy5zdWZmaXg7XG5cbiAgICBwdWJsaWMgdGhvdXNhbmRTZXBhcmF0b3I6IElDb25maWdbJ3Rob3VzYW5kU2VwYXJhdG9yJ10gPSB0aGlzLl9jb25maWcudGhvdXNhbmRTZXBhcmF0b3I7XG5cbiAgICBwdWJsaWMgZGVjaW1hbE1hcmtlcjogSUNvbmZpZ1snZGVjaW1hbE1hcmtlciddID0gdGhpcy5fY29uZmlnLmRlY2ltYWxNYXJrZXI7XG5cbiAgICBwdWJsaWMgY3VzdG9tUGF0dGVybiE6IElDb25maWdbJ3BhdHRlcm5zJ107XG5cbiAgICBwdWJsaWMgc2hvd01hc2tUeXBlZDogSUNvbmZpZ1snc2hvd01hc2tUeXBlZCddID0gdGhpcy5fY29uZmlnLnNob3dNYXNrVHlwZWQ7XG5cbiAgICBwdWJsaWMgcGxhY2VIb2xkZXJDaGFyYWN0ZXI6IElDb25maWdbJ3BsYWNlSG9sZGVyQ2hhcmFjdGVyJ10gPVxuICAgICAgICB0aGlzLl9jb25maWcucGxhY2VIb2xkZXJDaGFyYWN0ZXI7XG5cbiAgICBwdWJsaWMgdmFsaWRhdGlvbjogSUNvbmZpZ1sndmFsaWRhdGlvbiddID0gdGhpcy5fY29uZmlnLnZhbGlkYXRpb247XG5cbiAgICBwdWJsaWMgc2VwYXJhdG9yTGltaXQ6IElDb25maWdbJ3NlcGFyYXRvckxpbWl0J10gPSB0aGlzLl9jb25maWcuc2VwYXJhdG9yTGltaXQ7XG5cbiAgICBwdWJsaWMgYWxsb3dOZWdhdGl2ZU51bWJlcnM6IElDb25maWdbJ2FsbG93TmVnYXRpdmVOdW1iZXJzJ10gPVxuICAgICAgICB0aGlzLl9jb25maWcuYWxsb3dOZWdhdGl2ZU51bWJlcnM7XG5cbiAgICBwdWJsaWMgbGVhZFplcm9EYXRlVGltZTogSUNvbmZpZ1snbGVhZFplcm9EYXRlVGltZSddID0gdGhpcy5fY29uZmlnLmxlYWRaZXJvRGF0ZVRpbWU7XG5cbiAgICBwcml2YXRlIF9zaGlmdDogU2V0PG51bWJlcj4gPSBuZXcgU2V0KCk7XG5cbiAgICBwdWJsaWMgbWFza0V4cHJlc3Npb24gPSAnJztcblxuICAgIHB1YmxpYyBhY3R1YWxWYWx1ZSA9ICcnO1xuXG4gICAgcHVibGljIHNob3duTWFza0V4cHJlc3Npb24gPSAnJztcblxuICAgIHB1YmxpYyBpcEVycm9yPzogYm9vbGVhbjtcblxuICAgIHB1YmxpYyBjcGZDbnBqRXJyb3I/OiBib29sZWFuO1xuICAgIHB1YmxpYyBhcHBseU1hc2tXaXRoUGF0dGVybihcbiAgICAgICAgaW5wdXRWYWx1ZTogc3RyaW5nLFxuICAgICAgICBtYXNrQW5kUGF0dGVybjogW3N0cmluZywgSUNvbmZpZ1sncGF0dGVybnMnXV1cbiAgICApOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBbbWFzaywgY3VzdG9tUGF0dGVybl0gPSBtYXNrQW5kUGF0dGVybjtcbiAgICAgICAgdGhpcy5jdXN0b21QYXR0ZXJuID0gY3VzdG9tUGF0dGVybjtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlNYXNrKGlucHV0VmFsdWUsIG1hc2spO1xuICAgIH1cblxuICAgIHB1YmxpYyBhcHBseU1hc2soXG4gICAgICAgIGlucHV0VmFsdWU6IHN0cmluZyB8IG9iamVjdCB8IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgICAgICBtYXNrRXhwcmVzc2lvbjogc3RyaW5nLFxuICAgICAgICBwb3NpdGlvbiA9IDAsXG4gICAgICAgIGp1c3RQYXN0ZWQgPSBmYWxzZSxcbiAgICAgICAgYmFja3NwYWNlZCA9IGZhbHNlLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNiOiAoLi4uYXJnczogYW55W10pID0+IGFueSA9ICgpID0+IHt9XG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFtYXNrRXhwcmVzc2lvbiB8fCB0eXBlb2YgaW5wdXRWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICBsZXQgY3Vyc29yID0gMDtcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICBsZXQgbXVsdGkgPSBmYWxzZTtcbiAgICAgICAgbGV0IGJhY2tzcGFjZVNoaWZ0ID0gZmFsc2U7XG4gICAgICAgIGxldCBzaGlmdCA9IDE7XG4gICAgICAgIGxldCBzdGVwQmFjayA9IGZhbHNlO1xuICAgICAgICBpZiAoaW5wdXRWYWx1ZS5zbGljZSgwLCB0aGlzLnByZWZpeC5sZW5ndGgpID09PSB0aGlzLnByZWZpeCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICBpbnB1dFZhbHVlID0gaW5wdXRWYWx1ZS5zbGljZSh0aGlzLnByZWZpeC5sZW5ndGgsIGlucHV0VmFsdWUubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISF0aGlzLnN1ZmZpeCAmJiBpbnB1dFZhbHVlPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLmNoZWNrQW5kUmVtb3ZlU3VmZml4KGlucHV0VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0QXJyYXk6IHN0cmluZ1tdID0gaW5wdXRWYWx1ZS50b1N0cmluZygpLnNwbGl0KCcnKTtcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dOZWdhdGl2ZU51bWJlcnMgJiYgaW5wdXRWYWx1ZS5zbGljZShjdXJzb3IsIGN1cnNvciArIDEpID09PSAnLScpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgcmVzdWx0ICs9IGlucHV0VmFsdWUuc2xpY2UoY3Vyc29yLCBjdXJzb3IgKyAxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWFza0V4cHJlc3Npb24gPT09ICdJUCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlc0lQID0gaW5wdXRWYWx1ZS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgdGhpcy5pcEVycm9yID0gdGhpcy5fdmFsaWRJUCh2YWx1ZXNJUCk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIG1hc2tFeHByZXNzaW9uID0gJzA5OS4wOTkuMDk5LjA5OSc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJyOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0VmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpbnB1dFZhbHVlW2ldPy5tYXRjaCgnXFxcXGQnKSkge1xuICAgICAgICAgICAgICAgIGFyci5wdXNoKGlucHV0VmFsdWVbaV0gPz8gJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXNrRXhwcmVzc2lvbiA9PT0gJ0NQRl9DTlBKJykge1xuICAgICAgICAgICAgdGhpcy5jcGZDbnBqRXJyb3IgPSBhcnIubGVuZ3RoICE9PSAxMSAmJiBhcnIubGVuZ3RoICE9PSAxNDtcbiAgICAgICAgICAgIGlmIChhcnIubGVuZ3RoID4gMTEpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBtYXNrRXhwcmVzc2lvbiA9ICcwMC4wMDAuMDAwLzAwMDAtMDAnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBtYXNrRXhwcmVzc2lvbiA9ICcwMDAuMDAwLjAwMC0wMCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hc2tFeHByZXNzaW9uLnN0YXJ0c1dpdGgoJ3BlcmNlbnQnKSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGlucHV0VmFsdWUubWF0Y2goJ1thLXpdfFtBLVpdJykgfHxcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlLm1hdGNoKC9bLSEkJV4mKigpXyt8fj1ge31cXFtcXF06XCI7Jzw+PyxcXC8uXS8pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gdGhpcy5fc3RyaXBUb0RlY2ltYWwoaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJlY2lzaW9uOiBudW1iZXIgPSB0aGlzLmdldFByZWNpc2lvbihtYXNrRXhwcmVzc2lvbik7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IHRoaXMuY2hlY2tJbnB1dFByZWNpc2lvbihpbnB1dFZhbHVlLCBwcmVjaXNpb24sIHRoaXMuZGVjaW1hbE1hcmtlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaW5wdXRWYWx1ZS5pbmRleE9mKCcuJykgPiAwICYmXG4gICAgICAgICAgICAgICAgIXRoaXMucGVyY2VudGFnZShpbnB1dFZhbHVlLnN1YnN0cmluZygwLCBpbnB1dFZhbHVlLmluZGV4T2YoJy4nKSkpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBsZXQgYmFzZTogc3RyaW5nID0gaW5wdXRWYWx1ZS5zdWJzdHJpbmcoMCwgaW5wdXRWYWx1ZS5pbmRleE9mKCcuJykgLSAxKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hbGxvd05lZ2F0aXZlTnVtYmVycyAmJiBpbnB1dFZhbHVlLnNsaWNlKGN1cnNvciwgY3Vyc29yICsgMSkgPT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICBiYXNlID0gaW5wdXRWYWx1ZS5zdWJzdHJpbmcoMCwgaW5wdXRWYWx1ZS5pbmRleE9mKCcuJykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gYCR7YmFzZX0ke2lucHV0VmFsdWUuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlLmluZGV4T2YoJy4nKSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZS5sZW5ndGhcbiAgICAgICAgICAgICAgICApfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSAnJztcbiAgICAgICAgICAgIHRoaXMuYWxsb3dOZWdhdGl2ZU51bWJlcnMgJiYgaW5wdXRWYWx1ZS5zbGljZShjdXJzb3IsIGN1cnNvciArIDEpID09PSAnLSdcbiAgICAgICAgICAgICAgICA/ICh2YWx1ZSA9IGlucHV0VmFsdWUuc2xpY2UoY3Vyc29yICsgMSwgY3Vyc29yICsgaW5wdXRWYWx1ZS5sZW5ndGgpKVxuICAgICAgICAgICAgICAgIDogKHZhbHVlID0gaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5wZXJjZW50YWdlKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlucHV0VmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlucHV0VmFsdWUuc3Vic3RyaW5nKDAsIGlucHV0VmFsdWUubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobWFza0V4cHJlc3Npb24uc3RhcnRzV2l0aCgnc2VwYXJhdG9yJykpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlLm1hdGNoKCdbd9CwLdGP0JAt0K9dJykgfHxcbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlLm1hdGNoKCdb0IHRkdCQLdGPXScpIHx8XG4gICAgICAgICAgICAgICAgaW5wdXRWYWx1ZS5tYXRjaCgnW2Etel18W0EtWl0nKSB8fFxuICAgICAgICAgICAgICAgIGlucHV0VmFsdWUubWF0Y2goL1stQCMhJCVcXFxcXiYqKClfwqPCrCcrfH49YHt9XFxdOlwiOzw+Lj8vXS8pIHx8XG4gICAgICAgICAgICAgICAgaW5wdXRWYWx1ZS5tYXRjaCgnW15BLVphLXowLTksXScpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gdGhpcy5fc3RyaXBUb0RlY2ltYWwoaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIGlucHV0VmFsdWUgPVxuICAgICAgICAgICAgICAgIGlucHV0VmFsdWUubGVuZ3RoID4gMSAmJlxuICAgICAgICAgICAgICAgIGlucHV0VmFsdWVbMF0gPT09ICcwJyAmJlxuICAgICAgICAgICAgICAgIGlucHV0VmFsdWVbMV0gIT09IHRoaXMudGhvdXNhbmRTZXBhcmF0b3IgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy5fY29tcGFyZU9ySW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWVbMV0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVjaW1hbE1hcmtlcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aG91c2FuZFNlcGFyYXRvclxuICAgICAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICAgICAhYmFja3NwYWNlZFxuICAgICAgICAgICAgICAgICAgICA/IGlucHV0VmFsdWUuc2xpY2UoMCwgaW5wdXRWYWx1ZS5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgICAgICA6IGlucHV0VmFsdWU7XG4gICAgICAgICAgICBpZiAoYmFja3NwYWNlZCkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLl9jb21wYXJlT3JJbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZVtpbnB1dFZhbHVlLmxlbmd0aCAtIDFdLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlY2ltYWxNYXJrZXIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGhvdXNhbmRTZXBhcmF0b3JcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgID8gaW5wdXRWYWx1ZS5zbGljZSgwLCBpbnB1dFZhbHVlLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAgICAgICAgIDogaW5wdXRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRPRE86IHdlIGhhZCBkaWZmZXJlbnQgcmV4ZXhwcyBoZXJlIGZvciB0aGUgZGlmZmVyZW50IGNhc2VzLi4uIGJ1dCB0ZXN0cyBkb250IHNlYW0gdG8gYm90aGVyIC0gY2hlY2sgdGhpc1xuICAgICAgICAgICAgLy8gIHNlcGFyYXRvcjogbm8gQ09NTUEsIGRvdC1zZXA6IG5vIFNQQUNFLCBDT01NQSBPSywgY29tbWEtc2VwOiBubyBTUEFDRSwgQ09NTUEgT0tcblxuICAgICAgICAgICAgY29uc3QgdGhvdXNhbmRTZXBhcmF0b3JDaGFyRXNjYXBlZDogc3RyaW5nID0gdGhpcy5fY2hhclRvUmVnRXhwRXhwcmVzc2lvbihcbiAgICAgICAgICAgICAgICB0aGlzLnRob3VzYW5kU2VwYXJhdG9yXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGV0IGludmFsaWRDaGFyczogc3RyaW5nID0gJ0AjISQlXiYqKClfK3x+PWB7fVxcXFxbXFxcXF06XFxcXHMsXFxcXC5cIjs8Pj9cXFxcLycucmVwbGFjZShcbiAgICAgICAgICAgICAgICB0aG91c2FuZFNlcGFyYXRvckNoYXJFc2NhcGVkLFxuICAgICAgICAgICAgICAgICcnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8ucmVwbGFjZShkZWNpbWFsTWFya2VyRXNjYXBlZCwgJycpO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kZWNpbWFsTWFya2VyKSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbWFya2VyIG9mIHRoaXMuZGVjaW1hbE1hcmtlcikge1xuICAgICAgICAgICAgICAgICAgICBpbnZhbGlkQ2hhcnMgPSBpbnZhbGlkQ2hhcnMucmVwbGFjZSh0aGlzLl9jaGFyVG9SZWdFeHBFeHByZXNzaW9uKG1hcmtlciksICcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGludmFsaWRDaGFycyA9IGludmFsaWRDaGFycy5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFyVG9SZWdFeHBFeHByZXNzaW9uKHRoaXMuZGVjaW1hbE1hcmtlciksXG4gICAgICAgICAgICAgICAgICAgICcnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW52YWxpZENoYXJSZWdleHAgPSBuZXcgUmVnRXhwKCdbJyArIGludmFsaWRDaGFycyArICddJyk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlLm1hdGNoKGludmFsaWRDaGFyUmVnZXhwKSB8fFxuICAgICAgICAgICAgICAgIChpbnB1dFZhbHVlLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb21wYXJlT3JJbmNsdWRlcyhpbnB1dFZhbHVlLCB0aGlzLmRlY2ltYWxNYXJrZXIsIHRoaXMudGhvdXNhbmRTZXBhcmF0b3IpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IGlucHV0VmFsdWUuc3Vic3RyaW5nKDAsIGlucHV0VmFsdWUubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHByZWNpc2lvbjogbnVtYmVyID0gdGhpcy5nZXRQcmVjaXNpb24obWFza0V4cHJlc3Npb24pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICBpbnB1dFZhbHVlID0gdGhpcy5jaGVja0lucHV0UHJlY2lzaW9uKGlucHV0VmFsdWUsIHByZWNpc2lvbiwgdGhpcy5kZWNpbWFsTWFya2VyKTtcbiAgICAgICAgICAgIGNvbnN0IHN0ckZvclNlcDogc3RyaW5nID0gaW5wdXRWYWx1ZS5yZXBsYWNlKFxuICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAodGhvdXNhbmRTZXBhcmF0b3JDaGFyRXNjYXBlZCwgJ2cnKSxcbiAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX2Zvcm1hdFdpdGhTZXBhcmF0b3JzKFxuICAgICAgICAgICAgICAgIHN0ckZvclNlcCxcbiAgICAgICAgICAgICAgICB0aGlzLnRob3VzYW5kU2VwYXJhdG9yLFxuICAgICAgICAgICAgICAgIHRoaXMuZGVjaW1hbE1hcmtlcixcbiAgICAgICAgICAgICAgICBwcmVjaXNpb25cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBjb21tYVNoaWZ0OiBudW1iZXIgPSByZXN1bHQuaW5kZXhPZignLCcpIC0gaW5wdXRWYWx1ZS5pbmRleE9mKCcsJyk7XG4gICAgICAgICAgICBjb25zdCBzaGlmdFN0ZXA6IG51bWJlciA9IHJlc3VsdC5sZW5ndGggLSBpbnB1dFZhbHVlLmxlbmd0aDtcblxuICAgICAgICAgICAgaWYgKHNoaWZ0U3RlcCA+IDAgJiYgcmVzdWx0W3Bvc2l0aW9uXSAhPT0gJywnKSB7XG4gICAgICAgICAgICAgICAgYmFja3NwYWNlU2hpZnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxldCBfc2hpZnQgPSAwO1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hpZnQuYWRkKHBvc2l0aW9uICsgX3NoaWZ0KTtcbiAgICAgICAgICAgICAgICAgICAgX3NoaWZ0Kys7XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAoX3NoaWZ0IDwgc2hpZnRTdGVwKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgKGNvbW1hU2hpZnQgIT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICEocmVzdWx0LmluZGV4T2YoJywnKSA+PSBwb3NpdGlvbiAmJiBwb3NpdGlvbiA+IDMpKSB8fFxuICAgICAgICAgICAgICAgICghKHJlc3VsdC5pbmRleE9mKCcuJykgPj0gcG9zaXRpb24gJiYgcG9zaXRpb24gPiAzKSAmJiBzaGlmdFN0ZXAgPD0gMClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NoaWZ0LmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgYmFja3NwYWNlU2hpZnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHNoaWZ0ID0gc2hpZnRTdGVwO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIHBvc2l0aW9uICs9IHNoaWZ0U3RlcDtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaGlmdC5hZGQocG9zaXRpb24pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaGlmdC5jbGVhcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgICAgICBsZXQgaTogbnVtYmVyID0gMCwgaW5wdXRTeW1ib2w6IHN0cmluZyA9IGlucHV0QXJyYXlbMF0hO1xuICAgICAgICAgICAgICAgIGkgPCBpbnB1dEFycmF5Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpKyssIGlucHV0U3ltYm9sID0gaW5wdXRBcnJheVtpXSA/PyAnJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvciA9PT0gbWFza0V4cHJlc3Npb24ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrU3ltYm9sTWFzayhpbnB1dFN5bWJvbCwgbWFza0V4cHJlc3Npb25bY3Vyc29yXSA/PyAnJykgJiZcbiAgICAgICAgICAgICAgICAgICAgbWFza0V4cHJlc3Npb25bY3Vyc29yICsgMV0gPT09ICc/J1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gaW5wdXRTeW1ib2w7XG4gICAgICAgICAgICAgICAgICAgIGN1cnNvciArPSAyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG1hc2tFeHByZXNzaW9uW2N1cnNvciArIDFdID09PSAnKicgJiZcbiAgICAgICAgICAgICAgICAgICAgbXVsdGkgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tTeW1ib2xNYXNrKGlucHV0U3ltYm9sLCBtYXNrRXhwcmVzc2lvbltjdXJzb3IgKyAyXSA/PyAnJylcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGlucHV0U3ltYm9sO1xuICAgICAgICAgICAgICAgICAgICBjdXJzb3IgKz0gMztcbiAgICAgICAgICAgICAgICAgICAgbXVsdGkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1N5bWJvbE1hc2soaW5wdXRTeW1ib2wsIG1hc2tFeHByZXNzaW9uW2N1cnNvcl0gPz8gJycpICYmXG4gICAgICAgICAgICAgICAgICAgIG1hc2tFeHByZXNzaW9uW2N1cnNvciArIDFdID09PSAnKidcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGlucHV0U3ltYm9sO1xuICAgICAgICAgICAgICAgICAgICBtdWx0aSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgbWFza0V4cHJlc3Npb25bY3Vyc29yICsgMV0gPT09ICc/JyAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1N5bWJvbE1hc2soaW5wdXRTeW1ib2wsIG1hc2tFeHByZXNzaW9uW2N1cnNvciArIDJdID8/ICcnKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gaW5wdXRTeW1ib2w7XG4gICAgICAgICAgICAgICAgICAgIGN1cnNvciArPSAzO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fY2hlY2tTeW1ib2xNYXNrKGlucHV0U3ltYm9sLCBtYXNrRXhwcmVzc2lvbltjdXJzb3JdID8/ICcnKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWFza0V4cHJlc3Npb25bY3Vyc29yXSA9PT0gJ0gnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTnVtYmVyKGlucHV0U3ltYm9sKSA+IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGlmdFN0ZXAobWFza0V4cHJlc3Npb24sIGN1cnNvciwgaW5wdXRBcnJheS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sZWFkWmVyb0RhdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnMCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXNrRXhwcmVzc2lvbltjdXJzb3JdID09PSAnaCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzdWx0ID09PSAnMicgJiYgTnVtYmVyKGlucHV0U3ltYm9sKSA+IDMpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChyZXN1bHQuc2xpY2UoY3Vyc29yIC0gMiwgY3Vyc29yKSA9PT0gJzInIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zbGljZShjdXJzb3IgLSAzLCBjdXJzb3IpID09PSAnMicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNsaWNlKGN1cnNvciAtIDQsIGN1cnNvcikgPT09ICcyJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2xpY2UoY3Vyc29yIC0gMSwgY3Vyc29yKSA9PT0gJzInKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIoaW5wdXRTeW1ib2wpID4gMyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IgPiAxMClcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvciArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobWFza0V4cHJlc3Npb25bY3Vyc29yXSA9PT0gJ20nIHx8IG1hc2tFeHByZXNzaW9uW2N1cnNvcl0gPT09ICdzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE51bWJlcihpbnB1dFN5bWJvbCkgPiA1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hpZnRTdGVwKG1hc2tFeHByZXNzaW9uLCBjdXJzb3IsIGlucHV0QXJyYXkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGVhZFplcm9EYXRlVGltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJzAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXlzQ291bnQgPSAzMTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRWYWx1ZUN1cnNvciA9IGlucHV0VmFsdWVbY3Vyc29yXSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0VmFsdWVDdXJzb3JQbHVzT25lID0gaW5wdXRWYWx1ZVtjdXJzb3IgKyAxXSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0VmFsdWVDdXJzb3JQbHVzVHdvID0gaW5wdXRWYWx1ZVtjdXJzb3IgKyAyXSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0VmFsdWVDdXJzb3JNaW51c09uZSA9IGlucHV0VmFsdWVbY3Vyc29yIC0gMV0gYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dFZhbHVlQ3Vyc29yTWludXNUd28gPSBpbnB1dFZhbHVlW2N1cnNvciAtIDJdIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRWYWx1ZUN1cnNvck1pbnVzVGhyZWUgPSBpbnB1dFZhbHVlW2N1cnNvciAtIDNdIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRWYWx1ZVNsaWNlTWludXNUaHJlZU1pbnVzT25lID0gaW5wdXRWYWx1ZS5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvciAtIDMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IgLSAxXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0VmFsdWVTbGljZU1pbnVzT25lUGx1c09uZSA9IGlucHV0VmFsdWUuc2xpY2UoY3Vyc29yIC0gMSwgY3Vyc29yICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0VmFsdWVTbGljZUN1cnNvclBsdXNUd28gPSBpbnB1dFZhbHVlLnNsaWNlKGN1cnNvciwgY3Vyc29yICsgMik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0VmFsdWVTbGljZU1pbnVzVHdvQ3Vyc29yID0gaW5wdXRWYWx1ZS5zbGljZShjdXJzb3IgLSAyLCBjdXJzb3IpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWFza0V4cHJlc3Npb25bY3Vyc29yXSA9PT0gJ2QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXNrU3RhcnRXaXRoTW9udGggPSBtYXNrRXhwcmVzc2lvbi5zbGljZSgwLCAyKSA9PT0gJ00wJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0V2l0aE1vbnRoSW5wdXQ6IGJvb2xlYW4gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tFeHByZXNzaW9uLnNsaWNlKDAsIDIpID09PSAnTTAnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsQ2hhcmFjdGVycy5pbmNsdWRlcyhpbnB1dFZhbHVlQ3Vyc29yTWludXNUd28pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOdW1iZXIoaW5wdXRTeW1ib2wpID4gMyAmJiB0aGlzLmxlYWRaZXJvRGF0ZVRpbWUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFtYXNrU3RhcnRXaXRoTW9udGggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE51bWJlcihpbnB1dFZhbHVlU2xpY2VDdXJzb3JQbHVzVHdvKSA+IGRheXNDb3VudCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyKGlucHV0VmFsdWVTbGljZU1pbnVzT25lUGx1c09uZSkgPiBkYXlzQ291bnQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoaW5wdXRWYWx1ZUN1cnNvclBsdXNPbmUpKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhcnRXaXRoTW9udGhJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE51bWJlcihpbnB1dFZhbHVlU2xpY2VNaW51c09uZVBsdXNPbmUpID4gZGF5c0NvdW50IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCF0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLmluY2x1ZGVzKGlucHV0VmFsdWVDdXJzb3IpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoaW5wdXRWYWx1ZUN1cnNvclBsdXNUd28pKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoaW5wdXRWYWx1ZUN1cnNvcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOdW1iZXIoaW5wdXRWYWx1ZVNsaWNlQ3Vyc29yUGx1c1R3bykgPiBkYXlzQ291bnQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLmluY2x1ZGVzKGlucHV0VmFsdWVDdXJzb3JQbHVzT25lKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvciArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoaWZ0U3RlcChtYXNrRXhwcmVzc2lvbiwgY3Vyc29yLCBpbnB1dEFycmF5Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxlYWRaZXJvRGF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcwJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hc2tFeHByZXNzaW9uW2N1cnNvcl0gPT09ICdNJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9udGhzQ291bnQgPSAxMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hc2sgd2l0aG91dCBkYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpdGhvdXREYXlzOiBib29sZWFuID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTnVtYmVyKGlucHV0U3ltYm9sKSA+IDIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyKGlucHV0VmFsdWVTbGljZUN1cnNvclBsdXNUd28pID4gbW9udGhzQ291bnQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsQ2hhcmFjdGVycy5pbmNsdWRlcyhpbnB1dFZhbHVlQ3Vyc29yUGx1c09uZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGF5PDEwICYmIG1vbnRoPDEyIGZvciBpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3BlY2lhbENoYXJ0ID0gbWFza0V4cHJlc3Npb24uc2xpY2UoY3Vyc29yICsgMiwgY3Vyc29yICsgMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXkxbW9udGhJbnB1dDogYm9vbGVhbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZVNsaWNlTWludXNUaHJlZU1pbnVzT25lLmluY2x1ZGVzKHNwZWNpYWxDaGFydCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHRoaXMuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoaW5wdXRWYWx1ZUN1cnNvck1pbnVzVHdvKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIoaW5wdXRWYWx1ZVNsaWNlTWludXNPbmVQbHVzT25lKSA+IG1vbnRoc0NvdW50ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLmluY2x1ZGVzKGlucHV0VmFsdWVDdXJzb3IpKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLmluY2x1ZGVzKGlucHV0VmFsdWVDdXJzb3IpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLmluY2x1ZGVzKGlucHV0VmFsdWVDdXJzb3JNaW51c1RocmVlKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyKGlucHV0VmFsdWVTbGljZU1pbnVzVHdvQ3Vyc29yKSA+IG1vbnRoc0NvdW50ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5zcGVjaWFsQ2hhcmFjdGVycy5pbmNsdWRlcyhpbnB1dFZhbHVlQ3Vyc29yTWludXNPbmUpKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLmluY2x1ZGVzKGlucHV0VmFsdWVDdXJzb3JNaW51c09uZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIG1vbnRoPDEyICYmIGRheTwxMCBmb3IgaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRheTJtb250aElucHV0OiBib29sZWFuID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIoaW5wdXRWYWx1ZVNsaWNlTWludXNUaHJlZU1pbnVzT25lKSA8PSBkYXlzQ291bnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5zcGVjaWFsQ2hhcmFjdGVycy5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZVNsaWNlTWludXNUaHJlZU1pbnVzT25lIGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLmluY2x1ZGVzKGlucHV0VmFsdWVDdXJzb3JNaW51c09uZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTnVtYmVyKGlucHV0VmFsdWVTbGljZUN1cnNvclBsdXNUd28pID4gbW9udGhzQ291bnQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsQ2hhcmFjdGVycy5pbmNsdWRlcyhpbnB1dFZhbHVlQ3Vyc29yUGx1c09uZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Vyc29yID09PSA1ICYmIHdpdGhvdXQgZGF5c1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF5Mm1vbnRoSW5wdXREb3Q6IGJvb2xlYW4gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOdW1iZXIoaW5wdXRWYWx1ZVNsaWNlQ3Vyc29yUGx1c1R3bykgPiBtb250aHNDb3VudCAmJiBjdXJzb3IgPT09IDUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoaW5wdXRWYWx1ZUN1cnNvclBsdXNPbmUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvciA9PT0gNSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAvLyBkYXk8MTAgJiYgbW9udGg8MTIgZm9yIHBhc3RlIHdob2xlIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRheTFtb250aFBhc3RlOiBib29sZWFuID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIoaW5wdXRWYWx1ZVNsaWNlTWludXNUaHJlZU1pbnVzT25lKSA+IGRheXNDb3VudCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlU2xpY2VNaW51c1RocmVlTWludXNPbmUgYXMgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlU2xpY2VNaW51c1R3b0N1cnNvciBhcyBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyKGlucHV0VmFsdWVTbGljZU1pbnVzVHdvQ3Vyc29yKSA+IG1vbnRoc0NvdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTA8ZGF5PDMxICYmIG1vbnRoPDEyIGZvciBwYXN0ZSB3aG9sZSBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXkybW9udGhQYXN0ZTogYm9vbGVhbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyKGlucHV0VmFsdWVTbGljZU1pbnVzVGhyZWVNaW51c09uZSkgPD0gZGF5c0NvdW50ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWVTbGljZU1pbnVzVGhyZWVNaW51c09uZSBhcyBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoaW5wdXRWYWx1ZUN1cnNvck1pbnVzT25lKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlcihpbnB1dFZhbHVlU2xpY2VNaW51c09uZVBsdXNPbmUpID4gbW9udGhzQ291bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE51bWJlcihpbnB1dFN5bWJvbCkgPiAxICYmIHRoaXMubGVhZFplcm9EYXRlVGltZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0RGF5cyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheTFtb250aElucHV0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5Mm1vbnRoUGFzdGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkxbW9udGhQYXN0ZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheTJtb250aElucHV0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5Mm1vbnRoSW5wdXREb3RcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvciArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoaWZ0U3RlcChtYXNrRXhwcmVzc2lvbiwgY3Vyc29yLCBpbnB1dEFycmF5Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxlYWRaZXJvRGF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcwJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGlucHV0U3ltYm9sO1xuICAgICAgICAgICAgICAgICAgICBjdXJzb3IrKztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0U3ltYm9sID09PSAnICcgJiYgbWFza0V4cHJlc3Npb25bY3Vyc29yXSA9PT0gJyAnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBpbnB1dFN5bWJvbDtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLmluZGV4T2YobWFza0V4cHJlc3Npb25bY3Vyc29yXSA/PyAnJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBtYXNrRXhwcmVzc2lvbltjdXJzb3JdO1xuICAgICAgICAgICAgICAgICAgICBjdXJzb3IrKztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hpZnRTdGVwKG1hc2tFeHByZXNzaW9uLCBjdXJzb3IsIGlucHV0QXJyYXkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWFza0V4cHJlc3Npb25bY3Vyc29yXSA9PT0gJzknICYmIHRoaXMuc2hvd01hc2tUeXBlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGlmdFN0ZXAobWFza0V4cHJlc3Npb24sIGN1cnNvciwgaW5wdXRBcnJheS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbENoYXJhY3RlcnMuaW5kZXhPZihpbnB1dFN5bWJvbCkgPiAtMSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdHRlcm5zW21hc2tFeHByZXNzaW9uW2N1cnNvcl0gPz8gJyddICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGF0dGVybnNbbWFza0V4cHJlc3Npb25bY3Vyc29yXSA/PyAnJ10/Lm9wdGlvbmFsXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICEhaW5wdXRBcnJheVtjdXJzb3JdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNrRXhwcmVzc2lvbiAhPT0gJzA5OS4wOTkuMDk5LjA5OScgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tFeHByZXNzaW9uICE9PSAnMDAwLjAwMC4wMDAtMDAnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNrRXhwcmVzc2lvbiAhPT0gJzAwLjAwMC4wMDAvMDAwMC0wMCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFtYXNrRXhwcmVzc2lvbi5tYXRjaCgvXjkrXFwuMCskLykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tFeHByZXNzaW9uW2N1cnNvcl0gIT09ICc5J1xuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBpbnB1dEFycmF5W2N1cnNvcl07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hc2tFeHByZXNzaW9uW2N1cnNvciArIDFdID09PSAnKicgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmluZFNwZWNpYWxDaGFyKHRoaXMubWFza0V4cHJlc3Npb25bY3Vyc29yICsgMl0gPz8gJycpICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmRTcGVjaWFsQ2hhcihpbnB1dFN5bWJvbCkgPT09IHRoaXMubWFza0V4cHJlc3Npb25bY3Vyc29yICsgMl0gJiZcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yICs9IDM7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBpbnB1dFN5bWJvbDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hc2tFeHByZXNzaW9uW2N1cnNvciArIDFdID09PSAnPycgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmluZFNwZWNpYWxDaGFyKHRoaXMubWFza0V4cHJlc3Npb25bY3Vyc29yICsgMl0gPz8gJycpICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmRTcGVjaWFsQ2hhcihpbnB1dFN5bWJvbCkgPT09IHRoaXMubWFza0V4cHJlc3Npb25bY3Vyc29yICsgMl0gJiZcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yICs9IDM7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBpbnB1dFN5bWJvbDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dNYXNrVHlwZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsQ2hhcmFjdGVycy5pbmRleE9mKGlucHV0U3ltYm9sKSA8IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRTeW1ib2wgIT09IHRoaXMucGxhY2VIb2xkZXJDaGFyYWN0ZXJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgc3RlcEJhY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICByZXN1bHQubGVuZ3RoICsgMSA9PT0gbWFza0V4cHJlc3Npb24ubGVuZ3RoICYmXG4gICAgICAgICAgICB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLmluZGV4T2YobWFza0V4cHJlc3Npb25bbWFza0V4cHJlc3Npb24ubGVuZ3RoIC0gMV0gPz8gJycpICE9PSAtMVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBtYXNrRXhwcmVzc2lvblttYXNrRXhwcmVzc2lvbi5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV3UG9zaXRpb246IG51bWJlciA9IHBvc2l0aW9uICsgMTtcblxuICAgICAgICB3aGlsZSAodGhpcy5fc2hpZnQuaGFzKG5ld1Bvc2l0aW9uKSkge1xuICAgICAgICAgICAgc2hpZnQrKztcbiAgICAgICAgICAgIG5ld1Bvc2l0aW9uKys7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWN0dWFsU2hpZnQ6IG51bWJlciA9XG4gICAgICAgICAgICBqdXN0UGFzdGVkICYmICFtYXNrRXhwcmVzc2lvbi5zdGFydHNXaXRoKCdzZXBhcmF0b3InKVxuICAgICAgICAgICAgICAgID8gY3Vyc29yXG4gICAgICAgICAgICAgICAgOiB0aGlzLl9zaGlmdC5oYXMocG9zaXRpb24pXG4gICAgICAgICAgICAgICAgPyBzaGlmdFxuICAgICAgICAgICAgICAgIDogMDtcbiAgICAgICAgaWYgKHN0ZXBCYWNrKSB7XG4gICAgICAgICAgICBhY3R1YWxTaGlmdC0tO1xuICAgICAgICB9XG5cbiAgICAgICAgY2IoYWN0dWFsU2hpZnQsIGJhY2tzcGFjZVNoaWZ0KTtcbiAgICAgICAgaWYgKHNoaWZ0IDwgMCkge1xuICAgICAgICAgICAgdGhpcy5fc2hpZnQuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb25seVNwZWNpYWwgPSBmYWxzZTtcbiAgICAgICAgaWYgKGJhY2tzcGFjZWQpIHtcbiAgICAgICAgICAgIG9ubHlTcGVjaWFsID0gaW5wdXRBcnJheS5ldmVyeSgoY2hhcikgPT4gdGhpcy5zcGVjaWFsQ2hhcmFjdGVycy5pbmNsdWRlcyhjaGFyKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlcyA9IGAke3RoaXMucHJlZml4fSR7b25seVNwZWNpYWwgPyAnJyA6IHJlc3VsdH0ke3RoaXMuc3VmZml4fWA7XG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXMgPSBgJHt0aGlzLnByZWZpeH0ke3Jlc3VsdH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgcHVibGljIF9maW5kU3BlY2lhbENoYXIoaW5wdXRTeW1ib2w6IHN0cmluZyk6IHVuZGVmaW5lZCB8IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLmZpbmQoKHZhbDogc3RyaW5nKSA9PiB2YWwgPT09IGlucHV0U3ltYm9sKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2NoZWNrU3ltYm9sTWFzayhpbnB1dFN5bWJvbDogc3RyaW5nLCBtYXNrU3ltYm9sOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgdGhpcy5wYXR0ZXJucyA9IHRoaXMuY3VzdG9tUGF0dGVybiA/IHRoaXMuY3VzdG9tUGF0dGVybiA6IHRoaXMucGF0dGVybnM7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAodGhpcy5wYXR0ZXJuc1ttYXNrU3ltYm9sXT8ucGF0dGVybiAmJlxuICAgICAgICAgICAgICAgIHRoaXMucGF0dGVybnNbbWFza1N5bWJvbF0/LnBhdHRlcm4udGVzdChpbnB1dFN5bWJvbCkpID8/XG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2Zvcm1hdFdpdGhTZXBhcmF0b3JzID0gKFxuICAgICAgICBzdHI6IHN0cmluZyxcbiAgICAgICAgdGhvdXNhbmRTZXBhcmF0b3JDaGFyOiBzdHJpbmcsXG4gICAgICAgIGRlY2ltYWxDaGFyczogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgICAgIHByZWNpc2lvbjogbnVtYmVyXG4gICAgKSA9PiB7XG4gICAgICAgIGxldCB4OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgZGVjaW1hbENoYXIgPSAnJztcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGVjaW1hbENoYXJzKSkge1xuICAgICAgICAgICAgY29uc3QgcmVnRXhwID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICBkZWNpbWFsQ2hhcnMubWFwKCh2KSA9PiAoJ1tcXFxcXiQufD8qKygpJy5pbmRleE9mKHYpID49IDAgPyBgXFxcXCR7dn1gIDogdikpLmpvaW4oJ3wnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHggPSBzdHIuc3BsaXQocmVnRXhwKTtcbiAgICAgICAgICAgIGRlY2ltYWxDaGFyID0gc3RyLm1hdGNoKHJlZ0V4cCk/LlswXSA/PyAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHggPSBzdHIuc3BsaXQoZGVjaW1hbENoYXJzKTtcbiAgICAgICAgICAgIGRlY2ltYWxDaGFyID0gZGVjaW1hbENoYXJzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlY2ltYWxzOiBzdHJpbmcgPSB4Lmxlbmd0aCA+IDEgPyBgJHtkZWNpbWFsQ2hhcn0ke3hbMV19YCA6ICcnO1xuICAgICAgICBsZXQgcmVzOiBzdHJpbmcgPSB4WzBdID8/ICcnO1xuICAgICAgICBjb25zdCBzZXBhcmF0b3JMaW1pdDogc3RyaW5nID0gdGhpcy5zZXBhcmF0b3JMaW1pdC5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgICAgICBpZiAoc2VwYXJhdG9yTGltaXQgJiYgK3NlcGFyYXRvckxpbWl0KSB7XG4gICAgICAgICAgICBpZiAocmVzWzBdID09PSAnLScpIHtcbiAgICAgICAgICAgICAgICByZXMgPSBgLSR7cmVzLnNsaWNlKDEsIHJlcy5sZW5ndGgpLnNsaWNlKDAsIHNlcGFyYXRvckxpbWl0Lmxlbmd0aCl9YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzID0gcmVzLnNsaWNlKDAsIHNlcGFyYXRvckxpbWl0Lmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgcmd4ID0gLyhcXGQrKShcXGR7M30pLztcblxuICAgICAgICB3aGlsZSAodGhvdXNhbmRTZXBhcmF0b3JDaGFyICYmIHJneC50ZXN0KHJlcykpIHtcbiAgICAgICAgICAgIHJlcyA9IHJlcy5yZXBsYWNlKHJneCwgJyQxJyArIHRob3VzYW5kU2VwYXJhdG9yQ2hhciArICckMicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzICsgZGVjaW1hbHM7XG4gICAgICAgIH0gZWxzZSBpZiAocHJlY2lzaW9uID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXMgKyBkZWNpbWFscy5zdWJzdHJpbmcoMCwgcHJlY2lzaW9uICsgMSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgcGVyY2VudGFnZSA9IChzdHI6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgICAgICByZXR1cm4gTnVtYmVyKHN0cikgPj0gMCAmJiBOdW1iZXIoc3RyKSA8PSAxMDA7XG4gICAgfTtcblxuICAgIHByaXZhdGUgZ2V0UHJlY2lzaW9uID0gKG1hc2tFeHByZXNzaW9uOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICAgICAgICBjb25zdCB4OiBzdHJpbmdbXSA9IG1hc2tFeHByZXNzaW9uLnNwbGl0KCcuJyk7XG4gICAgICAgIGlmICh4Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIoeFt4Lmxlbmd0aCAtIDFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBjaGVja0FuZFJlbW92ZVN1ZmZpeCA9IChpbnB1dFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5zdWZmaXg/Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJzdHIgPSB0aGlzLnN1ZmZpeC5zdWJzdHJpbmcoaSwgdGhpcy5zdWZmaXg/Lmxlbmd0aCk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaW5wdXRWYWx1ZS5pbmNsdWRlcyhzdWJzdHIpICYmXG4gICAgICAgICAgICAgICAgaSAhPT0gdGhpcy5zdWZmaXg/Lmxlbmd0aCAtIDEgJiZcbiAgICAgICAgICAgICAgICAoaSAtIDEgPCAwIHx8XG4gICAgICAgICAgICAgICAgICAgICFpbnB1dFZhbHVlLmluY2x1ZGVzKHRoaXMuc3VmZml4LnN1YnN0cmluZyhpIC0gMSwgdGhpcy5zdWZmaXg/Lmxlbmd0aCkpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0VmFsdWUucmVwbGFjZShzdWJzdHIsICcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBjaGVja0lucHV0UHJlY2lzaW9uID0gKFxuICAgICAgICBpbnB1dFZhbHVlOiBzdHJpbmcsXG4gICAgICAgIHByZWNpc2lvbjogbnVtYmVyLFxuICAgICAgICBkZWNpbWFsTWFya2VyOiBJQ29uZmlnWydkZWNpbWFsTWFya2VyJ11cbiAgICApOiBzdHJpbmcgPT4ge1xuICAgICAgICBpZiAocHJlY2lzaW9uIDwgSW5maW5pdHkpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gbmVlZCB0aGluayBhYm91dCBkZWNpbWFsTWFya2VyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkZWNpbWFsTWFya2VyKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IGRlY2ltYWxNYXJrZXIuZmluZCgoZG0pID0+IGRtICE9PSB0aGlzLnRob3VzYW5kU2VwYXJhdG9yKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBkZWNpbWFsTWFya2VyID0gbWFya2VyID8gbWFya2VyIDogZGVjaW1hbE1hcmtlclswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHByZWNpc2lvblJlZ0V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFyVG9SZWdFeHBFeHByZXNzaW9uKGRlY2ltYWxNYXJrZXIpICsgYFxcXFxkeyR7cHJlY2lzaW9ufX0uKiRgXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBwcmVjaXNpb25NYXRjaDogUmVnRXhwTWF0Y2hBcnJheSB8IG51bGwgPSBpbnB1dFZhbHVlLm1hdGNoKHByZWNpc2lvblJlZ0V4KTtcbiAgICAgICAgICAgIGNvbnN0IHByZWNpc2lvbk1hdGNoTGVuZ3RoOiBudW1iZXIgPSAocHJlY2lzaW9uTWF0Y2ggJiYgcHJlY2lzaW9uTWF0Y2hbMF0/Lmxlbmd0aCkgPz8gMDtcbiAgICAgICAgICAgIGlmIChwcmVjaXNpb25NYXRjaExlbmd0aCAtIDEgPiBwcmVjaXNpb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaWZmID0gcHJlY2lzaW9uTWF0Y2hMZW5ndGggLSAxIC0gcHJlY2lzaW9uO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSBpbnB1dFZhbHVlLnN1YnN0cmluZygwLCBpbnB1dFZhbHVlLmxlbmd0aCAtIGRpZmYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHByZWNpc2lvbiA9PT0gMCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbXBhcmVPckluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlW2lucHV0VmFsdWUubGVuZ3RoIC0gMV0sXG4gICAgICAgICAgICAgICAgICAgIGRlY2ltYWxNYXJrZXIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGhvdXNhbmRTZXBhcmF0b3JcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gaW5wdXRWYWx1ZS5zdWJzdHJpbmcoMCwgaW5wdXRWYWx1ZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBfc3RyaXBUb0RlY2ltYWwoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gc3RyXG4gICAgICAgICAgICAuc3BsaXQoJycpXG4gICAgICAgICAgICAuZmlsdGVyKChpOiBzdHJpbmcsIGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNEZWNpbWFsTWFya2VyID1cbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMuZGVjaW1hbE1hcmtlciA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgICAgID8gaSA9PT0gdGhpcy5kZWNpbWFsTWFya2VyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IC8vIFRPRE8gKGluZXBpcGVua28pIHVzZSB1dGlsaXR5IHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWNpbWFsTWFya2VyLmluY2x1ZGVzKGkgYXMgJywnIHwgJy4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBpLm1hdGNoKCdeLT9cXFxcZCcpIHx8XG4gICAgICAgICAgICAgICAgICAgIGkgPT09IHRoaXMudGhvdXNhbmRTZXBhcmF0b3IgfHxcbiAgICAgICAgICAgICAgICAgICAgaXNEZWNpbWFsTWFya2VyIHx8XG4gICAgICAgICAgICAgICAgICAgIChpID09PSAnLScgJiYgaWR4ID09PSAwICYmIHRoaXMuYWxsb3dOZWdhdGl2ZU51bWJlcnMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2hhclRvUmVnRXhwRXhwcmVzc2lvbihjaGFyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICAvLyBpZiAoQXJyYXkuaXNBcnJheShjaGFyKSkge1xuICAgICAgICAvLyBcdHJldHVybiBjaGFyLm1hcCgodikgPT4gKCdbXFxcXF4kLnw/KisoKScuaW5kZXhPZih2KSA+PSAwID8gYFxcXFwke3Z9YCA6IHYpKS5qb2luKCd8Jyk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgaWYgKGNoYXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXJzVG9Fc2NhcGUgPSAnW1xcXFxeJC58PyorKCknO1xuICAgICAgICAgICAgcmV0dXJuIGNoYXIgPT09ICcgJyA/ICdcXFxccycgOiBjaGFyc1RvRXNjYXBlLmluZGV4T2YoY2hhcikgPj0gMCA/IGBcXFxcJHtjaGFyfWAgOiBjaGFyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFyO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NoaWZ0U3RlcChtYXNrRXhwcmVzc2lvbjogc3RyaW5nLCBjdXJzb3I6IG51bWJlciwgaW5wdXRMZW5ndGg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBzaGlmdFN0ZXA6IG51bWJlciA9IC9bKj9dL2cudGVzdChtYXNrRXhwcmVzc2lvbi5zbGljZSgwLCBjdXJzb3IpKVxuICAgICAgICAgICAgPyBpbnB1dExlbmd0aFxuICAgICAgICAgICAgOiBjdXJzb3I7XG4gICAgICAgIHRoaXMuX3NoaWZ0LmFkZChzaGlmdFN0ZXAgKyB0aGlzLnByZWZpeC5sZW5ndGggfHwgMCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9jb21wYXJlT3JJbmNsdWRlczxUPih2YWx1ZTogVCwgY29tcGFyZWRWYWx1ZTogVCB8IFRbXSwgZXhjbHVkZWRWYWx1ZTogVCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShjb21wYXJlZFZhbHVlKVxuICAgICAgICAgICAgPyBjb21wYXJlZFZhbHVlLmZpbHRlcigodikgPT4gdiAhPT0gZXhjbHVkZWRWYWx1ZSkuaW5jbHVkZXModmFsdWUpXG4gICAgICAgICAgICA6IHZhbHVlID09PSBjb21wYXJlZFZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ZhbGlkSVAodmFsdWVzSVA6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhKFxuICAgICAgICAgICAgdmFsdWVzSVAubGVuZ3RoID09PSA0ICYmXG4gICAgICAgICAgICAhdmFsdWVzSVAuc29tZSgodmFsdWU6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNJUC5sZW5ndGggIT09IGluZGV4ICsgMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09ICcnIHx8IE51bWJlcih2YWx1ZSkgPiAyNTU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gJycgfHwgTnVtYmVyKHZhbHVlLnN1YnN0cmluZygwLCAzKSkgPiAyNTU7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==
|
package/fesm2022/ngx-mask.mjs
CHANGED
|
@@ -532,7 +532,8 @@ class NgxMaskApplierService {
|
|
|
532
532
|
maskExpression !== '099.099.099.099' &&
|
|
533
533
|
maskExpression !== '000.000.000-00' &&
|
|
534
534
|
maskExpression !== '00.000.000/0000-00' &&
|
|
535
|
-
!maskExpression.match(/^9+\.0+$/)
|
|
535
|
+
!maskExpression.match(/^9+\.0+$/) &&
|
|
536
|
+
maskExpression[cursor] !== '9') {
|
|
536
537
|
result += inputArray[cursor];
|
|
537
538
|
}
|
|
538
539
|
cursor++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-mask.mjs","sources":["../../../projects/ngx-mask-lib/src/lib/ngx-mask.config.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask-applier.service.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask.service.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask.providers.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask.directive.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask.pipe.ts","../../../projects/ngx-mask-lib/src/ngx-mask.ts"],"sourcesContent":["import { InjectionToken, EventEmitter } from '@angular/core';\n\nexport interface IConfig {\n suffix: string;\n prefix: string;\n thousandSeparator: string;\n decimalMarker: '.' | ',' | ['.', ','];\n clearIfNotMatch: boolean;\n showTemplate: boolean;\n showMaskTyped: boolean;\n placeHolderCharacter: string;\n shownMaskExpression: string;\n dropSpecialCharacters: boolean | string[];\n specialCharacters: string[];\n hiddenInput: boolean | undefined;\n validation: boolean;\n separatorLimit: string;\n allowNegativeNumbers: boolean;\n leadZeroDateTime: boolean;\n triggerOnMaskChange: boolean;\n maskFilled: EventEmitter<void>;\n patterns: {\n [character: string]: {\n pattern: RegExp;\n optional?: boolean;\n symbol?: string;\n };\n };\n}\n\nexport type optionsConfig = Partial<IConfig>;\nexport const NGX_MASK_CONFIG: InjectionToken<IConfig> = new InjectionToken('ngx-mask config');\nexport const NEW_CONFIG: InjectionToken<IConfig> = new InjectionToken('new ngx-mask config');\nexport const INITIAL_CONFIG: InjectionToken<IConfig> = new InjectionToken(\n 'initial ngx-mask config'\n);\n\nexport const initialConfig: IConfig = {\n suffix: '',\n prefix: '',\n thousandSeparator: ' ',\n decimalMarker: ['.', ','],\n clearIfNotMatch: false,\n showTemplate: false,\n showMaskTyped: false,\n placeHolderCharacter: '_',\n dropSpecialCharacters: true,\n hiddenInput: undefined,\n shownMaskExpression: '',\n separatorLimit: '',\n allowNegativeNumbers: false,\n validation: true,\n // eslint-disable-next-line @typescript-eslint/quotes\n specialCharacters: ['-', '/', '(', ')', '.', ':', ' ', '+', ',', '@', '[', ']', '\"', \"'\"],\n leadZeroDateTime: false,\n triggerOnMaskChange: false,\n maskFilled: new EventEmitter<void>(),\n patterns: {\n '0': {\n pattern: new RegExp('\\\\d'),\n },\n '9': {\n pattern: new RegExp('\\\\d'),\n optional: true,\n },\n X: {\n pattern: new RegExp('\\\\d'),\n symbol: '*',\n },\n A: {\n pattern: new RegExp('[a-zA-Z0-9]'),\n },\n S: {\n pattern: new RegExp('[a-zA-Z]'),\n },\n U: {\n pattern: new RegExp('[A-Z]'),\n },\n L: {\n pattern: new RegExp('[a-z]'),\n },\n d: {\n pattern: new RegExp('\\\\d'),\n },\n m: {\n pattern: new RegExp('\\\\d'),\n },\n M: {\n pattern: new RegExp('\\\\d'),\n },\n H: {\n pattern: new RegExp('\\\\d'),\n },\n h: {\n pattern: new RegExp('\\\\d'),\n },\n s: {\n pattern: new RegExp('\\\\d'),\n },\n },\n};\n\nexport const timeMasks: string[] = ['Hh:m0:s0', 'Hh:m0', 'm0:s0'];\n\nexport const withoutValidation: string[] = [\n 'percent',\n 'Hh',\n 's0',\n 'm0',\n 'separator',\n 'd0/M0/0000',\n 'd0/M0',\n 'd0',\n 'M0',\n];\n","import { inject, Injectable } from '@angular/core';\nimport { NGX_MASK_CONFIG, IConfig } from './ngx-mask.config';\n\n@Injectable()\nexport class NgxMaskApplierService {\n protected _config = inject<IConfig>(NGX_MASK_CONFIG);\n\n public dropSpecialCharacters: IConfig['dropSpecialCharacters'] =\n this._config.dropSpecialCharacters;\n\n public hiddenInput: IConfig['hiddenInput'] = this._config.hiddenInput;\n\n public showTemplate!: IConfig['showTemplate'];\n\n public clearIfNotMatch: IConfig['clearIfNotMatch'] = this._config.clearIfNotMatch;\n\n public specialCharacters: IConfig['specialCharacters'] = this._config.specialCharacters;\n\n public patterns: IConfig['patterns'] = this._config.patterns;\n\n public prefix: IConfig['prefix'] = this._config.prefix;\n\n public suffix: IConfig['suffix'] = this._config.suffix;\n\n public thousandSeparator: IConfig['thousandSeparator'] = this._config.thousandSeparator;\n\n public decimalMarker: IConfig['decimalMarker'] = this._config.decimalMarker;\n\n public customPattern!: IConfig['patterns'];\n\n public showMaskTyped: IConfig['showMaskTyped'] = this._config.showMaskTyped;\n\n public placeHolderCharacter: IConfig['placeHolderCharacter'] =\n this._config.placeHolderCharacter;\n\n public validation: IConfig['validation'] = this._config.validation;\n\n public separatorLimit: IConfig['separatorLimit'] = this._config.separatorLimit;\n\n public allowNegativeNumbers: IConfig['allowNegativeNumbers'] =\n this._config.allowNegativeNumbers;\n\n public leadZeroDateTime: IConfig['leadZeroDateTime'] = this._config.leadZeroDateTime;\n\n private _shift: Set<number> = new Set();\n\n public maskExpression = '';\n\n public actualValue = '';\n\n public shownMaskExpression = '';\n\n public ipError?: boolean;\n\n public cpfCnpjError?: boolean;\n public applyMaskWithPattern(\n inputValue: string,\n maskAndPattern: [string, IConfig['patterns']]\n ): string {\n const [mask, customPattern] = maskAndPattern;\n this.customPattern = customPattern;\n return this.applyMask(inputValue, mask);\n }\n\n public applyMask(\n inputValue: string | object | boolean | null | undefined,\n maskExpression: string,\n position = 0,\n justPasted = false,\n backspaced = false,\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any\n cb: (...args: any[]) => any = () => {}\n ): string {\n if (!maskExpression || typeof inputValue !== 'string') {\n return '';\n }\n let cursor = 0;\n let result = '';\n let multi = false;\n let backspaceShift = false;\n let shift = 1;\n let stepBack = false;\n if (inputValue.slice(0, this.prefix.length) === this.prefix) {\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue.slice(this.prefix.length, inputValue.length);\n }\n if (!!this.suffix && inputValue?.length > 0) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this.checkAndRemoveSuffix(inputValue);\n }\n const inputArray: string[] = inputValue.toString().split('');\n if (this.allowNegativeNumbers && inputValue.slice(cursor, cursor + 1) === '-') {\n // eslint-disable-next-line no-param-reassign\n result += inputValue.slice(cursor, cursor + 1);\n }\n if (maskExpression === 'IP') {\n const valuesIP = inputValue.split('.');\n this.ipError = this._validIP(valuesIP);\n // eslint-disable-next-line no-param-reassign\n maskExpression = '099.099.099.099';\n }\n const arr: string[] = [];\n for (let i = 0; i < inputValue.length; i++) {\n if (inputValue[i]?.match('\\\\d')) {\n arr.push(inputValue[i] ?? '');\n }\n }\n if (maskExpression === 'CPF_CNPJ') {\n this.cpfCnpjError = arr.length !== 11 && arr.length !== 14;\n if (arr.length > 11) {\n // eslint-disable-next-line no-param-reassign\n maskExpression = '00.000.000/0000-00';\n } else {\n // eslint-disable-next-line no-param-reassign\n maskExpression = '000.000.000-00';\n }\n }\n if (maskExpression.startsWith('percent')) {\n if (\n inputValue.match('[a-z]|[A-Z]') ||\n // eslint-disable-next-line no-useless-escape\n inputValue.match(/[-!$%^&*()_+|~=`{}\\[\\]:\";'<>?,\\/.]/)\n ) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this._stripToDecimal(inputValue);\n const precision: number = this.getPrecision(maskExpression);\n // eslint-disable-next-line no-param-reassign\n inputValue = this.checkInputPrecision(inputValue, precision, this.decimalMarker);\n }\n if (\n inputValue.indexOf('.') > 0 &&\n !this.percentage(inputValue.substring(0, inputValue.indexOf('.')))\n ) {\n let base: string = inputValue.substring(0, inputValue.indexOf('.') - 1);\n if (this.allowNegativeNumbers && inputValue.slice(cursor, cursor + 1) === '-') {\n base = inputValue.substring(0, inputValue.indexOf('.'));\n }\n // eslint-disable-next-line no-param-reassign\n inputValue = `${base}${inputValue.substring(\n inputValue.indexOf('.'),\n inputValue.length\n )}`;\n }\n let value = '';\n this.allowNegativeNumbers && inputValue.slice(cursor, cursor + 1) === '-'\n ? (value = inputValue.slice(cursor + 1, cursor + inputValue.length))\n : (value = inputValue);\n if (this.percentage(value)) {\n result = inputValue;\n } else {\n result = inputValue.substring(0, inputValue.length - 1);\n }\n } else if (maskExpression.startsWith('separator')) {\n if (\n inputValue.match('[wа-яА-Я]') ||\n inputValue.match('[ЁёА-я]') ||\n inputValue.match('[a-z]|[A-Z]') ||\n inputValue.match(/[-@#!$%\\\\^&*()_£¬'+|~=`{}\\]:\";<>.?/]/) ||\n inputValue.match('[^A-Za-z0-9,]')\n ) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this._stripToDecimal(inputValue);\n }\n // eslint-disable-next-line no-param-reassign\n inputValue =\n inputValue.length > 1 &&\n inputValue[0] === '0' &&\n inputValue[1] !== this.thousandSeparator &&\n !this._compareOrIncludes(\n inputValue[1],\n this.decimalMarker,\n this.thousandSeparator\n ) &&\n !backspaced\n ? inputValue.slice(0, inputValue.length - 1)\n : inputValue;\n if (backspaced) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this._compareOrIncludes(\n inputValue[inputValue.length - 1],\n this.decimalMarker,\n this.thousandSeparator\n )\n ? inputValue.slice(0, inputValue.length - 1)\n : inputValue;\n }\n // TODO: we had different rexexps here for the different cases... but tests dont seam to bother - check this\n // separator: no COMMA, dot-sep: no SPACE, COMMA OK, comma-sep: no SPACE, COMMA OK\n\n const thousandSeparatorCharEscaped: string = this._charToRegExpExpression(\n this.thousandSeparator\n );\n let invalidChars: string = '@#!$%^&*()_+|~=`{}\\\\[\\\\]:\\\\s,\\\\.\";<>?\\\\/'.replace(\n thousandSeparatorCharEscaped,\n ''\n );\n //.replace(decimalMarkerEscaped, '');\n if (Array.isArray(this.decimalMarker)) {\n for (const marker of this.decimalMarker) {\n invalidChars = invalidChars.replace(this._charToRegExpExpression(marker), '');\n }\n } else {\n invalidChars = invalidChars.replace(\n this._charToRegExpExpression(this.decimalMarker),\n ''\n );\n }\n\n const invalidCharRegexp = new RegExp('[' + invalidChars + ']');\n\n if (\n inputValue.match(invalidCharRegexp) ||\n (inputValue.length === 1 &&\n this._compareOrIncludes(inputValue, this.decimalMarker, this.thousandSeparator))\n ) {\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue.substring(0, inputValue.length - 1);\n }\n\n const precision: number = this.getPrecision(maskExpression);\n // eslint-disable-next-line no-param-reassign\n inputValue = this.checkInputPrecision(inputValue, precision, this.decimalMarker);\n const strForSep: string = inputValue.replace(\n new RegExp(thousandSeparatorCharEscaped, 'g'),\n ''\n );\n result = this._formatWithSeparators(\n strForSep,\n this.thousandSeparator,\n this.decimalMarker,\n precision\n );\n const commaShift: number = result.indexOf(',') - inputValue.indexOf(',');\n const shiftStep: number = result.length - inputValue.length;\n\n if (shiftStep > 0 && result[position] !== ',') {\n backspaceShift = true;\n let _shift = 0;\n do {\n this._shift.add(position + _shift);\n _shift++;\n } while (_shift < shiftStep);\n } else if (\n (commaShift !== 0 &&\n position > 0 &&\n !(result.indexOf(',') >= position && position > 3)) ||\n (!(result.indexOf('.') >= position && position > 3) && shiftStep <= 0)\n ) {\n this._shift.clear();\n backspaceShift = true;\n shift = shiftStep;\n // eslint-disable-next-line no-param-reassign\n position += shiftStep;\n this._shift.add(position);\n } else {\n this._shift.clear();\n }\n } else {\n for (\n // eslint-disable-next-line\n let i: number = 0, inputSymbol: string = inputArray[0]!;\n i < inputArray.length;\n i++, inputSymbol = inputArray[i] ?? ''\n ) {\n if (cursor === maskExpression.length) {\n break;\n }\n if (\n this._checkSymbolMask(inputSymbol, maskExpression[cursor] ?? '') &&\n maskExpression[cursor + 1] === '?'\n ) {\n result += inputSymbol;\n cursor += 2;\n } else if (\n maskExpression[cursor + 1] === '*' &&\n multi &&\n this._checkSymbolMask(inputSymbol, maskExpression[cursor + 2] ?? '')\n ) {\n result += inputSymbol;\n cursor += 3;\n multi = false;\n } else if (\n this._checkSymbolMask(inputSymbol, maskExpression[cursor] ?? '') &&\n maskExpression[cursor + 1] === '*'\n ) {\n result += inputSymbol;\n multi = true;\n } else if (\n maskExpression[cursor + 1] === '?' &&\n this._checkSymbolMask(inputSymbol, maskExpression[cursor + 2] ?? '')\n ) {\n result += inputSymbol;\n cursor += 3;\n } else if (this._checkSymbolMask(inputSymbol, maskExpression[cursor] ?? '')) {\n if (maskExpression[cursor] === 'H') {\n if (Number(inputSymbol) > 2) {\n // eslint-disable-next-line no-param-reassign\n position = position + 1;\n cursor += 1;\n this._shiftStep(maskExpression, cursor, inputArray.length);\n i--;\n if (this.leadZeroDateTime) {\n result += '0';\n }\n continue;\n }\n }\n if (maskExpression[cursor] === 'h') {\n if (\n (result === '2' && Number(inputSymbol) > 3) ||\n ((result.slice(cursor - 2, cursor) === '2' ||\n result.slice(cursor - 3, cursor) === '2' ||\n result.slice(cursor - 4, cursor) === '2' ||\n result.slice(cursor - 1, cursor) === '2') &&\n Number(inputSymbol) > 3 &&\n cursor > 10)\n ) {\n // eslint-disable-next-line no-param-reassign\n position = position + 1;\n cursor += 1;\n i--;\n continue;\n }\n }\n if (maskExpression[cursor] === 'm' || maskExpression[cursor] === 's') {\n if (Number(inputSymbol) > 5) {\n // eslint-disable-next-line no-param-reassign\n position = position + 1;\n cursor += 1;\n this._shiftStep(maskExpression, cursor, inputArray.length);\n i--;\n if (this.leadZeroDateTime) {\n result += '0';\n }\n continue;\n }\n }\n const daysCount = 31;\n const inputValueCursor = inputValue[cursor] as string;\n const inputValueCursorPlusOne = inputValue[cursor + 1] as string;\n const inputValueCursorPlusTwo = inputValue[cursor + 2] as string;\n const inputValueCursorMinusOne = inputValue[cursor - 1] as string;\n const inputValueCursorMinusTwo = inputValue[cursor - 2] as string;\n const inputValueCursorMinusThree = inputValue[cursor - 3] as string;\n const inputValueSliceMinusThreeMinusOne = inputValue.slice(\n cursor - 3,\n cursor - 1\n );\n const inputValueSliceMinusOnePlusOne = inputValue.slice(cursor - 1, cursor + 1);\n const inputValueSliceCursorPlusTwo = inputValue.slice(cursor, cursor + 2);\n const inputValueSliceMinusTwoCursor = inputValue.slice(cursor - 2, cursor);\n if (maskExpression[cursor] === 'd') {\n const maskStartWithMonth = maskExpression.slice(0, 2) === 'M0';\n const startWithMonthInput: boolean =\n maskExpression.slice(0, 2) === 'M0' &&\n this.specialCharacters.includes(inputValueCursorMinusTwo);\n if (\n (Number(inputSymbol) > 3 && this.leadZeroDateTime) ||\n (!maskStartWithMonth &&\n (Number(inputValueSliceCursorPlusTwo) > daysCount ||\n Number(inputValueSliceMinusOnePlusOne) > daysCount ||\n this.specialCharacters.includes(inputValueCursorPlusOne))) ||\n (startWithMonthInput\n ? Number(inputValueSliceMinusOnePlusOne) > daysCount ||\n (!this.specialCharacters.includes(inputValueCursor) &&\n this.specialCharacters.includes(inputValueCursorPlusTwo)) ||\n this.specialCharacters.includes(inputValueCursor)\n : Number(inputValueSliceCursorPlusTwo) > daysCount ||\n this.specialCharacters.includes(inputValueCursorPlusOne))\n ) {\n // eslint-disable-next-line no-param-reassign\n position = position + 1;\n cursor += 1;\n this._shiftStep(maskExpression, cursor, inputArray.length);\n i--;\n if (this.leadZeroDateTime) {\n result += '0';\n }\n continue;\n }\n }\n if (maskExpression[cursor] === 'M') {\n const monthsCount = 12;\n // mask without day\n const withoutDays: boolean =\n cursor === 0 &&\n (Number(inputSymbol) > 2 ||\n Number(inputValueSliceCursorPlusTwo) > monthsCount ||\n this.specialCharacters.includes(inputValueCursorPlusOne));\n // day<10 && month<12 for input\n const specialChart = maskExpression.slice(cursor + 2, cursor + 3);\n const day1monthInput: boolean =\n inputValueSliceMinusThreeMinusOne.includes(specialChart) &&\n ((this.specialCharacters.includes(inputValueCursorMinusTwo) &&\n Number(inputValueSliceMinusOnePlusOne) > monthsCount &&\n !this.specialCharacters.includes(inputValueCursor)) ||\n this.specialCharacters.includes(inputValueCursor) ||\n (this.specialCharacters.includes(inputValueCursorMinusThree) &&\n Number(inputValueSliceMinusTwoCursor) > monthsCount &&\n !this.specialCharacters.includes(inputValueCursorMinusOne)) ||\n this.specialCharacters.includes(inputValueCursorMinusOne));\n // month<12 && day<10 for input\n const day2monthInput: boolean =\n Number(inputValueSliceMinusThreeMinusOne) <= daysCount &&\n !this.specialCharacters.includes(\n inputValueSliceMinusThreeMinusOne as string\n ) &&\n this.specialCharacters.includes(inputValueCursorMinusOne) &&\n (Number(inputValueSliceCursorPlusTwo) > monthsCount ||\n this.specialCharacters.includes(inputValueCursorPlusOne));\n // cursor === 5 && without days\n const day2monthInputDot: boolean =\n (Number(inputValueSliceCursorPlusTwo) > monthsCount && cursor === 5) ||\n (this.specialCharacters.includes(inputValueCursorPlusOne) &&\n cursor === 5);\n // // day<10 && month<12 for paste whole data\n const day1monthPaste: boolean =\n Number(inputValueSliceMinusThreeMinusOne) > daysCount &&\n !this.specialCharacters.includes(\n inputValueSliceMinusThreeMinusOne as string\n ) &&\n !this.specialCharacters.includes(\n inputValueSliceMinusTwoCursor as string\n ) &&\n Number(inputValueSliceMinusTwoCursor) > monthsCount;\n // 10<day<31 && month<12 for paste whole data\n const day2monthPaste: boolean =\n Number(inputValueSliceMinusThreeMinusOne) <= daysCount &&\n !this.specialCharacters.includes(\n inputValueSliceMinusThreeMinusOne as string\n ) &&\n !this.specialCharacters.includes(inputValueCursorMinusOne) &&\n Number(inputValueSliceMinusOnePlusOne) > monthsCount;\n if (\n (Number(inputSymbol) > 1 && this.leadZeroDateTime) ||\n withoutDays ||\n day1monthInput ||\n day2monthPaste ||\n day1monthPaste ||\n day2monthInput ||\n day2monthInputDot\n ) {\n // eslint-disable-next-line no-param-reassign\n position = position + 1;\n cursor += 1;\n this._shiftStep(maskExpression, cursor, inputArray.length);\n i--;\n if (this.leadZeroDateTime) {\n result += '0';\n }\n continue;\n }\n }\n result += inputSymbol;\n cursor++;\n } else if (inputSymbol === ' ' && maskExpression[cursor] === ' ') {\n result += inputSymbol;\n cursor++;\n } else if (this.specialCharacters.indexOf(maskExpression[cursor] ?? '') !== -1) {\n result += maskExpression[cursor];\n cursor++;\n this._shiftStep(maskExpression, cursor, inputArray.length);\n i--;\n } else if (maskExpression[cursor] === '9' && this.showMaskTyped) {\n this._shiftStep(maskExpression, cursor, inputArray.length);\n } else if (\n this.specialCharacters.indexOf(inputSymbol) > -1 &&\n this.patterns[maskExpression[cursor] ?? ''] &&\n this.patterns[maskExpression[cursor] ?? '']?.optional\n ) {\n if (\n !!inputArray[cursor] &&\n maskExpression !== '099.099.099.099' &&\n maskExpression !== '000.000.000-00' &&\n maskExpression !== '00.000.000/0000-00' &&\n !maskExpression.match(/^9+\\.0+$/)\n ) {\n result += inputArray[cursor];\n }\n cursor++;\n i--;\n } else if (\n this.maskExpression[cursor + 1] === '*' &&\n this._findSpecialChar(this.maskExpression[cursor + 2] ?? '') &&\n this._findSpecialChar(inputSymbol) === this.maskExpression[cursor + 2] &&\n multi\n ) {\n cursor += 3;\n result += inputSymbol;\n } else if (\n this.maskExpression[cursor + 1] === '?' &&\n this._findSpecialChar(this.maskExpression[cursor + 2] ?? '') &&\n this._findSpecialChar(inputSymbol) === this.maskExpression[cursor + 2] &&\n multi\n ) {\n cursor += 3;\n result += inputSymbol;\n } else if (\n this.showMaskTyped &&\n this.specialCharacters.indexOf(inputSymbol) < 0 &&\n inputSymbol !== this.placeHolderCharacter\n ) {\n stepBack = true;\n }\n }\n }\n if (\n result.length + 1 === maskExpression.length &&\n this.specialCharacters.indexOf(maskExpression[maskExpression.length - 1] ?? '') !== -1\n ) {\n result += maskExpression[maskExpression.length - 1];\n }\n let newPosition: number = position + 1;\n\n while (this._shift.has(newPosition)) {\n shift++;\n newPosition++;\n }\n\n let actualShift: number =\n justPasted && !maskExpression.startsWith('separator')\n ? cursor\n : this._shift.has(position)\n ? shift\n : 0;\n if (stepBack) {\n actualShift--;\n }\n\n cb(actualShift, backspaceShift);\n if (shift < 0) {\n this._shift.clear();\n }\n let onlySpecial = false;\n if (backspaced) {\n onlySpecial = inputArray.every((char) => this.specialCharacters.includes(char));\n }\n let res = `${this.prefix}${onlySpecial ? '' : result}${this.suffix}`;\n if (result.length === 0) {\n res = `${this.prefix}${result}`;\n }\n return res;\n }\n\n public _findSpecialChar(inputSymbol: string): undefined | string {\n return this.specialCharacters.find((val: string) => val === inputSymbol);\n }\n\n protected _checkSymbolMask(inputSymbol: string, maskSymbol: string): boolean {\n this.patterns = this.customPattern ? this.customPattern : this.patterns;\n return (\n (this.patterns[maskSymbol]?.pattern &&\n this.patterns[maskSymbol]?.pattern.test(inputSymbol)) ??\n false\n );\n }\n\n private _formatWithSeparators = (\n str: string,\n thousandSeparatorChar: string,\n decimalChars: string | string[],\n precision: number\n ) => {\n let x: string[] = [];\n let decimalChar = '';\n if (Array.isArray(decimalChars)) {\n const regExp = new RegExp(\n decimalChars.map((v) => ('[\\\\^$.|?*+()'.indexOf(v) >= 0 ? `\\\\${v}` : v)).join('|')\n );\n x = str.split(regExp);\n decimalChar = str.match(regExp)?.[0] ?? '';\n } else {\n x = str.split(decimalChars);\n decimalChar = decimalChars;\n }\n const decimals: string = x.length > 1 ? `${decimalChar}${x[1]}` : '';\n let res: string = x[0] ?? '';\n const separatorLimit: string = this.separatorLimit.replace(/\\s/g, '');\n if (separatorLimit && +separatorLimit) {\n if (res[0] === '-') {\n res = `-${res.slice(1, res.length).slice(0, separatorLimit.length)}`;\n } else {\n res = res.slice(0, separatorLimit.length);\n }\n }\n const rgx = /(\\d+)(\\d{3})/;\n\n while (thousandSeparatorChar && rgx.test(res)) {\n res = res.replace(rgx, '$1' + thousandSeparatorChar + '$2');\n }\n\n if (precision === undefined) {\n return res + decimals;\n } else if (precision === 0) {\n return res;\n }\n return res + decimals.substring(0, precision + 1);\n };\n\n private percentage = (str: string): boolean => {\n return Number(str) >= 0 && Number(str) <= 100;\n };\n\n private getPrecision = (maskExpression: string): number => {\n const x: string[] = maskExpression.split('.');\n if (x.length > 1) {\n return Number(x[x.length - 1]);\n }\n\n return Infinity;\n };\n\n private checkAndRemoveSuffix = (inputValue: string): string => {\n for (let i = this.suffix?.length - 1; i >= 0; i--) {\n const substr = this.suffix.substring(i, this.suffix?.length);\n if (\n inputValue.includes(substr) &&\n i !== this.suffix?.length - 1 &&\n (i - 1 < 0 ||\n !inputValue.includes(this.suffix.substring(i - 1, this.suffix?.length)))\n ) {\n return inputValue.replace(substr, '');\n }\n }\n return inputValue;\n };\n\n private checkInputPrecision = (\n inputValue: string,\n precision: number,\n decimalMarker: IConfig['decimalMarker']\n ): string => {\n if (precision < Infinity) {\n // TODO need think about decimalMarker\n if (Array.isArray(decimalMarker)) {\n const marker = decimalMarker.find((dm) => dm !== this.thousandSeparator);\n // eslint-disable-next-line no-param-reassign\n decimalMarker = marker ? marker : decimalMarker[0];\n }\n const precisionRegEx = new RegExp(\n this._charToRegExpExpression(decimalMarker) + `\\\\d{${precision}}.*$`\n );\n\n const precisionMatch: RegExpMatchArray | null = inputValue.match(precisionRegEx);\n const precisionMatchLength: number = (precisionMatch && precisionMatch[0]?.length) ?? 0;\n if (precisionMatchLength - 1 > precision) {\n const diff = precisionMatchLength - 1 - precision;\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue.substring(0, inputValue.length - diff);\n }\n if (\n precision === 0 &&\n this._compareOrIncludes(\n inputValue[inputValue.length - 1],\n decimalMarker,\n this.thousandSeparator\n )\n ) {\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue.substring(0, inputValue.length - 1);\n }\n }\n return inputValue;\n };\n\n private _stripToDecimal(str: string): string {\n return str\n .split('')\n .filter((i: string, idx: number) => {\n const isDecimalMarker =\n typeof this.decimalMarker === 'string'\n ? i === this.decimalMarker\n : // TODO (inepipenko) use utility type\n this.decimalMarker.includes(i as ',' | '.');\n return (\n i.match('^-?\\\\d') ||\n i === this.thousandSeparator ||\n isDecimalMarker ||\n (i === '-' && idx === 0 && this.allowNegativeNumbers)\n );\n })\n .join('');\n }\n\n private _charToRegExpExpression(char: string): string {\n // if (Array.isArray(char)) {\n // \treturn char.map((v) => ('[\\\\^$.|?*+()'.indexOf(v) >= 0 ? `\\\\${v}` : v)).join('|');\n // }\n if (char) {\n const charsToEscape = '[\\\\^$.|?*+()';\n return char === ' ' ? '\\\\s' : charsToEscape.indexOf(char) >= 0 ? `\\\\${char}` : char;\n }\n return char;\n }\n\n private _shiftStep(maskExpression: string, cursor: number, inputLength: number) {\n const shiftStep: number = /[*?]/g.test(maskExpression.slice(0, cursor))\n ? inputLength\n : cursor;\n this._shift.add(shiftStep + this.prefix.length || 0);\n }\n\n protected _compareOrIncludes<T>(value: T, comparedValue: T | T[], excludedValue: T): boolean {\n return Array.isArray(comparedValue)\n ? comparedValue.filter((v) => v !== excludedValue).includes(value)\n : value === comparedValue;\n }\n\n private _validIP(valuesIP: string[]): boolean {\n return !(\n valuesIP.length === 4 &&\n !valuesIP.some((value: string, index: number) => {\n if (valuesIP.length !== index + 1) {\n return value === '' || Number(value) > 255;\n }\n return value === '' || Number(value.substring(0, 3)) > 255;\n })\n );\n }\n}\n","import { ElementRef, inject, Injectable, Renderer2 } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\nimport { NGX_MASK_CONFIG, IConfig } from './ngx-mask.config';\nimport { NgxMaskApplierService } from './ngx-mask-applier.service';\n\n@Injectable()\nexport class NgxMaskService extends NgxMaskApplierService {\n public isNumberValue = false;\n\n public maskIsShown = '';\n\n public selStart: number | null = null;\n\n public selEnd: number | null = null;\n\n /**\n * Whether we are currently in writeValue function, in this case when applying the mask we don't want to trigger onChange function,\n * since writeValue should be a one way only process of writing the DOM value based on the Angular model value.\n */\n public writingValue = false;\n\n public maskChanged = false;\n\n public triggerOnMaskChange = false;\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any\n public onChange = (_: any) => {};\n\n private readonly document = inject(DOCUMENT);\n\n protected override _config = inject<IConfig>(NGX_MASK_CONFIG);\n\n private readonly _elementRef = inject(ElementRef, { optional: true });\n\n private readonly _renderer = inject(Renderer2, { optional: true });\n\n // eslint-disable-next-line complexity\n public override applyMask(\n inputValue: string,\n maskExpression: string,\n position = 0,\n justPasted = false,\n backspaced = false,\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any\n cb: (...args: any[]) => any = () => {}\n ): string {\n if (!maskExpression) {\n return inputValue !== this.actualValue ? this.actualValue : inputValue;\n }\n this.maskIsShown = this.showMaskTyped ? this.showMaskInInput() : '';\n if (this.maskExpression === 'IP' && this.showMaskTyped) {\n this.maskIsShown = this.showMaskInInput(inputValue || '#');\n }\n if (this.maskExpression === 'CPF_CNPJ' && this.showMaskTyped) {\n this.maskIsShown = this.showMaskInInput(inputValue || '#');\n }\n if (!inputValue && this.showMaskTyped) {\n this.formControlResult(this.prefix);\n return this.prefix + this.maskIsShown;\n }\n const getSymbol: string =\n !!inputValue && typeof this.selStart === 'number'\n ? inputValue[this.selStart] ?? ''\n : '';\n let newInputValue = '';\n if (this.hiddenInput !== undefined && !this.writingValue) {\n let actualResult: string[] = this.actualValue.split('');\n // eslint-disable @typescript-eslint/no-unused-expressions\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n inputValue !== '' && actualResult.length\n ? typeof this.selStart === 'number' && typeof this.selEnd === 'number'\n ? inputValue.length > actualResult.length\n ? actualResult.splice(this.selStart, 0, getSymbol)\n : inputValue.length < actualResult.length\n ? actualResult.length - inputValue.length === 1\n ? actualResult.splice(this.selStart - 1, 1)\n : actualResult.splice(this.selStart, this.selEnd - this.selStart)\n : null\n : null\n : (actualResult = []);\n if (this.showMaskTyped) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this.removeMask(inputValue);\n }\n // eslint-enable @typescript-eslint/no-unused-expressions\n newInputValue =\n this.actualValue.length && actualResult.length <= inputValue.length\n ? this.shiftTypedSymbols(actualResult.join(''))\n : inputValue;\n }\n\n if (this.showMaskTyped) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this.removeMask(inputValue);\n }\n\n newInputValue = Boolean(newInputValue) && newInputValue.length ? newInputValue : inputValue;\n\n const result: string = super.applyMask(\n newInputValue,\n maskExpression,\n position,\n justPasted,\n backspaced,\n cb\n );\n this.actualValue = this.getActualValue(result);\n // handle some separator implications:\n // a.) adjust decimalMarker default (. -> ,) if thousandSeparator is a dot\n if (this.thousandSeparator === '.' && this.decimalMarker === '.') {\n this.decimalMarker = ',';\n }\n\n // b) remove decimal marker from list of special characters to mask\n if (this.maskExpression.startsWith('separator') && this.dropSpecialCharacters === true) {\n this.specialCharacters = this.specialCharacters.filter(\n (item: string) =>\n !this._compareOrIncludes(item, this.decimalMarker, this.thousandSeparator) //item !== this.decimalMarker, // !\n );\n }\n this.formControlResult(result);\n if (!this.showMaskTyped) {\n if (this.hiddenInput) {\n return result && result.length\n ? this.hideInput(result, this.maskExpression)\n : result;\n }\n return result;\n }\n const resLen: number = result.length;\n const prefNmask: string = this.prefix + this.maskIsShown;\n\n if (this.maskExpression.includes('H')) {\n const countSkipedSymbol = this._numberSkipedSymbols(result);\n return result + prefNmask.slice(resLen + countSkipedSymbol);\n } else if (this.maskExpression === 'IP' || this.maskExpression === 'CPF_CNPJ') {\n return result + prefNmask;\n }\n return result + prefNmask.slice(resLen);\n }\n\n // get the number of characters that were shifted\n private _numberSkipedSymbols(value: string): number {\n const regex = /(^|\\D)(\\d\\D)/g;\n let match = regex.exec(value);\n let countSkipedSymbol = 0;\n while (match != null) {\n countSkipedSymbol += 1;\n match = regex.exec(value);\n }\n return countSkipedSymbol;\n }\n\n public applyValueChanges(\n position: number,\n justPasted: boolean,\n backspaced: boolean,\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any\n cb: (...args: any[]) => any = () => {}\n ): void {\n const formElement = this._elementRef?.nativeElement;\n if (!formElement) {\n return;\n }\n formElement.value = this.applyMask(\n formElement.value,\n this.maskExpression,\n position,\n justPasted,\n backspaced,\n cb\n );\n if (formElement === this._getActiveElement()) {\n return;\n }\n this.clearIfNotMatchFn();\n }\n\n public hideInput(inputValue: string, maskExpression: string): string {\n return inputValue\n .split('')\n .map((curr: string, index: number) => {\n if (\n this.patterns &&\n this.patterns[maskExpression[index] ?? ''] &&\n this.patterns[maskExpression[index] ?? '']?.symbol\n ) {\n return this.patterns[maskExpression[index] ?? '']?.symbol;\n }\n return curr;\n })\n .join('');\n }\n\n // this function is not necessary, it checks result against maskExpression\n public getActualValue(res: string): string {\n const compare: string[] = res.split('').filter((symbol: string, i: number) => {\n const maskChar = this.maskExpression[i] ?? '';\n return (\n this._checkSymbolMask(symbol, maskChar) ||\n (this.specialCharacters.includes(maskChar) && symbol === maskChar)\n );\n });\n if (compare.join('') === res) {\n return compare.join('');\n }\n return res;\n }\n\n public shiftTypedSymbols(inputValue: string): string {\n let symbolToReplace = '';\n const newInputValue: (string | undefined)[] =\n (inputValue &&\n inputValue.split('').map((currSymbol: string, index: number) => {\n if (\n this.specialCharacters.includes(inputValue[index + 1] ?? '') &&\n inputValue[index + 1] !== this.maskExpression[index + 1]\n ) {\n symbolToReplace = currSymbol;\n return inputValue[index + 1];\n }\n if (symbolToReplace.length) {\n const replaceSymbol: string = symbolToReplace;\n symbolToReplace = '';\n return replaceSymbol;\n }\n return currSymbol;\n })) ||\n [];\n return newInputValue.join('');\n }\n\n /**\n * Convert number value to string\n * 3.1415 -> '3.1415'\n * 1e-7 -> '0.0000001'\n */\n public numberToString(value: number | string): string {\n if (!value && value !== 0) {\n return String(value);\n }\n return Number(value).toLocaleString('fullwide', {\n useGrouping: false,\n maximumFractionDigits: 20,\n });\n }\n\n public showMaskInInput(inputVal?: string): string {\n if (this.showMaskTyped && !!this.shownMaskExpression) {\n if (this.maskExpression.length !== this.shownMaskExpression.length) {\n throw new Error('Mask expression must match mask placeholder length');\n } else {\n return this.shownMaskExpression;\n }\n } else if (this.showMaskTyped) {\n if (inputVal) {\n if (this.maskExpression === 'IP') {\n return this._checkForIp(inputVal);\n }\n if (this.maskExpression === 'CPF_CNPJ') {\n return this._checkForCpfCnpj(inputVal);\n }\n }\n return this.maskExpression.replace(/\\w/g, this.placeHolderCharacter);\n }\n return '';\n }\n\n public clearIfNotMatchFn(): void {\n const formElement = this._elementRef?.nativeElement;\n if (!formElement) {\n return;\n }\n if (\n this.clearIfNotMatch &&\n this.prefix.length + this.maskExpression.length + this.suffix.length !==\n formElement.value.replace(/_/g, '').length\n ) {\n this.formElementProperty = ['value', ''];\n this.applyMask(formElement.value, this.maskExpression);\n }\n }\n\n public set formElementProperty([name, value]: [string, string | boolean]) {\n if (!this._renderer || !this._elementRef) {\n return;\n }\n Promise.resolve().then(() =>\n this._renderer?.setProperty(this._elementRef?.nativeElement, name, value)\n );\n }\n\n public checkSpecialCharAmount(mask: string): number {\n const chars: string[] = mask\n .split('')\n .filter((item: string) => this._findSpecialChar(item));\n return chars.length;\n }\n\n public removeMask(inputValue: string): string {\n return this._removeMask(\n this._removeSuffix(this._removePrefix(inputValue)),\n this.specialCharacters.concat('_').concat(this.placeHolderCharacter)\n );\n }\n\n private _checkForIp(inputVal: string): string {\n if (inputVal === '#') {\n return `${this.placeHolderCharacter}.${this.placeHolderCharacter}.${this.placeHolderCharacter}.${this.placeHolderCharacter}`;\n }\n const arr: string[] = [];\n for (let i = 0; i < inputVal.length; i++) {\n const value = inputVal[i] ?? '';\n if (!value) {\n continue;\n }\n if (value.match('\\\\d')) {\n arr.push(value);\n }\n }\n if (arr.length <= 3) {\n return `${this.placeHolderCharacter}.${this.placeHolderCharacter}.${this.placeHolderCharacter}`;\n }\n if (arr.length > 3 && arr.length <= 6) {\n return `${this.placeHolderCharacter}.${this.placeHolderCharacter}`;\n }\n if (arr.length > 6 && arr.length <= 9) {\n return this.placeHolderCharacter;\n }\n if (arr.length > 9 && arr.length <= 12) {\n return '';\n }\n return '';\n }\n\n private _checkForCpfCnpj(inputVal: string): string {\n const cpf =\n `${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `.${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `.${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `-${this.placeHolderCharacter}${this.placeHolderCharacter}`;\n const cnpj =\n `${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `.${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `.${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `/${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `-${this.placeHolderCharacter}${this.placeHolderCharacter}`;\n\n if (inputVal === '#') {\n return cpf;\n }\n const arr: string[] = [];\n for (let i = 0; i < inputVal.length; i++) {\n const value = inputVal[i] ?? '';\n if (!value) {\n continue;\n }\n if (value.match('\\\\d')) {\n arr.push(value);\n }\n }\n if (arr.length <= 3) {\n return cpf.slice(arr.length, cpf.length);\n }\n if (arr.length > 3 && arr.length <= 6) {\n return cpf.slice(arr.length + 1, cpf.length);\n }\n if (arr.length > 6 && arr.length <= 9) {\n return cpf.slice(arr.length + 2, cpf.length);\n }\n if (arr.length > 9 && arr.length < 11) {\n return cpf.slice(arr.length + 3, cpf.length);\n }\n if (arr.length === 11) {\n return '';\n }\n if (arr.length === 12) {\n if (inputVal.length === 17) {\n return cnpj.slice(16, cnpj.length);\n }\n return cnpj.slice(15, cnpj.length);\n }\n if (arr.length > 12 && arr.length <= 14) {\n return cnpj.slice(arr.length + 4, cnpj.length);\n }\n return '';\n }\n\n /**\n * Recursively determine the current active element by navigating the Shadow DOM until the Active Element is found.\n */\n private _getActiveElement(document: DocumentOrShadowRoot = this.document): Element | null {\n const shadowRootEl = document?.activeElement?.shadowRoot;\n if (!shadowRootEl?.activeElement) {\n return document.activeElement;\n } else {\n return this._getActiveElement(shadowRootEl);\n }\n }\n\n /**\n * Propogates the input value back to the Angular model by triggering the onChange function. It won't do this if writingValue\n * is true. If that is true it means we are currently in the writeValue function, which is supposed to only update the actual\n * DOM element based on the Angular model value. It should be a one way process, i.e. writeValue should not be modifying the Angular\n * model value too. Therefore, we don't trigger onChange in this scenario.\n * @param inputValue the current form input value\n */\n private formControlResult(inputValue: string): void {\n if (this.writingValue || (!this.triggerOnMaskChange && this.maskChanged)) {\n this.maskChanged = false;\n return;\n }\n if (Array.isArray(this.dropSpecialCharacters)) {\n this.onChange(\n this._toNumber(\n this._checkSymbols(\n this._removeMask(\n this._removeSuffix(this._removePrefix(inputValue)),\n this.dropSpecialCharacters\n )\n )\n )\n );\n } else if (this.dropSpecialCharacters) {\n this.onChange(\n this._toNumber(\n this._checkSymbols(this._removeSuffix(this._removePrefix(inputValue)))\n )\n );\n } else {\n this.onChange(this._toNumber(inputValue));\n }\n }\n\n private _toNumber(value: string | number | undefined | null) {\n if (!this.isNumberValue || value === '') {\n return value;\n }\n const num = Number(value);\n return Number.isNaN(num) ? value : num;\n }\n\n private _removeMask(value: string, specialCharactersForRemove: string[]): string {\n if (this.maskExpression.startsWith('percent') && value.includes('.')) {\n return value;\n }\n return value ? value.replace(this._regExpForRemove(specialCharactersForRemove), '') : value;\n }\n\n private _removePrefix(value: string): string {\n if (!this.prefix) {\n return value;\n }\n return value ? value.replace(this.prefix, '') : value;\n }\n\n private _removeSuffix(value: string): string {\n if (!this.suffix) {\n return value;\n }\n return value ? value.replace(this.suffix, '') : value;\n }\n\n private _retrieveSeparatorValue(result: string): string {\n const specialCharacters = Array.isArray(this.dropSpecialCharacters)\n ? this.specialCharacters.filter((v) => {\n return (this.dropSpecialCharacters as string[]).includes(v);\n })\n : this.specialCharacters;\n return this._removeMask(result, specialCharacters);\n }\n\n private _regExpForRemove(specialCharactersForRemove: string[]): RegExp {\n return new RegExp(\n specialCharactersForRemove.map((item: string) => `\\\\${item}`).join('|'),\n 'gi'\n );\n }\n\n private _replaceDecimalMarkerToDot(value: string): string {\n const markers = Array.isArray(this.decimalMarker)\n ? this.decimalMarker\n : [this.decimalMarker];\n\n return value.replace(this._regExpForRemove(markers), '.');\n }\n\n private _checkSymbols(result: string): string | number | undefined | null {\n if (result === '') {\n return result;\n }\n\n const separatorPrecision: number | null = this._retrieveSeparatorPrecision(\n this.maskExpression\n );\n const separatorValue: string = this._replaceDecimalMarkerToDot(\n this._retrieveSeparatorValue(result)\n );\n\n if (!this.isNumberValue) {\n return separatorValue;\n }\n if (separatorPrecision) {\n if (result === this.decimalMarker) {\n return null;\n }\n return this._checkPrecision(this.maskExpression, separatorValue);\n } else {\n return separatorValue;\n }\n }\n\n // TODO should think about helpers or separting decimal precision to own property\n private _retrieveSeparatorPrecision(maskExpretion: string): number | null {\n const matcher: RegExpMatchArray | null = maskExpretion.match(\n new RegExp(`^separator\\\\.([^d]*)`)\n );\n return matcher ? Number(matcher[1]) : null;\n }\n\n private _checkPrecision(separatorExpression: string, separatorValue: string): number | string {\n if (separatorExpression.indexOf('2') > 0) {\n return Number(separatorValue).toFixed(2);\n }\n return Number(separatorValue);\n }\n}\n","import { EnvironmentProviders, inject, makeEnvironmentProviders, Provider } from '@angular/core';\n\nimport {\n NGX_MASK_CONFIG,\n INITIAL_CONFIG,\n initialConfig,\n NEW_CONFIG,\n optionsConfig,\n} from './ngx-mask.config';\nimport { NgxMaskService } from './ngx-mask.service';\n\n/**\n * @internal\n */\nfunction _configFactory(): optionsConfig {\n const initConfig = inject<optionsConfig>(INITIAL_CONFIG);\n const configValue = inject<optionsConfig | (() => optionsConfig)>(NEW_CONFIG);\n\n return configValue instanceof Function\n ? { ...initConfig, ...configValue() }\n : { ...initConfig, ...configValue };\n}\n\nexport function provideNgxMask(configValue?: optionsConfig | (() => optionsConfig)): Provider[] {\n return [\n {\n provide: NEW_CONFIG,\n useValue: configValue,\n },\n {\n provide: INITIAL_CONFIG,\n useValue: initialConfig,\n },\n {\n provide: NGX_MASK_CONFIG,\n useFactory: _configFactory,\n },\n NgxMaskService,\n ];\n}\n\nexport function provideEnvironmentNgxMask(\n configValue?: optionsConfig | (() => optionsConfig)\n): EnvironmentProviders {\n return makeEnvironmentProviders(provideNgxMask(configValue));\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n Directive,\n EventEmitter,\n HostListener,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n inject,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n FormControl,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\n\nimport { CustomKeyboardEvent } from './custom-keyboard-event';\nimport { IConfig, NGX_MASK_CONFIG, timeMasks, withoutValidation } from './ngx-mask.config';\nimport { NgxMaskService } from './ngx-mask.service';\n\n@Directive({\n selector: 'input[mask], textarea[mask]',\n standalone: true,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: NgxMaskDirective,\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: NgxMaskDirective,\n multi: true,\n },\n NgxMaskService,\n ],\n exportAs: 'mask,ngxMask',\n})\nexport class NgxMaskDirective implements ControlValueAccessor, OnChanges, Validator {\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input('mask') public maskExpression: string | undefined | null = '';\n\n @Input() public specialCharacters: IConfig['specialCharacters'] = [];\n\n @Input() public patterns: IConfig['patterns'] = {};\n\n @Input() public prefix: IConfig['prefix'] = '';\n\n @Input() public suffix: IConfig['suffix'] = '';\n\n @Input() public thousandSeparator: IConfig['thousandSeparator'] = ' ';\n\n @Input() public decimalMarker: IConfig['decimalMarker'] = '.';\n\n @Input() public dropSpecialCharacters: IConfig['dropSpecialCharacters'] | null = null;\n\n @Input() public hiddenInput: IConfig['hiddenInput'] | null = null;\n\n @Input() public showMaskTyped: IConfig['showMaskTyped'] | null = null;\n\n @Input() public placeHolderCharacter: IConfig['placeHolderCharacter'] | null = null;\n\n @Input() public shownMaskExpression: IConfig['shownMaskExpression'] | null = null;\n\n @Input() public showTemplate: IConfig['showTemplate'] | null = null;\n\n @Input() public clearIfNotMatch: IConfig['clearIfNotMatch'] | null = null;\n\n @Input() public validation: IConfig['validation'] | null = null;\n\n @Input() public separatorLimit: IConfig['separatorLimit'] | null = null;\n\n @Input() public allowNegativeNumbers: IConfig['allowNegativeNumbers'] | null = null;\n\n @Input() public leadZeroDateTime: IConfig['leadZeroDateTime'] | null = null;\n\n @Input() public triggerOnMaskChange: IConfig['triggerOnMaskChange'] | null = null;\n\n @Output() public maskFilled: IConfig['maskFilled'] = new EventEmitter<void>();\n\n private _maskValue = '';\n\n private _inputValue!: string;\n\n private _position: number | null = null;\n\n private _start!: number;\n\n private _end!: number;\n\n private _code!: string;\n\n private _maskExpressionArray: string[] = [];\n\n private _justPasted = false;\n\n /**For IME composition event */\n private _isComposing = false;\n\n private readonly document = inject(DOCUMENT);\n\n public _maskService = inject(NgxMaskService, { self: true });\n\n protected _config = inject<IConfig>(NGX_MASK_CONFIG);\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any\n public onChange = (_: any) => {};\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n public onTouch = () => {};\n\n public ngOnChanges(changes: SimpleChanges): void {\n const {\n maskExpression,\n specialCharacters,\n patterns,\n prefix,\n suffix,\n thousandSeparator,\n decimalMarker,\n dropSpecialCharacters,\n hiddenInput,\n showMaskTyped,\n placeHolderCharacter,\n shownMaskExpression,\n showTemplate,\n clearIfNotMatch,\n validation,\n separatorLimit,\n allowNegativeNumbers,\n leadZeroDateTime,\n triggerOnMaskChange,\n } = changes;\n if (maskExpression) {\n if (\n maskExpression.currentValue !== maskExpression.previousValue &&\n !maskExpression.firstChange\n ) {\n this._maskService.maskChanged = true;\n }\n if (allowNegativeNumbers) {\n this._maskService.allowNegativeNumbers = allowNegativeNumbers.currentValue;\n if (this._maskService.allowNegativeNumbers) {\n this._maskService.specialCharacters =\n this._maskService.specialCharacters.filter((c: string) => c !== '-');\n }\n }\n if (maskExpression.currentValue && maskExpression.currentValue.split('||').length > 1) {\n this._maskExpressionArray = maskExpression.currentValue\n .split('||')\n .sort((a: string, b: string) => {\n return a.length - b.length;\n });\n this._setMask();\n } else {\n this._maskExpressionArray = [];\n this._maskValue = maskExpression.currentValue || '';\n this._maskService.maskExpression = this._maskValue;\n }\n }\n if (specialCharacters) {\n if (!specialCharacters.currentValue || !Array.isArray(specialCharacters.currentValue)) {\n return;\n } else {\n this._maskService.specialCharacters = specialCharacters.currentValue || [];\n }\n }\n // Only overwrite the mask available patterns if a pattern has actually been passed in\n if (patterns && patterns.currentValue) {\n this._maskService.patterns = patterns.currentValue;\n }\n if (prefix) {\n this._maskService.prefix = prefix.currentValue;\n }\n if (suffix) {\n this._maskService.suffix = suffix.currentValue;\n }\n if (thousandSeparator) {\n this._maskService.thousandSeparator = thousandSeparator.currentValue;\n }\n if (decimalMarker) {\n this._maskService.decimalMarker = decimalMarker.currentValue;\n }\n if (dropSpecialCharacters) {\n this._maskService.dropSpecialCharacters = dropSpecialCharacters.currentValue;\n }\n if (hiddenInput) {\n this._maskService.hiddenInput = hiddenInput.currentValue;\n }\n if (showMaskTyped) {\n this._maskService.showMaskTyped = showMaskTyped.currentValue;\n }\n if (placeHolderCharacter) {\n this._maskService.placeHolderCharacter = placeHolderCharacter.currentValue;\n }\n if (shownMaskExpression) {\n this._maskService.shownMaskExpression = shownMaskExpression.currentValue;\n }\n if (showTemplate) {\n this._maskService.showTemplate = showTemplate.currentValue;\n }\n if (clearIfNotMatch) {\n this._maskService.clearIfNotMatch = clearIfNotMatch.currentValue;\n }\n if (validation) {\n this._maskService.validation = validation.currentValue;\n }\n if (separatorLimit) {\n this._maskService.separatorLimit = separatorLimit.currentValue;\n }\n if (leadZeroDateTime) {\n this._maskService.leadZeroDateTime = leadZeroDateTime.currentValue;\n }\n if (triggerOnMaskChange) {\n this._maskService.triggerOnMaskChange = triggerOnMaskChange.currentValue;\n }\n\n this._applyMask();\n }\n\n // eslint-disable-next-line complexity\n public validate({ value }: FormControl): ValidationErrors | null {\n if (!this._maskService.validation || !this._maskValue) {\n return null;\n }\n if (this._maskService.ipError) {\n return this._createValidationError(value);\n }\n if (this._maskService.cpfCnpjError) {\n return this._createValidationError(value);\n }\n if (this._maskValue.startsWith('separator')) {\n return null;\n }\n if (withoutValidation.includes(this._maskValue)) {\n return null;\n }\n if (this._maskService.clearIfNotMatch) {\n return null;\n }\n if (timeMasks.includes(this._maskValue)) {\n return this._validateTime(value);\n }\n if (value && value.toString().length >= 1) {\n let counterOfOpt = 0;\n for (const key in this._maskService.patterns) {\n if (this._maskService.patterns[key]?.optional) {\n if (this._maskValue.indexOf(key) !== this._maskValue.lastIndexOf(key)) {\n const opt: string = this._maskValue\n .split('')\n .filter((i: string) => i === key)\n .join('');\n counterOfOpt += opt.length;\n } else if (this._maskValue.indexOf(key) !== -1) {\n counterOfOpt++;\n }\n if (\n this._maskValue.indexOf(key) !== -1 &&\n value.toString().length >= this._maskValue.indexOf(key)\n ) {\n return null;\n }\n if (counterOfOpt === this._maskValue.length) {\n return null;\n }\n }\n }\n if (\n this._maskValue.indexOf('{') === 1 &&\n value.toString().length ===\n this._maskValue.length +\n Number((this._maskValue.split('{')[1] ?? '').split('}')[0]) -\n 4\n ) {\n return null;\n }\n if (this._maskValue.indexOf('*') === 1 || this._maskValue.indexOf('?') === 1) {\n return null;\n } else if (\n (this._maskValue.indexOf('*') > 1 &&\n value.toString().length < this._maskValue.indexOf('*')) ||\n (this._maskValue.indexOf('?') > 1 &&\n value.toString().length < this._maskValue.indexOf('?')) ||\n this._maskValue.indexOf('{') === 1\n ) {\n return this._createValidationError(value);\n }\n if (this._maskValue.indexOf('*') === -1 || this._maskValue.indexOf('?') === -1) {\n const length: number = this._maskService.dropSpecialCharacters\n ? this._maskValue.length -\n this._maskService.checkSpecialCharAmount(this._maskValue) -\n counterOfOpt\n : this._maskValue.length - counterOfOpt;\n if (value.toString().length < length) {\n return this._createValidationError(value);\n }\n }\n }\n if (value) {\n this.maskFilled.emit();\n return null;\n }\n return null;\n }\n\n @HostListener('paste')\n public onPaste() {\n this._justPasted = true;\n }\n\n @HostListener('ngModelChange', ['$event'])\n public onModelChange(value: string | undefined | null | number): void {\n // on form reset we need to update the actualValue\n if (\n (value === '' || value === null || value === undefined) &&\n this._maskService.actualValue\n ) {\n this._maskService.actualValue = this._maskService.getActualValue('');\n }\n }\n\n @HostListener('input', ['$event'])\n public onInput(e: CustomKeyboardEvent): void {\n // If IME is composing text, we wait for the composed text.\n if (this._isComposing) return;\n\n const el: HTMLInputElement = e.target as HTMLInputElement;\n this._inputValue = el.value;\n\n this._setMask();\n\n if (!this._maskValue) {\n this.onChange(el.value);\n return;\n }\n let position: number =\n el.selectionStart === 1\n ? (el.selectionStart as number) + this._maskService.prefix.length\n : (el.selectionStart as number);\n\n let caretShift = 0;\n let backspaceShift = false;\n this._maskService.applyValueChanges(\n position,\n this._justPasted,\n this._code === 'Backspace' || this._code === 'Delete',\n (shift: number, _backspaceShift: boolean) => {\n this._justPasted = false;\n caretShift = shift;\n backspaceShift = _backspaceShift;\n }\n );\n // only set the selection if the element is active\n if (this._getActiveElement() !== el) {\n return;\n }\n\n // update position after applyValueChanges to prevent cursor on wrong position when it has an array of maskExpression\n if (this._maskExpressionArray.length) {\n position =\n el.selectionStart === 1\n ? (el.selectionStart as number) + this._maskService.prefix.length\n : (el.selectionStart as number);\n }\n\n this._position =\n this._position === 1 && this._inputValue.length === 1 ? null : this._position;\n\n let positionToApply: number = this._position\n ? this._inputValue.length + position + caretShift\n : position + (this._code === 'Backspace' && !backspaceShift ? 0 : caretShift);\n if (positionToApply > this._getActualInputLength()) {\n positionToApply = this._getActualInputLength();\n }\n if (positionToApply < 0) {\n positionToApply = 0;\n }\n el.setSelectionRange(positionToApply, positionToApply);\n this._position = null;\n }\n\n // IME starts\n @HostListener('compositionstart', ['$event'])\n public onCompositionStart(): void {\n this._isComposing = true;\n }\n\n // IME completes\n @HostListener('compositionend', ['$event'])\n public onCompositionEnd(e: CustomKeyboardEvent): void {\n this._isComposing = false;\n this._justPasted = true;\n this.onInput(e);\n }\n\n @HostListener('blur')\n public onBlur(): void {\n if (this._maskValue) {\n this._maskService.clearIfNotMatchFn();\n }\n this.onTouch();\n }\n\n @HostListener('click', ['$event'])\n public onClick(e: MouseEvent | CustomKeyboardEvent): void {\n if (!this._maskValue) {\n return;\n }\n const el: HTMLInputElement = e.target as HTMLInputElement;\n const posStart = 0;\n const posEnd = 0;\n if (\n el !== null &&\n el.selectionStart !== null &&\n el.selectionStart === el.selectionEnd &&\n el.selectionStart > this._maskService.prefix.length &&\n // eslint-disable-next-line\n (e as any).keyCode !== 38\n ) {\n if (this._maskService.showMaskTyped) {\n // We are showing the mask in the input\n this._maskService.maskIsShown = this._maskService.showMaskInInput();\n if (\n el.setSelectionRange &&\n this._maskService.prefix + this._maskService.maskIsShown === el.value\n ) {\n // the input ONLY contains the mask, so position the cursor at the start\n el.focus();\n el.setSelectionRange(posStart, posEnd);\n } else {\n // the input contains some characters already\n if (el.selectionStart > this._maskService.actualValue.length) {\n // if the user clicked beyond our value's length, position the cursor at the end of our value\n el.setSelectionRange(\n this._maskService.actualValue.length,\n this._maskService.actualValue.length\n );\n }\n }\n }\n }\n const nextValue: string | null =\n el &&\n (!el.value || el.value === this._maskService.prefix\n ? this._maskService.prefix + this._maskService.maskIsShown\n : el.value);\n /** Fix of cursor position jumping to end in most browsers no matter where cursor is inserted onFocus */\n if (el && el.value !== nextValue) {\n el.value = nextValue;\n }\n\n /** fix of cursor position with prefix when mouse click occur */\n if (\n el &&\n ((el.selectionStart as number) || (el.selectionEnd as number)) <=\n this._maskService.prefix.length\n ) {\n el.selectionStart = this._maskService.prefix.length;\n return;\n }\n /** select only inserted text */\n if (el && (el.selectionEnd as number) > this._getActualInputLength()) {\n el.selectionEnd = this._getActualInputLength();\n }\n }\n\n // eslint-disable-next-line complexity\n @HostListener('keydown', ['$event'])\n public onKeyDown(e: CustomKeyboardEvent): void {\n if (!this._maskValue) {\n return;\n }\n\n if (this._isComposing) {\n // User finalize their choice from IME composition, so trigger onInput() for the composed text.\n if (e.key === 'Enter') this.onCompositionEnd(e);\n return;\n }\n\n this._code = e.code ? e.code : e.key;\n const el: HTMLInputElement = e.target as HTMLInputElement;\n this._inputValue = el.value;\n\n this._setMask();\n\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n }\n\n if (e.key === 'ArrowLeft' || e.key === 'Backspace' || e.key === 'Delete') {\n if (e.key === 'Backspace' && el.value.length === 0) {\n el.selectionStart = el.selectionEnd;\n }\n if (e.key === 'Backspace' && (el.selectionStart as number) !== 0) {\n // If specialChars is false, (shouldn't ever happen) then set to the defaults\n this.specialCharacters = this.specialCharacters?.length\n ? this.specialCharacters\n : this._config.specialCharacters;\n if (this.prefix.length > 1 && (el.selectionStart as number) <= this.prefix.length) {\n el.setSelectionRange(this.prefix.length, el.selectionEnd);\n } else {\n if (\n this._inputValue.length !== (el.selectionStart as number) &&\n (el.selectionStart as number) !== 1\n ) {\n while (\n this.specialCharacters.includes(\n (\n this._inputValue[(el.selectionStart as number) - 1] ?? ''\n ).toString()\n ) &&\n ((this.prefix.length >= 1 &&\n (el.selectionStart as number) > this.prefix.length) ||\n this.prefix.length === 0)\n ) {\n el.setSelectionRange(\n (el.selectionStart as number) - 1,\n el.selectionEnd\n );\n }\n }\n }\n }\n this.checkSelectionOnDeletion(el);\n if (\n this._maskService.prefix.length &&\n (el.selectionStart as number) <= this._maskService.prefix.length &&\n (el.selectionEnd as number) <= this._maskService.prefix.length\n ) {\n e.preventDefault();\n }\n const cursorStart: number | null = el.selectionStart;\n if (\n e.key === 'Backspace' &&\n !el.readOnly &&\n cursorStart === 0 &&\n el.selectionEnd === el.value.length &&\n el.value.length !== 0\n ) {\n this._position = this._maskService.prefix ? this._maskService.prefix.length : 0;\n this._maskService.applyMask(\n this._maskService.prefix,\n this._maskService.maskExpression,\n this._position\n );\n }\n }\n if (\n !!this.suffix &&\n this.suffix.length > 1 &&\n this._inputValue.length - this.suffix.length < (el.selectionStart as number)\n ) {\n el.setSelectionRange(\n this._inputValue.length - this.suffix.length,\n this._inputValue.length\n );\n } else if (\n (e.code === 'KeyA' && e.ctrlKey) ||\n (e.code === 'KeyA' && e.metaKey) // Cmd + A (Mac)\n ) {\n el.setSelectionRange(0, this._getActualInputLength());\n e.preventDefault();\n }\n this._maskService.selStart = el.selectionStart;\n this._maskService.selEnd = el.selectionEnd;\n }\n\n /** It writes the value in the input */\n public async writeValue(\n inputValue: string | number | { value: string | number; disable?: boolean }\n ): Promise<void> {\n if (typeof inputValue === 'object' && inputValue !== null && 'value' in inputValue) {\n if ('disable' in inputValue) {\n this.setDisabledState(Boolean(inputValue.disable));\n }\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue.value;\n }\n\n if (typeof inputValue === 'number' || this._maskValue.startsWith('separator')) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this._maskService.numberToString(inputValue);\n if (!Array.isArray(this._maskService.decimalMarker)) {\n const localeDecimalMarker = this._currentLocaleDecimalMarker();\n // eslint-disable-next-line no-param-reassign\n inputValue =\n this._maskService.decimalMarker !== localeDecimalMarker\n ? inputValue.replace(localeDecimalMarker, this._maskService.decimalMarker)\n : inputValue;\n }\n this._maskService.isNumberValue = true;\n }\n\n if (typeof inputValue !== 'string') {\n // eslint-disable-next-line no-param-reassign\n inputValue = '';\n }\n\n this._inputValue = inputValue;\n this._setMask();\n\n if (\n (inputValue && this._maskService.maskExpression) ||\n (this._maskService.maskExpression &&\n (this._maskService.prefix || this._maskService.showMaskTyped))\n ) {\n // Let the service we know we are writing value so that triggering onChange function won't happen during applyMask\n this._maskService.writingValue = true;\n this._maskService.formElementProperty = [\n 'value',\n this._maskService.applyMask(inputValue, this._maskService.maskExpression),\n ];\n // Let the service know we've finished writing value\n this._maskService.writingValue = false;\n } else {\n this._maskService.formElementProperty = ['value', inputValue];\n }\n this._inputValue = inputValue;\n }\n\n public registerOnChange(fn: typeof this.onChange): void {\n this._maskService.onChange = this.onChange = fn;\n }\n\n public registerOnTouched(fn: typeof this.onTouch): void {\n this.onTouch = fn;\n }\n\n private _getActiveElement(document: DocumentOrShadowRoot = this.document): Element | null {\n const shadowRootEl = document?.activeElement?.shadowRoot;\n if (!shadowRootEl?.activeElement) {\n return document.activeElement;\n } else {\n return this._getActiveElement(shadowRootEl);\n }\n }\n\n public checkSelectionOnDeletion(el: HTMLInputElement): void {\n el.selectionStart = Math.min(\n Math.max(this.prefix.length, el.selectionStart as number),\n this._inputValue.length - this.suffix.length\n );\n el.selectionEnd = Math.min(\n Math.max(this.prefix.length, el.selectionEnd as number),\n this._inputValue.length - this.suffix.length\n );\n }\n\n /** It disables the input element */\n public setDisabledState(isDisabled: boolean): void {\n this._maskService.formElementProperty = ['disabled', isDisabled];\n }\n\n private _repeatPatternSymbols(maskExp: string): string {\n return (\n (maskExp.match(/{[0-9]+}/) &&\n maskExp\n .split('')\n .reduce((accum: string, currVal: string, index: number): string => {\n this._start = currVal === '{' ? index : this._start;\n\n if (currVal !== '}') {\n return this._maskService._findSpecialChar(currVal)\n ? accum + currVal\n : accum;\n }\n this._end = index;\n const repeatNumber = Number(maskExp.slice(this._start + 1, this._end));\n const replaceWith: string = new Array(repeatNumber + 1).join(\n maskExp[this._start - 1]\n );\n return accum + replaceWith;\n }, '')) ||\n maskExp\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _applyMask(): any {\n this._maskService.maskExpression = this._repeatPatternSymbols(this._maskValue || '');\n this._maskService.formElementProperty = [\n 'value',\n this._maskService.applyMask(this._inputValue, this._maskService.maskExpression),\n ];\n }\n\n private _validateTime(value: string): ValidationErrors | null {\n const rowMaskLen: number = this._maskValue\n .split('')\n .filter((s: string) => s !== ':').length;\n if (!value) {\n return null; // Don't validate empty values to allow for optional form control\n }\n\n if (\n (+(value[value.length - 1] ?? -1) === 0 && value.length < rowMaskLen) ||\n value.length <= rowMaskLen - 2\n ) {\n return this._createValidationError(value);\n }\n\n return null;\n }\n\n private _getActualInputLength() {\n return (\n this._maskService.actualValue.length ||\n this._maskService.actualValue.length + this._maskService.prefix.length\n );\n }\n\n private _createValidationError(actualValue: string): ValidationErrors {\n return {\n mask: {\n requiredMask: this._maskValue,\n actualValue,\n },\n };\n }\n\n private _setMask() {\n if (this._maskExpressionArray.length > 0) {\n this._maskExpressionArray.some((mask): boolean | void => {\n const test =\n this._maskService.removeMask(this._inputValue)?.length <=\n this._maskService.removeMask(mask)?.length;\n if (this._inputValue && test) {\n this._maskValue = mask;\n this.maskExpression = mask;\n this._maskService.maskExpression = mask;\n return test;\n } else {\n const expression =\n this._maskExpressionArray[this._maskExpressionArray.length - 1] ?? '';\n this._maskValue =\n this.maskExpression =\n this._maskService.maskExpression =\n expression;\n }\n });\n }\n }\n\n private _currentLocaleDecimalMarker(): string {\n return (1.1).toLocaleString().substring(1, 2);\n }\n}\n","import { inject, Pipe, PipeTransform } from '@angular/core';\n\nimport { IConfig } from './ngx-mask.config';\nimport { NgxMaskService } from './ngx-mask.service';\n\n@Pipe({\n name: 'mask',\n pure: true,\n standalone: true,\n})\nexport class NgxMaskPipe implements PipeTransform {\n private readonly defaultOptions: Partial<IConfig> = {};\n\n private readonly _maskService = inject(NgxMaskService);\n\n public transform(\n value: string | number,\n mask: string,\n { patterns, ...config }: Partial<IConfig> = {} as Partial<IConfig>\n ): string {\n const currentConfig = {\n maskExpression: mask,\n ...this.defaultOptions,\n ...config,\n patterns: {\n ...this._maskService.patterns,\n ...patterns,\n },\n };\n Object.entries(currentConfig).forEach(([key, value]) => {\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this._maskService as any)[key] = value;\n });\n return this._maskService.applyMask(`${value}`, mask);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-mask.mjs","sources":["../../../projects/ngx-mask-lib/src/lib/ngx-mask.config.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask-applier.service.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask.service.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask.providers.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask.directive.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask.pipe.ts","../../../projects/ngx-mask-lib/src/ngx-mask.ts"],"sourcesContent":["import { InjectionToken, EventEmitter } from '@angular/core';\n\nexport interface IConfig {\n suffix: string;\n prefix: string;\n thousandSeparator: string;\n decimalMarker: '.' | ',' | ['.', ','];\n clearIfNotMatch: boolean;\n showTemplate: boolean;\n showMaskTyped: boolean;\n placeHolderCharacter: string;\n shownMaskExpression: string;\n dropSpecialCharacters: boolean | string[];\n specialCharacters: string[];\n hiddenInput: boolean | undefined;\n validation: boolean;\n separatorLimit: string;\n allowNegativeNumbers: boolean;\n leadZeroDateTime: boolean;\n triggerOnMaskChange: boolean;\n maskFilled: EventEmitter<void>;\n patterns: {\n [character: string]: {\n pattern: RegExp;\n optional?: boolean;\n symbol?: string;\n };\n };\n}\n\nexport type optionsConfig = Partial<IConfig>;\nexport const NGX_MASK_CONFIG: InjectionToken<IConfig> = new InjectionToken('ngx-mask config');\nexport const NEW_CONFIG: InjectionToken<IConfig> = new InjectionToken('new ngx-mask config');\nexport const INITIAL_CONFIG: InjectionToken<IConfig> = new InjectionToken(\n 'initial ngx-mask config'\n);\n\nexport const initialConfig: IConfig = {\n suffix: '',\n prefix: '',\n thousandSeparator: ' ',\n decimalMarker: ['.', ','],\n clearIfNotMatch: false,\n showTemplate: false,\n showMaskTyped: false,\n placeHolderCharacter: '_',\n dropSpecialCharacters: true,\n hiddenInput: undefined,\n shownMaskExpression: '',\n separatorLimit: '',\n allowNegativeNumbers: false,\n validation: true,\n // eslint-disable-next-line @typescript-eslint/quotes\n specialCharacters: ['-', '/', '(', ')', '.', ':', ' ', '+', ',', '@', '[', ']', '\"', \"'\"],\n leadZeroDateTime: false,\n triggerOnMaskChange: false,\n maskFilled: new EventEmitter<void>(),\n patterns: {\n '0': {\n pattern: new RegExp('\\\\d'),\n },\n '9': {\n pattern: new RegExp('\\\\d'),\n optional: true,\n },\n X: {\n pattern: new RegExp('\\\\d'),\n symbol: '*',\n },\n A: {\n pattern: new RegExp('[a-zA-Z0-9]'),\n },\n S: {\n pattern: new RegExp('[a-zA-Z]'),\n },\n U: {\n pattern: new RegExp('[A-Z]'),\n },\n L: {\n pattern: new RegExp('[a-z]'),\n },\n d: {\n pattern: new RegExp('\\\\d'),\n },\n m: {\n pattern: new RegExp('\\\\d'),\n },\n M: {\n pattern: new RegExp('\\\\d'),\n },\n H: {\n pattern: new RegExp('\\\\d'),\n },\n h: {\n pattern: new RegExp('\\\\d'),\n },\n s: {\n pattern: new RegExp('\\\\d'),\n },\n },\n};\n\nexport const timeMasks: string[] = ['Hh:m0:s0', 'Hh:m0', 'm0:s0'];\n\nexport const withoutValidation: string[] = [\n 'percent',\n 'Hh',\n 's0',\n 'm0',\n 'separator',\n 'd0/M0/0000',\n 'd0/M0',\n 'd0',\n 'M0',\n];\n","import { inject, Injectable } from '@angular/core';\nimport { NGX_MASK_CONFIG, IConfig } from './ngx-mask.config';\n\n@Injectable()\nexport class NgxMaskApplierService {\n protected _config = inject<IConfig>(NGX_MASK_CONFIG);\n\n public dropSpecialCharacters: IConfig['dropSpecialCharacters'] =\n this._config.dropSpecialCharacters;\n\n public hiddenInput: IConfig['hiddenInput'] = this._config.hiddenInput;\n\n public showTemplate!: IConfig['showTemplate'];\n\n public clearIfNotMatch: IConfig['clearIfNotMatch'] = this._config.clearIfNotMatch;\n\n public specialCharacters: IConfig['specialCharacters'] = this._config.specialCharacters;\n\n public patterns: IConfig['patterns'] = this._config.patterns;\n\n public prefix: IConfig['prefix'] = this._config.prefix;\n\n public suffix: IConfig['suffix'] = this._config.suffix;\n\n public thousandSeparator: IConfig['thousandSeparator'] = this._config.thousandSeparator;\n\n public decimalMarker: IConfig['decimalMarker'] = this._config.decimalMarker;\n\n public customPattern!: IConfig['patterns'];\n\n public showMaskTyped: IConfig['showMaskTyped'] = this._config.showMaskTyped;\n\n public placeHolderCharacter: IConfig['placeHolderCharacter'] =\n this._config.placeHolderCharacter;\n\n public validation: IConfig['validation'] = this._config.validation;\n\n public separatorLimit: IConfig['separatorLimit'] = this._config.separatorLimit;\n\n public allowNegativeNumbers: IConfig['allowNegativeNumbers'] =\n this._config.allowNegativeNumbers;\n\n public leadZeroDateTime: IConfig['leadZeroDateTime'] = this._config.leadZeroDateTime;\n\n private _shift: Set<number> = new Set();\n\n public maskExpression = '';\n\n public actualValue = '';\n\n public shownMaskExpression = '';\n\n public ipError?: boolean;\n\n public cpfCnpjError?: boolean;\n public applyMaskWithPattern(\n inputValue: string,\n maskAndPattern: [string, IConfig['patterns']]\n ): string {\n const [mask, customPattern] = maskAndPattern;\n this.customPattern = customPattern;\n return this.applyMask(inputValue, mask);\n }\n\n public applyMask(\n inputValue: string | object | boolean | null | undefined,\n maskExpression: string,\n position = 0,\n justPasted = false,\n backspaced = false,\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any\n cb: (...args: any[]) => any = () => {}\n ): string {\n if (!maskExpression || typeof inputValue !== 'string') {\n return '';\n }\n let cursor = 0;\n let result = '';\n let multi = false;\n let backspaceShift = false;\n let shift = 1;\n let stepBack = false;\n if (inputValue.slice(0, this.prefix.length) === this.prefix) {\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue.slice(this.prefix.length, inputValue.length);\n }\n if (!!this.suffix && inputValue?.length > 0) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this.checkAndRemoveSuffix(inputValue);\n }\n const inputArray: string[] = inputValue.toString().split('');\n if (this.allowNegativeNumbers && inputValue.slice(cursor, cursor + 1) === '-') {\n // eslint-disable-next-line no-param-reassign\n result += inputValue.slice(cursor, cursor + 1);\n }\n if (maskExpression === 'IP') {\n const valuesIP = inputValue.split('.');\n this.ipError = this._validIP(valuesIP);\n // eslint-disable-next-line no-param-reassign\n maskExpression = '099.099.099.099';\n }\n const arr: string[] = [];\n for (let i = 0; i < inputValue.length; i++) {\n if (inputValue[i]?.match('\\\\d')) {\n arr.push(inputValue[i] ?? '');\n }\n }\n if (maskExpression === 'CPF_CNPJ') {\n this.cpfCnpjError = arr.length !== 11 && arr.length !== 14;\n if (arr.length > 11) {\n // eslint-disable-next-line no-param-reassign\n maskExpression = '00.000.000/0000-00';\n } else {\n // eslint-disable-next-line no-param-reassign\n maskExpression = '000.000.000-00';\n }\n }\n if (maskExpression.startsWith('percent')) {\n if (\n inputValue.match('[a-z]|[A-Z]') ||\n // eslint-disable-next-line no-useless-escape\n inputValue.match(/[-!$%^&*()_+|~=`{}\\[\\]:\";'<>?,\\/.]/)\n ) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this._stripToDecimal(inputValue);\n const precision: number = this.getPrecision(maskExpression);\n // eslint-disable-next-line no-param-reassign\n inputValue = this.checkInputPrecision(inputValue, precision, this.decimalMarker);\n }\n if (\n inputValue.indexOf('.') > 0 &&\n !this.percentage(inputValue.substring(0, inputValue.indexOf('.')))\n ) {\n let base: string = inputValue.substring(0, inputValue.indexOf('.') - 1);\n if (this.allowNegativeNumbers && inputValue.slice(cursor, cursor + 1) === '-') {\n base = inputValue.substring(0, inputValue.indexOf('.'));\n }\n // eslint-disable-next-line no-param-reassign\n inputValue = `${base}${inputValue.substring(\n inputValue.indexOf('.'),\n inputValue.length\n )}`;\n }\n let value = '';\n this.allowNegativeNumbers && inputValue.slice(cursor, cursor + 1) === '-'\n ? (value = inputValue.slice(cursor + 1, cursor + inputValue.length))\n : (value = inputValue);\n if (this.percentage(value)) {\n result = inputValue;\n } else {\n result = inputValue.substring(0, inputValue.length - 1);\n }\n } else if (maskExpression.startsWith('separator')) {\n if (\n inputValue.match('[wа-яА-Я]') ||\n inputValue.match('[ЁёА-я]') ||\n inputValue.match('[a-z]|[A-Z]') ||\n inputValue.match(/[-@#!$%\\\\^&*()_£¬'+|~=`{}\\]:\";<>.?/]/) ||\n inputValue.match('[^A-Za-z0-9,]')\n ) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this._stripToDecimal(inputValue);\n }\n // eslint-disable-next-line no-param-reassign\n inputValue =\n inputValue.length > 1 &&\n inputValue[0] === '0' &&\n inputValue[1] !== this.thousandSeparator &&\n !this._compareOrIncludes(\n inputValue[1],\n this.decimalMarker,\n this.thousandSeparator\n ) &&\n !backspaced\n ? inputValue.slice(0, inputValue.length - 1)\n : inputValue;\n if (backspaced) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this._compareOrIncludes(\n inputValue[inputValue.length - 1],\n this.decimalMarker,\n this.thousandSeparator\n )\n ? inputValue.slice(0, inputValue.length - 1)\n : inputValue;\n }\n // TODO: we had different rexexps here for the different cases... but tests dont seam to bother - check this\n // separator: no COMMA, dot-sep: no SPACE, COMMA OK, comma-sep: no SPACE, COMMA OK\n\n const thousandSeparatorCharEscaped: string = this._charToRegExpExpression(\n this.thousandSeparator\n );\n let invalidChars: string = '@#!$%^&*()_+|~=`{}\\\\[\\\\]:\\\\s,\\\\.\";<>?\\\\/'.replace(\n thousandSeparatorCharEscaped,\n ''\n );\n //.replace(decimalMarkerEscaped, '');\n if (Array.isArray(this.decimalMarker)) {\n for (const marker of this.decimalMarker) {\n invalidChars = invalidChars.replace(this._charToRegExpExpression(marker), '');\n }\n } else {\n invalidChars = invalidChars.replace(\n this._charToRegExpExpression(this.decimalMarker),\n ''\n );\n }\n\n const invalidCharRegexp = new RegExp('[' + invalidChars + ']');\n\n if (\n inputValue.match(invalidCharRegexp) ||\n (inputValue.length === 1 &&\n this._compareOrIncludes(inputValue, this.decimalMarker, this.thousandSeparator))\n ) {\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue.substring(0, inputValue.length - 1);\n }\n\n const precision: number = this.getPrecision(maskExpression);\n // eslint-disable-next-line no-param-reassign\n inputValue = this.checkInputPrecision(inputValue, precision, this.decimalMarker);\n const strForSep: string = inputValue.replace(\n new RegExp(thousandSeparatorCharEscaped, 'g'),\n ''\n );\n result = this._formatWithSeparators(\n strForSep,\n this.thousandSeparator,\n this.decimalMarker,\n precision\n );\n const commaShift: number = result.indexOf(',') - inputValue.indexOf(',');\n const shiftStep: number = result.length - inputValue.length;\n\n if (shiftStep > 0 && result[position] !== ',') {\n backspaceShift = true;\n let _shift = 0;\n do {\n this._shift.add(position + _shift);\n _shift++;\n } while (_shift < shiftStep);\n } else if (\n (commaShift !== 0 &&\n position > 0 &&\n !(result.indexOf(',') >= position && position > 3)) ||\n (!(result.indexOf('.') >= position && position > 3) && shiftStep <= 0)\n ) {\n this._shift.clear();\n backspaceShift = true;\n shift = shiftStep;\n // eslint-disable-next-line no-param-reassign\n position += shiftStep;\n this._shift.add(position);\n } else {\n this._shift.clear();\n }\n } else {\n for (\n // eslint-disable-next-line\n let i: number = 0, inputSymbol: string = inputArray[0]!;\n i < inputArray.length;\n i++, inputSymbol = inputArray[i] ?? ''\n ) {\n if (cursor === maskExpression.length) {\n break;\n }\n if (\n this._checkSymbolMask(inputSymbol, maskExpression[cursor] ?? '') &&\n maskExpression[cursor + 1] === '?'\n ) {\n result += inputSymbol;\n cursor += 2;\n } else if (\n maskExpression[cursor + 1] === '*' &&\n multi &&\n this._checkSymbolMask(inputSymbol, maskExpression[cursor + 2] ?? '')\n ) {\n result += inputSymbol;\n cursor += 3;\n multi = false;\n } else if (\n this._checkSymbolMask(inputSymbol, maskExpression[cursor] ?? '') &&\n maskExpression[cursor + 1] === '*'\n ) {\n result += inputSymbol;\n multi = true;\n } else if (\n maskExpression[cursor + 1] === '?' &&\n this._checkSymbolMask(inputSymbol, maskExpression[cursor + 2] ?? '')\n ) {\n result += inputSymbol;\n cursor += 3;\n } else if (this._checkSymbolMask(inputSymbol, maskExpression[cursor] ?? '')) {\n if (maskExpression[cursor] === 'H') {\n if (Number(inputSymbol) > 2) {\n // eslint-disable-next-line no-param-reassign\n position = position + 1;\n cursor += 1;\n this._shiftStep(maskExpression, cursor, inputArray.length);\n i--;\n if (this.leadZeroDateTime) {\n result += '0';\n }\n continue;\n }\n }\n if (maskExpression[cursor] === 'h') {\n if (\n (result === '2' && Number(inputSymbol) > 3) ||\n ((result.slice(cursor - 2, cursor) === '2' ||\n result.slice(cursor - 3, cursor) === '2' ||\n result.slice(cursor - 4, cursor) === '2' ||\n result.slice(cursor - 1, cursor) === '2') &&\n Number(inputSymbol) > 3 &&\n cursor > 10)\n ) {\n // eslint-disable-next-line no-param-reassign\n position = position + 1;\n cursor += 1;\n i--;\n continue;\n }\n }\n if (maskExpression[cursor] === 'm' || maskExpression[cursor] === 's') {\n if (Number(inputSymbol) > 5) {\n // eslint-disable-next-line no-param-reassign\n position = position + 1;\n cursor += 1;\n this._shiftStep(maskExpression, cursor, inputArray.length);\n i--;\n if (this.leadZeroDateTime) {\n result += '0';\n }\n continue;\n }\n }\n const daysCount = 31;\n const inputValueCursor = inputValue[cursor] as string;\n const inputValueCursorPlusOne = inputValue[cursor + 1] as string;\n const inputValueCursorPlusTwo = inputValue[cursor + 2] as string;\n const inputValueCursorMinusOne = inputValue[cursor - 1] as string;\n const inputValueCursorMinusTwo = inputValue[cursor - 2] as string;\n const inputValueCursorMinusThree = inputValue[cursor - 3] as string;\n const inputValueSliceMinusThreeMinusOne = inputValue.slice(\n cursor - 3,\n cursor - 1\n );\n const inputValueSliceMinusOnePlusOne = inputValue.slice(cursor - 1, cursor + 1);\n const inputValueSliceCursorPlusTwo = inputValue.slice(cursor, cursor + 2);\n const inputValueSliceMinusTwoCursor = inputValue.slice(cursor - 2, cursor);\n if (maskExpression[cursor] === 'd') {\n const maskStartWithMonth = maskExpression.slice(0, 2) === 'M0';\n const startWithMonthInput: boolean =\n maskExpression.slice(0, 2) === 'M0' &&\n this.specialCharacters.includes(inputValueCursorMinusTwo);\n if (\n (Number(inputSymbol) > 3 && this.leadZeroDateTime) ||\n (!maskStartWithMonth &&\n (Number(inputValueSliceCursorPlusTwo) > daysCount ||\n Number(inputValueSliceMinusOnePlusOne) > daysCount ||\n this.specialCharacters.includes(inputValueCursorPlusOne))) ||\n (startWithMonthInput\n ? Number(inputValueSliceMinusOnePlusOne) > daysCount ||\n (!this.specialCharacters.includes(inputValueCursor) &&\n this.specialCharacters.includes(inputValueCursorPlusTwo)) ||\n this.specialCharacters.includes(inputValueCursor)\n : Number(inputValueSliceCursorPlusTwo) > daysCount ||\n this.specialCharacters.includes(inputValueCursorPlusOne))\n ) {\n // eslint-disable-next-line no-param-reassign\n position = position + 1;\n cursor += 1;\n this._shiftStep(maskExpression, cursor, inputArray.length);\n i--;\n if (this.leadZeroDateTime) {\n result += '0';\n }\n continue;\n }\n }\n if (maskExpression[cursor] === 'M') {\n const monthsCount = 12;\n // mask without day\n const withoutDays: boolean =\n cursor === 0 &&\n (Number(inputSymbol) > 2 ||\n Number(inputValueSliceCursorPlusTwo) > monthsCount ||\n this.specialCharacters.includes(inputValueCursorPlusOne));\n // day<10 && month<12 for input\n const specialChart = maskExpression.slice(cursor + 2, cursor + 3);\n const day1monthInput: boolean =\n inputValueSliceMinusThreeMinusOne.includes(specialChart) &&\n ((this.specialCharacters.includes(inputValueCursorMinusTwo) &&\n Number(inputValueSliceMinusOnePlusOne) > monthsCount &&\n !this.specialCharacters.includes(inputValueCursor)) ||\n this.specialCharacters.includes(inputValueCursor) ||\n (this.specialCharacters.includes(inputValueCursorMinusThree) &&\n Number(inputValueSliceMinusTwoCursor) > monthsCount &&\n !this.specialCharacters.includes(inputValueCursorMinusOne)) ||\n this.specialCharacters.includes(inputValueCursorMinusOne));\n // month<12 && day<10 for input\n const day2monthInput: boolean =\n Number(inputValueSliceMinusThreeMinusOne) <= daysCount &&\n !this.specialCharacters.includes(\n inputValueSliceMinusThreeMinusOne as string\n ) &&\n this.specialCharacters.includes(inputValueCursorMinusOne) &&\n (Number(inputValueSliceCursorPlusTwo) > monthsCount ||\n this.specialCharacters.includes(inputValueCursorPlusOne));\n // cursor === 5 && without days\n const day2monthInputDot: boolean =\n (Number(inputValueSliceCursorPlusTwo) > monthsCount && cursor === 5) ||\n (this.specialCharacters.includes(inputValueCursorPlusOne) &&\n cursor === 5);\n // // day<10 && month<12 for paste whole data\n const day1monthPaste: boolean =\n Number(inputValueSliceMinusThreeMinusOne) > daysCount &&\n !this.specialCharacters.includes(\n inputValueSliceMinusThreeMinusOne as string\n ) &&\n !this.specialCharacters.includes(\n inputValueSliceMinusTwoCursor as string\n ) &&\n Number(inputValueSliceMinusTwoCursor) > monthsCount;\n // 10<day<31 && month<12 for paste whole data\n const day2monthPaste: boolean =\n Number(inputValueSliceMinusThreeMinusOne) <= daysCount &&\n !this.specialCharacters.includes(\n inputValueSliceMinusThreeMinusOne as string\n ) &&\n !this.specialCharacters.includes(inputValueCursorMinusOne) &&\n Number(inputValueSliceMinusOnePlusOne) > monthsCount;\n if (\n (Number(inputSymbol) > 1 && this.leadZeroDateTime) ||\n withoutDays ||\n day1monthInput ||\n day2monthPaste ||\n day1monthPaste ||\n day2monthInput ||\n day2monthInputDot\n ) {\n // eslint-disable-next-line no-param-reassign\n position = position + 1;\n cursor += 1;\n this._shiftStep(maskExpression, cursor, inputArray.length);\n i--;\n if (this.leadZeroDateTime) {\n result += '0';\n }\n continue;\n }\n }\n result += inputSymbol;\n cursor++;\n } else if (inputSymbol === ' ' && maskExpression[cursor] === ' ') {\n result += inputSymbol;\n cursor++;\n } else if (this.specialCharacters.indexOf(maskExpression[cursor] ?? '') !== -1) {\n result += maskExpression[cursor];\n cursor++;\n this._shiftStep(maskExpression, cursor, inputArray.length);\n i--;\n } else if (maskExpression[cursor] === '9' && this.showMaskTyped) {\n this._shiftStep(maskExpression, cursor, inputArray.length);\n } else if (\n this.specialCharacters.indexOf(inputSymbol) > -1 &&\n this.patterns[maskExpression[cursor] ?? ''] &&\n this.patterns[maskExpression[cursor] ?? '']?.optional\n ) {\n if (\n !!inputArray[cursor] &&\n maskExpression !== '099.099.099.099' &&\n maskExpression !== '000.000.000-00' &&\n maskExpression !== '00.000.000/0000-00' &&\n !maskExpression.match(/^9+\\.0+$/) &&\n maskExpression[cursor] !== '9'\n ) {\n result += inputArray[cursor];\n }\n cursor++;\n i--;\n } else if (\n this.maskExpression[cursor + 1] === '*' &&\n this._findSpecialChar(this.maskExpression[cursor + 2] ?? '') &&\n this._findSpecialChar(inputSymbol) === this.maskExpression[cursor + 2] &&\n multi\n ) {\n cursor += 3;\n result += inputSymbol;\n } else if (\n this.maskExpression[cursor + 1] === '?' &&\n this._findSpecialChar(this.maskExpression[cursor + 2] ?? '') &&\n this._findSpecialChar(inputSymbol) === this.maskExpression[cursor + 2] &&\n multi\n ) {\n cursor += 3;\n result += inputSymbol;\n } else if (\n this.showMaskTyped &&\n this.specialCharacters.indexOf(inputSymbol) < 0 &&\n inputSymbol !== this.placeHolderCharacter\n ) {\n stepBack = true;\n }\n }\n }\n if (\n result.length + 1 === maskExpression.length &&\n this.specialCharacters.indexOf(maskExpression[maskExpression.length - 1] ?? '') !== -1\n ) {\n result += maskExpression[maskExpression.length - 1];\n }\n let newPosition: number = position + 1;\n\n while (this._shift.has(newPosition)) {\n shift++;\n newPosition++;\n }\n\n let actualShift: number =\n justPasted && !maskExpression.startsWith('separator')\n ? cursor\n : this._shift.has(position)\n ? shift\n : 0;\n if (stepBack) {\n actualShift--;\n }\n\n cb(actualShift, backspaceShift);\n if (shift < 0) {\n this._shift.clear();\n }\n let onlySpecial = false;\n if (backspaced) {\n onlySpecial = inputArray.every((char) => this.specialCharacters.includes(char));\n }\n let res = `${this.prefix}${onlySpecial ? '' : result}${this.suffix}`;\n if (result.length === 0) {\n res = `${this.prefix}${result}`;\n }\n return res;\n }\n\n public _findSpecialChar(inputSymbol: string): undefined | string {\n return this.specialCharacters.find((val: string) => val === inputSymbol);\n }\n\n protected _checkSymbolMask(inputSymbol: string, maskSymbol: string): boolean {\n this.patterns = this.customPattern ? this.customPattern : this.patterns;\n return (\n (this.patterns[maskSymbol]?.pattern &&\n this.patterns[maskSymbol]?.pattern.test(inputSymbol)) ??\n false\n );\n }\n\n private _formatWithSeparators = (\n str: string,\n thousandSeparatorChar: string,\n decimalChars: string | string[],\n precision: number\n ) => {\n let x: string[] = [];\n let decimalChar = '';\n if (Array.isArray(decimalChars)) {\n const regExp = new RegExp(\n decimalChars.map((v) => ('[\\\\^$.|?*+()'.indexOf(v) >= 0 ? `\\\\${v}` : v)).join('|')\n );\n x = str.split(regExp);\n decimalChar = str.match(regExp)?.[0] ?? '';\n } else {\n x = str.split(decimalChars);\n decimalChar = decimalChars;\n }\n const decimals: string = x.length > 1 ? `${decimalChar}${x[1]}` : '';\n let res: string = x[0] ?? '';\n const separatorLimit: string = this.separatorLimit.replace(/\\s/g, '');\n if (separatorLimit && +separatorLimit) {\n if (res[0] === '-') {\n res = `-${res.slice(1, res.length).slice(0, separatorLimit.length)}`;\n } else {\n res = res.slice(0, separatorLimit.length);\n }\n }\n const rgx = /(\\d+)(\\d{3})/;\n\n while (thousandSeparatorChar && rgx.test(res)) {\n res = res.replace(rgx, '$1' + thousandSeparatorChar + '$2');\n }\n\n if (precision === undefined) {\n return res + decimals;\n } else if (precision === 0) {\n return res;\n }\n return res + decimals.substring(0, precision + 1);\n };\n\n private percentage = (str: string): boolean => {\n return Number(str) >= 0 && Number(str) <= 100;\n };\n\n private getPrecision = (maskExpression: string): number => {\n const x: string[] = maskExpression.split('.');\n if (x.length > 1) {\n return Number(x[x.length - 1]);\n }\n\n return Infinity;\n };\n\n private checkAndRemoveSuffix = (inputValue: string): string => {\n for (let i = this.suffix?.length - 1; i >= 0; i--) {\n const substr = this.suffix.substring(i, this.suffix?.length);\n if (\n inputValue.includes(substr) &&\n i !== this.suffix?.length - 1 &&\n (i - 1 < 0 ||\n !inputValue.includes(this.suffix.substring(i - 1, this.suffix?.length)))\n ) {\n return inputValue.replace(substr, '');\n }\n }\n return inputValue;\n };\n\n private checkInputPrecision = (\n inputValue: string,\n precision: number,\n decimalMarker: IConfig['decimalMarker']\n ): string => {\n if (precision < Infinity) {\n // TODO need think about decimalMarker\n if (Array.isArray(decimalMarker)) {\n const marker = decimalMarker.find((dm) => dm !== this.thousandSeparator);\n // eslint-disable-next-line no-param-reassign\n decimalMarker = marker ? marker : decimalMarker[0];\n }\n const precisionRegEx = new RegExp(\n this._charToRegExpExpression(decimalMarker) + `\\\\d{${precision}}.*$`\n );\n\n const precisionMatch: RegExpMatchArray | null = inputValue.match(precisionRegEx);\n const precisionMatchLength: number = (precisionMatch && precisionMatch[0]?.length) ?? 0;\n if (precisionMatchLength - 1 > precision) {\n const diff = precisionMatchLength - 1 - precision;\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue.substring(0, inputValue.length - diff);\n }\n if (\n precision === 0 &&\n this._compareOrIncludes(\n inputValue[inputValue.length - 1],\n decimalMarker,\n this.thousandSeparator\n )\n ) {\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue.substring(0, inputValue.length - 1);\n }\n }\n return inputValue;\n };\n\n private _stripToDecimal(str: string): string {\n return str\n .split('')\n .filter((i: string, idx: number) => {\n const isDecimalMarker =\n typeof this.decimalMarker === 'string'\n ? i === this.decimalMarker\n : // TODO (inepipenko) use utility type\n this.decimalMarker.includes(i as ',' | '.');\n return (\n i.match('^-?\\\\d') ||\n i === this.thousandSeparator ||\n isDecimalMarker ||\n (i === '-' && idx === 0 && this.allowNegativeNumbers)\n );\n })\n .join('');\n }\n\n private _charToRegExpExpression(char: string): string {\n // if (Array.isArray(char)) {\n // \treturn char.map((v) => ('[\\\\^$.|?*+()'.indexOf(v) >= 0 ? `\\\\${v}` : v)).join('|');\n // }\n if (char) {\n const charsToEscape = '[\\\\^$.|?*+()';\n return char === ' ' ? '\\\\s' : charsToEscape.indexOf(char) >= 0 ? `\\\\${char}` : char;\n }\n return char;\n }\n\n private _shiftStep(maskExpression: string, cursor: number, inputLength: number) {\n const shiftStep: number = /[*?]/g.test(maskExpression.slice(0, cursor))\n ? inputLength\n : cursor;\n this._shift.add(shiftStep + this.prefix.length || 0);\n }\n\n protected _compareOrIncludes<T>(value: T, comparedValue: T | T[], excludedValue: T): boolean {\n return Array.isArray(comparedValue)\n ? comparedValue.filter((v) => v !== excludedValue).includes(value)\n : value === comparedValue;\n }\n\n private _validIP(valuesIP: string[]): boolean {\n return !(\n valuesIP.length === 4 &&\n !valuesIP.some((value: string, index: number) => {\n if (valuesIP.length !== index + 1) {\n return value === '' || Number(value) > 255;\n }\n return value === '' || Number(value.substring(0, 3)) > 255;\n })\n );\n }\n}\n","import { ElementRef, inject, Injectable, Renderer2 } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\nimport { NGX_MASK_CONFIG, IConfig } from './ngx-mask.config';\nimport { NgxMaskApplierService } from './ngx-mask-applier.service';\n\n@Injectable()\nexport class NgxMaskService extends NgxMaskApplierService {\n public isNumberValue = false;\n\n public maskIsShown = '';\n\n public selStart: number | null = null;\n\n public selEnd: number | null = null;\n\n /**\n * Whether we are currently in writeValue function, in this case when applying the mask we don't want to trigger onChange function,\n * since writeValue should be a one way only process of writing the DOM value based on the Angular model value.\n */\n public writingValue = false;\n\n public maskChanged = false;\n\n public triggerOnMaskChange = false;\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any\n public onChange = (_: any) => {};\n\n private readonly document = inject(DOCUMENT);\n\n protected override _config = inject<IConfig>(NGX_MASK_CONFIG);\n\n private readonly _elementRef = inject(ElementRef, { optional: true });\n\n private readonly _renderer = inject(Renderer2, { optional: true });\n\n // eslint-disable-next-line complexity\n public override applyMask(\n inputValue: string,\n maskExpression: string,\n position = 0,\n justPasted = false,\n backspaced = false,\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any\n cb: (...args: any[]) => any = () => {}\n ): string {\n if (!maskExpression) {\n return inputValue !== this.actualValue ? this.actualValue : inputValue;\n }\n this.maskIsShown = this.showMaskTyped ? this.showMaskInInput() : '';\n if (this.maskExpression === 'IP' && this.showMaskTyped) {\n this.maskIsShown = this.showMaskInInput(inputValue || '#');\n }\n if (this.maskExpression === 'CPF_CNPJ' && this.showMaskTyped) {\n this.maskIsShown = this.showMaskInInput(inputValue || '#');\n }\n if (!inputValue && this.showMaskTyped) {\n this.formControlResult(this.prefix);\n return this.prefix + this.maskIsShown;\n }\n const getSymbol: string =\n !!inputValue && typeof this.selStart === 'number'\n ? inputValue[this.selStart] ?? ''\n : '';\n let newInputValue = '';\n if (this.hiddenInput !== undefined && !this.writingValue) {\n let actualResult: string[] = this.actualValue.split('');\n // eslint-disable @typescript-eslint/no-unused-expressions\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n inputValue !== '' && actualResult.length\n ? typeof this.selStart === 'number' && typeof this.selEnd === 'number'\n ? inputValue.length > actualResult.length\n ? actualResult.splice(this.selStart, 0, getSymbol)\n : inputValue.length < actualResult.length\n ? actualResult.length - inputValue.length === 1\n ? actualResult.splice(this.selStart - 1, 1)\n : actualResult.splice(this.selStart, this.selEnd - this.selStart)\n : null\n : null\n : (actualResult = []);\n if (this.showMaskTyped) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this.removeMask(inputValue);\n }\n // eslint-enable @typescript-eslint/no-unused-expressions\n newInputValue =\n this.actualValue.length && actualResult.length <= inputValue.length\n ? this.shiftTypedSymbols(actualResult.join(''))\n : inputValue;\n }\n\n if (this.showMaskTyped) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this.removeMask(inputValue);\n }\n\n newInputValue = Boolean(newInputValue) && newInputValue.length ? newInputValue : inputValue;\n\n const result: string = super.applyMask(\n newInputValue,\n maskExpression,\n position,\n justPasted,\n backspaced,\n cb\n );\n this.actualValue = this.getActualValue(result);\n // handle some separator implications:\n // a.) adjust decimalMarker default (. -> ,) if thousandSeparator is a dot\n if (this.thousandSeparator === '.' && this.decimalMarker === '.') {\n this.decimalMarker = ',';\n }\n\n // b) remove decimal marker from list of special characters to mask\n if (this.maskExpression.startsWith('separator') && this.dropSpecialCharacters === true) {\n this.specialCharacters = this.specialCharacters.filter(\n (item: string) =>\n !this._compareOrIncludes(item, this.decimalMarker, this.thousandSeparator) //item !== this.decimalMarker, // !\n );\n }\n this.formControlResult(result);\n if (!this.showMaskTyped) {\n if (this.hiddenInput) {\n return result && result.length\n ? this.hideInput(result, this.maskExpression)\n : result;\n }\n return result;\n }\n const resLen: number = result.length;\n const prefNmask: string = this.prefix + this.maskIsShown;\n\n if (this.maskExpression.includes('H')) {\n const countSkipedSymbol = this._numberSkipedSymbols(result);\n return result + prefNmask.slice(resLen + countSkipedSymbol);\n } else if (this.maskExpression === 'IP' || this.maskExpression === 'CPF_CNPJ') {\n return result + prefNmask;\n }\n return result + prefNmask.slice(resLen);\n }\n\n // get the number of characters that were shifted\n private _numberSkipedSymbols(value: string): number {\n const regex = /(^|\\D)(\\d\\D)/g;\n let match = regex.exec(value);\n let countSkipedSymbol = 0;\n while (match != null) {\n countSkipedSymbol += 1;\n match = regex.exec(value);\n }\n return countSkipedSymbol;\n }\n\n public applyValueChanges(\n position: number,\n justPasted: boolean,\n backspaced: boolean,\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any\n cb: (...args: any[]) => any = () => {}\n ): void {\n const formElement = this._elementRef?.nativeElement;\n if (!formElement) {\n return;\n }\n formElement.value = this.applyMask(\n formElement.value,\n this.maskExpression,\n position,\n justPasted,\n backspaced,\n cb\n );\n if (formElement === this._getActiveElement()) {\n return;\n }\n this.clearIfNotMatchFn();\n }\n\n public hideInput(inputValue: string, maskExpression: string): string {\n return inputValue\n .split('')\n .map((curr: string, index: number) => {\n if (\n this.patterns &&\n this.patterns[maskExpression[index] ?? ''] &&\n this.patterns[maskExpression[index] ?? '']?.symbol\n ) {\n return this.patterns[maskExpression[index] ?? '']?.symbol;\n }\n return curr;\n })\n .join('');\n }\n\n // this function is not necessary, it checks result against maskExpression\n public getActualValue(res: string): string {\n const compare: string[] = res.split('').filter((symbol: string, i: number) => {\n const maskChar = this.maskExpression[i] ?? '';\n return (\n this._checkSymbolMask(symbol, maskChar) ||\n (this.specialCharacters.includes(maskChar) && symbol === maskChar)\n );\n });\n if (compare.join('') === res) {\n return compare.join('');\n }\n return res;\n }\n\n public shiftTypedSymbols(inputValue: string): string {\n let symbolToReplace = '';\n const newInputValue: (string | undefined)[] =\n (inputValue &&\n inputValue.split('').map((currSymbol: string, index: number) => {\n if (\n this.specialCharacters.includes(inputValue[index + 1] ?? '') &&\n inputValue[index + 1] !== this.maskExpression[index + 1]\n ) {\n symbolToReplace = currSymbol;\n return inputValue[index + 1];\n }\n if (symbolToReplace.length) {\n const replaceSymbol: string = symbolToReplace;\n symbolToReplace = '';\n return replaceSymbol;\n }\n return currSymbol;\n })) ||\n [];\n return newInputValue.join('');\n }\n\n /**\n * Convert number value to string\n * 3.1415 -> '3.1415'\n * 1e-7 -> '0.0000001'\n */\n public numberToString(value: number | string): string {\n if (!value && value !== 0) {\n return String(value);\n }\n return Number(value).toLocaleString('fullwide', {\n useGrouping: false,\n maximumFractionDigits: 20,\n });\n }\n\n public showMaskInInput(inputVal?: string): string {\n if (this.showMaskTyped && !!this.shownMaskExpression) {\n if (this.maskExpression.length !== this.shownMaskExpression.length) {\n throw new Error('Mask expression must match mask placeholder length');\n } else {\n return this.shownMaskExpression;\n }\n } else if (this.showMaskTyped) {\n if (inputVal) {\n if (this.maskExpression === 'IP') {\n return this._checkForIp(inputVal);\n }\n if (this.maskExpression === 'CPF_CNPJ') {\n return this._checkForCpfCnpj(inputVal);\n }\n }\n return this.maskExpression.replace(/\\w/g, this.placeHolderCharacter);\n }\n return '';\n }\n\n public clearIfNotMatchFn(): void {\n const formElement = this._elementRef?.nativeElement;\n if (!formElement) {\n return;\n }\n if (\n this.clearIfNotMatch &&\n this.prefix.length + this.maskExpression.length + this.suffix.length !==\n formElement.value.replace(/_/g, '').length\n ) {\n this.formElementProperty = ['value', ''];\n this.applyMask(formElement.value, this.maskExpression);\n }\n }\n\n public set formElementProperty([name, value]: [string, string | boolean]) {\n if (!this._renderer || !this._elementRef) {\n return;\n }\n Promise.resolve().then(() =>\n this._renderer?.setProperty(this._elementRef?.nativeElement, name, value)\n );\n }\n\n public checkSpecialCharAmount(mask: string): number {\n const chars: string[] = mask\n .split('')\n .filter((item: string) => this._findSpecialChar(item));\n return chars.length;\n }\n\n public removeMask(inputValue: string): string {\n return this._removeMask(\n this._removeSuffix(this._removePrefix(inputValue)),\n this.specialCharacters.concat('_').concat(this.placeHolderCharacter)\n );\n }\n\n private _checkForIp(inputVal: string): string {\n if (inputVal === '#') {\n return `${this.placeHolderCharacter}.${this.placeHolderCharacter}.${this.placeHolderCharacter}.${this.placeHolderCharacter}`;\n }\n const arr: string[] = [];\n for (let i = 0; i < inputVal.length; i++) {\n const value = inputVal[i] ?? '';\n if (!value) {\n continue;\n }\n if (value.match('\\\\d')) {\n arr.push(value);\n }\n }\n if (arr.length <= 3) {\n return `${this.placeHolderCharacter}.${this.placeHolderCharacter}.${this.placeHolderCharacter}`;\n }\n if (arr.length > 3 && arr.length <= 6) {\n return `${this.placeHolderCharacter}.${this.placeHolderCharacter}`;\n }\n if (arr.length > 6 && arr.length <= 9) {\n return this.placeHolderCharacter;\n }\n if (arr.length > 9 && arr.length <= 12) {\n return '';\n }\n return '';\n }\n\n private _checkForCpfCnpj(inputVal: string): string {\n const cpf =\n `${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `.${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `.${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `-${this.placeHolderCharacter}${this.placeHolderCharacter}`;\n const cnpj =\n `${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `.${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `.${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `/${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `-${this.placeHolderCharacter}${this.placeHolderCharacter}`;\n\n if (inputVal === '#') {\n return cpf;\n }\n const arr: string[] = [];\n for (let i = 0; i < inputVal.length; i++) {\n const value = inputVal[i] ?? '';\n if (!value) {\n continue;\n }\n if (value.match('\\\\d')) {\n arr.push(value);\n }\n }\n if (arr.length <= 3) {\n return cpf.slice(arr.length, cpf.length);\n }\n if (arr.length > 3 && arr.length <= 6) {\n return cpf.slice(arr.length + 1, cpf.length);\n }\n if (arr.length > 6 && arr.length <= 9) {\n return cpf.slice(arr.length + 2, cpf.length);\n }\n if (arr.length > 9 && arr.length < 11) {\n return cpf.slice(arr.length + 3, cpf.length);\n }\n if (arr.length === 11) {\n return '';\n }\n if (arr.length === 12) {\n if (inputVal.length === 17) {\n return cnpj.slice(16, cnpj.length);\n }\n return cnpj.slice(15, cnpj.length);\n }\n if (arr.length > 12 && arr.length <= 14) {\n return cnpj.slice(arr.length + 4, cnpj.length);\n }\n return '';\n }\n\n /**\n * Recursively determine the current active element by navigating the Shadow DOM until the Active Element is found.\n */\n private _getActiveElement(document: DocumentOrShadowRoot = this.document): Element | null {\n const shadowRootEl = document?.activeElement?.shadowRoot;\n if (!shadowRootEl?.activeElement) {\n return document.activeElement;\n } else {\n return this._getActiveElement(shadowRootEl);\n }\n }\n\n /**\n * Propogates the input value back to the Angular model by triggering the onChange function. It won't do this if writingValue\n * is true. If that is true it means we are currently in the writeValue function, which is supposed to only update the actual\n * DOM element based on the Angular model value. It should be a one way process, i.e. writeValue should not be modifying the Angular\n * model value too. Therefore, we don't trigger onChange in this scenario.\n * @param inputValue the current form input value\n */\n private formControlResult(inputValue: string): void {\n if (this.writingValue || (!this.triggerOnMaskChange && this.maskChanged)) {\n this.maskChanged = false;\n return;\n }\n if (Array.isArray(this.dropSpecialCharacters)) {\n this.onChange(\n this._toNumber(\n this._checkSymbols(\n this._removeMask(\n this._removeSuffix(this._removePrefix(inputValue)),\n this.dropSpecialCharacters\n )\n )\n )\n );\n } else if (this.dropSpecialCharacters) {\n this.onChange(\n this._toNumber(\n this._checkSymbols(this._removeSuffix(this._removePrefix(inputValue)))\n )\n );\n } else {\n this.onChange(this._toNumber(inputValue));\n }\n }\n\n private _toNumber(value: string | number | undefined | null) {\n if (!this.isNumberValue || value === '') {\n return value;\n }\n const num = Number(value);\n return Number.isNaN(num) ? value : num;\n }\n\n private _removeMask(value: string, specialCharactersForRemove: string[]): string {\n if (this.maskExpression.startsWith('percent') && value.includes('.')) {\n return value;\n }\n return value ? value.replace(this._regExpForRemove(specialCharactersForRemove), '') : value;\n }\n\n private _removePrefix(value: string): string {\n if (!this.prefix) {\n return value;\n }\n return value ? value.replace(this.prefix, '') : value;\n }\n\n private _removeSuffix(value: string): string {\n if (!this.suffix) {\n return value;\n }\n return value ? value.replace(this.suffix, '') : value;\n }\n\n private _retrieveSeparatorValue(result: string): string {\n const specialCharacters = Array.isArray(this.dropSpecialCharacters)\n ? this.specialCharacters.filter((v) => {\n return (this.dropSpecialCharacters as string[]).includes(v);\n })\n : this.specialCharacters;\n return this._removeMask(result, specialCharacters);\n }\n\n private _regExpForRemove(specialCharactersForRemove: string[]): RegExp {\n return new RegExp(\n specialCharactersForRemove.map((item: string) => `\\\\${item}`).join('|'),\n 'gi'\n );\n }\n\n private _replaceDecimalMarkerToDot(value: string): string {\n const markers = Array.isArray(this.decimalMarker)\n ? this.decimalMarker\n : [this.decimalMarker];\n\n return value.replace(this._regExpForRemove(markers), '.');\n }\n\n private _checkSymbols(result: string): string | number | undefined | null {\n if (result === '') {\n return result;\n }\n\n const separatorPrecision: number | null = this._retrieveSeparatorPrecision(\n this.maskExpression\n );\n const separatorValue: string = this._replaceDecimalMarkerToDot(\n this._retrieveSeparatorValue(result)\n );\n\n if (!this.isNumberValue) {\n return separatorValue;\n }\n if (separatorPrecision) {\n if (result === this.decimalMarker) {\n return null;\n }\n return this._checkPrecision(this.maskExpression, separatorValue);\n } else {\n return separatorValue;\n }\n }\n\n // TODO should think about helpers or separting decimal precision to own property\n private _retrieveSeparatorPrecision(maskExpretion: string): number | null {\n const matcher: RegExpMatchArray | null = maskExpretion.match(\n new RegExp(`^separator\\\\.([^d]*)`)\n );\n return matcher ? Number(matcher[1]) : null;\n }\n\n private _checkPrecision(separatorExpression: string, separatorValue: string): number | string {\n if (separatorExpression.indexOf('2') > 0) {\n return Number(separatorValue).toFixed(2);\n }\n return Number(separatorValue);\n }\n}\n","import { EnvironmentProviders, inject, makeEnvironmentProviders, Provider } from '@angular/core';\n\nimport {\n NGX_MASK_CONFIG,\n INITIAL_CONFIG,\n initialConfig,\n NEW_CONFIG,\n optionsConfig,\n} from './ngx-mask.config';\nimport { NgxMaskService } from './ngx-mask.service';\n\n/**\n * @internal\n */\nfunction _configFactory(): optionsConfig {\n const initConfig = inject<optionsConfig>(INITIAL_CONFIG);\n const configValue = inject<optionsConfig | (() => optionsConfig)>(NEW_CONFIG);\n\n return configValue instanceof Function\n ? { ...initConfig, ...configValue() }\n : { ...initConfig, ...configValue };\n}\n\nexport function provideNgxMask(configValue?: optionsConfig | (() => optionsConfig)): Provider[] {\n return [\n {\n provide: NEW_CONFIG,\n useValue: configValue,\n },\n {\n provide: INITIAL_CONFIG,\n useValue: initialConfig,\n },\n {\n provide: NGX_MASK_CONFIG,\n useFactory: _configFactory,\n },\n NgxMaskService,\n ];\n}\n\nexport function provideEnvironmentNgxMask(\n configValue?: optionsConfig | (() => optionsConfig)\n): EnvironmentProviders {\n return makeEnvironmentProviders(provideNgxMask(configValue));\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n Directive,\n EventEmitter,\n HostListener,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n inject,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n FormControl,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\n\nimport { CustomKeyboardEvent } from './custom-keyboard-event';\nimport { IConfig, NGX_MASK_CONFIG, timeMasks, withoutValidation } from './ngx-mask.config';\nimport { NgxMaskService } from './ngx-mask.service';\n\n@Directive({\n selector: 'input[mask], textarea[mask]',\n standalone: true,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: NgxMaskDirective,\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: NgxMaskDirective,\n multi: true,\n },\n NgxMaskService,\n ],\n exportAs: 'mask,ngxMask',\n})\nexport class NgxMaskDirective implements ControlValueAccessor, OnChanges, Validator {\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input('mask') public maskExpression: string | undefined | null = '';\n\n @Input() public specialCharacters: IConfig['specialCharacters'] = [];\n\n @Input() public patterns: IConfig['patterns'] = {};\n\n @Input() public prefix: IConfig['prefix'] = '';\n\n @Input() public suffix: IConfig['suffix'] = '';\n\n @Input() public thousandSeparator: IConfig['thousandSeparator'] = ' ';\n\n @Input() public decimalMarker: IConfig['decimalMarker'] = '.';\n\n @Input() public dropSpecialCharacters: IConfig['dropSpecialCharacters'] | null = null;\n\n @Input() public hiddenInput: IConfig['hiddenInput'] | null = null;\n\n @Input() public showMaskTyped: IConfig['showMaskTyped'] | null = null;\n\n @Input() public placeHolderCharacter: IConfig['placeHolderCharacter'] | null = null;\n\n @Input() public shownMaskExpression: IConfig['shownMaskExpression'] | null = null;\n\n @Input() public showTemplate: IConfig['showTemplate'] | null = null;\n\n @Input() public clearIfNotMatch: IConfig['clearIfNotMatch'] | null = null;\n\n @Input() public validation: IConfig['validation'] | null = null;\n\n @Input() public separatorLimit: IConfig['separatorLimit'] | null = null;\n\n @Input() public allowNegativeNumbers: IConfig['allowNegativeNumbers'] | null = null;\n\n @Input() public leadZeroDateTime: IConfig['leadZeroDateTime'] | null = null;\n\n @Input() public triggerOnMaskChange: IConfig['triggerOnMaskChange'] | null = null;\n\n @Output() public maskFilled: IConfig['maskFilled'] = new EventEmitter<void>();\n\n private _maskValue = '';\n\n private _inputValue!: string;\n\n private _position: number | null = null;\n\n private _start!: number;\n\n private _end!: number;\n\n private _code!: string;\n\n private _maskExpressionArray: string[] = [];\n\n private _justPasted = false;\n\n /**For IME composition event */\n private _isComposing = false;\n\n private readonly document = inject(DOCUMENT);\n\n public _maskService = inject(NgxMaskService, { self: true });\n\n protected _config = inject<IConfig>(NGX_MASK_CONFIG);\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any\n public onChange = (_: any) => {};\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n public onTouch = () => {};\n\n public ngOnChanges(changes: SimpleChanges): void {\n const {\n maskExpression,\n specialCharacters,\n patterns,\n prefix,\n suffix,\n thousandSeparator,\n decimalMarker,\n dropSpecialCharacters,\n hiddenInput,\n showMaskTyped,\n placeHolderCharacter,\n shownMaskExpression,\n showTemplate,\n clearIfNotMatch,\n validation,\n separatorLimit,\n allowNegativeNumbers,\n leadZeroDateTime,\n triggerOnMaskChange,\n } = changes;\n if (maskExpression) {\n if (\n maskExpression.currentValue !== maskExpression.previousValue &&\n !maskExpression.firstChange\n ) {\n this._maskService.maskChanged = true;\n }\n if (allowNegativeNumbers) {\n this._maskService.allowNegativeNumbers = allowNegativeNumbers.currentValue;\n if (this._maskService.allowNegativeNumbers) {\n this._maskService.specialCharacters =\n this._maskService.specialCharacters.filter((c: string) => c !== '-');\n }\n }\n if (maskExpression.currentValue && maskExpression.currentValue.split('||').length > 1) {\n this._maskExpressionArray = maskExpression.currentValue\n .split('||')\n .sort((a: string, b: string) => {\n return a.length - b.length;\n });\n this._setMask();\n } else {\n this._maskExpressionArray = [];\n this._maskValue = maskExpression.currentValue || '';\n this._maskService.maskExpression = this._maskValue;\n }\n }\n if (specialCharacters) {\n if (!specialCharacters.currentValue || !Array.isArray(specialCharacters.currentValue)) {\n return;\n } else {\n this._maskService.specialCharacters = specialCharacters.currentValue || [];\n }\n }\n // Only overwrite the mask available patterns if a pattern has actually been passed in\n if (patterns && patterns.currentValue) {\n this._maskService.patterns = patterns.currentValue;\n }\n if (prefix) {\n this._maskService.prefix = prefix.currentValue;\n }\n if (suffix) {\n this._maskService.suffix = suffix.currentValue;\n }\n if (thousandSeparator) {\n this._maskService.thousandSeparator = thousandSeparator.currentValue;\n }\n if (decimalMarker) {\n this._maskService.decimalMarker = decimalMarker.currentValue;\n }\n if (dropSpecialCharacters) {\n this._maskService.dropSpecialCharacters = dropSpecialCharacters.currentValue;\n }\n if (hiddenInput) {\n this._maskService.hiddenInput = hiddenInput.currentValue;\n }\n if (showMaskTyped) {\n this._maskService.showMaskTyped = showMaskTyped.currentValue;\n }\n if (placeHolderCharacter) {\n this._maskService.placeHolderCharacter = placeHolderCharacter.currentValue;\n }\n if (shownMaskExpression) {\n this._maskService.shownMaskExpression = shownMaskExpression.currentValue;\n }\n if (showTemplate) {\n this._maskService.showTemplate = showTemplate.currentValue;\n }\n if (clearIfNotMatch) {\n this._maskService.clearIfNotMatch = clearIfNotMatch.currentValue;\n }\n if (validation) {\n this._maskService.validation = validation.currentValue;\n }\n if (separatorLimit) {\n this._maskService.separatorLimit = separatorLimit.currentValue;\n }\n if (leadZeroDateTime) {\n this._maskService.leadZeroDateTime = leadZeroDateTime.currentValue;\n }\n if (triggerOnMaskChange) {\n this._maskService.triggerOnMaskChange = triggerOnMaskChange.currentValue;\n }\n\n this._applyMask();\n }\n\n // eslint-disable-next-line complexity\n public validate({ value }: FormControl): ValidationErrors | null {\n if (!this._maskService.validation || !this._maskValue) {\n return null;\n }\n if (this._maskService.ipError) {\n return this._createValidationError(value);\n }\n if (this._maskService.cpfCnpjError) {\n return this._createValidationError(value);\n }\n if (this._maskValue.startsWith('separator')) {\n return null;\n }\n if (withoutValidation.includes(this._maskValue)) {\n return null;\n }\n if (this._maskService.clearIfNotMatch) {\n return null;\n }\n if (timeMasks.includes(this._maskValue)) {\n return this._validateTime(value);\n }\n if (value && value.toString().length >= 1) {\n let counterOfOpt = 0;\n for (const key in this._maskService.patterns) {\n if (this._maskService.patterns[key]?.optional) {\n if (this._maskValue.indexOf(key) !== this._maskValue.lastIndexOf(key)) {\n const opt: string = this._maskValue\n .split('')\n .filter((i: string) => i === key)\n .join('');\n counterOfOpt += opt.length;\n } else if (this._maskValue.indexOf(key) !== -1) {\n counterOfOpt++;\n }\n if (\n this._maskValue.indexOf(key) !== -1 &&\n value.toString().length >= this._maskValue.indexOf(key)\n ) {\n return null;\n }\n if (counterOfOpt === this._maskValue.length) {\n return null;\n }\n }\n }\n if (\n this._maskValue.indexOf('{') === 1 &&\n value.toString().length ===\n this._maskValue.length +\n Number((this._maskValue.split('{')[1] ?? '').split('}')[0]) -\n 4\n ) {\n return null;\n }\n if (this._maskValue.indexOf('*') === 1 || this._maskValue.indexOf('?') === 1) {\n return null;\n } else if (\n (this._maskValue.indexOf('*') > 1 &&\n value.toString().length < this._maskValue.indexOf('*')) ||\n (this._maskValue.indexOf('?') > 1 &&\n value.toString().length < this._maskValue.indexOf('?')) ||\n this._maskValue.indexOf('{') === 1\n ) {\n return this._createValidationError(value);\n }\n if (this._maskValue.indexOf('*') === -1 || this._maskValue.indexOf('?') === -1) {\n const length: number = this._maskService.dropSpecialCharacters\n ? this._maskValue.length -\n this._maskService.checkSpecialCharAmount(this._maskValue) -\n counterOfOpt\n : this._maskValue.length - counterOfOpt;\n if (value.toString().length < length) {\n return this._createValidationError(value);\n }\n }\n }\n if (value) {\n this.maskFilled.emit();\n return null;\n }\n return null;\n }\n\n @HostListener('paste')\n public onPaste() {\n this._justPasted = true;\n }\n\n @HostListener('ngModelChange', ['$event'])\n public onModelChange(value: string | undefined | null | number): void {\n // on form reset we need to update the actualValue\n if (\n (value === '' || value === null || value === undefined) &&\n this._maskService.actualValue\n ) {\n this._maskService.actualValue = this._maskService.getActualValue('');\n }\n }\n\n @HostListener('input', ['$event'])\n public onInput(e: CustomKeyboardEvent): void {\n // If IME is composing text, we wait for the composed text.\n if (this._isComposing) return;\n\n const el: HTMLInputElement = e.target as HTMLInputElement;\n this._inputValue = el.value;\n\n this._setMask();\n\n if (!this._maskValue) {\n this.onChange(el.value);\n return;\n }\n let position: number =\n el.selectionStart === 1\n ? (el.selectionStart as number) + this._maskService.prefix.length\n : (el.selectionStart as number);\n\n let caretShift = 0;\n let backspaceShift = false;\n this._maskService.applyValueChanges(\n position,\n this._justPasted,\n this._code === 'Backspace' || this._code === 'Delete',\n (shift: number, _backspaceShift: boolean) => {\n this._justPasted = false;\n caretShift = shift;\n backspaceShift = _backspaceShift;\n }\n );\n // only set the selection if the element is active\n if (this._getActiveElement() !== el) {\n return;\n }\n\n // update position after applyValueChanges to prevent cursor on wrong position when it has an array of maskExpression\n if (this._maskExpressionArray.length) {\n position =\n el.selectionStart === 1\n ? (el.selectionStart as number) + this._maskService.prefix.length\n : (el.selectionStart as number);\n }\n\n this._position =\n this._position === 1 && this._inputValue.length === 1 ? null : this._position;\n\n let positionToApply: number = this._position\n ? this._inputValue.length + position + caretShift\n : position + (this._code === 'Backspace' && !backspaceShift ? 0 : caretShift);\n if (positionToApply > this._getActualInputLength()) {\n positionToApply = this._getActualInputLength();\n }\n if (positionToApply < 0) {\n positionToApply = 0;\n }\n el.setSelectionRange(positionToApply, positionToApply);\n this._position = null;\n }\n\n // IME starts\n @HostListener('compositionstart', ['$event'])\n public onCompositionStart(): void {\n this._isComposing = true;\n }\n\n // IME completes\n @HostListener('compositionend', ['$event'])\n public onCompositionEnd(e: CustomKeyboardEvent): void {\n this._isComposing = false;\n this._justPasted = true;\n this.onInput(e);\n }\n\n @HostListener('blur')\n public onBlur(): void {\n if (this._maskValue) {\n this._maskService.clearIfNotMatchFn();\n }\n this.onTouch();\n }\n\n @HostListener('click', ['$event'])\n public onClick(e: MouseEvent | CustomKeyboardEvent): void {\n if (!this._maskValue) {\n return;\n }\n const el: HTMLInputElement = e.target as HTMLInputElement;\n const posStart = 0;\n const posEnd = 0;\n if (\n el !== null &&\n el.selectionStart !== null &&\n el.selectionStart === el.selectionEnd &&\n el.selectionStart > this._maskService.prefix.length &&\n // eslint-disable-next-line\n (e as any).keyCode !== 38\n ) {\n if (this._maskService.showMaskTyped) {\n // We are showing the mask in the input\n this._maskService.maskIsShown = this._maskService.showMaskInInput();\n if (\n el.setSelectionRange &&\n this._maskService.prefix + this._maskService.maskIsShown === el.value\n ) {\n // the input ONLY contains the mask, so position the cursor at the start\n el.focus();\n el.setSelectionRange(posStart, posEnd);\n } else {\n // the input contains some characters already\n if (el.selectionStart > this._maskService.actualValue.length) {\n // if the user clicked beyond our value's length, position the cursor at the end of our value\n el.setSelectionRange(\n this._maskService.actualValue.length,\n this._maskService.actualValue.length\n );\n }\n }\n }\n }\n const nextValue: string | null =\n el &&\n (!el.value || el.value === this._maskService.prefix\n ? this._maskService.prefix + this._maskService.maskIsShown\n : el.value);\n /** Fix of cursor position jumping to end in most browsers no matter where cursor is inserted onFocus */\n if (el && el.value !== nextValue) {\n el.value = nextValue;\n }\n\n /** fix of cursor position with prefix when mouse click occur */\n if (\n el &&\n ((el.selectionStart as number) || (el.selectionEnd as number)) <=\n this._maskService.prefix.length\n ) {\n el.selectionStart = this._maskService.prefix.length;\n return;\n }\n /** select only inserted text */\n if (el && (el.selectionEnd as number) > this._getActualInputLength()) {\n el.selectionEnd = this._getActualInputLength();\n }\n }\n\n // eslint-disable-next-line complexity\n @HostListener('keydown', ['$event'])\n public onKeyDown(e: CustomKeyboardEvent): void {\n if (!this._maskValue) {\n return;\n }\n\n if (this._isComposing) {\n // User finalize their choice from IME composition, so trigger onInput() for the composed text.\n if (e.key === 'Enter') this.onCompositionEnd(e);\n return;\n }\n\n this._code = e.code ? e.code : e.key;\n const el: HTMLInputElement = e.target as HTMLInputElement;\n this._inputValue = el.value;\n\n this._setMask();\n\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n }\n\n if (e.key === 'ArrowLeft' || e.key === 'Backspace' || e.key === 'Delete') {\n if (e.key === 'Backspace' && el.value.length === 0) {\n el.selectionStart = el.selectionEnd;\n }\n if (e.key === 'Backspace' && (el.selectionStart as number) !== 0) {\n // If specialChars is false, (shouldn't ever happen) then set to the defaults\n this.specialCharacters = this.specialCharacters?.length\n ? this.specialCharacters\n : this._config.specialCharacters;\n if (this.prefix.length > 1 && (el.selectionStart as number) <= this.prefix.length) {\n el.setSelectionRange(this.prefix.length, el.selectionEnd);\n } else {\n if (\n this._inputValue.length !== (el.selectionStart as number) &&\n (el.selectionStart as number) !== 1\n ) {\n while (\n this.specialCharacters.includes(\n (\n this._inputValue[(el.selectionStart as number) - 1] ?? ''\n ).toString()\n ) &&\n ((this.prefix.length >= 1 &&\n (el.selectionStart as number) > this.prefix.length) ||\n this.prefix.length === 0)\n ) {\n el.setSelectionRange(\n (el.selectionStart as number) - 1,\n el.selectionEnd\n );\n }\n }\n }\n }\n this.checkSelectionOnDeletion(el);\n if (\n this._maskService.prefix.length &&\n (el.selectionStart as number) <= this._maskService.prefix.length &&\n (el.selectionEnd as number) <= this._maskService.prefix.length\n ) {\n e.preventDefault();\n }\n const cursorStart: number | null = el.selectionStart;\n if (\n e.key === 'Backspace' &&\n !el.readOnly &&\n cursorStart === 0 &&\n el.selectionEnd === el.value.length &&\n el.value.length !== 0\n ) {\n this._position = this._maskService.prefix ? this._maskService.prefix.length : 0;\n this._maskService.applyMask(\n this._maskService.prefix,\n this._maskService.maskExpression,\n this._position\n );\n }\n }\n if (\n !!this.suffix &&\n this.suffix.length > 1 &&\n this._inputValue.length - this.suffix.length < (el.selectionStart as number)\n ) {\n el.setSelectionRange(\n this._inputValue.length - this.suffix.length,\n this._inputValue.length\n );\n } else if (\n (e.code === 'KeyA' && e.ctrlKey) ||\n (e.code === 'KeyA' && e.metaKey) // Cmd + A (Mac)\n ) {\n el.setSelectionRange(0, this._getActualInputLength());\n e.preventDefault();\n }\n this._maskService.selStart = el.selectionStart;\n this._maskService.selEnd = el.selectionEnd;\n }\n\n /** It writes the value in the input */\n public async writeValue(\n inputValue: string | number | { value: string | number; disable?: boolean }\n ): Promise<void> {\n if (typeof inputValue === 'object' && inputValue !== null && 'value' in inputValue) {\n if ('disable' in inputValue) {\n this.setDisabledState(Boolean(inputValue.disable));\n }\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue.value;\n }\n\n if (typeof inputValue === 'number' || this._maskValue.startsWith('separator')) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this._maskService.numberToString(inputValue);\n if (!Array.isArray(this._maskService.decimalMarker)) {\n const localeDecimalMarker = this._currentLocaleDecimalMarker();\n // eslint-disable-next-line no-param-reassign\n inputValue =\n this._maskService.decimalMarker !== localeDecimalMarker\n ? inputValue.replace(localeDecimalMarker, this._maskService.decimalMarker)\n : inputValue;\n }\n this._maskService.isNumberValue = true;\n }\n\n if (typeof inputValue !== 'string') {\n // eslint-disable-next-line no-param-reassign\n inputValue = '';\n }\n\n this._inputValue = inputValue;\n this._setMask();\n\n if (\n (inputValue && this._maskService.maskExpression) ||\n (this._maskService.maskExpression &&\n (this._maskService.prefix || this._maskService.showMaskTyped))\n ) {\n // Let the service we know we are writing value so that triggering onChange function won't happen during applyMask\n this._maskService.writingValue = true;\n this._maskService.formElementProperty = [\n 'value',\n this._maskService.applyMask(inputValue, this._maskService.maskExpression),\n ];\n // Let the service know we've finished writing value\n this._maskService.writingValue = false;\n } else {\n this._maskService.formElementProperty = ['value', inputValue];\n }\n this._inputValue = inputValue;\n }\n\n public registerOnChange(fn: typeof this.onChange): void {\n this._maskService.onChange = this.onChange = fn;\n }\n\n public registerOnTouched(fn: typeof this.onTouch): void {\n this.onTouch = fn;\n }\n\n private _getActiveElement(document: DocumentOrShadowRoot = this.document): Element | null {\n const shadowRootEl = document?.activeElement?.shadowRoot;\n if (!shadowRootEl?.activeElement) {\n return document.activeElement;\n } else {\n return this._getActiveElement(shadowRootEl);\n }\n }\n\n public checkSelectionOnDeletion(el: HTMLInputElement): void {\n el.selectionStart = Math.min(\n Math.max(this.prefix.length, el.selectionStart as number),\n this._inputValue.length - this.suffix.length\n );\n el.selectionEnd = Math.min(\n Math.max(this.prefix.length, el.selectionEnd as number),\n this._inputValue.length - this.suffix.length\n );\n }\n\n /** It disables the input element */\n public setDisabledState(isDisabled: boolean): void {\n this._maskService.formElementProperty = ['disabled', isDisabled];\n }\n\n private _repeatPatternSymbols(maskExp: string): string {\n return (\n (maskExp.match(/{[0-9]+}/) &&\n maskExp\n .split('')\n .reduce((accum: string, currVal: string, index: number): string => {\n this._start = currVal === '{' ? index : this._start;\n\n if (currVal !== '}') {\n return this._maskService._findSpecialChar(currVal)\n ? accum + currVal\n : accum;\n }\n this._end = index;\n const repeatNumber = Number(maskExp.slice(this._start + 1, this._end));\n const replaceWith: string = new Array(repeatNumber + 1).join(\n maskExp[this._start - 1]\n );\n return accum + replaceWith;\n }, '')) ||\n maskExp\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _applyMask(): any {\n this._maskService.maskExpression = this._repeatPatternSymbols(this._maskValue || '');\n this._maskService.formElementProperty = [\n 'value',\n this._maskService.applyMask(this._inputValue, this._maskService.maskExpression),\n ];\n }\n\n private _validateTime(value: string): ValidationErrors | null {\n const rowMaskLen: number = this._maskValue\n .split('')\n .filter((s: string) => s !== ':').length;\n if (!value) {\n return null; // Don't validate empty values to allow for optional form control\n }\n\n if (\n (+(value[value.length - 1] ?? -1) === 0 && value.length < rowMaskLen) ||\n value.length <= rowMaskLen - 2\n ) {\n return this._createValidationError(value);\n }\n\n return null;\n }\n\n private _getActualInputLength() {\n return (\n this._maskService.actualValue.length ||\n this._maskService.actualValue.length + this._maskService.prefix.length\n );\n }\n\n private _createValidationError(actualValue: string): ValidationErrors {\n return {\n mask: {\n requiredMask: this._maskValue,\n actualValue,\n },\n };\n }\n\n private _setMask() {\n if (this._maskExpressionArray.length > 0) {\n this._maskExpressionArray.some((mask): boolean | void => {\n const test =\n this._maskService.removeMask(this._inputValue)?.length <=\n this._maskService.removeMask(mask)?.length;\n if (this._inputValue && test) {\n this._maskValue = mask;\n this.maskExpression = mask;\n this._maskService.maskExpression = mask;\n return test;\n } else {\n const expression =\n this._maskExpressionArray[this._maskExpressionArray.length - 1] ?? '';\n this._maskValue =\n this.maskExpression =\n this._maskService.maskExpression =\n expression;\n }\n });\n }\n }\n\n private _currentLocaleDecimalMarker(): string {\n return (1.1).toLocaleString().substring(1, 2);\n }\n}\n","import { inject, Pipe, PipeTransform } from '@angular/core';\n\nimport { IConfig } from './ngx-mask.config';\nimport { NgxMaskService } from './ngx-mask.service';\n\n@Pipe({\n name: 'mask',\n pure: true,\n standalone: true,\n})\nexport class NgxMaskPipe implements PipeTransform {\n private readonly defaultOptions: Partial<IConfig> = {};\n\n private readonly _maskService = inject(NgxMaskService);\n\n public transform(\n value: string | number,\n mask: string,\n { patterns, ...config }: Partial<IConfig> = {} as Partial<IConfig>\n ): string {\n const currentConfig = {\n maskExpression: mask,\n ...this.defaultOptions,\n ...config,\n patterns: {\n ...this._maskService.patterns,\n ...patterns,\n },\n };\n Object.entries(currentConfig).forEach(([key, value]) => {\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this._maskService as any)[key] = value;\n });\n return this._maskService.applyMask(`${value}`, mask);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;MA+Ba,eAAe,GAA4B,IAAI,cAAc,CAAC,iBAAiB,EAAE;MACjF,UAAU,GAA4B,IAAI,cAAc,CAAC,qBAAqB,EAAE;MAChF,cAAc,GAA4B,IAAI,cAAc,CACrE,yBAAyB,EAC3B;AAEW,MAAA,aAAa,GAAY;AAClC,IAAA,MAAM,EAAE,EAAE;AACV,IAAA,MAAM,EAAE,EAAE;AACV,IAAA,iBAAiB,EAAE,GAAG;AACtB,IAAA,aAAa,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;AACzB,IAAA,eAAe,EAAE,KAAK;AACtB,IAAA,YAAY,EAAE,KAAK;AACnB,IAAA,aAAa,EAAE,KAAK;AACpB,IAAA,oBAAoB,EAAE,GAAG;AACzB,IAAA,qBAAqB,EAAE,IAAI;AAC3B,IAAA,WAAW,EAAE,SAAS;AACtB,IAAA,mBAAmB,EAAE,EAAE;AACvB,IAAA,cAAc,EAAE,EAAE;AAClB,IAAA,oBAAoB,EAAE,KAAK;AAC3B,IAAA,UAAU,EAAE,IAAI;;AAEhB,IAAA,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACzF,IAAA,gBAAgB,EAAE,KAAK;AACvB,IAAA,mBAAmB,EAAE,KAAK;IAC1B,UAAU,EAAE,IAAI,YAAY,EAAQ;AACpC,IAAA,QAAQ,EAAE;AACN,QAAA,GAAG,EAAE;AACD,YAAA,OAAO,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC;AAC7B,SAAA;AACD,QAAA,GAAG,EAAE;AACD,YAAA,OAAO,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC;AAC1B,YAAA,QAAQ,EAAE,IAAI;AACjB,SAAA;AACD,QAAA,CAAC,EAAE;AACC,YAAA,OAAO,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC;AAC1B,YAAA,MAAM,EAAE,GAAG;AACd,SAAA;AACD,QAAA,CAAC,EAAE;AACC,YAAA,OAAO,EAAE,IAAI,MAAM,CAAC,aAAa,CAAC;AACrC,SAAA;AACD,QAAA,CAAC,EAAE;AACC,YAAA,OAAO,EAAE,IAAI,MAAM,CAAC,UAAU,CAAC;AAClC,SAAA;AACD,QAAA,CAAC,EAAE;AACC,YAAA,OAAO,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC;AAC/B,SAAA;AACD,QAAA,CAAC,EAAE;AACC,YAAA,OAAO,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC;AAC/B,SAAA;AACD,QAAA,CAAC,EAAE;AACC,YAAA,OAAO,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC;AAC7B,SAAA;AACD,QAAA,CAAC,EAAE;AACC,YAAA,OAAO,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC;AAC7B,SAAA;AACD,QAAA,CAAC,EAAE;AACC,YAAA,OAAO,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC;AAC7B,SAAA;AACD,QAAA,CAAC,EAAE;AACC,YAAA,OAAO,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC;AAC7B,SAAA;AACD,QAAA,CAAC,EAAE;AACC,YAAA,OAAO,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC;AAC7B,SAAA;AACD,QAAA,CAAC,EAAE;AACC,YAAA,OAAO,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC;AAC7B,SAAA;AACJ,KAAA;EACH;AAEW,MAAA,SAAS,GAAa,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE;AAErD,MAAA,iBAAiB,GAAa;IACvC,SAAS;IACT,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,WAAW;IACX,YAAY;IACZ,OAAO;IACP,IAAI;IACJ,IAAI;;;AC9GR,MACa,qBAAqB,CAAA;AADlC,IAAA,WAAA,GAAA;AAEc,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAU,eAAe,CAAC,CAAC;AAE9C,QAAA,IAAA,CAAA,qBAAqB,GACxB,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC;AAEhC,QAAA,IAAA,CAAA,WAAW,GAA2B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;AAI/D,QAAA,IAAA,CAAA,eAAe,GAA+B,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;AAE3E,QAAA,IAAA,CAAA,iBAAiB,GAAiC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC;AAEjF,QAAA,IAAA,CAAA,QAAQ,GAAwB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;AAEtD,QAAA,IAAA,CAAA,MAAM,GAAsB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;AAEhD,QAAA,IAAA,CAAA,MAAM,GAAsB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;AAEhD,QAAA,IAAA,CAAA,iBAAiB,GAAiC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC;AAEjF,QAAA,IAAA,CAAA,aAAa,GAA6B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;AAIrE,QAAA,IAAA,CAAA,aAAa,GAA6B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;AAErE,QAAA,IAAA,CAAA,oBAAoB,GACvB,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC;AAE/B,QAAA,IAAA,CAAA,UAAU,GAA0B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;AAE5D,QAAA,IAAA,CAAA,cAAc,GAA8B,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;AAExE,QAAA,IAAA,CAAA,oBAAoB,GACvB,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC;AAE/B,QAAA,IAAA,CAAA,gBAAgB,GAAgC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;AAE7E,QAAA,IAAA,CAAA,MAAM,GAAgB,IAAI,GAAG,EAAE,CAAC;QAEjC,IAAc,CAAA,cAAA,GAAG,EAAE,CAAC;QAEpB,IAAW,CAAA,WAAA,GAAG,EAAE,CAAC;QAEjB,IAAmB,CAAA,mBAAA,GAAG,EAAE,CAAC;QA4fxB,IAAqB,CAAA,qBAAA,GAAG,CAC5B,GAAW,EACX,qBAA6B,EAC7B,YAA+B,EAC/B,SAAiB,KACjB;YACA,IAAI,CAAC,GAAa,EAAE,CAAC;YACrB,IAAI,WAAW,GAAG,EAAE,CAAC;AACrB,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;AAC7B,gBAAA,MAAM,MAAM,GAAG,IAAI,MAAM,CACrB,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAK,EAAA,EAAA,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CACrF,CAAC;AACF,gBAAA,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACtB,gBAAA,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9C,aAAA;AAAM,iBAAA;AACH,gBAAA,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBAC5B,WAAW,GAAG,YAAY,CAAC;AAC9B,aAAA;YACD,MAAM,QAAQ,GAAW,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAA,EAAG,WAAW,CAAG,EAAA,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;YACrE,IAAI,GAAG,GAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7B,YAAA,MAAM,cAAc,GAAW,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACtE,YAAA,IAAI,cAAc,IAAI,CAAC,cAAc,EAAE;AACnC,gBAAA,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;oBAChB,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAA,CAAE,CAAC;AACxE,iBAAA;AAAM,qBAAA;oBACH,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;AAC7C,iBAAA;AACJ,aAAA;YACD,MAAM,GAAG,GAAG,cAAc,CAAC;YAE3B,OAAO,qBAAqB,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AAC3C,gBAAA,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,GAAG,qBAAqB,GAAG,IAAI,CAAC,CAAC;AAC/D,aAAA;YAED,IAAI,SAAS,KAAK,SAAS,EAAE;gBACzB,OAAO,GAAG,GAAG,QAAQ,CAAC;AACzB,aAAA;iBAAM,IAAI,SAAS,KAAK,CAAC,EAAE;AACxB,gBAAA,OAAO,GAAG,CAAC;AACd,aAAA;AACD,YAAA,OAAO,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;AACtD,SAAC,CAAC;AAEM,QAAA,IAAA,CAAA,UAAU,GAAG,CAAC,GAAW,KAAa;AAC1C,YAAA,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;AAClD,SAAC,CAAC;AAEM,QAAA,IAAA,CAAA,YAAY,GAAG,CAAC,cAAsB,KAAY;YACtD,MAAM,CAAC,GAAa,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC9C,YAAA,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;gBACd,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AAClC,aAAA;AAED,YAAA,OAAO,QAAQ,CAAC;AACpB,SAAC,CAAC;AAEM,QAAA,IAAA,CAAA,oBAAoB,GAAG,CAAC,UAAkB,KAAY;AAC1D,YAAA,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAC/C,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC7D,gBAAA,IACI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC3B,oBAAA,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC;AAC7B,qBAAC,CAAC,GAAG,CAAC,GAAG,CAAC;wBACN,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAC9E;oBACE,OAAO,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACzC,iBAAA;AACJ,aAAA;AACD,YAAA,OAAO,UAAU,CAAC;AACtB,SAAC,CAAC;QAEM,IAAmB,CAAA,mBAAA,GAAG,CAC1B,UAAkB,EAClB,SAAiB,EACjB,aAAuC,KAC/B;YACR,IAAI,SAAS,GAAG,QAAQ,EAAE;;AAEtB,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;AAC9B,oBAAA,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC,iBAAiB,CAAC,CAAC;;AAEzE,oBAAA,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;AACtD,iBAAA;AACD,gBAAA,MAAM,cAAc,GAAG,IAAI,MAAM,CAC7B,IAAI,CAAC,uBAAuB,CAAC,aAAa,CAAC,GAAG,CAAA,IAAA,EAAO,SAAS,CAAA,IAAA,CAAM,CACvE,CAAC;gBAEF,MAAM,cAAc,GAA4B,UAAU,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;AACjF,gBAAA,MAAM,oBAAoB,GAAW,CAAC,cAAc,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,CAAC;AACxF,gBAAA,IAAI,oBAAoB,GAAG,CAAC,GAAG,SAAS,EAAE;AACtC,oBAAA,MAAM,IAAI,GAAG,oBAAoB,GAAG,CAAC,GAAG,SAAS,CAAC;;AAElD,oBAAA,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAClE,iBAAA;gBACD,IACI,SAAS,KAAK,CAAC;AACf,oBAAA,IAAI,CAAC,kBAAkB,CACnB,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,EACjC,aAAa,EACb,IAAI,CAAC,iBAAiB,CACzB,EACH;;AAEE,oBAAA,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC/D,iBAAA;AACJ,aAAA;AACD,YAAA,OAAO,UAAU,CAAC;AACtB,SAAC,CAAC;AAwDL,KAAA;IAzpBU,oBAAoB,CACvB,UAAkB,EAClB,cAA6C,EAAA;AAE7C,QAAA,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,cAAc,CAAC;AAC7C,QAAA,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;KAC3C;AAEM,IAAA,SAAS,CACZ,UAAwD,EACxD,cAAsB,EACtB,QAAQ,GAAG,CAAC,EACZ,UAAU,GAAG,KAAK,EAClB,UAAU,GAAG,KAAK;;IAElB,EAA8B,GAAA,MAAK,GAAG,EAAA;AAEtC,QAAA,IAAI,CAAC,cAAc,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;AACnD,YAAA,OAAO,EAAE,CAAC;AACb,SAAA;QACD,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,QAAQ,GAAG,KAAK,CAAC;AACrB,QAAA,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE;;AAEzD,YAAA,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;AACxE,SAAA;QACD,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,UAAU,EAAE,MAAM,GAAG,CAAC,EAAE;;AAEzC,YAAA,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;AACtD,SAAA;QACD,MAAM,UAAU,GAAa,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC7D,QAAA,IAAI,IAAI,CAAC,oBAAoB,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE;;YAE3E,MAAM,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;AAClD,SAAA;QACD,IAAI,cAAc,KAAK,IAAI,EAAE;YACzB,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;;YAEvC,cAAc,GAAG,iBAAiB,CAAC;AACtC,SAAA;QACD,MAAM,GAAG,GAAa,EAAE,CAAC;AACzB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACxC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE;gBAC7B,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACjC,aAAA;AACJ,SAAA;QACD,IAAI,cAAc,KAAK,UAAU,EAAE;AAC/B,YAAA,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,MAAM,KAAK,EAAE,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,CAAC;AAC3D,YAAA,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,EAAE;;gBAEjB,cAAc,GAAG,oBAAoB,CAAC;AACzC,aAAA;AAAM,iBAAA;;gBAEH,cAAc,GAAG,gBAAgB,CAAC;AACrC,aAAA;AACJ,SAAA;AACD,QAAA,IAAI,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;AACtC,YAAA,IACI,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC;;AAE/B,gBAAA,UAAU,CAAC,KAAK,CAAC,oCAAoC,CAAC,EACxD;;AAEE,gBAAA,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;gBAC9C,MAAM,SAAS,GAAW,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;;AAE5D,gBAAA,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;AACpF,aAAA;AACD,YAAA,IACI,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;AAC3B,gBAAA,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EACpE;AACE,gBAAA,IAAI,IAAI,GAAW,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACxE,gBAAA,IAAI,IAAI,CAAC,oBAAoB,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE;AAC3E,oBAAA,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3D,iBAAA;;gBAED,UAAU,GAAG,GAAG,IAAI,CAAA,EAAG,UAAU,CAAC,SAAS,CACvC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,EACvB,UAAU,CAAC,MAAM,CACpB,EAAE,CAAC;AACP,aAAA;YACD,IAAI,KAAK,GAAG,EAAE,CAAC;AACf,YAAA,IAAI,CAAC,oBAAoB,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG;AACrE,mBAAG,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;AACnE,mBAAG,KAAK,GAAG,UAAU,CAAC,CAAC;AAC3B,YAAA,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;gBACxB,MAAM,GAAG,UAAU,CAAC;AACvB,aAAA;AAAM,iBAAA;AACH,gBAAA,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3D,aAAA;AACJ,SAAA;AAAM,aAAA,IAAI,cAAc,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE;AAC/C,YAAA,IACI,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC;AAC7B,gBAAA,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;AAC3B,gBAAA,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC;AAC/B,gBAAA,UAAU,CAAC,KAAK,CAAC,sCAAsC,CAAC;AACxD,gBAAA,UAAU,CAAC,KAAK,CAAC,eAAe,CAAC,EACnC;;AAEE,gBAAA,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;AACjD,aAAA;;YAED,UAAU;gBACN,UAAU,CAAC,MAAM,GAAG,CAAC;AACrB,oBAAA,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG;AACrB,oBAAA,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,iBAAiB;AACxC,oBAAA,CAAC,IAAI,CAAC,kBAAkB,CACpB,UAAU,CAAC,CAAC,CAAC,EACb,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,iBAAiB,CACzB;AACD,oBAAA,CAAC,UAAU;AACP,sBAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;sBAC1C,UAAU,CAAC;AACrB,YAAA,IAAI,UAAU,EAAE;;gBAEZ,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAChC,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,EACjC,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,iBAAiB,CACzB;AACG,sBAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;sBAC1C,UAAU,CAAC;AACpB,aAAA;;;YAID,MAAM,4BAA4B,GAAW,IAAI,CAAC,uBAAuB,CACrE,IAAI,CAAC,iBAAiB,CACzB,CAAC;YACF,IAAI,YAAY,GAAW,0CAA0C,CAAC,OAAO,CACzE,4BAA4B,EAC5B,EAAE,CACL,CAAC;;YAEF,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;AACnC,gBAAA,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,aAAa,EAAE;AACrC,oBAAA,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;AACjF,iBAAA;AACJ,aAAA;AAAM,iBAAA;AACH,gBAAA,YAAY,GAAG,YAAY,CAAC,OAAO,CAC/B,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,aAAa,CAAC,EAChD,EAAE,CACL,CAAC;AACL,aAAA;YAED,MAAM,iBAAiB,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,YAAY,GAAG,GAAG,CAAC,CAAC;AAE/D,YAAA,IACI,UAAU,CAAC,KAAK,CAAC,iBAAiB,CAAC;AACnC,iBAAC,UAAU,CAAC,MAAM,KAAK,CAAC;AACpB,oBAAA,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,EACtF;;AAEE,gBAAA,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC/D,aAAA;YAED,MAAM,SAAS,GAAW,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;;AAE5D,YAAA,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;AACjF,YAAA,MAAM,SAAS,GAAW,UAAU,CAAC,OAAO,CACxC,IAAI,MAAM,CAAC,4BAA4B,EAAE,GAAG,CAAC,EAC7C,EAAE,CACL,CAAC;AACF,YAAA,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAC/B,SAAS,EACT,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,aAAa,EAClB,SAAS,CACZ,CAAC;AACF,YAAA,MAAM,UAAU,GAAW,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACzE,MAAM,SAAS,GAAW,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;YAE5D,IAAI,SAAS,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,GAAG,EAAE;gBAC3C,cAAc,GAAG,IAAI,CAAC;gBACtB,IAAI,MAAM,GAAG,CAAC,CAAC;gBACf,GAAG;oBACC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC;AACnC,oBAAA,MAAM,EAAE,CAAC;iBACZ,QAAQ,MAAM,GAAG,SAAS,EAAE;AAChC,aAAA;iBAAM,IACH,CAAC,UAAU,KAAK,CAAC;AACb,gBAAA,QAAQ,GAAG,CAAC;AACZ,gBAAA,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,QAAQ,IAAI,QAAQ,GAAG,CAAC,CAAC;iBACrD,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,QAAQ,IAAI,QAAQ,GAAG,CAAC,CAAC,IAAI,SAAS,IAAI,CAAC,CAAC,EACxE;AACE,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACpB,cAAc,GAAG,IAAI,CAAC;gBACtB,KAAK,GAAG,SAAS,CAAC;;gBAElB,QAAQ,IAAI,SAAS,CAAC;AACtB,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC7B,aAAA;AAAM,iBAAA;AACH,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;AACvB,aAAA;AACJ,SAAA;AAAM,aAAA;AACH,YAAA;;AAEI,YAAA,IAAI,CAAC,GAAW,CAAC,EAAE,WAAW,GAAW,UAAU,CAAC,CAAC,CAAE,EACvD,CAAC,GAAG,UAAU,CAAC,MAAM,EACrB,CAAC,EAAE,EAAE,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,EACxC;AACE,gBAAA,IAAI,MAAM,KAAK,cAAc,CAAC,MAAM,EAAE;oBAClC,MAAM;AACT,iBAAA;AACD,gBAAA,IACI,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAChE,oBAAA,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,EACpC;oBACE,MAAM,IAAI,WAAW,CAAC;oBACtB,MAAM,IAAI,CAAC,CAAC;AACf,iBAAA;AAAM,qBAAA,IACH,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG;oBAClC,KAAK;AACL,oBAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EACtE;oBACE,MAAM,IAAI,WAAW,CAAC;oBACtB,MAAM,IAAI,CAAC,CAAC;oBACZ,KAAK,GAAG,KAAK,CAAC;AACjB,iBAAA;AAAM,qBAAA,IACH,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAChE,oBAAA,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,EACpC;oBACE,MAAM,IAAI,WAAW,CAAC;oBACtB,KAAK,GAAG,IAAI,CAAC;AAChB,iBAAA;AAAM,qBAAA,IACH,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG;AAClC,oBAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EACtE;oBACE,MAAM,IAAI,WAAW,CAAC;oBACtB,MAAM,IAAI,CAAC,CAAC;AACf,iBAAA;AAAM,qBAAA,IAAI,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE;AACzE,oBAAA,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;AAChC,wBAAA,IAAI,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;;AAEzB,4BAAA,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;4BACxB,MAAM,IAAI,CAAC,CAAC;4BACZ,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;AAC3D,4BAAA,CAAC,EAAE,CAAC;4BACJ,IAAI,IAAI,CAAC,gBAAgB,EAAE;gCACvB,MAAM,IAAI,GAAG,CAAC;AACjB,6BAAA;4BACD,SAAS;AACZ,yBAAA;AACJ,qBAAA;AACD,oBAAA,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;wBAChC,IACI,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC;AAC1C,6BAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,GAAG;gCACtC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,GAAG;gCACxC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,GAAG;gCACxC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,GAAG;AACxC,gCAAA,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC;gCACvB,MAAM,GAAG,EAAE,CAAC,EAClB;;AAEE,4BAAA,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;4BACxB,MAAM,IAAI,CAAC,CAAC;AACZ,4BAAA,CAAC,EAAE,CAAC;4BACJ,SAAS;AACZ,yBAAA;AACJ,qBAAA;AACD,oBAAA,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;AAClE,wBAAA,IAAI,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;;AAEzB,4BAAA,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;4BACxB,MAAM,IAAI,CAAC,CAAC;4BACZ,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;AAC3D,4BAAA,CAAC,EAAE,CAAC;4BACJ,IAAI,IAAI,CAAC,gBAAgB,EAAE;gCACvB,MAAM,IAAI,GAAG,CAAC;AACjB,6BAAA;4BACD,SAAS;AACZ,yBAAA;AACJ,qBAAA;oBACD,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,oBAAA,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAW,CAAC;oBACtD,MAAM,uBAAuB,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAW,CAAC;oBACjE,MAAM,uBAAuB,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAW,CAAC;oBACjE,MAAM,wBAAwB,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAW,CAAC;oBAClE,MAAM,wBAAwB,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAW,CAAC;oBAClE,MAAM,0BAA0B,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAW,CAAC;AACpE,oBAAA,MAAM,iCAAiC,GAAG,UAAU,CAAC,KAAK,CACtD,MAAM,GAAG,CAAC,EACV,MAAM,GAAG,CAAC,CACb,CAAC;AACF,oBAAA,MAAM,8BAA8B,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;AAChF,oBAAA,MAAM,4BAA4B,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;AAC1E,oBAAA,MAAM,6BAA6B,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;AAC3E,oBAAA,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;AAChC,wBAAA,MAAM,kBAAkB,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;wBAC/D,MAAM,mBAAmB,GACrB,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI;AACnC,4BAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;wBAC9D,IACI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,gBAAgB;AACjD,6BAAC,CAAC,kBAAkB;AAChB,iCAAC,MAAM,CAAC,4BAA4B,CAAC,GAAG,SAAS;AAC7C,oCAAA,MAAM,CAAC,8BAA8B,CAAC,GAAG,SAAS;oCAClD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC;AAClE,6BAAC,mBAAmB;AAChB,kCAAE,MAAM,CAAC,8BAA8B,CAAC,GAAG,SAAS;qCACjD,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,gBAAgB,CAAC;AAC/C,wCAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;AAC7D,oCAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,gBAAgB,CAAC;AACnD,kCAAE,MAAM,CAAC,4BAA4B,CAAC,GAAG,SAAS;oCAChD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,EACjE;;AAEE,4BAAA,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;4BACxB,MAAM,IAAI,CAAC,CAAC;4BACZ,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;AAC3D,4BAAA,CAAC,EAAE,CAAC;4BACJ,IAAI,IAAI,CAAC,gBAAgB,EAAE;gCACvB,MAAM,IAAI,GAAG,CAAC;AACjB,6BAAA;4BACD,SAAS;AACZ,yBAAA;AACJ,qBAAA;AACD,oBAAA,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;wBAChC,MAAM,WAAW,GAAG,EAAE,CAAC;;AAEvB,wBAAA,MAAM,WAAW,GACb,MAAM,KAAK,CAAC;AACZ,6BAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC;AACpB,gCAAA,MAAM,CAAC,4BAA4B,CAAC,GAAG,WAAW;gCAClD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC;;AAElE,wBAAA,MAAM,YAAY,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;AAClE,wBAAA,MAAM,cAAc,GAChB,iCAAiC,CAAC,QAAQ,CAAC,YAAY,CAAC;6BACvD,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,wBAAwB,CAAC;AACvD,gCAAA,MAAM,CAAC,8BAA8B,CAAC,GAAG,WAAW;gCACpD,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,gBAAgB,CAAC;AAClD,gCAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,gBAAgB,CAAC;AACjD,iCAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,0BAA0B,CAAC;AACxD,oCAAA,MAAM,CAAC,6BAA6B,CAAC,GAAG,WAAW;oCACnD,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;gCAC/D,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC;;AAEnE,wBAAA,MAAM,cAAc,GAChB,MAAM,CAAC,iCAAiC,CAAC,IAAI,SAAS;AACtD,4BAAA,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAC5B,iCAA2C,CAC9C;AACD,4BAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,wBAAwB,CAAC;AACzD,6BAAC,MAAM,CAAC,4BAA4B,CAAC,GAAG,WAAW;gCAC/C,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC;;AAElE,wBAAA,MAAM,iBAAiB,GACnB,CAAC,MAAM,CAAC,4BAA4B,CAAC,GAAG,WAAW,IAAI,MAAM,KAAK,CAAC;AACnE,6BAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,uBAAuB,CAAC;gCACrD,MAAM,KAAK,CAAC,CAAC,CAAC;;AAEtB,wBAAA,MAAM,cAAc,GAChB,MAAM,CAAC,iCAAiC,CAAC,GAAG,SAAS;AACrD,4BAAA,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAC5B,iCAA2C,CAC9C;AACD,4BAAA,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAC5B,6BAAuC,CAC1C;AACD,4BAAA,MAAM,CAAC,6BAA6B,CAAC,GAAG,WAAW,CAAC;;AAExD,wBAAA,MAAM,cAAc,GAChB,MAAM,CAAC,iCAAiC,CAAC,IAAI,SAAS;AACtD,4BAAA,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAC5B,iCAA2C,CAC9C;AACD,4BAAA,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,wBAAwB,CAAC;AAC1D,4BAAA,MAAM,CAAC,8BAA8B,CAAC,GAAG,WAAW,CAAC;wBACzD,IACI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,gBAAgB;4BACjD,WAAW;4BACX,cAAc;4BACd,cAAc;4BACd,cAAc;4BACd,cAAc;AACd,4BAAA,iBAAiB,EACnB;;AAEE,4BAAA,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;4BACxB,MAAM,IAAI,CAAC,CAAC;4BACZ,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;AAC3D,4BAAA,CAAC,EAAE,CAAC;4BACJ,IAAI,IAAI,CAAC,gBAAgB,EAAE;gCACvB,MAAM,IAAI,GAAG,CAAC;AACjB,6BAAA;4BACD,SAAS;AACZ,yBAAA;AACJ,qBAAA;oBACD,MAAM,IAAI,WAAW,CAAC;AACtB,oBAAA,MAAM,EAAE,CAAC;AACZ,iBAAA;qBAAM,IAAI,WAAW,KAAK,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;oBAC9D,MAAM,IAAI,WAAW,CAAC;AACtB,oBAAA,MAAM,EAAE,CAAC;AACZ,iBAAA;AAAM,qBAAA,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE;AAC5E,oBAAA,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;AACjC,oBAAA,MAAM,EAAE,CAAC;oBACT,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;AAC3D,oBAAA,CAAC,EAAE,CAAC;AACP,iBAAA;qBAAM,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,aAAa,EAAE;oBAC7D,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;AAC9D,iBAAA;qBAAM,IACH,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;oBAChD,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAC3C,oBAAA,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,EACvD;AACE,oBAAA,IACI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;AACpB,wBAAA,cAAc,KAAK,iBAAiB;AACpC,wBAAA,cAAc,KAAK,gBAAgB;AACnC,wBAAA,cAAc,KAAK,oBAAoB;AACvC,wBAAA,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC;AACjC,wBAAA,cAAc,CAAC,MAAM,CAAC,KAAK,GAAG,EAChC;AACE,wBAAA,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;AAChC,qBAAA;AACD,oBAAA,MAAM,EAAE,CAAC;AACT,oBAAA,CAAC,EAAE,CAAC;AACP,iBAAA;qBAAM,IACH,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG;AACvC,oBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5D,oBAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;AACtE,oBAAA,KAAK,EACP;oBACE,MAAM,IAAI,CAAC,CAAC;oBACZ,MAAM,IAAI,WAAW,CAAC;AACzB,iBAAA;qBAAM,IACH,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG;AACvC,oBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5D,oBAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;AACtE,oBAAA,KAAK,EACP;oBACE,MAAM,IAAI,CAAC,CAAC;oBACZ,MAAM,IAAI,WAAW,CAAC;AACzB,iBAAA;qBAAM,IACH,IAAI,CAAC,aAAa;oBAClB,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC;AAC/C,oBAAA,WAAW,KAAK,IAAI,CAAC,oBAAoB,EAC3C;oBACE,QAAQ,GAAG,IAAI,CAAC;AACnB,iBAAA;AACJ,aAAA;AACJ,SAAA;QACD,IACI,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,cAAc,CAAC,MAAM;AAC3C,YAAA,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,cAAc,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EACxF;YACE,MAAM,IAAI,cAAc,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACvD,SAAA;AACD,QAAA,IAAI,WAAW,GAAW,QAAQ,GAAG,CAAC,CAAC;QAEvC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;AACjC,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,WAAW,EAAE,CAAC;AACjB,SAAA;QAED,IAAI,WAAW,GACX,UAAU,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,WAAW,CAAC;AACjD,cAAE,MAAM;cACN,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC3B,kBAAE,KAAK;kBACL,CAAC,CAAC;AACZ,QAAA,IAAI,QAAQ,EAAE;AACV,YAAA,WAAW,EAAE,CAAC;AACjB,SAAA;AAED,QAAA,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC,EAAE;AACX,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;AACvB,SAAA;QACD,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB,QAAA,IAAI,UAAU,EAAE;AACZ,YAAA,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACnF,SAAA;QACD,IAAI,GAAG,GAAG,CAAG,EAAA,IAAI,CAAC,MAAM,CAAA,EAAG,WAAW,GAAG,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA,CAAE,CAAC;AACrE,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YACrB,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAG,EAAA,MAAM,EAAE,CAAC;AACnC,SAAA;AACD,QAAA,OAAO,GAAG,CAAC;KACd;AAEM,IAAA,gBAAgB,CAAC,WAAmB,EAAA;AACvC,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,GAAW,KAAK,GAAG,KAAK,WAAW,CAAC,CAAC;KAC5E;IAES,gBAAgB,CAAC,WAAmB,EAAE,UAAkB,EAAA;AAC9D,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC;QACxE,QACI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO;AAC/B,YAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;AACxD,YAAA,KAAK,EACP;KACL;AA8GO,IAAA,eAAe,CAAC,GAAW,EAAA;AAC/B,QAAA,OAAO,GAAG;aACL,KAAK,CAAC,EAAE,CAAC;AACT,aAAA,MAAM,CAAC,CAAC,CAAS,EAAE,GAAW,KAAI;AAC/B,YAAA,MAAM,eAAe,GACjB,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ;AAClC,kBAAE,CAAC,KAAK,IAAI,CAAC,aAAa;AAC1B;AACE,oBAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAc,CAAC,CAAC;AACtD,YAAA,QACI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;gBACjB,CAAC,KAAK,IAAI,CAAC,iBAAiB;gBAC5B,eAAe;AACf,iBAAC,CAAC,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,oBAAoB,CAAC,EACvD;AACN,SAAC,CAAC;aACD,IAAI,CAAC,EAAE,CAAC,CAAC;KACjB;AAEO,IAAA,uBAAuB,CAAC,IAAY,EAAA;;;;AAIxC,QAAA,IAAI,IAAI,EAAE;YACN,MAAM,aAAa,GAAG,cAAc,CAAC;AACrC,YAAA,OAAO,IAAI,KAAK,GAAG,GAAG,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,GAAG,IAAI,CAAC;AACvF,SAAA;AACD,QAAA,OAAO,IAAI,CAAC;KACf;AAEO,IAAA,UAAU,CAAC,cAAsB,EAAE,MAAc,EAAE,WAAmB,EAAA;AAC1E,QAAA,MAAM,SAAS,GAAW,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACnE,cAAE,WAAW;cACX,MAAM,CAAC;AACb,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;KACxD;AAES,IAAA,kBAAkB,CAAI,KAAQ,EAAE,aAAsB,EAAE,aAAgB,EAAA;AAC9E,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;AAC/B,cAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,aAAa,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;AAClE,cAAE,KAAK,KAAK,aAAa,CAAC;KACjC;AAEO,IAAA,QAAQ,CAAC,QAAkB,EAAA;AAC/B,QAAA,OAAO,EACH,QAAQ,CAAC,MAAM,KAAK,CAAC;YACrB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAa,EAAE,KAAa,KAAI;AAC5C,gBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,GAAG,CAAC,EAAE;oBAC/B,OAAO,KAAK,KAAK,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;AAC9C,iBAAA;AACD,gBAAA,OAAO,KAAK,KAAK,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;aAC9D,CAAC,CACL,CAAC;KACL;8GA3sBQ,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;kHAArB,qBAAqB,EAAA,CAAA,CAAA,EAAA;;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC,UAAU;;;ACGX,MACa,cAAe,SAAQ,qBAAqB,CAAA;AADzD,IAAA,WAAA,GAAA;;QAEW,IAAa,CAAA,aAAA,GAAG,KAAK,CAAC;QAEtB,IAAW,CAAA,WAAA,GAAG,EAAE,CAAC;QAEjB,IAAQ,CAAA,QAAA,GAAkB,IAAI,CAAC;QAE/B,IAAM,CAAA,MAAA,GAAkB,IAAI,CAAC;AAEpC;;;AAGG;QACI,IAAY,CAAA,YAAA,GAAG,KAAK,CAAC;QAErB,IAAW,CAAA,WAAA,GAAG,KAAK,CAAC;QAEpB,IAAmB,CAAA,mBAAA,GAAG,KAAK,CAAC;;AAG5B,QAAA,IAAA,CAAA,QAAQ,GAAG,CAAC,CAAM,KAAI,GAAG,CAAC;AAEhB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAE1B,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAU,eAAe,CAAC,CAAC;QAE7C,IAAW,CAAA,WAAA,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAErD,IAAS,CAAA,SAAA,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AA4etE,KAAA;;AAzemB,IAAA,SAAS,CACrB,UAAkB,EAClB,cAAsB,EACtB,QAAQ,GAAG,CAAC,EACZ,UAAU,GAAG,KAAK,EAClB,UAAU,GAAG,KAAK;;IAElB,EAA8B,GAAA,MAAK,GAAG,EAAA;QAEtC,IAAI,CAAC,cAAc,EAAE;AACjB,YAAA,OAAO,UAAU,KAAK,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;AAC1E,SAAA;AACD,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC;QACpE,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE;YACpD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;AAC9D,SAAA;QACD,IAAI,IAAI,CAAC,cAAc,KAAK,UAAU,IAAI,IAAI,CAAC,aAAa,EAAE;YAC1D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;AAC9D,SAAA;AACD,QAAA,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa,EAAE;AACnC,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACpC,YAAA,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;AACzC,SAAA;QACD,MAAM,SAAS,GACX,CAAC,CAAC,UAAU,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ;cAC3C,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;cAC/B,EAAE,CAAC;QACb,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtD,IAAI,YAAY,GAAa,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;;;AAGxD,YAAA,UAAU,KAAK,EAAE,IAAI,YAAY,CAAC,MAAM;AACpC,kBAAE,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;AAClE,sBAAE,UAAU,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM;AACrC,0BAAE,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,SAAS,CAAC;AAClD,0BAAE,UAAU,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM;8BACvC,YAAY,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC;AAC3C,kCAAE,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC;AAC3C,kCAAE,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;AACrE,8BAAE,IAAI;AACV,sBAAE,IAAI;AACV,mBAAG,YAAY,GAAG,EAAE,CAAC,CAAC;YAC1B,IAAI,IAAI,CAAC,aAAa,EAAE;;AAEpB,gBAAA,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC5C,aAAA;;YAED,aAAa;gBACT,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM;sBAC7D,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;sBAC7C,UAAU,CAAC;AACxB,SAAA;QAED,IAAI,IAAI,CAAC,aAAa,EAAE;;AAEpB,YAAA,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC5C,SAAA;AAED,QAAA,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,MAAM,GAAG,aAAa,GAAG,UAAU,CAAC;AAE5F,QAAA,MAAM,MAAM,GAAW,KAAK,CAAC,SAAS,CAClC,aAAa,EACb,cAAc,EACd,QAAQ,EACR,UAAU,EACV,UAAU,EACV,EAAE,CACL,CAAC;QACF,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;;;QAG/C,IAAI,IAAI,CAAC,iBAAiB,KAAK,GAAG,IAAI,IAAI,CAAC,aAAa,KAAK,GAAG,EAAE;AAC9D,YAAA,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC;AAC5B,SAAA;;AAGD,QAAA,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,qBAAqB,KAAK,IAAI,EAAE;AACpF,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAClD,CAAC,IAAY,KACT,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,iBAAiB,CAAC;aACjF,CAAC;AACL,SAAA;AACD,QAAA,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACrB,IAAI,IAAI,CAAC,WAAW,EAAE;AAClB,gBAAA,OAAO,MAAM,IAAI,MAAM,CAAC,MAAM;sBACxB,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC;sBAC3C,MAAM,CAAC;AAChB,aAAA;AACD,YAAA,OAAO,MAAM,CAAC;AACjB,SAAA;AACD,QAAA,MAAM,MAAM,GAAW,MAAM,CAAC,MAAM,CAAC;QACrC,MAAM,SAAS,GAAW,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;QAEzD,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACnC,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAC5D,OAAO,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC;AAC/D,SAAA;aAAM,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,IAAI,IAAI,CAAC,cAAc,KAAK,UAAU,EAAE;YAC3E,OAAO,MAAM,GAAG,SAAS,CAAC;AAC7B,SAAA;QACD,OAAO,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;KAC3C;;AAGO,IAAA,oBAAoB,CAAC,KAAa,EAAA;QACtC,MAAM,KAAK,GAAG,eAAe,CAAC;QAC9B,IAAI,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAC1B,OAAO,KAAK,IAAI,IAAI,EAAE;YAClB,iBAAiB,IAAI,CAAC,CAAC;AACvB,YAAA,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7B,SAAA;AACD,QAAA,OAAO,iBAAiB,CAAC;KAC5B;AAEM,IAAA,iBAAiB,CACpB,QAAgB,EAChB,UAAmB,EACnB,UAAmB;;IAEnB,EAA8B,GAAA,MAAK,GAAG,EAAA;AAEtC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC;QACpD,IAAI,CAAC,WAAW,EAAE;YACd,OAAO;AACV,SAAA;QACD,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAC9B,WAAW,CAAC,KAAK,EACjB,IAAI,CAAC,cAAc,EACnB,QAAQ,EACR,UAAU,EACV,UAAU,EACV,EAAE,CACL,CAAC;AACF,QAAA,IAAI,WAAW,KAAK,IAAI,CAAC,iBAAiB,EAAE,EAAE;YAC1C,OAAO;AACV,SAAA;QACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;KAC5B;IAEM,SAAS,CAAC,UAAkB,EAAE,cAAsB,EAAA;AACvD,QAAA,OAAO,UAAU;aACZ,KAAK,CAAC,EAAE,CAAC;AACT,aAAA,GAAG,CAAC,CAAC,IAAY,EAAE,KAAa,KAAI;YACjC,IACI,IAAI,CAAC,QAAQ;gBACb,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AAC1C,gBAAA,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EACpD;AACE,gBAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC;AAC7D,aAAA;AACD,YAAA,OAAO,IAAI,CAAC;AAChB,SAAC,CAAC;aACD,IAAI,CAAC,EAAE,CAAC,CAAC;KACjB;;AAGM,IAAA,cAAc,CAAC,GAAW,EAAA;AAC7B,QAAA,MAAM,OAAO,GAAa,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAc,EAAE,CAAS,KAAI;YACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9C,QACI,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC;AACvC,iBAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,MAAM,KAAK,QAAQ,CAAC,EACpE;AACN,SAAC,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,GAAG,EAAE;AAC1B,YAAA,OAAO,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3B,SAAA;AACD,QAAA,OAAO,GAAG,CAAC;KACd;AAEM,IAAA,iBAAiB,CAAC,UAAkB,EAAA;QACvC,IAAI,eAAe,GAAG,EAAE,CAAC;QACzB,MAAM,aAAa,GACf,CAAC,UAAU;AACP,YAAA,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,UAAkB,EAAE,KAAa,KAAI;AAC3D,gBAAA,IACI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5D,oBAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC,KAAK,GAAG,CAAC,CAAC,EAC1D;oBACE,eAAe,GAAG,UAAU,CAAC;AAC7B,oBAAA,OAAO,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAChC,iBAAA;gBACD,IAAI,eAAe,CAAC,MAAM,EAAE;oBACxB,MAAM,aAAa,GAAW,eAAe,CAAC;oBAC9C,eAAe,GAAG,EAAE,CAAC;AACrB,oBAAA,OAAO,aAAa,CAAC;AACxB,iBAAA;AACD,gBAAA,OAAO,UAAU,CAAC;AACtB,aAAC,CAAC;AACN,YAAA,EAAE,CAAC;AACP,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACjC;AAED;;;;AAIG;AACI,IAAA,cAAc,CAAC,KAAsB,EAAA;AACxC,QAAA,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,CAAC,EAAE;AACvB,YAAA,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACxB,SAAA;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,UAAU,EAAE;AAC5C,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,qBAAqB,EAAE,EAAE;AAC5B,SAAA,CAAC,CAAC;KACN;AAEM,IAAA,eAAe,CAAC,QAAiB,EAAA;QACpC,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,IAAI,CAAC,mBAAmB,EAAE;YAClD,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE;AAChE,gBAAA,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;AACzE,aAAA;AAAM,iBAAA;gBACH,OAAO,IAAI,CAAC,mBAAmB,CAAC;AACnC,aAAA;AACJ,SAAA;aAAM,IAAI,IAAI,CAAC,aAAa,EAAE;AAC3B,YAAA,IAAI,QAAQ,EAAE;AACV,gBAAA,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE;AAC9B,oBAAA,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AACrC,iBAAA;AACD,gBAAA,IAAI,IAAI,CAAC,cAAc,KAAK,UAAU,EAAE;AACpC,oBAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AAC1C,iBAAA;AACJ,aAAA;AACD,YAAA,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;AACxE,SAAA;AACD,QAAA,OAAO,EAAE,CAAC;KACb;IAEM,iBAAiB,GAAA;AACpB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC;QACpD,IAAI,CAAC,WAAW,EAAE;YACd,OAAO;AACV,SAAA;QACD,IACI,IAAI,CAAC,eAAe;AACpB,YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM;gBAChE,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,EAChD;YACE,IAAI,CAAC,mBAAmB,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;AAC1D,SAAA;KACJ;AAED,IAAA,IAAW,mBAAmB,CAAC,CAAC,IAAI,EAAE,KAAK,CAA6B,EAAA;QACpE,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACtC,OAAO;AACV,SAAA;QACD,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MACnB,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,CAAC,CAC5E,CAAC;KACL;AAEM,IAAA,sBAAsB,CAAC,IAAY,EAAA;QACtC,MAAM,KAAK,GAAa,IAAI;aACvB,KAAK,CAAC,EAAE,CAAC;AACT,aAAA,MAAM,CAAC,CAAC,IAAY,KAAK,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,OAAO,KAAK,CAAC,MAAM,CAAC;KACvB;AAEM,IAAA,UAAU,CAAC,UAAkB,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,WAAW,CACnB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,EAClD,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CACvE,CAAC;KACL;AAEO,IAAA,WAAW,CAAC,QAAgB,EAAA;QAChC,IAAI,QAAQ,KAAK,GAAG,EAAE;AAClB,YAAA,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAA,CAAA,EAAI,IAAI,CAAC,oBAAoB,CAAI,CAAA,EAAA,IAAI,CAAC,oBAAoB,CAAA,CAAA,EAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAChI,SAAA;QACD,MAAM,GAAG,GAAa,EAAE,CAAC;AACzB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,EAAE;gBACR,SAAS;AACZ,aAAA;AACD,YAAA,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;AACpB,gBAAA,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACnB,aAAA;AACJ,SAAA;AACD,QAAA,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE;AACjB,YAAA,OAAO,CAAG,EAAA,IAAI,CAAC,oBAAoB,CAAI,CAAA,EAAA,IAAI,CAAC,oBAAoB,CAAI,CAAA,EAAA,IAAI,CAAC,oBAAoB,EAAE,CAAC;AACnG,SAAA;QACD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE;YACnC,OAAO,CAAA,EAAG,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,oBAAoB,CAAA,CAAE,CAAC;AACtE,SAAA;QACD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE;YACnC,OAAO,IAAI,CAAC,oBAAoB,CAAC;AACpC,SAAA;QACD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE;AACpC,YAAA,OAAO,EAAE,CAAC;AACb,SAAA;AACD,QAAA,OAAO,EAAE,CAAC;KACb;AAEO,IAAA,gBAAgB,CAAC,QAAgB,EAAA;AACrC,QAAA,MAAM,GAAG,GACL,CAAG,EAAA,IAAI,CAAC,oBAAoB,CAAA,EAAG,IAAI,CAAC,oBAAoB,CAAA,EAAG,IAAI,CAAC,oBAAoB,CAAE,CAAA;YACtF,CAAI,CAAA,EAAA,IAAI,CAAC,oBAAoB,CAAG,EAAA,IAAI,CAAC,oBAAoB,CAAG,EAAA,IAAI,CAAC,oBAAoB,CAAE,CAAA;YACvF,CAAI,CAAA,EAAA,IAAI,CAAC,oBAAoB,CAAG,EAAA,IAAI,CAAC,oBAAoB,CAAG,EAAA,IAAI,CAAC,oBAAoB,CAAE,CAAA;YACvF,CAAI,CAAA,EAAA,IAAI,CAAC,oBAAoB,CAAA,EAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChE,MAAM,IAAI,GACN,CAAA,EAAG,IAAI,CAAC,oBAAoB,CAAG,EAAA,IAAI,CAAC,oBAAoB,CAAE,CAAA;YAC1D,CAAI,CAAA,EAAA,IAAI,CAAC,oBAAoB,CAAG,EAAA,IAAI,CAAC,oBAAoB,CAAG,EAAA,IAAI,CAAC,oBAAoB,CAAE,CAAA;YACvF,CAAI,CAAA,EAAA,IAAI,CAAC,oBAAoB,CAAG,EAAA,IAAI,CAAC,oBAAoB,CAAG,EAAA,IAAI,CAAC,oBAAoB,CAAE,CAAA;AACvF,YAAA,CAAA,CAAA,EAAI,IAAI,CAAC,oBAAoB,CAAA,EAAG,IAAI,CAAC,oBAAoB,CAAG,EAAA,IAAI,CAAC,oBAAoB,CAAA,EAAG,IAAI,CAAC,oBAAoB,CAAE,CAAA;YACnH,CAAI,CAAA,EAAA,IAAI,CAAC,oBAAoB,CAAA,EAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAEhE,IAAI,QAAQ,KAAK,GAAG,EAAE;AAClB,YAAA,OAAO,GAAG,CAAC;AACd,SAAA;QACD,MAAM,GAAG,GAAa,EAAE,CAAC;AACzB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,EAAE;gBACR,SAAS;AACZ,aAAA;AACD,YAAA,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;AACpB,gBAAA,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACnB,aAAA;AACJ,SAAA;AACD,QAAA,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE;AACjB,YAAA,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;AAC5C,SAAA;QACD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE;AACnC,YAAA,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;AAChD,SAAA;QACD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE;AACnC,YAAA,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;AAChD,SAAA;QACD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,EAAE;AACnC,YAAA,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;AAChD,SAAA;AACD,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE;AACnB,YAAA,OAAO,EAAE,CAAC;AACb,SAAA;AACD,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE;AACnB,YAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,EAAE,EAAE;gBACxB,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;AACtC,aAAA;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;AACtC,SAAA;QACD,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE;AACrC,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;AAClD,SAAA;AACD,QAAA,OAAO,EAAE,CAAC;KACb;AAED;;AAEG;AACK,IAAA,iBAAiB,CAAC,QAAA,GAAiC,IAAI,CAAC,QAAQ,EAAA;AACpE,QAAA,MAAM,YAAY,GAAG,QAAQ,EAAE,aAAa,EAAE,UAAU,CAAC;AACzD,QAAA,IAAI,CAAC,YAAY,EAAE,aAAa,EAAE;YAC9B,OAAO,QAAQ,CAAC,aAAa,CAAC;AACjC,SAAA;AAAM,aAAA;AACH,YAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;AAC/C,SAAA;KACJ;AAED;;;;;;AAMG;AACK,IAAA,iBAAiB,CAAC,UAAkB,EAAA;AACxC,QAAA,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE;AACtE,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,OAAO;AACV,SAAA;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE;AAC3C,YAAA,IAAI,CAAC,QAAQ,CACT,IAAI,CAAC,SAAS,CACV,IAAI,CAAC,aAAa,CACd,IAAI,CAAC,WAAW,CACZ,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,EAClD,IAAI,CAAC,qBAAqB,CAC7B,CACJ,CACJ,CACJ,CAAC;AACL,SAAA;aAAM,IAAI,IAAI,CAAC,qBAAqB,EAAE;YACnC,IAAI,CAAC,QAAQ,CACT,IAAI,CAAC,SAAS,CACV,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CACzE,CACJ,CAAC;AACL,SAAA;AAAM,aAAA;YACH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;AAC7C,SAAA;KACJ;AAEO,IAAA,SAAS,CAAC,KAAyC,EAAA;QACvD,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,KAAK,KAAK,EAAE,EAAE;AACrC,YAAA,OAAO,KAAK,CAAC;AAChB,SAAA;AACD,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1B,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC;KAC1C;IAEO,WAAW,CAAC,KAAa,EAAE,0BAAoC,EAAA;AACnE,QAAA,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAClE,YAAA,OAAO,KAAK,CAAC;AAChB,SAAA;QACD,OAAO,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,0BAA0B,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC;KAC/F;AAEO,IAAA,aAAa,CAAC,KAAa,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AACd,YAAA,OAAO,KAAK,CAAC;AAChB,SAAA;AACD,QAAA,OAAO,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC;KACzD;AAEO,IAAA,aAAa,CAAC,KAAa,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AACd,YAAA,OAAO,KAAK,CAAC;AAChB,SAAA;AACD,QAAA,OAAO,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC;KACzD;AAEO,IAAA,uBAAuB,CAAC,MAAc,EAAA;QAC1C,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC;cAC7D,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,KAAI;gBAChC,OAAQ,IAAI,CAAC,qBAAkC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAChE,aAAC,CAAC;AACJ,cAAE,IAAI,CAAC,iBAAiB,CAAC;QAC7B,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;KACtD;AAEO,IAAA,gBAAgB,CAAC,0BAAoC,EAAA;QACzD,OAAO,IAAI,MAAM,CACb,0BAA0B,CAAC,GAAG,CAAC,CAAC,IAAY,KAAK,KAAK,IAAI,CAAA,CAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EACvE,IAAI,CACP,CAAC;KACL;AAEO,IAAA,0BAA0B,CAAC,KAAa,EAAA;QAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;cAC3C,IAAI,CAAC,aAAa;AACpB,cAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAE3B,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;KAC7D;AAEO,IAAA,aAAa,CAAC,MAAc,EAAA;QAChC,IAAI,MAAM,KAAK,EAAE,EAAE;AACf,YAAA,OAAO,MAAM,CAAC;AACjB,SAAA;QAED,MAAM,kBAAkB,GAAkB,IAAI,CAAC,2BAA2B,CACtE,IAAI,CAAC,cAAc,CACtB,CAAC;AACF,QAAA,MAAM,cAAc,GAAW,IAAI,CAAC,0BAA0B,CAC1D,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CACvC,CAAC;AAEF,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACrB,YAAA,OAAO,cAAc,CAAC;AACzB,SAAA;AACD,QAAA,IAAI,kBAAkB,EAAE;AACpB,YAAA,IAAI,MAAM,KAAK,IAAI,CAAC,aAAa,EAAE;AAC/B,gBAAA,OAAO,IAAI,CAAC;AACf,aAAA;YACD,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;AACpE,SAAA;AAAM,aAAA;AACH,YAAA,OAAO,cAAc,CAAC;AACzB,SAAA;KACJ;;AAGO,IAAA,2BAA2B,CAAC,aAAqB,EAAA;AACrD,QAAA,MAAM,OAAO,GAA4B,aAAa,CAAC,KAAK,CACxD,IAAI,MAAM,CAAC,CAAA,oBAAA,CAAsB,CAAC,CACrC,CAAC;AACF,QAAA,OAAO,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;KAC9C;IAEO,eAAe,CAAC,mBAA2B,EAAE,cAAsB,EAAA;QACvE,IAAI,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACtC,OAAO,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC5C,SAAA;AACD,QAAA,OAAO,MAAM,CAAC,cAAc,CAAC,CAAC;KACjC;8GAvgBQ,cAAc,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;kHAAd,cAAc,EAAA,CAAA,CAAA,EAAA;;2FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B,UAAU;;;ACKX;;AAEG;AACH,SAAS,cAAc,GAAA;AACnB,IAAA,MAAM,UAAU,GAAG,MAAM,CAAgB,cAAc,CAAC,CAAC;AACzD,IAAA,MAAM,WAAW,GAAG,MAAM,CAAwC,UAAU,CAAC,CAAC;IAE9E,OAAO,WAAW,YAAY,QAAQ;UAChC,EAAE,GAAG,UAAU,EAAE,GAAG,WAAW,EAAE,EAAE;UACnC,EAAE,GAAG,UAAU,EAAE,GAAG,WAAW,EAAE,CAAC;AAC5C,CAAC;AAEK,SAAU,cAAc,CAAC,WAAmD,EAAA;IAC9E,OAAO;AACH,QAAA;AACI,YAAA,OAAO,EAAE,UAAU;AACnB,YAAA,QAAQ,EAAE,WAAW;AACxB,SAAA;AACD,QAAA;AACI,YAAA,OAAO,EAAE,cAAc;AACvB,YAAA,QAAQ,EAAE,aAAa;AAC1B,SAAA;AACD,QAAA;AACI,YAAA,OAAO,EAAE,eAAe;AACxB,YAAA,UAAU,EAAE,cAAc;AAC7B,SAAA;QACD,cAAc;KACjB,CAAC;AACN,CAAC;AAEK,SAAU,yBAAyB,CACrC,WAAmD,EAAA;AAEnD,IAAA,OAAO,wBAAwB,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;AACjE;;ACrBA,MAkBa,gBAAgB,CAAA;AAlB7B,IAAA,WAAA,GAAA;;QAoB0B,IAAc,CAAA,cAAA,GAA8B,EAAE,CAAC;QAErD,IAAiB,CAAA,iBAAA,GAAiC,EAAE,CAAC;QAErD,IAAQ,CAAA,QAAA,GAAwB,EAAE,CAAC;QAEnC,IAAM,CAAA,MAAA,GAAsB,EAAE,CAAC;QAE/B,IAAM,CAAA,MAAA,GAAsB,EAAE,CAAC;QAE/B,IAAiB,CAAA,iBAAA,GAAiC,GAAG,CAAC;QAEtD,IAAa,CAAA,aAAA,GAA6B,GAAG,CAAC;QAE9C,IAAqB,CAAA,qBAAA,GAA4C,IAAI,CAAC;QAEtE,IAAW,CAAA,WAAA,GAAkC,IAAI,CAAC;QAElD,IAAa,CAAA,aAAA,GAAoC,IAAI,CAAC;QAEtD,IAAoB,CAAA,oBAAA,GAA2C,IAAI,CAAC;QAEpE,IAAmB,CAAA,mBAAA,GAA0C,IAAI,CAAC;QAElE,IAAY,CAAA,YAAA,GAAmC,IAAI,CAAC;QAEpD,IAAe,CAAA,eAAA,GAAsC,IAAI,CAAC;QAE1D,IAAU,CAAA,UAAA,GAAiC,IAAI,CAAC;QAEhD,IAAc,CAAA,cAAA,GAAqC,IAAI,CAAC;QAExD,IAAoB,CAAA,oBAAA,GAA2C,IAAI,CAAC;QAEpE,IAAgB,CAAA,gBAAA,GAAuC,IAAI,CAAC;QAE5D,IAAmB,CAAA,mBAAA,GAA0C,IAAI,CAAC;AAEjE,QAAA,IAAA,CAAA,UAAU,GAA0B,IAAI,YAAY,EAAQ,CAAC;QAEtE,IAAU,CAAA,UAAA,GAAG,EAAE,CAAC;QAIhB,IAAS,CAAA,SAAA,GAAkB,IAAI,CAAC;QAQhC,IAAoB,CAAA,oBAAA,GAAa,EAAE,CAAC;QAEpC,IAAW,CAAA,WAAA,GAAG,KAAK,CAAC;;QAGpB,IAAY,CAAA,YAAA,GAAG,KAAK,CAAC;AAEZ,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEtC,IAAY,CAAA,YAAA,GAAG,MAAM,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AAEnD,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAU,eAAe,CAAC,CAAC;;AAG9C,QAAA,IAAA,CAAA,QAAQ,GAAG,CAAC,CAAM,KAAI,GAAG,CAAC;;AAG1B,QAAA,IAAA,CAAA,OAAO,GAAG,MAAK,GAAG,CAAC;AA6nB7B,KAAA;AA3nBU,IAAA,WAAW,CAAC,OAAsB,EAAA;AACrC,QAAA,MAAM,EACF,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,MAAM,EACN,MAAM,EACN,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,GACtB,GAAG,OAAO,CAAC;AACZ,QAAA,IAAI,cAAc,EAAE;AAChB,YAAA,IACI,cAAc,CAAC,YAAY,KAAK,cAAc,CAAC,aAAa;gBAC5D,CAAC,cAAc,CAAC,WAAW,EAC7B;AACE,gBAAA,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC;AACxC,aAAA;AACD,YAAA,IAAI,oBAAoB,EAAE;gBACtB,IAAI,CAAC,YAAY,CAAC,oBAAoB,GAAG,oBAAoB,CAAC,YAAY,CAAC;AAC3E,gBAAA,IAAI,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE;oBACxC,IAAI,CAAC,YAAY,CAAC,iBAAiB;AAC/B,wBAAA,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAS,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;AAC5E,iBAAA;AACJ,aAAA;AACD,YAAA,IAAI,cAAc,CAAC,YAAY,IAAI,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AACnF,gBAAA,IAAI,CAAC,oBAAoB,GAAG,cAAc,CAAC,YAAY;qBAClD,KAAK,CAAC,IAAI,CAAC;AACX,qBAAA,IAAI,CAAC,CAAC,CAAS,EAAE,CAAS,KAAI;AAC3B,oBAAA,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;AAC/B,iBAAC,CAAC,CAAC;gBACP,IAAI,CAAC,QAAQ,EAAE,CAAC;AACnB,aAAA;AAAM,iBAAA;AACH,gBAAA,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;gBAC/B,IAAI,CAAC,UAAU,GAAG,cAAc,CAAC,YAAY,IAAI,EAAE,CAAC;gBACpD,IAAI,CAAC,YAAY,CAAC,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC;AACtD,aAAA;AACJ,SAAA;AACD,QAAA,IAAI,iBAAiB,EAAE;AACnB,YAAA,IAAI,CAAC,iBAAiB,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE;gBACnF,OAAO;AACV,aAAA;AAAM,iBAAA;gBACH,IAAI,CAAC,YAAY,CAAC,iBAAiB,GAAG,iBAAiB,CAAC,YAAY,IAAI,EAAE,CAAC;AAC9E,aAAA;AACJ,SAAA;;AAED,QAAA,IAAI,QAAQ,IAAI,QAAQ,CAAC,YAAY,EAAE;YACnC,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC;AACtD,SAAA;AACD,QAAA,IAAI,MAAM,EAAE;YACR,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC;AAClD,SAAA;AACD,QAAA,IAAI,MAAM,EAAE;YACR,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC;AAClD,SAAA;AACD,QAAA,IAAI,iBAAiB,EAAE;YACnB,IAAI,CAAC,YAAY,CAAC,iBAAiB,GAAG,iBAAiB,CAAC,YAAY,CAAC;AACxE,SAAA;AACD,QAAA,IAAI,aAAa,EAAE;YACf,IAAI,CAAC,YAAY,CAAC,aAAa,GAAG,aAAa,CAAC,YAAY,CAAC;AAChE,SAAA;AACD,QAAA,IAAI,qBAAqB,EAAE;YACvB,IAAI,CAAC,YAAY,CAAC,qBAAqB,GAAG,qBAAqB,CAAC,YAAY,CAAC;AAChF,SAAA;AACD,QAAA,IAAI,WAAW,EAAE;YACb,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,WAAW,CAAC,YAAY,CAAC;AAC5D,SAAA;AACD,QAAA,IAAI,aAAa,EAAE;YACf,IAAI,CAAC,YAAY,CAAC,aAAa,GAAG,aAAa,CAAC,YAAY,CAAC;AAChE,SAAA;AACD,QAAA,IAAI,oBAAoB,EAAE;YACtB,IAAI,CAAC,YAAY,CAAC,oBAAoB,GAAG,oBAAoB,CAAC,YAAY,CAAC;AAC9E,SAAA;AACD,QAAA,IAAI,mBAAmB,EAAE;YACrB,IAAI,CAAC,YAAY,CAAC,mBAAmB,GAAG,mBAAmB,CAAC,YAAY,CAAC;AAC5E,SAAA;AACD,QAAA,IAAI,YAAY,EAAE;YACd,IAAI,CAAC,YAAY,CAAC,YAAY,GAAG,YAAY,CAAC,YAAY,CAAC;AAC9D,SAAA;AACD,QAAA,IAAI,eAAe,EAAE;YACjB,IAAI,CAAC,YAAY,CAAC,eAAe,GAAG,eAAe,CAAC,YAAY,CAAC;AACpE,SAAA;AACD,QAAA,IAAI,UAAU,EAAE;YACZ,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,UAAU,CAAC,YAAY,CAAC;AAC1D,SAAA;AACD,QAAA,IAAI,cAAc,EAAE;YAChB,IAAI,CAAC,YAAY,CAAC,cAAc,GAAG,cAAc,CAAC,YAAY,CAAC;AAClE,SAAA;AACD,QAAA,IAAI,gBAAgB,EAAE;YAClB,IAAI,CAAC,YAAY,CAAC,gBAAgB,GAAG,gBAAgB,CAAC,YAAY,CAAC;AACtE,SAAA;AACD,QAAA,IAAI,mBAAmB,EAAE;YACrB,IAAI,CAAC,YAAY,CAAC,mBAAmB,GAAG,mBAAmB,CAAC,YAAY,CAAC;AAC5E,SAAA;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;KACrB;;IAGM,QAAQ,CAAC,EAAE,KAAK,EAAe,EAAA;QAClC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACnD,YAAA,OAAO,IAAI,CAAC;AACf,SAAA;AACD,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AAC3B,YAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;AAC7C,SAAA;AACD,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;AAChC,YAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;AAC7C,SAAA;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE;AACzC,YAAA,OAAO,IAAI,CAAC;AACf,SAAA;QACD,IAAI,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AAC7C,YAAA,OAAO,IAAI,CAAC;AACf,SAAA;AACD,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE;AACnC,YAAA,OAAO,IAAI,CAAC;AACf,SAAA;QACD,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AACrC,YAAA,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AACpC,SAAA;QACD,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE;YACvC,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;gBAC1C,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE;AAC3C,oBAAA,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;AACnE,wBAAA,MAAM,GAAG,GAAW,IAAI,CAAC,UAAU;6BAC9B,KAAK,CAAC,EAAE,CAAC;6BACT,MAAM,CAAC,CAAC,CAAS,KAAK,CAAC,KAAK,GAAG,CAAC;6BAChC,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,wBAAA,YAAY,IAAI,GAAG,CAAC,MAAM,CAAC;AAC9B,qBAAA;yBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE;AAC5C,wBAAA,YAAY,EAAE,CAAC;AAClB,qBAAA;oBACD,IACI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACnC,wBAAA,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,EACzD;AACE,wBAAA,OAAO,IAAI,CAAC;AACf,qBAAA;AACD,oBAAA,IAAI,YAAY,KAAK,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;AACzC,wBAAA,OAAO,IAAI,CAAC;AACf,qBAAA;AACJ,iBAAA;AACJ,aAAA;YACD,IACI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AAClC,gBAAA,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM;oBACnB,IAAI,CAAC,UAAU,CAAC,MAAM;wBAClB,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,wBAAA,CAAC,EACX;AACE,gBAAA,OAAO,IAAI,CAAC;AACf,aAAA;YACD,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AAC1E,gBAAA,OAAO,IAAI,CAAC;AACf,aAAA;iBAAM,IACH,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;AAC7B,gBAAA,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC;iBACzD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;AAC7B,oBAAA,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC3D,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EACpC;AACE,gBAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;AAC7C,aAAA;YACD,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE;AAC5E,gBAAA,MAAM,MAAM,GAAW,IAAI,CAAC,YAAY,CAAC,qBAAqB;AAC1D,sBAAE,IAAI,CAAC,UAAU,CAAC,MAAM;wBACtB,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC;wBACzD,YAAY;sBACZ,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,YAAY,CAAC;gBAC5C,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,MAAM,EAAE;AAClC,oBAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;AAC7C,iBAAA;AACJ,aAAA;AACJ,SAAA;AACD,QAAA,IAAI,KAAK,EAAE;AACP,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AACvB,YAAA,OAAO,IAAI,CAAC;AACf,SAAA;AACD,QAAA,OAAO,IAAI,CAAC;KACf;IAGM,OAAO,GAAA;AACV,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;KAC3B;AAGM,IAAA,aAAa,CAAC,KAAyC,EAAA;;AAE1D,QAAA,IACI,CAAC,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;AACtD,YAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAC/B;AACE,YAAA,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;AACxE,SAAA;KACJ;AAGM,IAAA,OAAO,CAAC,CAAsB,EAAA;;QAEjC,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;AAE9B,QAAA,MAAM,EAAE,GAAqB,CAAC,CAAC,MAA0B,CAAC;AAC1D,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,KAAK,CAAC;QAE5B,IAAI,CAAC,QAAQ,EAAE,CAAC;AAEhB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AAClB,YAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO;AACV,SAAA;AACD,QAAA,IAAI,QAAQ,GACR,EAAE,CAAC,cAAc,KAAK,CAAC;cAChB,EAAE,CAAC,cAAyB,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM;AACjE,cAAG,EAAE,CAAC,cAAyB,CAAC;QAExC,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,cAAc,GAAG,KAAK,CAAC;AAC3B,QAAA,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAC/B,QAAQ,EACR,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,KAAK,KAAK,WAAW,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EACrD,CAAC,KAAa,EAAE,eAAwB,KAAI;AACxC,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,UAAU,GAAG,KAAK,CAAC;YACnB,cAAc,GAAG,eAAe,CAAC;AACrC,SAAC,CACJ,CAAC;;AAEF,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,EAAE;YACjC,OAAO;AACV,SAAA;;AAGD,QAAA,IAAI,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE;YAClC,QAAQ;gBACJ,EAAE,CAAC,cAAc,KAAK,CAAC;sBAChB,EAAE,CAAC,cAAyB,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM;AACjE,sBAAG,EAAE,CAAC,cAAyB,CAAC;AAC3C,SAAA;AAED,QAAA,IAAI,CAAC,SAAS;YACV,IAAI,CAAC,SAAS,KAAK,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;AAElF,QAAA,IAAI,eAAe,GAAW,IAAI,CAAC,SAAS;cACtC,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,QAAQ,GAAG,UAAU;cAC/C,QAAQ,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,IAAI,CAAC,cAAc,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC;AAClF,QAAA,IAAI,eAAe,GAAG,IAAI,CAAC,qBAAqB,EAAE,EAAE;AAChD,YAAA,eAAe,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;AAClD,SAAA;QACD,IAAI,eAAe,GAAG,CAAC,EAAE;YACrB,eAAe,GAAG,CAAC,CAAC;AACvB,SAAA;AACD,QAAA,EAAE,CAAC,iBAAiB,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;AACvD,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;KACzB;;IAIM,kBAAkB,GAAA;AACrB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;KAC5B;;AAIM,IAAA,gBAAgB,CAAC,CAAsB,EAAA;AAC1C,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;KACnB;IAGM,MAAM,GAAA;QACT,IAAI,IAAI,CAAC,UAAU,EAAE;AACjB,YAAA,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,CAAC;AACzC,SAAA;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;KAClB;AAGM,IAAA,OAAO,CAAC,CAAmC,EAAA;AAC9C,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO;AACV,SAAA;AACD,QAAA,MAAM,EAAE,GAAqB,CAAC,CAAC,MAA0B,CAAC;QAC1D,MAAM,QAAQ,GAAG,CAAC,CAAC;QACnB,MAAM,MAAM,GAAG,CAAC,CAAC;QACjB,IACI,EAAE,KAAK,IAAI;YACX,EAAE,CAAC,cAAc,KAAK,IAAI;AAC1B,YAAA,EAAE,CAAC,cAAc,KAAK,EAAE,CAAC,YAAY;YACrC,EAAE,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM;;AAElD,YAAA,CAAS,CAAC,OAAO,KAAK,EAAE,EAC3B;AACE,YAAA,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;;gBAEjC,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC;gBACpE,IACI,EAAE,CAAC,iBAAiB;AACpB,oBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,KAAK,EAAE,CAAC,KAAK,EACvE;;oBAEE,EAAE,CAAC,KAAK,EAAE,CAAC;AACX,oBAAA,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC1C,iBAAA;AAAM,qBAAA;;oBAEH,IAAI,EAAE,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,EAAE;;AAE1D,wBAAA,EAAE,CAAC,iBAAiB,CAChB,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,EACpC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,CACvC,CAAC;AACL,qBAAA;AACJ,iBAAA;AACJ,aAAA;AACJ,SAAA;QACD,MAAM,SAAS,GACX,EAAE;AACF,aAAC,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,YAAY,CAAC,MAAM;kBAC7C,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW;AAC1D,kBAAE,EAAE,CAAC,KAAK,CAAC,CAAC;;AAEpB,QAAA,IAAI,EAAE,IAAI,EAAE,CAAC,KAAK,KAAK,SAAS,EAAE;AAC9B,YAAA,EAAE,CAAC,KAAK,GAAG,SAAS,CAAC;AACxB,SAAA;;AAGD,QAAA,IACI,EAAE;AACF,YAAA,CAAE,EAAE,CAAC,cAAyB,IAAK,EAAE,CAAC,YAAuB;AACzD,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EACrC;YACE,EAAE,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC;YACpD,OAAO;AACV,SAAA;;QAED,IAAI,EAAE,IAAK,EAAE,CAAC,YAAuB,GAAG,IAAI,CAAC,qBAAqB,EAAE,EAAE;AAClE,YAAA,EAAE,CAAC,YAAY,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;AAClD,SAAA;KACJ;;AAIM,IAAA,SAAS,CAAC,CAAsB,EAAA;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO;AACV,SAAA;QAED,IAAI,IAAI,CAAC,YAAY,EAAE;;AAEnB,YAAA,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO;AAAE,gBAAA,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAChD,OAAO;AACV,SAAA;AAED,QAAA,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC;AACrC,QAAA,MAAM,EAAE,GAAqB,CAAC,CAAC,MAA0B,CAAC;AAC1D,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,KAAK,CAAC;QAE5B,IAAI,CAAC,QAAQ,EAAE,CAAC;AAEhB,QAAA,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,EAAE;YACrB,CAAC,CAAC,cAAc,EAAE,CAAC;AACtB,SAAA;AAED,QAAA,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE;AACtE,YAAA,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAChD,gBAAA,EAAE,CAAC,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC;AACvC,aAAA;YACD,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,IAAK,EAAE,CAAC,cAAyB,KAAK,CAAC,EAAE;;AAE9D,gBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,EAAE,MAAM;sBACjD,IAAI,CAAC,iBAAiB;AACxB,sBAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC;AACrC,gBAAA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAK,EAAE,CAAC,cAAyB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AAC/E,oBAAA,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC;AAC7D,iBAAA;AAAM,qBAAA;oBACH,IACI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAM,EAAE,CAAC,cAAyB;AACxD,wBAAA,EAAE,CAAC,cAAyB,KAAK,CAAC,EACrC;wBACE,OACI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAC3B,CACI,IAAI,CAAC,WAAW,CAAE,EAAE,CAAC,cAAyB,GAAG,CAAC,CAAC,IAAI,EAAE,EAC3D,QAAQ,EAAE,CACf;AACD,6BAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC;gCACpB,EAAE,CAAC,cAAyB,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM;AAClD,gCAAA,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,EAC/B;AACE,4BAAA,EAAE,CAAC,iBAAiB,CACf,EAAE,CAAC,cAAyB,GAAG,CAAC,EACjC,EAAE,CAAC,YAAY,CAClB,CAAC;AACL,yBAAA;AACJ,qBAAA;AACJ,iBAAA;AACJ,aAAA;AACD,YAAA,IAAI,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;AAClC,YAAA,IACI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM;gBAC9B,EAAE,CAAC,cAAyB,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM;gBAC/D,EAAE,CAAC,YAAuB,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAChE;gBACE,CAAC,CAAC,cAAc,EAAE,CAAC;AACtB,aAAA;AACD,YAAA,MAAM,WAAW,GAAkB,EAAE,CAAC,cAAc,CAAC;AACrD,YAAA,IACI,CAAC,CAAC,GAAG,KAAK,WAAW;gBACrB,CAAC,EAAE,CAAC,QAAQ;AACZ,gBAAA,WAAW,KAAK,CAAC;AACjB,gBAAA,EAAE,CAAC,YAAY,KAAK,EAAE,CAAC,KAAK,CAAC,MAAM;AACnC,gBAAA,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EACvB;gBACE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBAChF,IAAI,CAAC,YAAY,CAAC,SAAS,CACvB,IAAI,CAAC,YAAY,CAAC,MAAM,EACxB,IAAI,CAAC,YAAY,CAAC,cAAc,EAChC,IAAI,CAAC,SAAS,CACjB,CAAC;AACL,aAAA;AACJ,SAAA;AACD,QAAA,IACI,CAAC,CAAC,IAAI,CAAC,MAAM;AACb,YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;AACtB,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAI,EAAE,CAAC,cAAyB,EAC9E;YACE,EAAE,CAAC,iBAAiB,CAChB,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAC5C,IAAI,CAAC,WAAW,CAAC,MAAM,CAC1B,CAAC;AACL,SAAA;aAAM,IACH,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO;aAC9B,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC;AAClC,UAAA;YACE,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;YACtD,CAAC,CAAC,cAAc,EAAE,CAAC;AACtB,SAAA;QACD,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,EAAE,CAAC,cAAc,CAAC;QAC/C,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC;KAC9C;;IAGM,MAAM,UAAU,CACnB,UAA2E,EAAA;AAE3E,QAAA,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,IAAI,OAAO,IAAI,UAAU,EAAE;YAChF,IAAI,SAAS,IAAI,UAAU,EAAE;gBACzB,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;AACtD,aAAA;;AAED,YAAA,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC;AACjC,SAAA;AAED,QAAA,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE;;YAE3E,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAC1D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE;AACjD,gBAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,2BAA2B,EAAE,CAAC;;gBAE/D,UAAU;AACN,oBAAA,IAAI,CAAC,YAAY,CAAC,aAAa,KAAK,mBAAmB;AACnD,0BAAE,UAAU,CAAC,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;0BACxE,UAAU,CAAC;AACxB,aAAA;AACD,YAAA,IAAI,CAAC,YAAY,CAAC,aAAa,GAAG,IAAI,CAAC;AAC1C,SAAA;AAED,QAAA,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;;YAEhC,UAAU,GAAG,EAAE,CAAC;AACnB,SAAA;AAED,QAAA,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEhB,IACI,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,CAAC,cAAc;AAC/C,aAAC,IAAI,CAAC,YAAY,CAAC,cAAc;AAC7B,iBAAC,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,EACpE;;AAEE,YAAA,IAAI,CAAC,YAAY,CAAC,YAAY,GAAG,IAAI,CAAC;AACtC,YAAA,IAAI,CAAC,YAAY,CAAC,mBAAmB,GAAG;gBACpC,OAAO;AACP,gBAAA,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC;aAC5E,CAAC;;AAEF,YAAA,IAAI,CAAC,YAAY,CAAC,YAAY,GAAG,KAAK,CAAC;AAC1C,SAAA;AAAM,aAAA;YACH,IAAI,CAAC,YAAY,CAAC,mBAAmB,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACjE,SAAA;AACD,QAAA,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;KACjC;AAEM,IAAA,gBAAgB,CAAC,EAAwB,EAAA;QAC5C,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;KACnD;AAEM,IAAA,iBAAiB,CAAC,EAAuB,EAAA;AAC5C,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;KACrB;AAEO,IAAA,iBAAiB,CAAC,QAAA,GAAiC,IAAI,CAAC,QAAQ,EAAA;AACpE,QAAA,MAAM,YAAY,GAAG,QAAQ,EAAE,aAAa,EAAE,UAAU,CAAC;AACzD,QAAA,IAAI,CAAC,YAAY,EAAE,aAAa,EAAE;YAC9B,OAAO,QAAQ,CAAC,aAAa,CAAC;AACjC,SAAA;AAAM,aAAA;AACH,YAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;AAC/C,SAAA;KACJ;AAEM,IAAA,wBAAwB,CAAC,EAAoB,EAAA;AAChD,QAAA,EAAE,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CACxB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,cAAwB,CAAC,EACzD,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAC/C,CAAC;AACF,QAAA,EAAE,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CACtB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,YAAsB,CAAC,EACvD,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAC/C,CAAC;KACL;;AAGM,IAAA,gBAAgB,CAAC,UAAmB,EAAA;QACvC,IAAI,CAAC,YAAY,CAAC,mBAAmB,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;KACpE;AAEO,IAAA,qBAAqB,CAAC,OAAe,EAAA;AACzC,QAAA,QACI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;YACtB,OAAO;iBACF,KAAK,CAAC,EAAE,CAAC;iBACT,MAAM,CAAC,CAAC,KAAa,EAAE,OAAe,EAAE,KAAa,KAAY;AAC9D,gBAAA,IAAI,CAAC,MAAM,GAAG,OAAO,KAAK,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;gBAEpD,IAAI,OAAO,KAAK,GAAG,EAAE;AACjB,oBAAA,OAAO,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,OAAO,CAAC;0BAC5C,KAAK,GAAG,OAAO;0BACf,KAAK,CAAC;AACf,iBAAA;AACD,gBAAA,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;AAClB,gBAAA,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBACvE,MAAM,WAAW,GAAW,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,CACxD,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAC3B,CAAC;gBACF,OAAO,KAAK,GAAG,WAAW,CAAC;aAC9B,EAAE,EAAE,CAAC;AACd,YAAA,OAAO,EACT;KACL;;IAGO,UAAU,GAAA;AACd,QAAA,IAAI,CAAC,YAAY,CAAC,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;AACrF,QAAA,IAAI,CAAC,YAAY,CAAC,mBAAmB,GAAG;YACpC,OAAO;AACP,YAAA,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC;SAClF,CAAC;KACL;AAEO,IAAA,aAAa,CAAC,KAAa,EAAA;AAC/B,QAAA,MAAM,UAAU,GAAW,IAAI,CAAC,UAAU;aACrC,KAAK,CAAC,EAAE,CAAC;AACT,aAAA,MAAM,CAAC,CAAC,CAAS,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC;QAC7C,IAAI,CAAC,KAAK,EAAE;YACR,OAAO,IAAI,CAAC;AACf,SAAA;QAED,IACI,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,UAAU;AACpE,YAAA,KAAK,CAAC,MAAM,IAAI,UAAU,GAAG,CAAC,EAChC;AACE,YAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;AAC7C,SAAA;AAED,QAAA,OAAO,IAAI,CAAC;KACf;IAEO,qBAAqB,GAAA;AACzB,QAAA,QACI,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM;AACpC,YAAA,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EACxE;KACL;AAEO,IAAA,sBAAsB,CAAC,WAAmB,EAAA;QAC9C,OAAO;AACH,YAAA,IAAI,EAAE;gBACF,YAAY,EAAE,IAAI,CAAC,UAAU;gBAC7B,WAAW;AACd,aAAA;SACJ,CAAC;KACL;IAEO,QAAQ,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE;YACtC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,IAAI,KAAoB;AACpD,gBAAA,MAAM,IAAI,GACN,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM;oBACtD,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;AAC/C,gBAAA,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,EAAE;AAC1B,oBAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;AACvB,oBAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;AAC3B,oBAAA,IAAI,CAAC,YAAY,CAAC,cAAc,GAAG,IAAI,CAAC;AACxC,oBAAA,OAAO,IAAI,CAAC;AACf,iBAAA;AAAM,qBAAA;AACH,oBAAA,MAAM,UAAU,GACZ,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1E,oBAAA,IAAI,CAAC,UAAU;AACX,wBAAA,IAAI,CAAC,cAAc;4BACnB,IAAI,CAAC,YAAY,CAAC,cAAc;AAC5B,gCAAA,UAAU,CAAC;AACtB,iBAAA;AACL,aAAC,CAAC,CAAC;AACN,SAAA;KACJ;IAEO,2BAA2B,GAAA;AAC/B,QAAA,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KACjD;8GAnsBQ,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gBAAgB,EAfd,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,CAAA,MAAA,EAAA,gBAAA,CAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,4BAAA,EAAA,gBAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,SAAA,EAAA;AACP,YAAA;AACI,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,gBAAgB;AAC7B,gBAAA,KAAK,EAAE,IAAI;AACd,aAAA;AACD,YAAA;AACI,gBAAA,OAAO,EAAE,aAAa;AACtB,gBAAA,WAAW,EAAE,gBAAgB;AAC7B,gBAAA,KAAK,EAAE,IAAI;AACd,aAAA;YACD,cAAc;AACjB,SAAA,EAAA,QAAA,EAAA,CAAA,MAAA,EAAA,SAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA;;2FAGQ,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAlB5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,6BAA6B;AACvC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,SAAS,EAAE;AACP,wBAAA;AACI,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAkB,gBAAA;AAC7B,4BAAA,KAAK,EAAE,IAAI;AACd,yBAAA;AACD,wBAAA;AACI,4BAAA,OAAO,EAAE,aAAa;AACtB,4BAAA,WAAW,EAAkB,gBAAA;AAC7B,4BAAA,KAAK,EAAE,IAAI;AACd,yBAAA;wBACD,cAAc;AACjB,qBAAA;AACD,oBAAA,QAAQ,EAAE,cAAc;AAC3B,iBAAA,CAAA;8BAGyB,cAAc,EAAA,CAAA;sBAAnC,KAAK;uBAAC,MAAM,CAAA;gBAEG,iBAAiB,EAAA,CAAA;sBAAhC,KAAK;gBAEU,QAAQ,EAAA,CAAA;sBAAvB,KAAK;gBAEU,MAAM,EAAA,CAAA;sBAArB,KAAK;gBAEU,MAAM,EAAA,CAAA;sBAArB,KAAK;gBAEU,iBAAiB,EAAA,CAAA;sBAAhC,KAAK;gBAEU,aAAa,EAAA,CAAA;sBAA5B,KAAK;gBAEU,qBAAqB,EAAA,CAAA;sBAApC,KAAK;gBAEU,WAAW,EAAA,CAAA;sBAA1B,KAAK;gBAEU,aAAa,EAAA,CAAA;sBAA5B,KAAK;gBAEU,oBAAoB,EAAA,CAAA;sBAAnC,KAAK;gBAEU,mBAAmB,EAAA,CAAA;sBAAlC,KAAK;gBAEU,YAAY,EAAA,CAAA;sBAA3B,KAAK;gBAEU,eAAe,EAAA,CAAA;sBAA9B,KAAK;gBAEU,UAAU,EAAA,CAAA;sBAAzB,KAAK;gBAEU,cAAc,EAAA,CAAA;sBAA7B,KAAK;gBAEU,oBAAoB,EAAA,CAAA;sBAAnC,KAAK;gBAEU,gBAAgB,EAAA,CAAA;sBAA/B,KAAK;gBAEU,mBAAmB,EAAA,CAAA;sBAAlC,KAAK;gBAEW,UAAU,EAAA,CAAA;sBAA1B,MAAM;gBAoOA,OAAO,EAAA,CAAA;sBADb,YAAY;uBAAC,OAAO,CAAA;gBAMd,aAAa,EAAA,CAAA;sBADnB,YAAY;uBAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,CAAA;gBAYlC,OAAO,EAAA,CAAA;sBADb,YAAY;uBAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAA;gBA8D1B,kBAAkB,EAAA,CAAA;sBADxB,YAAY;uBAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC,CAAA;gBAOrC,gBAAgB,EAAA,CAAA;sBADtB,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC,CAAA;gBAQnC,MAAM,EAAA,CAAA;sBADZ,YAAY;uBAAC,MAAM,CAAA;gBASb,OAAO,EAAA,CAAA;sBADb,YAAY;uBAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAA;gBAiE1B,SAAS,EAAA,CAAA;sBADf,YAAY;uBAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAA;;;ACldvC,MAKa,WAAW,CAAA;AALxB,IAAA,WAAA,GAAA;QAMqB,IAAc,CAAA,cAAA,GAAqB,EAAE,CAAC;AAEtC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AAsB1D,KAAA;IApBU,SAAS,CACZ,KAAsB,EACtB,IAAY,EACZ,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAA,GAAuB,EAAsB,EAAA;AAElE,QAAA,MAAM,aAAa,GAAG;AAClB,YAAA,cAAc,EAAE,IAAI;YACpB,GAAG,IAAI,CAAC,cAAc;AACtB,YAAA,GAAG,MAAM;AACT,YAAA,QAAQ,EAAE;AACN,gBAAA,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ;AAC7B,gBAAA,GAAG,QAAQ;AACd,aAAA;SACJ,CAAC;AACF,QAAA,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;;AAElD,YAAA,IAAI,CAAC,YAAoB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAC5C,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAG,EAAA,KAAK,CAAE,CAAA,EAAE,IAAI,CAAC,CAAC;KACxD;8GAxBQ,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;4GAAX,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,CAAA,EAAA;;2FAAX,WAAW,EAAA,UAAA,EAAA,CAAA;kBALvB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACF,oBAAA,IAAI,EAAE,MAAM;AACZ,oBAAA,IAAI,EAAE,IAAI;AACV,oBAAA,UAAU,EAAE,IAAI;AACnB,iBAAA,CAAA;;;ACTD;;AAEG;;;;"}
|