@draggable/i18n 1.1.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,24 +1,34 @@
1
1
  # i18n ![NPM Version](https://img.shields.io/npm/v/@draggable/i18n)
2
2
 
3
- Add multi-lingual support to any JavaScript app or module with this light-weight package.
3
+ Add multi-lingual support to any JavaScript app or module with this light-weight package. Used by [Formeo](https://formeo.io).
4
4
 
5
5
  ### Features:
6
6
 
7
- - Isomorphic/Universal
7
+ - Isomorphic/Universal: works in the browser and in Node (no `fetch` needed when languages are preloaded)
8
8
  - easy translation of static text files
9
9
  - benefits: anyone can translate, no more xliff
10
10
  - reduced margin of error.
11
11
  - Variable support
12
+ - Fallback locales and plurals
13
+ - TypeScript types included
12
14
  - Dependency free
13
15
  - Fast
14
16
 
17
+ ## Install
18
+
19
+ ```sh
20
+ npm install @draggable/i18n
21
+ ```
22
+
15
23
  ## Usage
16
24
 
25
+ The default export is a shared singleton instance, `I18N` is the class.
26
+
17
27
  ```javascript
18
- import { I18n } from '@draggable/i18n'
28
+ import i18n, { I18N } from '@draggable/i18n'
19
29
 
20
30
  const i18nOptions = {
21
- extension: '.lang', // extnsion used by your language files, defaults to ".lang"
31
+ extension: '.lang', // extension used by your language files, defaults to ".lang"
22
32
  location: 'https://location.of/language/files/', // absolute or relative url to language files
23
33
  langs: [
24
34
  // locales you would like to be active
@@ -33,32 +43,209 @@ const i18nOptions = {
33
43
  },
34
44
  },
35
45
  }
36
- const i18n = new I18n(i18nOptions)
46
+
47
+ // configure the singleton and load the current locale
48
+ await i18n.init(i18nOptions)
49
+
50
+ // or create a separate instance
51
+ const myI18n = new I18N(i18nOptions)
52
+ await myI18n.init()
37
53
  ```
38
54
 
55
+ `I18N(options)` (without `new`) returns the singleton, the same instance as the default export. Options passed this way are
56
+ only used if the singleton has not been created yet; use `i18n.init(options)` to reconfigure it.
57
+
39
58
  ... then in your app
40
59
 
41
60
  ```jsx
42
61
  <label>{i18n.get('addOption')}</label>
43
62
  ```
44
63
 
64
+ ### Options
65
+
66
+ | Option | Type | Default | Description |
67
+ | ---------------- | ------------------------------------------ | ---------------- | ----------------------------------------------------------------------------------- |
68
+ | `extension` | `string` | `'.lang'` | extension of remote language files |
69
+ | `location` | `string` | `'assets/lang/'` | url or path of the directory containing language files |
70
+ | `langs` | `string[]` | `['en-US']` | available locales, handy for populating a language selector |
71
+ | `locale` | `string` | `'en-US'` | initial locale, falls back to the first of `langs` when empty |
72
+ | `preloaded` | `{ [locale]: { [key]: string } }` | `{}` | languages available without fetching |
73
+ | `override` | `{ [locale]: { [key]: string } }` | `{}` | keys that take precedence over loaded and preloaded languages |
74
+ | `fallbackLocale` | `string \| string[]` | – | locale(s) to fall back to when a key is missing, see [Fallback locales](#fallback-locales) |
75
+ | `onMissing` | `(info) => string \| void` | – | called for missing keys and arguments, see [Missing keys](#missing-keys-and-arguments) |
76
+
77
+ ### Translating
78
+
79
+ ```javascript
80
+ // languages: { 'en-US': { greeting: 'Hello {name}', total: '{count} of {count}' } }
81
+
82
+ i18n.get('greeting', { name: 'Ana' }) // 'Hello Ana'
83
+ i18n.get('total', 3) // '3 of 3', a primitive replaces every placeholder
84
+ i18n.get('greeting') // 'Hello {name}', no args: no replacement
85
+ i18n.get('missing') // undefined
86
+
87
+ // t() always returns a string, falling back to the key
88
+ i18n.t('greeting', { name: 'Ana' }) // 'Hello Ana'
89
+ i18n.t('missing') // 'missing'
90
+
91
+ // per-call locale, without changing the current locale
92
+ i18n.get('greeting', { name: 'Ana' }, 'de-DE') // 'Hallo Ana'
93
+ i18n.t('greeting', { name: 'Ana' }, 'de-DE') // 'Hallo Ana'
94
+ i18n.getValue('greeting', 'de-DE') // 'Hallo {name}', raw string
95
+
96
+ // t() bound to a locale, handy on servers handling several locales at once
97
+ const t = i18n.forLocale('de-DE')
98
+ t('greeting', { name: 'Ana' }) // 'Hallo Ana'
99
+ ```
100
+
101
+ Missing placeholder arguments are replaced with an empty string.
102
+
103
+ ### Fallback locales
104
+
105
+ Without `fallbackLocale` a missing key is looked up in any loaded language that has it (legacy behaviour).
106
+ With `fallbackLocale` set the lookup order is:
107
+
108
+ 1. the requested locale, eg. `pt-BR`
109
+ 2. its base language, if loaded, eg. `pt`
110
+ 3. each fallback locale, in order
111
+ 4. `t()` returns the key, `get()` returns `undefined`
112
+
113
+ ```javascript
114
+ const i18n = new I18N({
115
+ locale: 'pt-BR',
116
+ fallbackLocale: ['pt', 'en'],
117
+ preloaded: {
118
+ 'pt-BR': { save: 'Salvar' },
119
+ pt: { cancel: 'Cancelar' },
120
+ en: { save: 'Save', cancel: 'Cancel', help: 'Help' },
121
+ },
122
+ })
123
+
124
+ i18n.t('save') // 'Salvar'
125
+ i18n.t('cancel') // 'Cancelar'
126
+ i18n.t('help') // 'Help'
127
+ i18n.getLocaleChain('pt-BR') // ['pt-BR', 'pt', 'en']
128
+ ```
129
+
130
+ When `fallbackLocale` is set, keys whose value is an empty string (`''`) count as translated and are returned as `''`
131
+ instead of falling back. Without it, empty strings are treated as missing.
132
+
133
+ `init()` also loads fallback locales that are not loaded yet.
134
+
135
+ ### Plurals
136
+
137
+ When a key is missing and `args` is a number or has a numeric `count`, plural forms of the key are used.
138
+ The form is chosen with [`Intl.PluralRules`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Intl/PluralRules) for the locale:
139
+ `key.zero` (only for a count of `0`), then `key.<category>` (`zero`, `one`, `two`, `few`, `many`, `other`), then `key.other`.
140
+ `{count}` and other placeholders are replaced as usual. If `Intl.PluralRules` is not available, `1` is `one` and anything else is `other`.
141
+
142
+ ```txt
143
+ items.zero = No items
144
+ items.one = {count} item
145
+ items.other = {count} items
146
+ files.other = {count} files in {folder}
147
+ ```
148
+
149
+ ```javascript
150
+ i18n.t('items', 0) // 'No items'
151
+ i18n.t('items', { count: 1 }) // '1 item'
152
+ i18n.t('items', 5) // '5 items'
153
+ i18n.t('files', { count: 2, folder: 'docs' }) // '2 files in docs'
154
+ ```
155
+
156
+ A key that exists as-is (eg. `items`) always takes precedence over its plural forms.
157
+
158
+ ### Missing keys and arguments
159
+
160
+ ```javascript
161
+ const i18n = new I18N({
162
+ onMissing: ({ key, locale, type, arg }) => {
163
+ console.warn(`missing ${type}`, locale, key, arg)
164
+ if (type === 'key') return `[${key}]` // optional replacement
165
+ },
166
+ })
167
+ ```
168
+
169
+ `onMissing` is called by `get()` and `t()` for missing keys (`type: 'key'`) and for missing placeholder values
170
+ (`type: 'arg'`, with `arg` set to the placeholder name). Returning a string uses it instead; returning nothing keeps the
171
+ default (`undefined` from `get()`, the key from `t()`, `''` for arguments).
172
+
45
173
  ### Add a Language after initialization
46
174
 
47
175
  ```javascript
48
176
  i18n.addLanguage('fr-FR', {
49
177
  addOption: 'Ajouter une option',
50
178
  })
179
+
180
+ // or from the contents of a .lang file
181
+ i18n.addLanguage('fr-FR', 'addOption = Ajouter une option')
51
182
  ```
52
183
 
53
- ### Process a confige file
184
+ Adding the same locale again merges the keys; `getLangs` and `loaded` do not get duplicates.
185
+
186
+ ### Put a string
54
187
 
55
188
  ```javascript
56
- i18n.processConfig(configFileString)
189
+ i18n.put('greeting', 'Hi {name}') // current language
190
+ i18n.put('greeting', 'Oi {name}', 'pt-BR') // a specific locale
57
191
  ```
58
192
 
59
- ### Example `.lang` file
193
+ ### Change language
194
+
195
+ ```javascript
196
+ await i18n.setCurrent('de-DE') // fetches de-DE.lang unless already loaded or preloaded
197
+ ```
198
+
199
+ ### Process a config
200
+
201
+ ```javascript
202
+ i18n.processConfig({ locale: 'de-DE', override: { 'de-DE': { save: 'Speichern' } } })
203
+ ```
204
+
205
+ `processConfig(options)` applies options without fetching anything; `init(options)` applies them and loads the current
206
+ locale.
207
+
208
+ ### Server-side usage
209
+
210
+ No `fetch` is needed when languages are preloaded or added from strings:
211
+
212
+ ```javascript
213
+ import { readFileSync } from 'node:fs'
214
+ import { I18N } from '@draggable/i18n'
215
+
216
+ const i18n = new I18N({
217
+ locale: 'en-US',
218
+ fallbackLocale: 'en-US',
219
+ preloaded: {
220
+ 'en-US': I18N.parse(readFileSync('lang/en-US.lang', 'utf8')),
221
+ },
222
+ })
223
+ i18n.addLanguage('de-DE', readFileSync('lang/de-DE.lang', 'utf8'))
224
+
225
+ // per request
226
+ const t = i18n.forLocale(request.locale)
227
+ t('greeting', { name: user.name })
228
+ ```
229
+
230
+ `setCurrent()` and `init()` do not fetch locales that are preloaded or added with `addLanguage()`.
231
+ CommonJS is supported as well: `const { I18N } = require('@draggable/i18n')`.
232
+
233
+ ### TypeScript
234
+
235
+ Types are included:
236
+
237
+ ```typescript
238
+ import i18n, { I18N, type I18NOptions, type I18NInstance } from '@draggable/i18n'
239
+
240
+ const options: I18NOptions = { locale: 'en-US', fallbackLocale: 'en-US' }
241
+ const instance: I18NInstance = new I18N(options)
242
+ const label: string = instance.t('addOption')
243
+ ```
244
+
245
+ ### `.lang` files
60
246
 
61
247
  ```txt
248
+ # comments start with # or ; at the beginning of a line
62
249
  de-DE = Deutsch
63
250
  en-US = German
64
251
 
@@ -66,4 +253,16 @@ addOption = Option hinzufügen
66
253
  allFieldsRemoved = Alle Felder wurden entfernt.
67
254
  allowMultipleFiles = Upload mehrerer Dateien erlauben
68
255
  autocomplete = Autovervollständigung
256
+
257
+ ; a trailing backslash continues the value on the next line,
258
+ ; leading whitespace of the next line is ignored
259
+ longText = Dies ist ein langer Text, \
260
+ der über mehrere Zeilen geht.
69
261
  ```
262
+
263
+ - one `key = value` per line, keys and values are trimmed
264
+ - `\n` and `\r\n` line endings are supported, blank lines are ignored
265
+ - `#` or `;` only start a comment at the beginning of a line (after optional whitespace), not after a value
266
+ - a single trailing `\` joins the next line, `\\` at the end of a line is kept as-is
267
+
268
+ Parse file contents with `I18N.parse(text)` (alias of `I18N.processFile(text)`).
package/dist/i18n.cjs ADDED
@@ -0,0 +1,9 @@
1
+
2
+ /**
3
+ @draggable/i18n - https://github.com/Draggable/i18n
4
+ Version: 1.1.2
5
+ Author: Draggable https://draggable.io
6
+ */
7
+
8
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),Object.freeze({method:"GET",body:""});var t={extension:".lang",location:"assets/lang/",langs:["en-US"],locale:"en-US",override:{}},e=null,n=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),s=(t,e)=>{Array.isArray(t)&&!t.includes(e)&&t.push(e)},l=(t,e)=>e?null!=t:Boolean(t),a=new Map,i=(t,e)=>{const n=new Set;return 0===t&&n.add("zero"),n.add(((t,e)=>{const n=1===e?"one":"other";if("undefined"==typeof Intl||"function"!=typeof Intl.PluralRules)return n;if(!a.has(t)){let e=null;try{e=new Intl.PluralRules(String(t).replaceAll("_","-"))}catch{}a.set(t,e)}const s=a.get(t);return s?s.select(e):n})(e,t)),n.add("other"),[...n]},o=new Proxy(class a{constructor(e=t){this.langs=Object.create(null),this.loaded=[],this.processConfig(e)}processConfig(e){const{location:n,...s}={...t,...e},l=n.endsWith("/")?n:`${n}/`;Array.isArray(s.langs)&&(s.langs=[...new Set(s.langs)]),this.config={location:l,...s};const{preloaded:a={},override:i={}}=this.config,o=new Set([...Object.keys(a),...Object.keys(i)]);for(const t of o){const e={...a[t]||{},...i[t]||{}};this.applyLanguage(t,e)}this.locale=this.config.locale||this.config.langs[0]}init(t){this.processConfig({...this.config,...t});const e=this.getFallbackLocales().filter(t=>!this.loaded.includes(t));return e.length?Promise.all([this.setCurrent(this.locale),...e.map(t=>this.loadLang(t))]).then(([t])=>t):this.setCurrent(this.locale)}addLanguage(t,e={}){e="string"==typeof e?a.processFile(e):e,this.applyLanguage(t,e),s(this.loaded,t),s(this.config.langs,t)}getFallbackLocales(){const{fallbackLocale:t}=this.config;return[].concat(t??[]).filter(t=>"string"==typeof t&&t)}getLocaleChain(t=this.locale){const e=[t],n=String(t).split(/[-_]/)[0];return n&&this.langs[n]&&e.push(n),e.push(...this.getFallbackLocales()),[...new Set(e)]}getValue(t,e=this.locale){if(!this.config.fallbackLocale)return this.langs[e]?.[t]||this.getFallbackValue(t);for(const s of this.getLocaleChain(e)){const e=this.langs[s];if(e&&n(e,t)&&l(e[t],!0))return e[t]}}getPluralValue(t,e,s=this.locale){const a=Boolean(this.config.fallbackLocale),o=a?this.getLocaleChain(s):new Set([s,...Object.keys(this.langs)]);for(const r of o){const s=this.langs[r];if(s)for(const o of i(e,r)){const e=`${t}.${o}`;if(n(s,e)&&l(s[e],a))return s[e]}}}handleMissing(t){const{onMissing:e}=this.config;if("function"==typeof e){const n=e(t);if("string"==typeof n)return n}}getFallbackValue(t){return Object.values(this.langs).find(e=>e[t])?.[t]}makeSafe(t){const e={"{":String.raw`\{`,"}":String.raw`\}`,"|":String.raw`\|`},n=t.replaceAll(/[{}|]/g,t=>e[t]);return new RegExp(n,"g")}put(t,e,n){let s;return s=void 0===n?this.current||(this.langs[this.locale]??={}):this.langs[n]??={},s[t]=e,e}get(t,e,n=this.locale){const s=Boolean(this.config.fallbackLocale);let a=this.getValue(t,n);if(!l(a,s)){const s=(t=>"number"==typeof t?t:t&&"object"==typeof t&&"number"==typeof t.count?t.count:void 0)(e);a=void 0===s?void 0:this.getPluralValue(t,s,n)}if(!l(a,s))return this.handleMissing({key:t,locale:n,type:"key"});if(!e&&0!==e)return a;const i=a.match(/\{[^}]+?\}/g);if(!i)return a;if("object"==typeof e)for(const l of i){const s=l.slice(1,-1);let i=e[s];null==i&&(i=this.handleMissing({key:t,locale:n,type:"arg",arg:s})??""),a=a.replace(this.makeSafe(l),i)}else a=a.replaceAll(/\{[^}]+?\}/g,e);return a}t(t,e,n){const s=this.get(t,e,n);return void 0===s?t:s}forLocale(t){return(e,n)=>this.t(e,n,t)}static processFile(t){return o.fromFile(t)}static fromFile(t){const e=String(t).replaceAll("\r\n","\n").split("\n"),n={},s=/^(.+?) *?= *?([^\n]+)/,l=t=>{const e=s.exec(t),l=e?.[1].trim();l&&(n[l]=e[2].trim())};let a=null;for(const i of e){let t=i;if(null!==a)t=a+i.trimStart(),a=null;else if(/^\s*[#;]/.test(i))continue;/(^|[^\\])\\$/.test(t)?a=t.slice(0,-1):l(t)}return null!==a&&l(a),n}static parse(t){return o.processFile(t)}static getInstance(t){return e||(e=new a(t)),e}static resetInstance(){e=null}async loadLang(t,e=!0){if(this.loaded.includes(t)&&e)return this.langs[t];const n=`${this.config.location}${t}${this.config.extension}`;try{const e=await async function(t){try{const e=await fetch(t);if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);return await e[t.endsWith(".lang")?"text":"json"]()}catch(e){throw e}}(n),s="string"==typeof e?a.processFile(e):e;return this.applyLanguage(t,s),this.langs[t]}catch(s){return this.applyLanguage(t)}}applyLanguage(t,e={}){const n=this.config.override[t]||{},l=this.langs[t]||{};return this.langs[t]={...l,...e,...n},this.current&&t===this.locale&&(this.current=this.langs[t]),s(this.loaded,t),this.langs[t]}get getLangs(){return this.config.langs}async setCurrent(t="en-US"){return this.loaded.includes(t)||await this.loadLang(t),this.locale=t,this.current=this.langs[t],this.current}},{apply:(t,e,n)=>t.getInstance(...n),construct:(t,e)=>new t(...e),get:(t,e)=>t[e]}),r=o.getInstance();exports.I18N=o,exports.default=r;
9
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bi5janMubWluLmpzIiwibmFtZXMiOlsiT2JqZWN0IiwiZGVmaW5lUHJvcGVydGllcyIsImV4cG9ydHMiLCJfX2VzTW9kdWxlIiwidmFsdWUiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsImZyZWV6ZSIsIm1ldGhvZCIsImJvZHkiLCJERUZBVUxUX0NPTkZJRyIsImV4dGVuc2lvbiIsImxvY2F0aW9uIiwibGFuZ3MiLCJsb2NhbGUiLCJvdmVycmlkZSIsImluc3RhbmNlIiwiaGFzT3duIiwib2JqIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwicHVzaFVuaXF1ZSIsImFyciIsIml0ZW0iLCJBcnJheSIsImlzQXJyYXkiLCJpbmNsdWRlcyIsInB1c2giLCJpc1ByZXNlbnQiLCJzdHJpY3QiLCJCb29sZWFuIiwicGx1cmFsUnVsZXNDYWNoZSIsIk1hcCIsImdldFBsdXJhbFN1ZmZpeGVzIiwiY291bnQiLCJzdWZmaXhlcyIsIlNldCIsImFkZCIsImJhc2ljQ2F0ZWdvcnkiLCJJbnRsIiwiUGx1cmFsUnVsZXMiLCJoYXMiLCJydWxlcyIsIlN0cmluZyIsInJlcGxhY2VBbGwiLCJzZXQiLCJnZXQiLCJzZWxlY3QiLCJnZXRQbHVyYWxDYXRlZ29yeSIsIkkxOE4iLCJQcm94eSIsIkkxOE5CYXNlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwidGhpcyIsImNyZWF0ZSIsImxvYWRlZCIsInByb2Nlc3NDb25maWciLCJyZXN0T3B0aW9ucyIsInBhcnNlZExvY2F0aW9uIiwiZW5kc1dpdGgiLCJjb25maWciLCJwcmVsb2FkZWQiLCJhbGxMb2NhbGVzIiwia2V5cyIsIm1lcmdlZExhbmciLCJhcHBseUxhbmd1YWdlIiwiaW5pdCIsImZhbGxiYWNrcyIsImdldEZhbGxiYWNrTG9jYWxlcyIsImZpbHRlciIsImxlbmd0aCIsIlByb21pc2UiLCJhbGwiLCJzZXRDdXJyZW50IiwibWFwIiwibG9hZExhbmciLCJ0aGVuIiwiY3VycmVudCIsImFkZExhbmd1YWdlIiwibGFuZyIsInByb2Nlc3NGaWxlIiwiZmFsbGJhY2tMb2NhbGUiLCJjb25jYXQiLCJnZXRMb2NhbGVDaGFpbiIsImNoYWluIiwiYmFzZUxvY2FsZSIsInNwbGl0IiwiZ2V0VmFsdWUiLCJnZXRGYWxsYmFja1ZhbHVlIiwiY2hhaW5Mb2NhbGUiLCJnZXRQbHVyYWxWYWx1ZSIsImxvY2FsZXMiLCJwbHVyYWxMb2NhbGUiLCJzdWZmaXgiLCJwbHVyYWxLZXkiLCJoYW5kbGVNaXNzaW5nIiwiaW5mbyIsIm9uTWlzc2luZyIsInJlc3VsdCIsInZhbHVlcyIsImZpbmQiLCJtYWtlU2FmZSIsInN0ciIsIm1hcE9iaiIsInJhdyIsImVzY2FwZWRTdHIiLCJtYXRjaGVkIiwiUmVnRXhwIiwicHV0Iiwic3RyaW5nIiwiYXJncyIsImdldENvdW50IiwidHlwZSIsInRva2VucyIsIm1hdGNoIiwidG9rZW4iLCJ0b2tlbktleSIsInNsaWNlIiwicmVwbGFjZW1lbnQiLCJhcmciLCJyZXBsYWNlIiwidCIsImZvckxvY2FsZSIsInJlc3BvbnNlIiwiZnJvbUZpbGUiLCJyYXdUZXh0IiwibGluZXMiLCJyZWdleCIsInBhcnNlTGluZSIsImxpbmUiLCJtYXRjaGVzIiwiZXhlYyIsInRyaW0iLCJjb250aW51ZWQiLCJsb2dpY2FsTGluZSIsInRyaW1TdGFydCIsInRlc3QiLCJwYXJzZSIsInRleHQiLCJnZXRJbnN0YW5jZSIsInJlc2V0SW5zdGFuY2UiLCJ1c2VDYWNoZSIsImxhbmdGaWxlIiwiYXN5bmMiLCJ1cmwiLCJmZXRjaCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJlcnJvciIsImZldGNoRGF0YSIsInByb2Nlc3NlZEZpbGUiLCJlcnIiLCJleGlzdGluZ0xhbmciLCJnZXRMYW5ncyIsImFwcGx5IiwidGFyZ2V0IiwidGhpc0FyZyIsImNvbnN0cnVjdCIsInByb3AiLCJtaTE4bl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9mZXRjaC5qcyIsIi4uL3NyYy9taTE4bi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBkZWZhdWx0T3B0aW9ucyA9IE9iamVjdC5mcmVlemUoeyBtZXRob2Q6ICdHRVQnLCBib2R5OiAnJyB9KVxuLyoqXG4gKiBGZXRjaGVzIGEgcmVzb3VyY2UgZnJvbSB0aGUgbmV0d29yay5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIFVSTCB0byBmZXRjaC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbZmV0Y2hPcHRpb25zPXt9XSAtIFRoZSBvcHRpb25zIGZvciB0aGUgZmV0Y2ggcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbZmV0Y2hPcHRpb25zLmhlYWRlcnNdIC0gSGVhZGVycyB0byBpbmNsdWRlIGluIHRoZSByZXF1ZXN0LlxuICogQHBhcmFtIHtzdHJpbmd9IFtmZXRjaE9wdGlvbnMubWV0aG9kXSAtIFRoZSBIVFRQIG1ldGhvZCB0byB1c2UgKGUuZy4sICdHRVQnLCAnUE9TVCcpLlxuICogQHBhcmFtIHtzdHJpbmd8QnVmZmVyfSBbZmV0Y2hPcHRpb25zLmJvZHldIC0gVGhlIGJvZHkgb2YgdGhlIHJlcXVlc3QuXG4gKiBAcmV0dXJuIHtQcm9taXNlPE9iamVjdD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXNwb25zZSBvYmplY3QuXG4gKiBAcmV0dXJuIHtib29sZWFufSByZXR1cm4ub2sgLSBJbmRpY2F0ZXMgaWYgdGhlIHJlc3BvbnNlIHN0YXR1cyBpcyBpbiB0aGUgcmFuZ2UgMjAwLTI5OS5cbiAqIEByZXR1cm4ge251bWJlcn0gcmV0dXJuLnN0YXR1cyAtIFRoZSBIVFRQIHN0YXR1cyBjb2RlIG9mIHRoZSByZXNwb25zZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gcmV0dXJuLnN0YXR1c1RleHQgLSBUaGUgSFRUUCBzdGF0dXMgbWVzc2FnZSBvZiB0aGUgcmVzcG9uc2UuXG4gKiBAcmV0dXJuIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSByZXR1cm4uaGVhZGVycyAtIFRoZSBoZWFkZXJzIG9mIHRoZSByZXNwb25zZS5cbiAqIEByZXR1cm4ge0J1ZmZlcn0gcmV0dXJuLmJvZHkgLSBUaGUgYm9keSBvZiB0aGUgcmVzcG9uc2UgYXMgYSBCdWZmZXIuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbigpOiBQcm9taXNlPEJ1ZmZlcj59IHJldHVybi5hcnJheUJ1ZmZlciAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGJvZHkgYXMgYW4gQXJyYXlCdWZmZXIuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbigpOiBQcm9taXNlPE9iamVjdD59IHJldHVybi5qc29uIC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBwcm9taXNlIHJlc29sdmluZyB0byB0aGUgYm9keSBwYXJzZWQgYXMgSlNPTi5cbiAqL1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEYXRhKHVybCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKVxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCBlcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgIH1cbiAgICBjb25zdCBoYW5kbGVyID0gdXJsLmVuZHNXaXRoKCcubGFuZycpID8gJ3RleHQnIDogJ2pzb24nXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlW2hhbmRsZXJdKClcbiAgICByZXR1cm4gZGF0YVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1RoZXJlIGhhcyBiZWVuIGEgcHJvYmxlbSB3aXRoIHlvdXIgZmV0Y2ggb3BlcmF0aW9uOicsIGVycm9yKVxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cbiIsImltcG9ydCB7IGZldGNoRGF0YSB9IGZyb20gJy4vZmV0Y2guanMnXG5cbmNvbnN0IERFRkFVTFRfQ09ORklHID0ge1xuICBleHRlbnNpb246ICcubGFuZycsXG4gIC8vIGxvY2FsIG9yIHJlbW90ZSBkaXJlY3RvcnkgY29udGFpbmluZyBsYW5ndWFnZSBmaWxlc1xuICBsb2NhdGlvbjogJ2Fzc2V0cy9sYW5nLycsXG4gIC8vIGxpc3Qgb2YgYXZhaWxhYmxlIGxvY2FsZXMsIGhhbmR5IGZvciBwb3B1bGF0aW5nIHNlbGVjdG9yLlxuICBsYW5nczogWydlbi1VUyddLFxuICBsb2NhbGU6ICdlbi1VUycsIC8vIGluaXQgd2l0aCB1c2VyJ3MgcHJlZmVycmVkIGxhbmd1YWdlXG4gIG92ZXJyaWRlOiB7fSxcbn1cblxuLy8gU2luZ2xldG9uIGluc3RhbmNlIGhvbGRlclxubGV0IGluc3RhbmNlID0gbnVsbFxuXG5jb25zdCBoYXNPd24gPSAob2JqLCBrZXkpID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSlcblxuLyoqXG4gKiBBZGQgYW4gaXRlbSB0byBhbiBhcnJheSBpZiBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJcbiAqIEBwYXJhbSB7Kn0gaXRlbVxuICovXG5jb25zdCBwdXNoVW5pcXVlID0gKGFyciwgaXRlbSkgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpICYmICFhcnIuaW5jbHVkZXMoaXRlbSkpIHtcbiAgICBhcnIucHVzaChpdGVtKVxuICB9XG59XG5cbi8qKlxuICogV2hldGhlciBhIGxvb2tlZCB1cCB2YWx1ZSBjb3VudHMgYXMgcHJlc2VudC5cbiAqIExlZ2FjeSBsb29rdXBzIHRyZWF0IGVtcHR5IHN0cmluZ3MgYXMgbWlzc2luZywgZmFsbGJhY2tMb2NhbGUgbG9va3VwcyBkbyBub3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHN0cmljdCB0cnVlIHdoZW4gZmFsbGJhY2tMb2NhbGUgaXMgY29uZmlndXJlZFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuY29uc3QgaXNQcmVzZW50ID0gKHZhbHVlLCBzdHJpY3QpID0+IChzdHJpY3QgPyB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsIDogQm9vbGVhbih2YWx1ZSkpXG5cbi8qKlxuICogRXh0cmFjdCB0aGUgcGx1cmFsIGNvdW50IGZyb20gZ2V0L3QgYXJnc1xuICogQHBhcmFtIHsqfSBhcmdzXG4gKiBAcmV0dXJuIHtOdW1iZXJ8dW5kZWZpbmVkfVxuICovXG5jb25zdCBnZXRDb3VudCA9IGFyZ3MgPT4ge1xuICBpZiAodHlwZW9mIGFyZ3MgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGFyZ3NcbiAgfVxuICBpZiAoYXJncyAmJiB0eXBlb2YgYXJncyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGFyZ3MuY291bnQgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGFyZ3MuY291bnRcbiAgfVxufVxuXG5jb25zdCBwbHVyYWxSdWxlc0NhY2hlID0gbmV3IE1hcCgpXG5cbi8qKlxuICogR2V0IHRoZSBDTERSIHBsdXJhbCBjYXRlZ29yeSBmb3IgYSBjb3VudCBpbiBhIGxvY2FsZVxuICogQHBhcmFtIHtTdHJpbmd9IGxvY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50XG4gKiBAcmV0dXJuIHtTdHJpbmd9IHBsdXJhbCBjYXRlZ29yeSwgZWcuICdvbmUnLCAnZmV3JywgJ290aGVyJ1xuICovXG5jb25zdCBnZXRQbHVyYWxDYXRlZ29yeSA9IChsb2NhbGUsIGNvdW50KSA9PiB7XG4gIGNvbnN0IGJhc2ljQ2F0ZWdvcnkgPSBjb3VudCA9PT0gMSA/ICdvbmUnIDogJ290aGVyJ1xuICBpZiAodHlwZW9mIEludGwgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBJbnRsLlBsdXJhbFJ1bGVzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGJhc2ljQ2F0ZWdvcnlcbiAgfVxuICBpZiAoIXBsdXJhbFJ1bGVzQ2FjaGUuaGFzKGxvY2FsZSkpIHtcbiAgICBsZXQgcnVsZXMgPSBudWxsXG4gICAgdHJ5IHtcbiAgICAgIHJ1bGVzID0gbmV3IEludGwuUGx1cmFsUnVsZXMoU3RyaW5nKGxvY2FsZSkucmVwbGFjZUFsbCgnXycsICctJykpXG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpbnZhbGlkIGxvY2FsZSB0YWdcbiAgICB9XG4gICAgcGx1cmFsUnVsZXNDYWNoZS5zZXQobG9jYWxlLCBydWxlcylcbiAgfVxuICBjb25zdCBydWxlcyA9IHBsdXJhbFJ1bGVzQ2FjaGUuZ2V0KGxvY2FsZSlcbiAgcmV0dXJuIHJ1bGVzID8gcnVsZXMuc2VsZWN0KGNvdW50KSA6IGJhc2ljQ2F0ZWdvcnlcbn1cblxuLyoqXG4gKiBQbHVyYWwga2V5IHN1ZmZpeGVzIHRvIHRyeSwgaW4gb3JkZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudFxuICogQHBhcmFtIHtTdHJpbmd9IGxvY2FsZVxuICogQHJldHVybiB7U3RyaW5nW119XG4gKi9cbmNvbnN0IGdldFBsdXJhbFN1ZmZpeGVzID0gKGNvdW50LCBsb2NhbGUpID0+IHtcbiAgY29uc3Qgc3VmZml4ZXMgPSBuZXcgU2V0KClcbiAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgc3VmZml4ZXMuYWRkKCd6ZXJvJylcbiAgfVxuICBzdWZmaXhlcy5hZGQoZ2V0UGx1cmFsQ2F0ZWdvcnkobG9jYWxlLCBjb3VudCkpXG4gIHN1ZmZpeGVzLmFkZCgnb3RoZXInKVxuICByZXR1cm4gWy4uLnN1ZmZpeGVzXVxufVxuXG4vKipcbiAqIE1haW4gaTE4biBjbGFzc1xuICogQGNsYXNzIEkxOE5CYXNlXG4gKiBAY2xhc3NkZXNjIG1ldGhvZHMgYW5kIGRhdGEgc3RvcmUgZm9yIGkxOG5cbiAqL1xuY2xhc3MgSTE4TkJhc2Uge1xuICAvKipcbiAgICogUHJvY2VzcyBvcHRpb25zIGFuZCBzdGFydCB0aGUgbW9kdWxlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0gREVGQVVMVF9DT05GSUcpIHtcbiAgICB0aGlzLmxhbmdzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIHRoaXMubG9hZGVkID0gW11cbiAgICB0aGlzLnByb2Nlc3NDb25maWcob3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBwYXJzZSBhbmQgZm9ybWF0IGNvbmZpZ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKi9cbiAgcHJvY2Vzc0NvbmZpZyhvcHRpb25zKSB7XG4gICAgY29uc3QgeyBsb2NhdGlvbiwgLi4ucmVzdE9wdGlvbnMgfSA9IHsgLi4uREVGQVVMVF9DT05GSUcsIC4uLm9wdGlvbnMgfVxuICAgIC8vIEVuc3VyZSBsb2NhdGlvbiBlbmRzIHdpdGggYSBzbGFzaFxuICAgIGNvbnN0IHBhcnNlZExvY2F0aW9uID0gbG9jYXRpb24uZW5kc1dpdGgoJy8nKSA/IGxvY2F0aW9uIDogYCR7bG9jYXRpb259L2BcbiAgICAvLyBDb3B5IGxhbmdzIHNvIHRoZSBkZWZhdWx0cyBhbmQgdXNlciBzdXBwbGllZCBhcnJheXMgYXJlIG5ldmVyIG11dGF0ZWRcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN0T3B0aW9ucy5sYW5ncykpIHtcbiAgICAgIHJlc3RPcHRpb25zLmxhbmdzID0gWy4uLm5ldyBTZXQocmVzdE9wdGlvbnMubGFuZ3MpXVxuICAgIH1cbiAgICB0aGlzLmNvbmZpZyA9IHsgbG9jYXRpb246IHBhcnNlZExvY2F0aW9uLCAuLi5yZXN0T3B0aW9ucyB9XG5cbiAgICBjb25zdCB7IHByZWxvYWRlZCA9IHt9LCBvdmVycmlkZSA9IHt9IH0gPSB0aGlzLmNvbmZpZ1xuXG4gICAgLy8gTWVyZ2UgbG9jYWxlcyBmcm9tIGJvdGggcHJlbG9hZGVkIGFuZCBvdmVycmlkZVxuICAgIC8vIFRoaXMgc3VwcG9ydHMgbGVnYWN5IHVzYWdlIHdoZXJlIG92ZXJyaWRlIGRlZmluZWQgZW50aXJlIGxhbmd1YWdlc1xuICAgIGNvbnN0IGFsbExvY2FsZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhwcmVsb2FkZWQpLCAuLi5PYmplY3Qua2V5cyhvdmVycmlkZSldKVxuXG4gICAgLy8gQXBwbHkgbGFuZ3VhZ2VzIGZyb20gYm90aCBwcmVsb2FkZWQgYW5kIG92ZXJyaWRlXG4gICAgLy8gYXBwbHlMYW5ndWFnZSB3aWxsIG1lcmdlIHRoZW0gcHJvcGVybHkgKGV4aXN0aW5nICsgcHJlbG9hZGVkICsgb3ZlcnJpZGUpXG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgYWxsTG9jYWxlcykge1xuICAgICAgY29uc3QgcHJlbG9hZGVkTGFuZyA9IHByZWxvYWRlZFtsb2NhbGVdIHx8IHt9XG4gICAgICBjb25zdCBvdmVycmlkZUxhbmcgPSBvdmVycmlkZVtsb2NhbGVdIHx8IHt9XG4gICAgICAvLyBNZXJnZSBwcmVsb2FkZWQgYW5kIG92ZXJyaWRlIGZvciB0aGlzIGxvY2FsZVxuICAgICAgY29uc3QgbWVyZ2VkTGFuZyA9IHsgLi4ucHJlbG9hZGVkTGFuZywgLi4ub3ZlcnJpZGVMYW5nIH1cbiAgICAgIHRoaXMuYXBwbHlMYW5ndWFnZShsb2NhbGUsIG1lcmdlZExhbmcpXG4gICAgfVxuXG4gICAgdGhpcy5sb2NhbGUgPSB0aGlzLmNvbmZpZy5sb2NhbGUgfHwgdGhpcy5jb25maWcubGFuZ3NbMF1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGxhbmd1YWdlIGFuZCBzZXQgZGVmYXVsdFxuICAgKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybiB7UHJvbWlzZX0gICAgICAgIHJlc29sdmVzIGxhbmd1YWdlXG4gICAqL1xuICBpbml0KG9wdGlvbnMpIHtcbiAgICB0aGlzLnByb2Nlc3NDb25maWcoeyAuLi50aGlzLmNvbmZpZywgLi4ub3B0aW9ucyB9KVxuICAgIC8vIEZhbGxiYWNrIGxvY2FsZXMgYXJlIGxvYWRlZCBhbG9uZ3NpZGUgdGhlIGN1cnJlbnQgbG9jYWxlIHNvIGxvb2t1cHMgY2FuIGZhbGwgYmFjayB0byB0aGVtXG4gICAgY29uc3QgZmFsbGJhY2tzID0gdGhpcy5nZXRGYWxsYmFja0xvY2FsZXMoKS5maWx0ZXIobG9jYWxlID0+ICF0aGlzLmxvYWRlZC5pbmNsdWRlcyhsb2NhbGUpKVxuICAgIGlmICghZmFsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0Q3VycmVudCh0aGlzLmxvY2FsZSlcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFt0aGlzLnNldEN1cnJlbnQodGhpcy5sb2NhbGUpLCAuLi5mYWxsYmFja3MubWFwKGxvY2FsZSA9PiB0aGlzLmxvYWRMYW5nKGxvY2FsZSkpXSkudGhlbihcbiAgICAgIChbY3VycmVudF0pID0+IGN1cnJlbnQsXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBsYW5ndWFnZSB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgbGFuZ3VhZ2VzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGVcbiAgICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBsYW5nXG4gICAqL1xuICBhZGRMYW5ndWFnZShsb2NhbGUsIGxhbmcgPSB7fSkge1xuICAgIGxhbmcgPSB0eXBlb2YgbGFuZyA9PT0gJ3N0cmluZycgPyBJMThOQmFzZS5wcm9jZXNzRmlsZShsYW5nKSA6IGxhbmdcbiAgICB0aGlzLmFwcGx5TGFuZ3VhZ2UobG9jYWxlLCBsYW5nKVxuICAgIHB1c2hVbmlxdWUodGhpcy5sb2FkZWQsIGxvY2FsZSlcbiAgICBwdXNoVW5pcXVlKHRoaXMuY29uZmlnLmxhbmdzLCBsb2NhbGUpXG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlZCBmYWxsYmFjayBsb2NhbGVzXG4gICAqIEByZXR1cm4ge1N0cmluZ1tdfVxuICAgKi9cbiAgZ2V0RmFsbGJhY2tMb2NhbGVzKCkge1xuICAgIGNvbnN0IHsgZmFsbGJhY2tMb2NhbGUgfSA9IHRoaXMuY29uZmlnXG4gICAgcmV0dXJuIFtdLmNvbmNhdChmYWxsYmFja0xvY2FsZSA/PyBbXSkuZmlsdGVyKGxvY2FsZSA9PiB0eXBlb2YgbG9jYWxlID09PSAnc3RyaW5nJyAmJiBsb2NhbGUpXG4gIH1cblxuICAvKipcbiAgICogTG9jYWxlcyBjaGVja2VkLCBpbiBvcmRlciwgd2hlbiBsb29raW5nIHVwIGEga2V5IHdpdGggZmFsbGJhY2tMb2NhbGUgY29uZmlndXJlZDpcbiAgICogcmVxdWVzdGVkIGxvY2FsZSwgaXRzIGJhc2UgbGFuZ3VhZ2UgKGlmIGxvYWRlZCksIHRoZW4gZWFjaCBmYWxsYmFjayBsb2NhbGVcbiAgICogQHBhcmFtICB7U3RyaW5nfSBsb2NhbGVcbiAgICogQHJldHVybiB7U3RyaW5nW119XG4gICAqL1xuICBnZXRMb2NhbGVDaGFpbihsb2NhbGUgPSB0aGlzLmxvY2FsZSkge1xuICAgIGNvbnN0IGNoYWluID0gW2xvY2FsZV1cbiAgICBjb25zdCBiYXNlTG9jYWxlID0gU3RyaW5nKGxvY2FsZSkuc3BsaXQoL1stX10vKVswXVxuICAgIGlmIChiYXNlTG9jYWxlICYmIHRoaXMubGFuZ3NbYmFzZUxvY2FsZV0pIHtcbiAgICAgIGNoYWluLnB1c2goYmFzZUxvY2FsZSlcbiAgICB9XG4gICAgY2hhaW4ucHVzaCguLi50aGlzLmdldEZhbGxiYWNrTG9jYWxlcygpKVxuICAgIHJldHVybiBbLi4ubmV3IFNldChjaGFpbildXG4gIH1cblxuICAvKipcbiAgICogZ2V0IGEgc3RyaW5nIGZyb20gYSBsb2FkZWQgbGFuZ3VhZ2UgZmlsZVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGtleSAgLSB0aGUga2V5IGZvciB0aGUgc3RyaW5nIHdlIGFyZSB0cnlpbmcgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtICB7U3RyaW5nfSBsb2NhbGUgLSBsb2NhbGUgdG8gY2hlY2sgZm9yIHZhbHVlXG4gICAqIEByZXR1cm4ge1N0cmluZ30gbGFuZ3VhZ2Ugc3RyaW5nIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0VmFsdWUoa2V5LCBsb2NhbGUgPSB0aGlzLmxvY2FsZSkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5mYWxsYmFja0xvY2FsZSkge1xuICAgICAgZm9yIChjb25zdCBjaGFpbkxvY2FsZSBvZiB0aGlzLmdldExvY2FsZUNoYWluKGxvY2FsZSkpIHtcbiAgICAgICAgY29uc3QgbGFuZyA9IHRoaXMubGFuZ3NbY2hhaW5Mb2NhbGVdXG4gICAgICAgIGlmIChsYW5nICYmIGhhc093bihsYW5nLCBrZXkpICYmIGlzUHJlc2VudChsYW5nW2tleV0sIHRydWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGxhbmdba2V5XVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMubGFuZ3NbbG9jYWxlXT8uW2tleV1cbiAgICByZXR1cm4gdmFsdWUgfHwgdGhpcy5nZXRGYWxsYmFja1ZhbHVlKGtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgcGx1cmFsIGZvcm0gb2Yga2V5LCBlZy4gYGtleS56ZXJvYCwgYGtleS5vbmVgLCBga2V5Lm90aGVyYFxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGtleVxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGNvdW50XG4gICAqIEBwYXJhbSAge1N0cmluZ30gbG9jYWxlXG4gICAqIEByZXR1cm4ge1N0cmluZ30gcGx1cmFsIHN0cmluZyBvciB1bmRlZmluZWRcbiAgICovXG4gIGdldFBsdXJhbFZhbHVlKGtleSwgY291bnQsIGxvY2FsZSA9IHRoaXMubG9jYWxlKSB7XG4gICAgY29uc3Qgc3RyaWN0ID0gQm9vbGVhbih0aGlzLmNvbmZpZy5mYWxsYmFja0xvY2FsZSlcbiAgICBjb25zdCBsb2NhbGVzID0gc3RyaWN0ID8gdGhpcy5nZXRMb2NhbGVDaGFpbihsb2NhbGUpIDogbmV3IFNldChbbG9jYWxlLCAuLi5PYmplY3Qua2V5cyh0aGlzLmxhbmdzKV0pXG5cbiAgICBmb3IgKGNvbnN0IHBsdXJhbExvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICBjb25zdCBsYW5nID0gdGhpcy5sYW5nc1twbHVyYWxMb2NhbGVdXG4gICAgICBpZiAoIWxhbmcpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qgc3VmZml4IG9mIGdldFBsdXJhbFN1ZmZpeGVzKGNvdW50LCBwbHVyYWxMb2NhbGUpKSB7XG4gICAgICAgIGNvbnN0IHBsdXJhbEtleSA9IGAke2tleX0uJHtzdWZmaXh9YFxuICAgICAgICBpZiAoaGFzT3duKGxhbmcsIHBsdXJhbEtleSkgJiYgaXNQcmVzZW50KGxhbmdbcGx1cmFsS2V5XSwgc3RyaWN0KSkge1xuICAgICAgICAgIHJldHVybiBsYW5nW3BsdXJhbEtleV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnQgYSBtaXNzaW5nIGtleSBvciBhcmd1bWVudCB0byB0aGUgb25NaXNzaW5nIGhhbmRsZXJcbiAgICogQHBhcmFtICB7T2JqZWN0fSBpbmZvIHsga2V5LCBsb2NhbGUsIHR5cGUsIGFyZyB9XG4gICAqIEByZXR1cm4ge1N0cmluZ30gcmVwbGFjZW1lbnQgc3RyaW5nIHJldHVybmVkIGJ5IG9uTWlzc2luZyBvciB1bmRlZmluZWRcbiAgICovXG4gIGhhbmRsZU1pc3NpbmcoaW5mbykge1xuICAgIGNvbnN0IHsgb25NaXNzaW5nIH0gPSB0aGlzLmNvbmZpZ1xuICAgIGlmICh0eXBlb2Ygb25NaXNzaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBvbk1pc3NpbmcoaW5mbylcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYSBsYW5ndWFnZSB0aGF0IGhhcyBkZXNpcmVkIGtleVxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IHZhbHVlIGtleVxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IGZvdW5kIHZhbHVlIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0RmFsbGJhY2tWYWx1ZShrZXkpIHtcbiAgICBjb25zdCBmYWxsYmFja0xhbmcgPSBPYmplY3QudmFsdWVzKHRoaXMubGFuZ3MpLmZpbmQobGFuZyA9PiBsYW5nW2tleV0pXG4gICAgcmV0dXJuIGZhbGxiYWNrTGFuZz8uW2tleV1cbiAgfVxuXG4gIC8qKlxuICAgKiBFc2NhcGUgdmFyaWFibGUgc3ludGF4XG4gICAqIEBwYXJhbSAge1N0cmluZ30gc3RyXG4gICAqIEByZXR1cm4ge1N0cmluZ30gICAgIGVzY2FwZWQgc3RyXG4gICAqL1xuICBtYWtlU2FmZShzdHIpIHtcbiAgICBjb25zdCBtYXBPYmogPSB7XG4gICAgICAneyc6IFN0cmluZy5yYXdgXFx7YCxcbiAgICAgICd9JzogU3RyaW5nLnJhd2BcXH1gLFxuICAgICAgJ3wnOiBTdHJpbmcucmF3YFxcfGAsXG4gICAgfVxuXG4gICAgY29uc3QgZXNjYXBlZFN0ciA9IHN0ci5yZXBsYWNlQWxsKC9be318XS9nLCBtYXRjaGVkID0+IG1hcE9ialttYXRjaGVkXSlcblxuICAgIHJldHVybiBuZXcgUmVnRXhwKGVzY2FwZWRTdHIsICdnJylcbiAgfVxuXG4gIC8qKlxuICAgKiBUZW1wb3JhcmlseSBwdXQgYSBzdHJpbmcgaW50byB0aGUgY3VycmVudGx5IGxvYWRlZCBsYW5ndWFnZSwgb3IgdGhlIGdpdmVuIGxvY2FsZVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGtleVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IHN0cmluZ1xuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGxvY2FsZSBvcHRpb25hbCBsb2NhbGUgdG8gd3JpdGUgdG9cbiAgICogQHJldHVybiB7U3RyaW5nfSBzdHJpbmcgaW4gY3VycmVudCBsYW5ndWFnZVxuICAgKi9cbiAgcHV0KGtleSwgc3RyaW5nLCBsb2NhbGUpIHtcbiAgICBsZXQgbGFuZ1xuICAgIGlmIChsb2NhbGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbGFuZyA9IHRoaXMuY3VycmVudCB8fCAodGhpcy5sYW5nc1t0aGlzLmxvY2FsZV0gPz89IHt9KVxuICAgIH0gZWxzZSB7XG4gICAgICBsYW5nID0gdGhpcy5sYW5nc1tsb2NhbGVdID8/PSB7fVxuICAgIH1cbiAgICBsYW5nW2tleV0gPSBzdHJpbmdcblxuICAgIHJldHVybiBzdHJpbmdcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhcmd1bWVudHMgZm9yIHRoZSByZXF1ZXN0ZWQgc3RyaW5nXG4gICAqIEBwYXJhbSAge1N0cmluZ30ga2V5ICB0aGUga2V5IHdlIHVzZSB0byBsb29rdXAgb3VyIHRyYW5zbGF0aW9uXG4gICAqIEBwYXJhbSAge211bHRpfSAgYXJncyAgc3RyaW5nLCBudW1iZXIgb3Igb2JqZWN0IGNvbnRhaW5pbmcgb3VyIGFyZ3VtZW50c1xuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGxvY2FsZSBvcHRpb25hbCBsb2NhbGUsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGxvY2FsZVxuICAgKiBAcmV0dXJuIHtTdHJpbmd9ICAgICAgdXBkYXRlZCBzdHJpbmcgdHJhbnNsYXRpb25cbiAgICovXG4gIGdldChrZXksIGFyZ3MsIGxvY2FsZSA9IHRoaXMubG9jYWxlKSB7XG4gICAgY29uc3Qgc3RyaWN0ID0gQm9vbGVhbih0aGlzLmNvbmZpZy5mYWxsYmFja0xvY2FsZSlcbiAgICBsZXQgdmFsdWUgPSB0aGlzLmdldFZhbHVlKGtleSwgbG9jYWxlKVxuXG4gICAgaWYgKCFpc1ByZXNlbnQodmFsdWUsIHN0cmljdCkpIHtcbiAgICAgIGNvbnN0IGNvdW50ID0gZ2V0Q291bnQoYXJncylcbiAgICAgIHZhbHVlID0gY291bnQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMuZ2V0UGx1cmFsVmFsdWUoa2V5LCBjb3VudCwgbG9jYWxlKVxuICAgIH1cblxuICAgIGlmICghaXNQcmVzZW50KHZhbHVlLCBzdHJpY3QpKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVNaXNzaW5nKHsga2V5LCBsb2NhbGUsIHR5cGU6ICdrZXknIH0pXG4gICAgfVxuXG4gICAgLy8gTm8gcmVwbGFjZW1lbnQgbmVlZGVkIGlmIG5vIGFyZ3MgcHJvdmlkZWRcbiAgICBpZiAoIWFyZ3MgJiYgYXJncyAhPT0gMCkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW5zID0gdmFsdWUubWF0Y2goL1xce1tefV0rP1xcfS9nKVxuXG4gICAgLy8gTm8gdG9rZW5zIHRvIHJlcGxhY2VcbiAgICBpZiAoIXRva2Vucykge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgLy8gT2JqZWN0IGFyZ3M6IHJlcGxhY2UgZWFjaCB0b2tlbiB3aXRoIGNvcnJlc3BvbmRpbmcga2V5XG4gICAgaWYgKHR5cGVvZiBhcmdzID09PSAnb2JqZWN0Jykge1xuICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICAgICAgY29uc3QgdG9rZW5LZXkgPSB0b2tlbi5zbGljZSgxLCAtMSlcbiAgICAgICAgbGV0IHJlcGxhY2VtZW50ID0gYXJnc1t0b2tlbktleV1cbiAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09PSB1bmRlZmluZWQgfHwgcmVwbGFjZW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgICByZXBsYWNlbWVudCA9IHRoaXMuaGFuZGxlTWlzc2luZyh7IGtleSwgbG9jYWxlLCB0eXBlOiAnYXJnJywgYXJnOiB0b2tlbktleSB9KSA/PyAnJ1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSh0aGlzLm1ha2VTYWZlKHRva2VuKSwgcmVwbGFjZW1lbnQpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFByaW1pdGl2ZSBhcmdzOiByZXBsYWNlIGFsbCB0b2tlbnMgd2l0aCBzYW1lIHZhbHVlXG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2VBbGwoL1xce1tefV0rP1xcfS9nLCBhcmdzKVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIExpa2UgZ2V0KCkgYnV0IGFsd2F5cyByZXR1cm5zIGEgc3RyaW5nLCBmYWxsaW5nIGJhY2sgdG8gdGhlIGtleSBpdHNlbGZcbiAgICogQHBhcmFtICB7U3RyaW5nfSBrZXkgIHRoZSBrZXkgd2UgdXNlIHRvIGxvb2t1cCBvdXIgdHJhbnNsYXRpb25cbiAgICogQHBhcmFtICB7bXVsdGl9ICBhcmdzICBzdHJpbmcsIG51bWJlciBvciBvYmplY3QgY29udGFpbmluZyBvdXIgYXJndW1lbnRzXG4gICAqIEBwYXJhbSAge1N0cmluZ30gbG9jYWxlIG9wdGlvbmFsIGxvY2FsZSwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgbG9jYWxlXG4gICAqIEByZXR1cm4ge1N0cmluZ30gdHJhbnNsYXRlZCBzdHJpbmcgb3Iga2V5XG4gICAqL1xuICB0KGtleSwgYXJncywgbG9jYWxlKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldChrZXksIGFyZ3MsIGxvY2FsZSlcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IGtleSA6IHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdHJhbnNsYXRlIGZ1bmN0aW9uIGJvdW5kIHRvIGEgbG9jYWxlXG4gICAqIEBwYXJhbSAge1N0cmluZ30gbG9jYWxlXG4gICAqIEByZXR1cm4ge0Z1bmN0aW9ufSAoa2V5LCBhcmdzKSA9PiBzdHJpbmdcbiAgICovXG4gIGZvckxvY2FsZShsb2NhbGUpIHtcbiAgICByZXR1cm4gKGtleSwgYXJncykgPT4gdGhpcy50KGtleSwgYXJncywgbG9jYWxlKVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBtZXRob2Q6IFByb2Nlc3MgYSBsYW5ndWFnZSBmaWxlIGZyb20gcmF3IHRleHRcbiAgICogQHBhcmFtICB7U3RyaW5nfSByZXNwb25zZVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IHByb2Nlc3NlZCBsYW5ndWFnZVxuICAgKi9cbiAgc3RhdGljIHByb2Nlc3NGaWxlKHJlc3BvbnNlKSB7XG4gICAgLy8gYmxhbmsgbGluZXMgYXJlIGlnbm9yZWQgYnkgZnJvbUZpbGVcbiAgICByZXR1cm4gSTE4Ti5mcm9tRmlsZShyZXNwb25zZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgbWV0aG9kOiBUdXJuIHJhdyB0ZXh0IGZyb20gdGhlIGxhbmd1YWdlIGZpbGVzIGludG8gZmFuY3kgSlNPTlxuICAgKiBTdXBwb3J0cyBgI2AgYW5kIGA7YCBmdWxsLWxpbmUgY29tbWVudHMgYW5kIHRyYWlsaW5nIGBcXGAgbGluZSBjb250aW51YXRpb25cbiAgICogQHBhcmFtICB7U3RyaW5nfSByYXdUZXh0XG4gICAqIEByZXR1cm4ge09iamVjdH0gY29udmVydGVkIGxhbmd1YWdlIGZpbGVcbiAgICovXG4gIHN0YXRpYyBmcm9tRmlsZShyYXdUZXh0KSB7XG4gICAgY29uc3QgbGluZXMgPSBTdHJpbmcocmF3VGV4dCkucmVwbGFjZUFsbCgnXFxyXFxuJywgJ1xcbicpLnNwbGl0KCdcXG4nKVxuICAgIGNvbnN0IGxhbmcgPSB7fVxuICAgIGNvbnN0IHJlZ2V4ID0gL14oLis/KSAqPz0gKj8oW15cXG5dKykvXG4gICAgY29uc3QgcGFyc2VMaW5lID0gbGluZSA9PiB7XG4gICAgICBjb25zdCBtYXRjaGVzID0gcmVnZXguZXhlYyhsaW5lKVxuICAgICAgY29uc3Qga2V5ID0gbWF0Y2hlcz8uWzFdLnRyaW0oKVxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBsYW5nW2tleV0gPSBtYXRjaGVzWzJdLnRyaW0oKVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBjb250aW51ZWQgPSBudWxsXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBsZXQgbG9naWNhbExpbmUgPSBsaW5lXG4gICAgICBpZiAoY29udGludWVkICE9PSBudWxsKSB7XG4gICAgICAgIGxvZ2ljYWxMaW5lID0gY29udGludWVkICsgbGluZS50cmltU3RhcnQoKVxuICAgICAgICBjb250aW51ZWQgPSBudWxsXG4gICAgICB9IGVsc2UgaWYgKC9eXFxzKlsjO10vLnRlc3QobGluZSkpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gYSBzaW5nbGUgdHJhaWxpbmcgYmFja3NsYXNoIGpvaW5zIHRoZSBuZXh0IGxpbmVcbiAgICAgIGlmICgvKF58W15cXFxcXSlcXFxcJC8udGVzdChsb2dpY2FsTGluZSkpIHtcbiAgICAgICAgY29udGludWVkID0gbG9naWNhbExpbmUuc2xpY2UoMCwgLTEpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHBhcnNlTGluZShsb2dpY2FsTGluZSlcbiAgICB9XG5cbiAgICBpZiAoY29udGludWVkICE9PSBudWxsKSB7XG4gICAgICBwYXJzZUxpbmUoY29udGludWVkKVxuICAgIH1cblxuICAgIHJldHVybiBsYW5nXG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIG1ldGhvZDogUGFyc2UgdGhlIGNvbnRlbnRzIG9mIGEgYC5sYW5nYCBmaWxlLCBhbGlhcyBvZiBwcm9jZXNzRmlsZVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IHRleHRcbiAgICogQHJldHVybiB7T2JqZWN0fSBwcm9jZXNzZWQgbGFuZ3VhZ2VcbiAgICovXG4gIHN0YXRpYyBwYXJzZSh0ZXh0KSB7XG4gICAgcmV0dXJuIEkxOE4ucHJvY2Vzc0ZpbGUodGV4dClcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHtJMThOQmFzZX0gc2luZ2xldG9uIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZ2V0SW5zdGFuY2Uob3B0aW9ucykge1xuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIGluc3RhbmNlID0gbmV3IEkxOE5CYXNlKG9wdGlvbnMpXG4gICAgfVxuICAgIHJldHVybiBpbnN0YW5jZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2UgKHVzZWZ1bCBmb3IgdGVzdGluZylcbiAgICovXG4gIHN0YXRpYyByZXNldEluc3RhbmNlKCkge1xuICAgIGluc3RhbmNlID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSByZW1vdGVseSBzdG9yZWQgbGFuZ3VhZ2UgZmlsZVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGxvY2FsZVxuICAgKiBAcGFyYW0gIHtCb29sZWFufSB1c2VDYWNoZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSAgICAgICByZXNvbHZlcyByZXNwb25zZVxuICAgKi9cbiAgYXN5bmMgbG9hZExhbmcobG9jYWxlLCB1c2VDYWNoZSA9IHRydWUpIHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIGxhbmd1YWdlIGlmIGFscmVhZHkgbG9hZGVkXG4gICAgaWYgKHRoaXMubG9hZGVkLmluY2x1ZGVzKGxvY2FsZSkgJiYgdXNlQ2FjaGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmdzW2xvY2FsZV1cbiAgICB9XG4gICAgLy8gRmV0Y2ggYW5kIHByb2Nlc3MgbGFuZ3VhZ2UgZmlsZVxuICAgIGNvbnN0IGxhbmdGaWxlID0gYCR7dGhpcy5jb25maWcubG9jYXRpb259JHtsb2NhbGV9JHt0aGlzLmNvbmZpZy5leHRlbnNpb259YFxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxhbmcgPSBhd2FpdCBmZXRjaERhdGEobGFuZ0ZpbGUpXG4gICAgICBjb25zdCBwcm9jZXNzZWRGaWxlID0gdHlwZW9mIGxhbmcgPT09ICdzdHJpbmcnID8gSTE4TkJhc2UucHJvY2Vzc0ZpbGUobGFuZykgOiBsYW5nXG4gICAgICB0aGlzLmFwcGx5TGFuZ3VhZ2UobG9jYWxlLCBwcm9jZXNzZWRGaWxlKVxuICAgICAgcmV0dXJuIHRoaXMubGFuZ3NbbG9jYWxlXVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUxhbmd1YWdlKGxvY2FsZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYXBwbGllcyBvdmVycmlkZXMgZnJvbSBjb25maWdcbiAgICogQHBhcmFtIHtTdHJpbmd9IGxvY2FsZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbGFuZ1xuICAgKiBAcmV0dXJuIHtPYmplY3R9IG92ZXJyaWRlbiBsYW5ndWFnZVxuICAgKi9cbiAgYXBwbHlMYW5ndWFnZShsb2NhbGUsIGxhbmcgPSB7fSkge1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5jb25maWcub3ZlcnJpZGVbbG9jYWxlXSB8fCB7fVxuICAgIGNvbnN0IGV4aXN0aW5nTGFuZyA9IHRoaXMubGFuZ3NbbG9jYWxlXSB8fCB7fVxuICAgIHRoaXMubGFuZ3NbbG9jYWxlXSA9IHsgLi4uZXhpc3RpbmdMYW5nLCAuLi5sYW5nLCAuLi5vdmVycmlkZSB9XG4gICAgLy8ga2VlcCB0aGUgY3VycmVudCBsYW5ndWFnZSByZWZlcmVuY2UgaW4gc3luY1xuICAgIGlmICh0aGlzLmN1cnJlbnQgJiYgbG9jYWxlID09PSB0aGlzLmxvY2FsZSkge1xuICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5sYW5nc1tsb2NhbGVdXG4gICAgfVxuICAgIHB1c2hVbmlxdWUodGhpcy5sb2FkZWQsIGxvY2FsZSlcbiAgICByZXR1cm4gdGhpcy5sYW5nc1tsb2NhbGVdXG4gIH1cblxuICAvKipcbiAgICogcmV0dXJuIGN1cnJlbnRseSBhdmFpbGFibGUgbGFuZ3VhZ2VzXG4gICAqIEByZXR1cm4ge09iamVjdH0gYWxsIGNvbmZpZ3VyZWQgbGFuZ3VhZ2VzXG4gICAqL1xuICBnZXQgZ2V0TGFuZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmxhbmdzXG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdCB0byBzZXQgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgdG8gdGhlIGxvY2FsIHByb3ZpZGVkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSAgIGxvY2FsZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBsYW5ndWFnZVxuICAgKi9cbiAgYXN5bmMgc2V0Q3VycmVudChsb2NhbGUgPSAnZW4tVVMnKSB7XG4gICAgaWYgKCF0aGlzLmxvYWRlZC5pbmNsdWRlcyhsb2NhbGUpKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRMYW5nKGxvY2FsZSlcbiAgICB9XG5cbiAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZVxuICAgIHRoaXMuY3VycmVudCA9IHRoaXMubGFuZ3NbbG9jYWxlXVxuXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFxuICB9XG59XG5cbi8qKlxuICogUHJveHkgd3JhcHBlciB0aGF0IGVuYWJsZXMgc2luZ2xldG9uIHBhdHRlcm46XG4gKiAtIEkxOE4oKSByZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2VcbiAqIC0gbmV3IEkxOE4oKSBjcmVhdGVzIGEgbmV3IGluc3RhbmNlXG4gKi9cbmV4cG9ydCBjb25zdCBJMThOID0gbmV3IFByb3h5KEkxOE5CYXNlLCB7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBJMThOKCkgaXMgaW52b2tlZCBhcyBhIGZ1bmN0aW9uICh3aXRob3V0IG5ldylcbiAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gICAqL1xuICBhcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpIHtcbiAgICByZXR1cm4gdGFyZ2V0LmdldEluc3RhbmNlKC4uLmFyZ3MpXG4gIH0sXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIG5ldyBJMThOKCkgaXMgaW52b2tlZFxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlXG4gICAqL1xuICBjb25zdHJ1Y3QodGFyZ2V0LCBhcmdzKSB7XG4gICAgcmV0dXJuIG5ldyB0YXJnZXQoLi4uYXJncylcbiAgfSxcblxuICAvKipcbiAgICogUHJveHkgcHJvcGVydHkgYWNjZXNzIHRvIHRoZSBiYXNlIGNsYXNzXG4gICAqL1xuICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgcmV0dXJuIHRhcmdldFtwcm9wXVxuICB9LFxufSlcblxuZXhwb3J0IGRlZmF1bHQgSTE4Ti5nZXRJbnN0YW5jZSgpXG4iXSwibWFwcGluZ3MiOiJBLCtGQUF1QkEsT0FBT08sT0FBTyxDQUFFQyxPQUFRLE1BQU9DLEtBQU0sS0NFNUQsSUFBTUMsRUFBaUIsQ0FDckJDLFVBQVcsUUFFWEMsU0FBVSxlQUVWQyxNQUFPLENBQUMsU0FDUkMsT0FB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
@@ -1,9 +1,9 @@
1
1
 
2
2
  /**
3
3
  @draggable/i18n - https://github.com/Draggable/i18n
4
- Version: 1.1.1
4
+ Version: 1.1.2
5
5
  Author: Draggable https://draggable.io
6
6
  */
7
7
 
8
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),Object.freeze({method:"GET",body:""});var t={extension:".lang",location:"assets/lang/",langs:["en-US"],locale:"en-US",override:{}},e=null,n=new Proxy(class s{constructor(e=t){this.langs=Object.create(null),this.loaded=[],this.processConfig(e)}processConfig(e){const{location:n,...s}={...t,...e},a=n.endsWith("/")?n:`${n}/`;this.config={location:a,...s};const{preloaded:r={},override:i={}}=this.config,l=new Set([...Object.keys(r),...Object.keys(i)]);for(const t of l){const e={...r[t]||{},...i[t]||{}};this.applyLanguage(t,e)}this.locale=this.config.locale||this.config.langs[0]}init(t){return this.processConfig({...this.config,...t}),this.setCurrent(this.locale)}addLanguage(t,e={}){e="string"==typeof e?s.processFile(e):e,this.applyLanguage(t,e),this.loaded.push(t),this.config.langs.push(t)}getValue(t,e=this.locale){return this.langs[e]?.[t]||this.getFallbackValue(t)}getFallbackValue(t){return Object.values(this.langs).find(e=>e[t])?.[t]}makeSafe(t){const e={"{":String.raw`\{`,"}":String.raw`\}`,"|":String.raw`\|`},n=t.replaceAll(/[{}|]/g,t=>e[t]);return new RegExp(n,"g")}put(t,e){return this.current[t]=e,e}get(t,e){let n=this.getValue(t);if(!n)return;if(!e)return n;const s=n.match(/\{[^}]+?\}/g);if(!s)return n;if("object"==typeof e)for(const a of s){const t=a.slice(1,-1);n=n.replace(this.makeSafe(a),e[t]??"")}else n=n.replaceAll(/\{[^}]+?\}/g,e);return n}static processFile(t){return n.fromFile(t.replaceAll("\n\n","\n"))}static fromFile(t){const e=t.split("\n"),n={};for(let s,a=0;a<e.length;a++)s=/^(.+?) *?= *?([^\n]+)/.exec(e[a]),s&&(n[s[1]]=s[2].trim());return n}static getInstance(t){return e||(e=new s(t)),e}static resetInstance(){e=null}async loadLang(t,e=!0){if(this.loaded.includes(t)&&e)return this.langs[t];const n=`${this.config.location}${t}${this.config.extension}`;try{const e=await async function(t){try{const e=await fetch(t);if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);return await e[t.endsWith(".lang")?"text":"json"]()}catch(e){throw e}}(n),a=s.processFile(e);return this.applyLanguage(t,a),this.langs[t]}catch(a){return this.applyLanguage(t)}}applyLanguage(t,e={}){const n=this.config.override[t]||{},s=this.langs[t]||{};return this.langs[t]={...s,...e,...n},this.loaded.push(t),this.langs[t]}get getLangs(){return this.config.langs}async setCurrent(t="en-US"){return this.loaded.includes(t)||await this.loadLang(t),this.locale=t,this.current=this.langs[t],this.current}},{apply:(t,e,n)=>t.getInstance(...n),construct:(t,e)=>new t(...e),get:(t,e)=>t[e]}),s=n.getInstance();exports.I18N=n,exports.default=s;
9
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bi5janMubWluLmpzIiwibmFtZXMiOlsiT2JqZWN0IiwiZGVmaW5lUHJvcGVydGllcyIsImV4cG9ydHMiLCJfX2VzTW9kdWxlIiwidmFsdWUiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsImZyZWV6ZSIsIm1ldGhvZCIsImJvZHkiLCJERUZBVUxUX0NPTkZJRyIsImV4dGVuc2lvbiIsImxvY2F0aW9uIiwibGFuZ3MiLCJsb2NhbGUiLCJvdmVycmlkZSIsImluc3RhbmNlIiwiSTE4TiIsIlByb3h5IiwiSTE4TkJhc2UiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJ0aGlzIiwiY3JlYXRlIiwibG9hZGVkIiwicHJvY2Vzc0NvbmZpZyIsInJlc3RPcHRpb25zIiwicGFyc2VkTG9jYXRpb24iLCJlbmRzV2l0aCIsImNvbmZpZyIsInByZWxvYWRlZCIsImFsbExvY2FsZXMiLCJTZXQiLCJrZXlzIiwibWVyZ2VkTGFuZyIsImFwcGx5TGFuZ3VhZ2UiLCJpbml0Iiwic2V0Q3VycmVudCIsImFkZExhbmd1YWdlIiwibGFuZyIsInByb2Nlc3NGaWxlIiwicHVzaCIsImdldFZhbHVlIiwia2V5IiwiZ2V0RmFsbGJhY2tWYWx1ZSIsInZhbHVlcyIsImZpbmQiLCJtYWtlU2FmZSIsInN0ciIsIm1hcE9iaiIsIlN0cmluZyIsInJhdyIsImVzY2FwZWRTdHIiLCJyZXBsYWNlQWxsIiwibWF0Y2hlZCIsIlJlZ0V4cCIsInB1dCIsInN0cmluZyIsImN1cnJlbnQiLCJnZXQiLCJhcmdzIiwidG9rZW5zIiwibWF0Y2giLCJ0b2tlbiIsInRva2VuS2V5Iiwic2xpY2UiLCJyZXBsYWNlIiwicmVzcG9uc2UiLCJmcm9tRmlsZSIsInJhd1RleHQiLCJsaW5lcyIsInNwbGl0IiwibWF0Y2hlcyIsImkiLCJsZW5ndGgiLCJleGVjIiwidHJpbSIsImdldEluc3RhbmNlIiwicmVzZXRJbnN0YW5jZSIsImxvYWRMYW5nIiwidXNlQ2FjaGUiLCJpbmNsdWRlcyIsImxhbmdGaWxlIiwiYXN5bmMiLCJ1cmwiLCJmZXRjaCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJlcnJvciIsImZldGNoRGF0YSIsInByb2Nlc3NlZEZpbGUiLCJlcnIiLCJleGlzdGluZ0xhbmciLCJnZXRMYW5ncyIsImFwcGx5IiwidGFyZ2V0IiwidGhpc0FyZyIsImNvbnN0cnVjdCIsInByb3AiLCJtaTE4bl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9mZXRjaC5qcyIsIi4uL3NyYy9taTE4bi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBkZWZhdWx0T3B0aW9ucyA9IE9iamVjdC5mcmVlemUoeyBtZXRob2Q6ICdHRVQnLCBib2R5OiAnJyB9KVxuLyoqXG4gKiBGZXRjaGVzIGEgcmVzb3VyY2UgZnJvbSB0aGUgbmV0d29yay5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIFVSTCB0byBmZXRjaC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbZmV0Y2hPcHRpb25zPXt9XSAtIFRoZSBvcHRpb25zIGZvciB0aGUgZmV0Y2ggcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbZmV0Y2hPcHRpb25zLmhlYWRlcnNdIC0gSGVhZGVycyB0byBpbmNsdWRlIGluIHRoZSByZXF1ZXN0LlxuICogQHBhcmFtIHtzdHJpbmd9IFtmZXRjaE9wdGlvbnMubWV0aG9kXSAtIFRoZSBIVFRQIG1ldGhvZCB0byB1c2UgKGUuZy4sICdHRVQnLCAnUE9TVCcpLlxuICogQHBhcmFtIHtzdHJpbmd8QnVmZmVyfSBbZmV0Y2hPcHRpb25zLmJvZHldIC0gVGhlIGJvZHkgb2YgdGhlIHJlcXVlc3QuXG4gKiBAcmV0dXJuIHtQcm9taXNlPE9iamVjdD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXNwb25zZSBvYmplY3QuXG4gKiBAcmV0dXJuIHtib29sZWFufSByZXR1cm4ub2sgLSBJbmRpY2F0ZXMgaWYgdGhlIHJlc3BvbnNlIHN0YXR1cyBpcyBpbiB0aGUgcmFuZ2UgMjAwLTI5OS5cbiAqIEByZXR1cm4ge251bWJlcn0gcmV0dXJuLnN0YXR1cyAtIFRoZSBIVFRQIHN0YXR1cyBjb2RlIG9mIHRoZSByZXNwb25zZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gcmV0dXJuLnN0YXR1c1RleHQgLSBUaGUgSFRUUCBzdGF0dXMgbWVzc2FnZSBvZiB0aGUgcmVzcG9uc2UuXG4gKiBAcmV0dXJuIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSByZXR1cm4uaGVhZGVycyAtIFRoZSBoZWFkZXJzIG9mIHRoZSByZXNwb25zZS5cbiAqIEByZXR1cm4ge0J1ZmZlcn0gcmV0dXJuLmJvZHkgLSBUaGUgYm9keSBvZiB0aGUgcmVzcG9uc2UgYXMgYSBCdWZmZXIuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbigpOiBQcm9taXNlPEJ1ZmZlcj59IHJldHVybi5hcnJheUJ1ZmZlciAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGJvZHkgYXMgYW4gQXJyYXlCdWZmZXIuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbigpOiBQcm9taXNlPE9iamVjdD59IHJldHVybi5qc29uIC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBwcm9taXNlIHJlc29sdmluZyB0byB0aGUgYm9keSBwYXJzZWQgYXMgSlNPTi5cbiAqL1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEYXRhKHVybCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKVxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCBlcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgIH1cbiAgICBjb25zdCBoYW5kbGVyID0gdXJsLmVuZHNXaXRoKCcubGFuZycpID8gJ3RleHQnIDogJ2pzb24nXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlW2hhbmRsZXJdKClcbiAgICByZXR1cm4gZGF0YVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1RoZXJlIGhhcyBiZWVuIGEgcHJvYmxlbSB3aXRoIHlvdXIgZmV0Y2ggb3BlcmF0aW9uOicsIGVycm9yKVxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cbiIsImltcG9ydCB7IGZldGNoRGF0YSB9IGZyb20gJy4vZmV0Y2guanMnXG5cbmNvbnN0IERFRkFVTFRfQ09ORklHID0ge1xuICBleHRlbnNpb246ICcubGFuZycsXG4gIC8vIGxvY2FsIG9yIHJlbW90ZSBkaXJlY3RvcnkgY29udGFpbmluZyBsYW5ndWFnZSBmaWxlc1xuICBsb2NhdGlvbjogJ2Fzc2V0cy9sYW5nLycsXG4gIC8vIGxpc3Qgb2YgYXZhaWxhYmxlIGxvY2FsZXMsIGhhbmR5IGZvciBwb3B1bGF0aW5nIHNlbGVjdG9yLlxuICBsYW5nczogWydlbi1VUyddLFxuICBsb2NhbGU6ICdlbi1VUycsIC8vIGluaXQgd2l0aCB1c2VyJ3MgcHJlZmVycmVkIGxhbmd1YWdlXG4gIG92ZXJyaWRlOiB7fSxcbn1cblxuLy8gU2luZ2xldG9uIGluc3RhbmNlIGhvbGRlclxubGV0IGluc3RhbmNlID0gbnVsbFxuXG4vKipcbiAqIE1haW4gaTE4biBjbGFzc1xuICogQGNsYXNzIEkxOE5CYXNlXG4gKiBAY2xhc3NkZXNjIG1ldGhvZHMgYW5kIGRhdGEgc3RvcmUgZm9yIGkxOG5cbiAqL1xuY2xhc3MgSTE4TkJhc2Uge1xuICAvKipcbiAgICogUHJvY2VzcyBvcHRpb25zIGFuZCBzdGFydCB0aGUgbW9kdWxlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0gREVGQVVMVF9DT05GSUcpIHtcbiAgICB0aGlzLmxhbmdzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIHRoaXMubG9hZGVkID0gW11cbiAgICB0aGlzLnByb2Nlc3NDb25maWcob3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBwYXJzZSBhbmQgZm9ybWF0IGNvbmZpZ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKi9cbiAgcHJvY2Vzc0NvbmZpZyhvcHRpb25zKSB7XG4gICAgY29uc3QgeyBsb2NhdGlvbiwgLi4ucmVzdE9wdGlvbnMgfSA9IHsgLi4uREVGQVVMVF9DT05GSUcsIC4uLm9wdGlvbnMgfVxuICAgIC8vIEVuc3VyZSBsb2NhdGlvbiBlbmRzIHdpdGggYSBzbGFzaFxuICAgIGNvbnN0IHBhcnNlZExvY2F0aW9uID0gbG9jYXRpb24uZW5kc1dpdGgoJy8nKSA/IGxvY2F0aW9uIDogYCR7bG9jYXRpb259L2BcbiAgICB0aGlzLmNvbmZpZyA9IHsgbG9jYXRpb246IHBhcnNlZExvY2F0aW9uLCAuLi5yZXN0T3B0aW9ucyB9XG5cbiAgICBjb25zdCB7IHByZWxvYWRlZCA9IHt9LCBvdmVycmlkZSA9IHt9IH0gPSB0aGlzLmNvbmZpZ1xuXG4gICAgLy8gTWVyZ2UgbG9jYWxlcyBmcm9tIGJvdGggcHJlbG9hZGVkIGFuZCBvdmVycmlkZVxuICAgIC8vIFRoaXMgc3VwcG9ydHMgbGVnYWN5IHVzYWdlIHdoZXJlIG92ZXJyaWRlIGRlZmluZWQgZW50aXJlIGxhbmd1YWdlc1xuICAgIGNvbnN0IGFsbExvY2FsZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhwcmVsb2FkZWQpLCAuLi5PYmplY3Qua2V5cyhvdmVycmlkZSldKVxuXG4gICAgLy8gQXBwbHkgbGFuZ3VhZ2VzIGZyb20gYm90aCBwcmVsb2FkZWQgYW5kIG92ZXJyaWRlXG4gICAgLy8gYXBwbHlMYW5ndWFnZSB3aWxsIG1lcmdlIHRoZW0gcHJvcGVybHkgKGV4aXN0aW5nICsgcHJlbG9hZGVkICsgb3ZlcnJpZGUpXG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgYWxsTG9jYWxlcykge1xuICAgICAgY29uc3QgcHJlbG9hZGVkTGFuZyA9IHByZWxvYWRlZFtsb2NhbGVdIHx8IHt9XG4gICAgICBjb25zdCBvdmVycmlkZUxhbmcgPSBvdmVycmlkZVtsb2NhbGVdIHx8IHt9XG4gICAgICAvLyBNZXJnZSBwcmVsb2FkZWQgYW5kIG92ZXJyaWRlIGZvciB0aGlzIGxvY2FsZVxuICAgICAgY29uc3QgbWVyZ2VkTGFuZyA9IHsgLi4ucHJlbG9hZGVkTGFuZywgLi4ub3ZlcnJpZGVMYW5nIH1cbiAgICAgIHRoaXMuYXBwbHlMYW5ndWFnZShsb2NhbGUsIG1lcmdlZExhbmcpXG4gICAgfVxuXG4gICAgdGhpcy5sb2NhbGUgPSB0aGlzLmNvbmZpZy5sb2NhbGUgfHwgdGhpcy5jb25maWcubGFuZ3NbMF1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGxhbmd1YWdlIGFuZCBzZXQgZGVmYXVsdFxuICAgKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybiB7UHJvbWlzZX0gICAgICAgIHJlc29sdmVzIGxhbmd1YWdlXG4gICAqL1xuICBpbml0KG9wdGlvbnMpIHtcbiAgICB0aGlzLnByb2Nlc3NDb25maWcoeyAuLi50aGlzLmNvbmZpZywgLi4ub3B0aW9ucyB9KVxuICAgIHJldHVybiB0aGlzLnNldEN1cnJlbnQodGhpcy5sb2NhbGUpXG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGxhbmd1YWdlIHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBsYW5ndWFnZXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IGxvY2FsZVxuICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IGxhbmdcbiAgICovXG4gIGFkZExhbmd1YWdlKGxvY2FsZSwgbGFuZyA9IHt9KSB7XG4gICAgbGFuZyA9IHR5cGVvZiBsYW5nID09PSAnc3RyaW5nJyA/IEkxOE5CYXNlLnByb2Nlc3NGaWxlKGxhbmcpIDogbGFuZ1xuICAgIHRoaXMuYXBwbHlMYW5ndWFnZShsb2NhbGUsIGxhbmcpXG4gICAgdGhpcy5sb2FkZWQucHVzaChsb2NhbGUpXG4gICAgdGhpcy5jb25maWcubGFuZ3MucHVzaChsb2NhbGUpXG4gIH1cblxuICAvKipcbiAgICogZ2V0IGEgc3RyaW5nIGZyb20gYSBsb2FkZWQgbGFuZ3VhZ2UgZmlsZVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGtleSAgLSB0aGUga2V5IGZvciB0aGUgc3RyaW5nIHdlIGFyZSB0cnlpbmcgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtICB7U3RyaW5nfSBsb2NhbGUgLSBsb2NhbGUgdG8gY2hlY2sgZm9yIHZhbHVlXG4gICAqIEByZXR1cm4ge1N0cmluZ30gbGFuZ3VhZ2Ugc3RyaW5nIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0VmFsdWUoa2V5LCBsb2NhbGUgPSB0aGlzLmxvY2FsZSkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5sYW5nc1tsb2NhbGVdPy5ba2V5XVxuICAgIHJldHVybiB2YWx1ZSB8fCB0aGlzLmdldEZhbGxiYWNrVmFsdWUoa2V5KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYSBsYW5ndWFnZSB0aGF0IGhhcyBkZXNpcmVkIGtleVxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IHZhbHVlIGtleVxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IGZvdW5kIHZhbHVlIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0RmFsbGJhY2tWYWx1ZShrZXkpIHtcbiAgICBjb25zdCBmYWxsYmFja0xhbmcgPSBPYmplY3QudmFsdWVzKHRoaXMubGFuZ3MpLmZpbmQobGFuZyA9PiBsYW5nW2tleV0pXG4gICAgcmV0dXJuIGZhbGxiYWNrTGFuZz8uW2tleV1cbiAgfVxuXG4gIC8qKlxuICAgKiBFc2NhcGUgdmFyaWFibGUgc3ludGF4XG4gICAqIEBwYXJhbSAge1N0cmluZ30gc3RyXG4gICAqIEByZXR1cm4ge1N0cmluZ30gICAgIGVzY2FwZWQgc3RyXG4gICAqL1xuICBtYWtlU2FmZShzdHIpIHtcbiAgICBjb25zdCBtYXBPYmogPSB7XG4gICAgICAneyc6IFN0cmluZy5yYXdgXFx7YCxcbiAgICAgICd9JzogU3RyaW5nLnJhd2BcXH1gLFxuICAgICAgJ3wnOiBTdHJpbmcucmF3YFxcfGAsXG4gICAgfVxuXG4gICAgY29uc3QgZXNjYXBlZFN0ciA9IHN0ci5yZXBsYWNlQWxsKC9be318XS9nLCBtYXRjaGVkID0+IG1hcE9ialttYXRjaGVkXSlcblxuICAgIHJldHVybiBuZXcgUmVnRXhwKGVzY2FwZWRTdHIsICdnJylcbiAgfVxuXG4gIC8qKlxuICAgKiBUZW1wb3JhcmlseSBwdXQgYSBzdHJpbmcgaW50byB0aGUgY3VycmVudGx5IGxvYWRlZCBsYW5ndWFnZVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGtleVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IHN0cmluZ1xuICAgKiBAcmV0dXJuIHtTdHJpbmd9IHN0cmluZyBpbiBjdXJyZW50IGxhbmd1YWdlXG4gICAqL1xuICBwdXQoa2V5LCBzdHJpbmcpIHtcbiAgICB0aGlzLmN1cnJlbnRba2V5XSA9IHN0cmluZ1xuXG4gICAgcmV0dXJuIHN0cmluZ1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGFyZ3VtZW50cyBmb3IgdGhlIHJlcXVlc3RlZCBzdHJpbmdcbiAgICogQHBhcmFtICB7U3RyaW5nfSBrZXkgIHRoZSBrZXkgd2UgdXNlIHRvIGxvb2t1cCBvdXIgdHJhbnNsYXRpb25cbiAgICogQHBhcmFtICB7bXVsdGl9ICBhcmdzICBzdHJpbmcsIG51bWJlciBvciBvYmplY3QgY29udGFpbmluZyBvdXIgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1N0cmluZ30gICAgICB1cGRhdGVkIHN0cmluZyB0cmFuc2xhdGlvblxuICAgKi9cbiAgZ2V0KGtleSwgYXJncykge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoa2V5KVxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIE5vIHJlcGxhY2VtZW50IG5lZWRlZCBpZiBubyBhcmdzIHByb3ZpZGVkXG4gICAgaWYgKCFhcmdzKSB7XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbnMgPSB2YWx1ZS5tYXRjaCgvXFx7W159XSs/XFx9L2cpXG5cbiAgICAvLyBObyB0b2tlbnMgdG8gcmVwbGFjZVxuICAgIGlmICghdG9rZW5zKSB7XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICAvLyBPYmplY3QgYXJnczogcmVwbGFjZSBlYWNoIHRva2VuIHdpdGggY29ycmVzcG9uZGluZyBrZXlcbiAgICBpZiAodHlwZW9mIGFyZ3MgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgICBjb25zdCB0b2tlbktleSA9IHRva2VuLnNsaWNlKDEsIC0xKVxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UodGhpcy5tYWtlU2FmZSh0b2tlbiksIGFyZ3NbdG9rZW5LZXldID8/ICcnKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQcmltaXRpdmUgYXJnczogcmVwbGFjZSBhbGwgdG9rZW5zIHdpdGggc2FtZSB2YWx1ZVxuICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlQWxsKC9cXHtbXn1dKz9cXH0vZywgYXJncylcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgbWV0aG9kOiBQcm9jZXNzIGEgbGFuZ3VhZ2UgZmlsZSBmcm9tIHJhdyB0ZXh0XG4gICAqIEBwYXJhbSAge1N0cmluZ30gcmVzcG9uc2VcbiAgICogQHJldHVybiB7T2JqZWN0fSBwcm9jZXNzZWQgbGFuZ3VhZ2VcbiAgICovXG4gIHN0YXRpYyBwcm9jZXNzRmlsZShyZXNwb25zZSkge1xuICAgIHJldHVybiBJMThOLmZyb21GaWxlKHJlc3BvbnNlLnJlcGxhY2VBbGwoJ1xcblxcbicsICdcXG4nKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgbWV0aG9kOiBUdXJuIHJhdyB0ZXh0IGZyb20gdGhlIGxhbmd1YWdlIGZpbGVzIGludG8gZmFuY3kgSlNPTlxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IHJhd1RleHRcbiAgICogQHJldHVybiB7T2JqZWN0fSBjb252ZXJ0ZWQgbGFuZ3VhZ2UgZmlsZVxuICAgKi9cbiAgc3RhdGljIGZyb21GaWxlKHJhd1RleHQpIHtcbiAgICBjb25zdCBsaW5lcyA9IHJhd1RleHQuc3BsaXQoJ1xcbicpXG4gICAgY29uc3QgbGFuZyA9IHt9XG5cbiAgICBmb3IgKGxldCBtYXRjaGVzLCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByZWdleCA9IC9eKC4rPykgKj89ICo/KFteXFxuXSspL1xuICAgICAgbWF0Y2hlcyA9IHJlZ2V4LmV4ZWMobGluZXNbaV0pXG4gICAgICBpZiAobWF0Y2hlcykge1xuICAgICAgICBsYW5nW21hdGNoZXNbMV1dID0gbWF0Y2hlc1syXS50cmltKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGFuZ1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm4ge0kxOE5CYXNlfSBzaW5nbGV0b24gaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBnZXRJbnN0YW5jZShvcHRpb25zKSB7XG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgaW5zdGFuY2UgPSBuZXcgSTE4TkJhc2Uob3B0aW9ucylcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbmNlXG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSAodXNlZnVsIGZvciB0ZXN0aW5nKVxuICAgKi9cbiAgc3RhdGljIHJlc2V0SW5zdGFuY2UoKSB7XG4gICAgaW5zdGFuY2UgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIHJlbW90ZWx5IHN0b3JlZCBsYW5ndWFnZSBmaWxlXG4gICAqIEBwYXJhbSAge1N0cmluZ30gbG9jYWxlXG4gICAqIEBwYXJhbSAge0Jvb2xlYW59IHVzZUNhY2hlXG4gICAqIEByZXR1cm4ge1Byb21pc2V9ICAgICAgIHJlc29sdmVzIHJlc3BvbnNlXG4gICAqL1xuICBhc3luYyBsb2FkTGFuZyhsb2NhbGUsIHVzZUNhY2hlID0gdHJ1ZSkge1xuICAgIC8vIFJldHVybiBjYWNoZWQgbGFuZ3VhZ2UgaWYgYWxyZWFkeSBsb2FkZWRcbiAgICBpZiAodGhpcy5sb2FkZWQuaW5jbHVkZXMobG9jYWxlKSAmJiB1c2VDYWNoZSkge1xuICAgICAgcmV0dXJuIHRoaXMubGFuZ3NbbG9jYWxlXVxuICAgIH1cbiAgICAvLyBGZXRjaCBhbmQgcHJvY2VzcyBsYW5ndWFnZSBmaWxlXG4gICAgY29uc3QgbGFuZ0ZpbGUgPSBgJHt0aGlzLmNvbmZpZy5sb2NhdGlvbn0ke2xvY2FsZX0ke3RoaXMuY29uZmlnLmV4dGVuc2lvbn1gXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbGFuZyA9IGF3YWl0IGZldGNoRGF0YShsYW5nRmlsZSlcbiAgICAgIGNvbnN0IHByb2Nlc3NlZEZpbGUgPSBJMThOQmFzZS5wcm9jZXNzRmlsZShsYW5nKVxuICAgICAgdGhpcy5hcHBseUxhbmd1YWdlKGxvY2FsZSwgcHJvY2Vzc2VkRmlsZSlcbiAgICAgIHJldHVybiB0aGlzLmxhbmdzW2xvY2FsZV1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlMYW5ndWFnZShsb2NhbGUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGFwcGxpZXMgb3ZlcnJpZGVzIGZyb20gY29uZmlnXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGxhbmdcbiAgICogQHJldHVybiB7T2JqZWN0fSBvdmVycmlkZW4gbGFuZ3VhZ2VcbiAgICovXG4gIGFwcGx5TGFuZ3VhZ2UobG9jYWxlLCBsYW5nID0ge30pIHtcbiAgICBjb25zdCBvdmVycmlkZSA9IHRoaXMuY29uZmlnLm92ZXJyaWRlW2xvY2FsZV0gfHwge31cbiAgICBjb25zdCBleGlzdGluZ0xhbmcgPSB0aGlzLmxhbmdzW2xvY2FsZV0gfHwge31cbiAgICB0aGlzLmxhbmdzW2xvY2FsZV0gPSB7IC4uLmV4aXN0aW5nTGFuZywgLi4ubGFuZywgLi4ub3ZlcnJpZGUgfVxuICAgIHRoaXMubG9hZGVkLnB1c2gobG9jYWxlKVxuICAgIHJldHVybiB0aGlzLmxhbmdzW2xvY2FsZV1cbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gY3VycmVudGx5IGF2YWlsYWJsZSBsYW5ndWFnZXNcbiAgICogQHJldHVybiB7T2JqZWN0fSBhbGwgY29uZmlndXJlZCBsYW5ndWFnZXNcbiAgICovXG4gIGdldCBnZXRMYW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcubGFuZ3NcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0IHRvIHNldCB0aGUgY3VycmVudCBsYW5ndWFnZSB0byB0aGUgbG9jYWwgcHJvdmlkZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9ICAgbG9jYWxlXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IGxhbmd1YWdlXG4gICAqL1xuICBhc3luYyBzZXRDdXJyZW50KGxvY2FsZSA9ICdlbi1VUycpIHtcbiAgICBpZiAoIXRoaXMubG9hZGVkLmluY2x1ZGVzKGxvY2FsZSkpIHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZExhbmcobG9jYWxlKVxuICAgIH1cblxuICAgIHRoaXMubG9jYWxlID0gbG9jYWxlXG4gICAgdGhpcy5jdXJyZW50ID0gdGhpcy5sYW5nc1tsb2NhbGVdXG5cbiAgICByZXR1cm4gdGhpcy5jdXJyZW50XG4gIH1cbn1cblxuLyoqXG4gKiBQcm94eSB3cmFwcGVyIHRoYXQgZW5hYmxlcyBzaW5nbGV0b24gcGF0dGVybjpcbiAqIC0gSTE4TigpIHJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZVxuICogLSBuZXcgSTE4TigpIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNvbnN0IEkxOE4gPSBuZXcgUHJveHkoSTE4TkJhc2UsIHtcbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIEkxOE4oKSBpcyBpbnZva2VkIGFzIGEgZnVuY3Rpb24gKHdpdGhvdXQgbmV3KVxuICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2VcbiAgICovXG4gIGFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJncykge1xuICAgIHJldHVybiB0YXJnZXQuZ2V0SW5zdGFuY2UoLi4uYXJncylcbiAgfSxcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gbmV3IEkxOE4oKSBpcyBpbnZva2VkXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2VcbiAgICovXG4gIGNvbnN0cnVjdCh0YXJnZXQsIGFyZ3MpIHtcbiAgICByZXR1cm4gbmV3IHRhcmdldCguLi5hcmdzKVxuICB9LFxuXG4gIC8qKlxuICAgKiBQcm94eSBwcm9wZXJ0eSBhY2Nlc3MgdG8gdGhlIGJhc2UgY2xhc3NcbiAgICovXG4gIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICByZXR1cm4gdGFyZ2V0W3Byb3BdXG4gIH0sXG59KVxuXG5leHBvcnQgZGVmYXVsdCBJMThOLmdldEluc3RhbmNlKClcbiJdLCJtYXBwaW5ncyI6IkEsK0ZBQXVCQSxPQUFPTyxPQUFPLENBQUVDLE9BQVEsTUFBT0MsS0FBTSxLQ0U1RCxJQUFNQyxFQUFpQixDQUNyQkMsVUFBVyxRQUVYQyxTQUFVLGVBRVZDLE1BQU8sQ0FBQyxTQUNSQyxPQUFRLFFBQ1JDLFNBQVUsQ0FBQyxHQUlUQyxFQUFXLEtBa1JGQyxFQUFPLElBQUlDLE1BM1F4QixNQUFNQyxFQUtKLFdBQUFDLENBQVlDLEVBQVVYLEdBQ3BCWSxLQUFLVCxNQUFRYixPQUFPdUIsT0FBTyxNQUMzQkQsS0FBS0UsT0FBUyxHQUNkRixLQUFLRyxjQUFjSixFQUNyQixDQU1BLGFBQUFJLENBQWNKLEdBQ1osTUFBTVQsU0FBRUEsS0FBYWMsR0FBZ0IsSUFBS2hCLEtBQW1CVyxHQUV2RE0sRUFBaUJmLEVBQVNnQixTQUFTLEtBQU9oQixFQUFXLEdBQUdBLEtBQzlEVSxLQUFLTyxPQUFTLENBQUVqQixTQUFVZSxLQUFtQkQsR0FFN0MsTUFBTUksVUFBRUEsRUFBWSxDQUFDLEVBQUFmLFNBQUdBLEVBQVcs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
8
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),Object.freeze({method:"GET",body:""});var t={extension:".lang",location:"assets/lang/",langs:["en-US"],locale:"en-US",override:{}},e=null,n=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),s=(t,e)=>{Array.isArray(t)&&!t.includes(e)&&t.push(e)},l=(t,e)=>e?null!=t:Boolean(t),a=new Map,i=(t,e)=>{const n=new Set;return 0===t&&n.add("zero"),n.add(((t,e)=>{const n=1===e?"one":"other";if("undefined"==typeof Intl||"function"!=typeof Intl.PluralRules)return n;if(!a.has(t)){let e=null;try{e=new Intl.PluralRules(String(t).replaceAll("_","-"))}catch{}a.set(t,e)}const s=a.get(t);return s?s.select(e):n})(e,t)),n.add("other"),[...n]},o=new Proxy(class a{constructor(e=t){this.langs=Object.create(null),this.loaded=[],this.processConfig(e)}processConfig(e){const{location:n,...s}={...t,...e},l=n.endsWith("/")?n:`${n}/`;Array.isArray(s.langs)&&(s.langs=[...new Set(s.langs)]),this.config={location:l,...s};const{preloaded:a={},override:i={}}=this.config,o=new Set([...Object.keys(a),...Object.keys(i)]);for(const t of o){const e={...a[t]||{},...i[t]||{}};this.applyLanguage(t,e)}this.locale=this.config.locale||this.config.langs[0]}init(t){this.processConfig({...this.config,...t});const e=this.getFallbackLocales().filter(t=>!this.loaded.includes(t));return e.length?Promise.all([this.setCurrent(this.locale),...e.map(t=>this.loadLang(t))]).then(([t])=>t):this.setCurrent(this.locale)}addLanguage(t,e={}){e="string"==typeof e?a.processFile(e):e,this.applyLanguage(t,e),s(this.loaded,t),s(this.config.langs,t)}getFallbackLocales(){const{fallbackLocale:t}=this.config;return[].concat(t??[]).filter(t=>"string"==typeof t&&t)}getLocaleChain(t=this.locale){const e=[t],n=String(t).split(/[-_]/)[0];return n&&this.langs[n]&&e.push(n),e.push(...this.getFallbackLocales()),[...new Set(e)]}getValue(t,e=this.locale){if(!this.config.fallbackLocale)return this.langs[e]?.[t]||this.getFallbackValue(t);for(const s of this.getLocaleChain(e)){const e=this.langs[s];if(e&&n(e,t)&&l(e[t],!0))return e[t]}}getPluralValue(t,e,s=this.locale){const a=Boolean(this.config.fallbackLocale),o=a?this.getLocaleChain(s):new Set([s,...Object.keys(this.langs)]);for(const r of o){const s=this.langs[r];if(s)for(const o of i(e,r)){const e=`${t}.${o}`;if(n(s,e)&&l(s[e],a))return s[e]}}}handleMissing(t){const{onMissing:e}=this.config;if("function"==typeof e){const n=e(t);if("string"==typeof n)return n}}getFallbackValue(t){return Object.values(this.langs).find(e=>e[t])?.[t]}makeSafe(t){const e={"{":String.raw`\{`,"}":String.raw`\}`,"|":String.raw`\|`},n=t.replaceAll(/[{}|]/g,t=>e[t]);return new RegExp(n,"g")}put(t,e,n){let s;return s=void 0===n?this.current||(this.langs[this.locale]??={}):this.langs[n]??={},s[t]=e,e}get(t,e,n=this.locale){const s=Boolean(this.config.fallbackLocale);let a=this.getValue(t,n);if(!l(a,s)){const s=(t=>"number"==typeof t?t:t&&"object"==typeof t&&"number"==typeof t.count?t.count:void 0)(e);a=void 0===s?void 0:this.getPluralValue(t,s,n)}if(!l(a,s))return this.handleMissing({key:t,locale:n,type:"key"});if(!e&&0!==e)return a;const i=a.match(/\{[^}]+?\}/g);if(!i)return a;if("object"==typeof e)for(const l of i){const s=l.slice(1,-1);let i=e[s];null==i&&(i=this.handleMissing({key:t,locale:n,type:"arg",arg:s})??""),a=a.replace(this.makeSafe(l),i)}else a=a.replaceAll(/\{[^}]+?\}/g,e);return a}t(t,e,n){const s=this.get(t,e,n);return void 0===s?t:s}forLocale(t){return(e,n)=>this.t(e,n,t)}static processFile(t){return o.fromFile(t)}static fromFile(t){const e=String(t).replaceAll("\r\n","\n").split("\n"),n={},s=/^(.+?) *?= *?([^\n]+)/,l=t=>{const e=s.exec(t),l=e?.[1].trim();l&&(n[l]=e[2].trim())};let a=null;for(const i of e){let t=i;if(null!==a)t=a+i.trimStart(),a=null;else if(/^\s*[#;]/.test(i))continue;/(^|[^\\])\\$/.test(t)?a=t.slice(0,-1):l(t)}return null!==a&&l(a),n}static parse(t){return o.processFile(t)}static getInstance(t){return e||(e=new a(t)),e}static resetInstance(){e=null}async loadLang(t,e=!0){if(this.loaded.includes(t)&&e)return this.langs[t];const n=`${this.config.location}${t}${this.config.extension}`;try{const e=await async function(t){try{const e=await fetch(t);if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);return await e[t.endsWith(".lang")?"text":"json"]()}catch(e){throw e}}(n),s="string"==typeof e?a.processFile(e):e;return this.applyLanguage(t,s),this.langs[t]}catch(s){return this.applyLanguage(t)}}applyLanguage(t,e={}){const n=this.config.override[t]||{},l=this.langs[t]||{};return this.langs[t]={...l,...e,...n},this.current&&t===this.locale&&(this.current=this.langs[t]),s(this.loaded,t),this.langs[t]}get getLangs(){return this.config.langs}async setCurrent(t="en-US"){return this.loaded.includes(t)||await this.loadLang(t),this.locale=t,this.current=this.langs[t],this.current}},{apply:(t,e,n)=>t.getInstance(...n),construct:(t,e)=>new t(...e),get:(t,e)=>t[e]}),r=o.getInstance();exports.I18N=o,exports.default=r;
9
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bi5janMubWluLmpzIiwibmFtZXMiOlsiT2JqZWN0IiwiZGVmaW5lUHJvcGVydGllcyIsImV4cG9ydHMiLCJfX2VzTW9kdWxlIiwidmFsdWUiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsImZyZWV6ZSIsIm1ldGhvZCIsImJvZHkiLCJERUZBVUxUX0NPTkZJRyIsImV4dGVuc2lvbiIsImxvY2F0aW9uIiwibGFuZ3MiLCJsb2NhbGUiLCJvdmVycmlkZSIsImluc3RhbmNlIiwiaGFzT3duIiwib2JqIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwicHVzaFVuaXF1ZSIsImFyciIsIml0ZW0iLCJBcnJheSIsImlzQXJyYXkiLCJpbmNsdWRlcyIsInB1c2giLCJpc1ByZXNlbnQiLCJzdHJpY3QiLCJCb29sZWFuIiwicGx1cmFsUnVsZXNDYWNoZSIsIk1hcCIsImdldFBsdXJhbFN1ZmZpeGVzIiwiY291bnQiLCJzdWZmaXhlcyIsIlNldCIsImFkZCIsImJhc2ljQ2F0ZWdvcnkiLCJJbnRsIiwiUGx1cmFsUnVsZXMiLCJoYXMiLCJydWxlcyIsIlN0cmluZyIsInJlcGxhY2VBbGwiLCJzZXQiLCJnZXQiLCJzZWxlY3QiLCJnZXRQbHVyYWxDYXRlZ29yeSIsIkkxOE4iLCJQcm94eSIsIkkxOE5CYXNlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwidGhpcyIsImNyZWF0ZSIsImxvYWRlZCIsInByb2Nlc3NDb25maWciLCJyZXN0T3B0aW9ucyIsInBhcnNlZExvY2F0aW9uIiwiZW5kc1dpdGgiLCJjb25maWciLCJwcmVsb2FkZWQiLCJhbGxMb2NhbGVzIiwia2V5cyIsIm1lcmdlZExhbmciLCJhcHBseUxhbmd1YWdlIiwiaW5pdCIsImZhbGxiYWNrcyIsImdldEZhbGxiYWNrTG9jYWxlcyIsImZpbHRlciIsImxlbmd0aCIsIlByb21pc2UiLCJhbGwiLCJzZXRDdXJyZW50IiwibWFwIiwibG9hZExhbmciLCJ0aGVuIiwiY3VycmVudCIsImFkZExhbmd1YWdlIiwibGFuZyIsInByb2Nlc3NGaWxlIiwiZmFsbGJhY2tMb2NhbGUiLCJjb25jYXQiLCJnZXRMb2NhbGVDaGFpbiIsImNoYWluIiwiYmFzZUxvY2FsZSIsInNwbGl0IiwiZ2V0VmFsdWUiLCJnZXRGYWxsYmFja1ZhbHVlIiwiY2hhaW5Mb2NhbGUiLCJnZXRQbHVyYWxWYWx1ZSIsImxvY2FsZXMiLCJwbHVyYWxMb2NhbGUiLCJzdWZmaXgiLCJwbHVyYWxLZXkiLCJoYW5kbGVNaXNzaW5nIiwiaW5mbyIsIm9uTWlzc2luZyIsInJlc3VsdCIsInZhbHVlcyIsImZpbmQiLCJtYWtlU2FmZSIsInN0ciIsIm1hcE9iaiIsInJhdyIsImVzY2FwZWRTdHIiLCJtYXRjaGVkIiwiUmVnRXhwIiwicHV0Iiwic3RyaW5nIiwiYXJncyIsImdldENvdW50IiwidHlwZSIsInRva2VucyIsIm1hdGNoIiwidG9rZW4iLCJ0b2tlbktleSIsInNsaWNlIiwicmVwbGFjZW1lbnQiLCJhcmciLCJyZXBsYWNlIiwidCIsImZvckxvY2FsZSIsInJlc3BvbnNlIiwiZnJvbUZpbGUiLCJyYXdUZXh0IiwibGluZXMiLCJyZWdleCIsInBhcnNlTGluZSIsImxpbmUiLCJtYXRjaGVzIiwiZXhlYyIsInRyaW0iLCJjb250aW51ZWQiLCJsb2dpY2FsTGluZSIsInRyaW1TdGFydCIsInRlc3QiLCJwYXJzZSIsInRleHQiLCJnZXRJbnN0YW5jZSIsInJlc2V0SW5zdGFuY2UiLCJ1c2VDYWNoZSIsImxhbmdGaWxlIiwiYXN5bmMiLCJ1cmwiLCJmZXRjaCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJlcnJvciIsImZldGNoRGF0YSIsInByb2Nlc3NlZEZpbGUiLCJlcnIiLCJleGlzdGluZ0xhbmciLCJnZXRMYW5ncyIsImFwcGx5IiwidGFyZ2V0IiwidGhpc0FyZyIsImNvbnN0cnVjdCIsInByb3AiLCJtaTE4bl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9mZXRjaC5qcyIsIi4uL3NyYy9taTE4bi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBkZWZhdWx0T3B0aW9ucyA9IE9iamVjdC5mcmVlemUoeyBtZXRob2Q6ICdHRVQnLCBib2R5OiAnJyB9KVxuLyoqXG4gKiBGZXRjaGVzIGEgcmVzb3VyY2UgZnJvbSB0aGUgbmV0d29yay5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIFVSTCB0byBmZXRjaC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbZmV0Y2hPcHRpb25zPXt9XSAtIFRoZSBvcHRpb25zIGZvciB0aGUgZmV0Y2ggcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbZmV0Y2hPcHRpb25zLmhlYWRlcnNdIC0gSGVhZGVycyB0byBpbmNsdWRlIGluIHRoZSByZXF1ZXN0LlxuICogQHBhcmFtIHtzdHJpbmd9IFtmZXRjaE9wdGlvbnMubWV0aG9kXSAtIFRoZSBIVFRQIG1ldGhvZCB0byB1c2UgKGUuZy4sICdHRVQnLCAnUE9TVCcpLlxuICogQHBhcmFtIHtzdHJpbmd8QnVmZmVyfSBbZmV0Y2hPcHRpb25zLmJvZHldIC0gVGhlIGJvZHkgb2YgdGhlIHJlcXVlc3QuXG4gKiBAcmV0dXJuIHtQcm9taXNlPE9iamVjdD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXNwb25zZSBvYmplY3QuXG4gKiBAcmV0dXJuIHtib29sZWFufSByZXR1cm4ub2sgLSBJbmRpY2F0ZXMgaWYgdGhlIHJlc3BvbnNlIHN0YXR1cyBpcyBpbiB0aGUgcmFuZ2UgMjAwLTI5OS5cbiAqIEByZXR1cm4ge251bWJlcn0gcmV0dXJuLnN0YXR1cyAtIFRoZSBIVFRQIHN0YXR1cyBjb2RlIG9mIHRoZSByZXNwb25zZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gcmV0dXJuLnN0YXR1c1RleHQgLSBUaGUgSFRUUCBzdGF0dXMgbWVzc2FnZSBvZiB0aGUgcmVzcG9uc2UuXG4gKiBAcmV0dXJuIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSByZXR1cm4uaGVhZGVycyAtIFRoZSBoZWFkZXJzIG9mIHRoZSByZXNwb25zZS5cbiAqIEByZXR1cm4ge0J1ZmZlcn0gcmV0dXJuLmJvZHkgLSBUaGUgYm9keSBvZiB0aGUgcmVzcG9uc2UgYXMgYSBCdWZmZXIuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbigpOiBQcm9taXNlPEJ1ZmZlcj59IHJldHVybi5hcnJheUJ1ZmZlciAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGJvZHkgYXMgYW4gQXJyYXlCdWZmZXIuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbigpOiBQcm9taXNlPE9iamVjdD59IHJldHVybi5qc29uIC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBwcm9taXNlIHJlc29sdmluZyB0byB0aGUgYm9keSBwYXJzZWQgYXMgSlNPTi5cbiAqL1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEYXRhKHVybCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKVxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCBlcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgIH1cbiAgICBjb25zdCBoYW5kbGVyID0gdXJsLmVuZHNXaXRoKCcubGFuZycpID8gJ3RleHQnIDogJ2pzb24nXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlW2hhbmRsZXJdKClcbiAgICByZXR1cm4gZGF0YVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1RoZXJlIGhhcyBiZWVuIGEgcHJvYmxlbSB3aXRoIHlvdXIgZmV0Y2ggb3BlcmF0aW9uOicsIGVycm9yKVxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cbiIsImltcG9ydCB7IGZldGNoRGF0YSB9IGZyb20gJy4vZmV0Y2guanMnXG5cbmNvbnN0IERFRkFVTFRfQ09ORklHID0ge1xuICBleHRlbnNpb246ICcubGFuZycsXG4gIC8vIGxvY2FsIG9yIHJlbW90ZSBkaXJlY3RvcnkgY29udGFpbmluZyBsYW5ndWFnZSBmaWxlc1xuICBsb2NhdGlvbjogJ2Fzc2V0cy9sYW5nLycsXG4gIC8vIGxpc3Qgb2YgYXZhaWxhYmxlIGxvY2FsZXMsIGhhbmR5IGZvciBwb3B1bGF0aW5nIHNlbGVjdG9yLlxuICBsYW5nczogWydlbi1VUyddLFxuICBsb2NhbGU6ICdlbi1VUycsIC8vIGluaXQgd2l0aCB1c2VyJ3MgcHJlZmVycmVkIGxhbmd1YWdlXG4gIG92ZXJyaWRlOiB7fSxcbn1cblxuLy8gU2luZ2xldG9uIGluc3RhbmNlIGhvbGRlclxubGV0IGluc3RhbmNlID0gbnVsbFxuXG5jb25zdCBoYXNPd24gPSAob2JqLCBrZXkpID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSlcblxuLyoqXG4gKiBBZGQgYW4gaXRlbSB0byBhbiBhcnJheSBpZiBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJcbiAqIEBwYXJhbSB7Kn0gaXRlbVxuICovXG5jb25zdCBwdXNoVW5pcXVlID0gKGFyciwgaXRlbSkgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpICYmICFhcnIuaW5jbHVkZXMoaXRlbSkpIHtcbiAgICBhcnIucHVzaChpdGVtKVxuICB9XG59XG5cbi8qKlxuICogV2hldGhlciBhIGxvb2tlZCB1cCB2YWx1ZSBjb3VudHMgYXMgcHJlc2VudC5cbiAqIExlZ2FjeSBsb29rdXBzIHRyZWF0IGVtcHR5IHN0cmluZ3MgYXMgbWlzc2luZywgZmFsbGJhY2tMb2NhbGUgbG9va3VwcyBkbyBub3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHN0cmljdCB0cnVlIHdoZW4gZmFsbGJhY2tMb2NhbGUgaXMgY29uZmlndXJlZFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuY29uc3QgaXNQcmVzZW50ID0gKHZhbHVlLCBzdHJpY3QpID0+IChzdHJpY3QgPyB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsIDogQm9vbGVhbih2YWx1ZSkpXG5cbi8qKlxuICogRXh0cmFjdCB0aGUgcGx1cmFsIGNvdW50IGZyb20gZ2V0L3QgYXJnc1xuICogQHBhcmFtIHsqfSBhcmdzXG4gKiBAcmV0dXJuIHtOdW1iZXJ8dW5kZWZpbmVkfVxuICovXG5jb25zdCBnZXRDb3VudCA9IGFyZ3MgPT4ge1xuICBpZiAodHlwZW9mIGFyZ3MgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGFyZ3NcbiAgfVxuICBpZiAoYXJncyAmJiB0eXBlb2YgYXJncyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGFyZ3MuY291bnQgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGFyZ3MuY291bnRcbiAgfVxufVxuXG5jb25zdCBwbHVyYWxSdWxlc0NhY2hlID0gbmV3IE1hcCgpXG5cbi8qKlxuICogR2V0IHRoZSBDTERSIHBsdXJhbCBjYXRlZ29yeSBmb3IgYSBjb3VudCBpbiBhIGxvY2FsZVxuICogQHBhcmFtIHtTdHJpbmd9IGxvY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50XG4gKiBAcmV0dXJuIHtTdHJpbmd9IHBsdXJhbCBjYXRlZ29yeSwgZWcuICdvbmUnLCAnZmV3JywgJ290aGVyJ1xuICovXG5jb25zdCBnZXRQbHVyYWxDYXRlZ29yeSA9IChsb2NhbGUsIGNvdW50KSA9PiB7XG4gIGNvbnN0IGJhc2ljQ2F0ZWdvcnkgPSBjb3VudCA9PT0gMSA/ICdvbmUnIDogJ290aGVyJ1xuICBpZiAodHlwZW9mIEludGwgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBJbnRsLlBsdXJhbFJ1bGVzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGJhc2ljQ2F0ZWdvcnlcbiAgfVxuICBpZiAoIXBsdXJhbFJ1bGVzQ2FjaGUuaGFzKGxvY2FsZSkpIHtcbiAgICBsZXQgcnVsZXMgPSBudWxsXG4gICAgdHJ5IHtcbiAgICAgIHJ1bGVzID0gbmV3IEludGwuUGx1cmFsUnVsZXMoU3RyaW5nKGxvY2FsZSkucmVwbGFjZUFsbCgnXycsICctJykpXG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpbnZhbGlkIGxvY2FsZSB0YWdcbiAgICB9XG4gICAgcGx1cmFsUnVsZXNDYWNoZS5zZXQobG9jYWxlLCBydWxlcylcbiAgfVxuICBjb25zdCBydWxlcyA9IHBsdXJhbFJ1bGVzQ2FjaGUuZ2V0KGxvY2FsZSlcbiAgcmV0dXJuIHJ1bGVzID8gcnVsZXMuc2VsZWN0KGNvdW50KSA6IGJhc2ljQ2F0ZWdvcnlcbn1cblxuLyoqXG4gKiBQbHVyYWwga2V5IHN1ZmZpeGVzIHRvIHRyeSwgaW4gb3JkZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudFxuICogQHBhcmFtIHtTdHJpbmd9IGxvY2FsZVxuICogQHJldHVybiB7U3RyaW5nW119XG4gKi9cbmNvbnN0IGdldFBsdXJhbFN1ZmZpeGVzID0gKGNvdW50LCBsb2NhbGUpID0+IHtcbiAgY29uc3Qgc3VmZml4ZXMgPSBuZXcgU2V0KClcbiAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgc3VmZml4ZXMuYWRkKCd6ZXJvJylcbiAgfVxuICBzdWZmaXhlcy5hZGQoZ2V0UGx1cmFsQ2F0ZWdvcnkobG9jYWxlLCBjb3VudCkpXG4gIHN1ZmZpeGVzLmFkZCgnb3RoZXInKVxuICByZXR1cm4gWy4uLnN1ZmZpeGVzXVxufVxuXG4vKipcbiAqIE1haW4gaTE4biBjbGFzc1xuICogQGNsYXNzIEkxOE5CYXNlXG4gKiBAY2xhc3NkZXNjIG1ldGhvZHMgYW5kIGRhdGEgc3RvcmUgZm9yIGkxOG5cbiAqL1xuY2xhc3MgSTE4TkJhc2Uge1xuICAvKipcbiAgICogUHJvY2VzcyBvcHRpb25zIGFuZCBzdGFydCB0aGUgbW9kdWxlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0gREVGQVVMVF9DT05GSUcpIHtcbiAgICB0aGlzLmxhbmdzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIHRoaXMubG9hZGVkID0gW11cbiAgICB0aGlzLnByb2Nlc3NDb25maWcob3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBwYXJzZSBhbmQgZm9ybWF0IGNvbmZpZ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKi9cbiAgcHJvY2Vzc0NvbmZpZyhvcHRpb25zKSB7XG4gICAgY29uc3QgeyBsb2NhdGlvbiwgLi4ucmVzdE9wdGlvbnMgfSA9IHsgLi4uREVGQVVMVF9DT05GSUcsIC4uLm9wdGlvbnMgfVxuICAgIC8vIEVuc3VyZSBsb2NhdGlvbiBlbmRzIHdpdGggYSBzbGFzaFxuICAgIGNvbnN0IHBhcnNlZExvY2F0aW9uID0gbG9jYXRpb24uZW5kc1dpdGgoJy8nKSA/IGxvY2F0aW9uIDogYCR7bG9jYXRpb259L2BcbiAgICAvLyBDb3B5IGxhbmdzIHNvIHRoZSBkZWZhdWx0cyBhbmQgdXNlciBzdXBwbGllZCBhcnJheXMgYXJlIG5ldmVyIG11dGF0ZWRcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN0T3B0aW9ucy5sYW5ncykpIHtcbiAgICAgIHJlc3RPcHRpb25zLmxhbmdzID0gWy4uLm5ldyBTZXQocmVzdE9wdGlvbnMubGFuZ3MpXVxuICAgIH1cbiAgICB0aGlzLmNvbmZpZyA9IHsgbG9jYXRpb246IHBhcnNlZExvY2F0aW9uLCAuLi5yZXN0T3B0aW9ucyB9XG5cbiAgICBjb25zdCB7IHByZWxvYWRlZCA9IHt9LCBvdmVycmlkZSA9IHt9IH0gPSB0aGlzLmNvbmZpZ1xuXG4gICAgLy8gTWVyZ2UgbG9jYWxlcyBmcm9tIGJvdGggcHJlbG9hZGVkIGFuZCBvdmVycmlkZVxuICAgIC8vIFRoaXMgc3VwcG9ydHMgbGVnYWN5IHVzYWdlIHdoZXJlIG92ZXJyaWRlIGRlZmluZWQgZW50aXJlIGxhbmd1YWdlc1xuICAgIGNvbnN0IGFsbExvY2FsZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhwcmVsb2FkZWQpLCAuLi5PYmplY3Qua2V5cyhvdmVycmlkZSldKVxuXG4gICAgLy8gQXBwbHkgbGFuZ3VhZ2VzIGZyb20gYm90aCBwcmVsb2FkZWQgYW5kIG92ZXJyaWRlXG4gICAgLy8gYXBwbHlMYW5ndWFnZSB3aWxsIG1lcmdlIHRoZW0gcHJvcGVybHkgKGV4aXN0aW5nICsgcHJlbG9hZGVkICsgb3ZlcnJpZGUpXG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgYWxsTG9jYWxlcykge1xuICAgICAgY29uc3QgcHJlbG9hZGVkTGFuZyA9IHByZWxvYWRlZFtsb2NhbGVdIHx8IHt9XG4gICAgICBjb25zdCBvdmVycmlkZUxhbmcgPSBvdmVycmlkZVtsb2NhbGVdIHx8IHt9XG4gICAgICAvLyBNZXJnZSBwcmVsb2FkZWQgYW5kIG92ZXJyaWRlIGZvciB0aGlzIGxvY2FsZVxuICAgICAgY29uc3QgbWVyZ2VkTGFuZyA9IHsgLi4ucHJlbG9hZGVkTGFuZywgLi4ub3ZlcnJpZGVMYW5nIH1cbiAgICAgIHRoaXMuYXBwbHlMYW5ndWFnZShsb2NhbGUsIG1lcmdlZExhbmcpXG4gICAgfVxuXG4gICAgdGhpcy5sb2NhbGUgPSB0aGlzLmNvbmZpZy5sb2NhbGUgfHwgdGhpcy5jb25maWcubGFuZ3NbMF1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGxhbmd1YWdlIGFuZCBzZXQgZGVmYXVsdFxuICAgKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybiB7UHJvbWlzZX0gICAgICAgIHJlc29sdmVzIGxhbmd1YWdlXG4gICAqL1xuICBpbml0KG9wdGlvbnMpIHtcbiAgICB0aGlzLnByb2Nlc3NDb25maWcoeyAuLi50aGlzLmNvbmZpZywgLi4ub3B0aW9ucyB9KVxuICAgIC8vIEZhbGxiYWNrIGxvY2FsZXMgYXJlIGxvYWRlZCBhbG9uZ3NpZGUgdGhlIGN1cnJlbnQgbG9jYWxlIHNvIGxvb2t1cHMgY2FuIGZhbGwgYmFjayB0byB0aGVtXG4gICAgY29uc3QgZmFsbGJhY2tzID0gdGhpcy5nZXRGYWxsYmFja0xvY2FsZXMoKS5maWx0ZXIobG9jYWxlID0+ICF0aGlzLmxvYWRlZC5pbmNsdWRlcyhsb2NhbGUpKVxuICAgIGlmICghZmFsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0Q3VycmVudCh0aGlzLmxvY2FsZSlcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFt0aGlzLnNldEN1cnJlbnQodGhpcy5sb2NhbGUpLCAuLi5mYWxsYmFja3MubWFwKGxvY2FsZSA9PiB0aGlzLmxvYWRMYW5nKGxvY2FsZSkpXSkudGhlbihcbiAgICAgIChbY3VycmVudF0pID0+IGN1cnJlbnQsXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBsYW5ndWFnZSB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgbGFuZ3VhZ2VzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGVcbiAgICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBsYW5nXG4gICAqL1xuICBhZGRMYW5ndWFnZShsb2NhbGUsIGxhbmcgPSB7fSkge1xuICAgIGxhbmcgPSB0eXBlb2YgbGFuZyA9PT0gJ3N0cmluZycgPyBJMThOQmFzZS5wcm9jZXNzRmlsZShsYW5nKSA6IGxhbmdcbiAgICB0aGlzLmFwcGx5TGFuZ3VhZ2UobG9jYWxlLCBsYW5nKVxuICAgIHB1c2hVbmlxdWUodGhpcy5sb2FkZWQsIGxvY2FsZSlcbiAgICBwdXNoVW5pcXVlKHRoaXMuY29uZmlnLmxhbmdzLCBsb2NhbGUpXG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlZCBmYWxsYmFjayBsb2NhbGVzXG4gICAqIEByZXR1cm4ge1N0cmluZ1tdfVxuICAgKi9cbiAgZ2V0RmFsbGJhY2tMb2NhbGVzKCkge1xuICAgIGNvbnN0IHsgZmFsbGJhY2tMb2NhbGUgfSA9IHRoaXMuY29uZmlnXG4gICAgcmV0dXJuIFtdLmNvbmNhdChmYWxsYmFja0xvY2FsZSA/PyBbXSkuZmlsdGVyKGxvY2FsZSA9PiB0eXBlb2YgbG9jYWxlID09PSAnc3RyaW5nJyAmJiBsb2NhbGUpXG4gIH1cblxuICAvKipcbiAgICogTG9jYWxlcyBjaGVja2VkLCBpbiBvcmRlciwgd2hlbiBsb29raW5nIHVwIGEga2V5IHdpdGggZmFsbGJhY2tMb2NhbGUgY29uZmlndXJlZDpcbiAgICogcmVxdWVzdGVkIGxvY2FsZSwgaXRzIGJhc2UgbGFuZ3VhZ2UgKGlmIGxvYWRlZCksIHRoZW4gZWFjaCBmYWxsYmFjayBsb2NhbGVcbiAgICogQHBhcmFtICB7U3RyaW5nfSBsb2NhbGVcbiAgICogQHJldHVybiB7U3RyaW5nW119XG4gICAqL1xuICBnZXRMb2NhbGVDaGFpbihsb2NhbGUgPSB0aGlzLmxvY2FsZSkge1xuICAgIGNvbnN0IGNoYWluID0gW2xvY2FsZV1cbiAgICBjb25zdCBiYXNlTG9jYWxlID0gU3RyaW5nKGxvY2FsZSkuc3BsaXQoL1stX10vKVswXVxuICAgIGlmIChiYXNlTG9jYWxlICYmIHRoaXMubGFuZ3NbYmFzZUxvY2FsZV0pIHtcbiAgICAgIGNoYWluLnB1c2goYmFzZUxvY2FsZSlcbiAgICB9XG4gICAgY2hhaW4ucHVzaCguLi50aGlzLmdldEZhbGxiYWNrTG9jYWxlcygpKVxuICAgIHJldHVybiBbLi4ubmV3IFNldChjaGFpbildXG4gIH1cblxuICAvKipcbiAgICogZ2V0IGEgc3RyaW5nIGZyb20gYSBsb2FkZWQgbGFuZ3VhZ2UgZmlsZVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGtleSAgLSB0aGUga2V5IGZvciB0aGUgc3RyaW5nIHdlIGFyZSB0cnlpbmcgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtICB7U3RyaW5nfSBsb2NhbGUgLSBsb2NhbGUgdG8gY2hlY2sgZm9yIHZhbHVlXG4gICAqIEByZXR1cm4ge1N0cmluZ30gbGFuZ3VhZ2Ugc3RyaW5nIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0VmFsdWUoa2V5LCBsb2NhbGUgPSB0aGlzLmxvY2FsZSkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5mYWxsYmFja0xvY2FsZSkge1xuICAgICAgZm9yIChjb25zdCBjaGFpbkxvY2FsZSBvZiB0aGlzLmdldExvY2FsZUNoYWluKGxvY2FsZSkpIHtcbiAgICAgICAgY29uc3QgbGFuZyA9IHRoaXMubGFuZ3NbY2hhaW5Mb2NhbGVdXG4gICAgICAgIGlmIChsYW5nICYmIGhhc093bihsYW5nLCBrZXkpICYmIGlzUHJlc2VudChsYW5nW2tleV0sIHRydWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGxhbmdba2V5XVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMubGFuZ3NbbG9jYWxlXT8uW2tleV1cbiAgICByZXR1cm4gdmFsdWUgfHwgdGhpcy5nZXRGYWxsYmFja1ZhbHVlKGtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgcGx1cmFsIGZvcm0gb2Yga2V5LCBlZy4gYGtleS56ZXJvYCwgYGtleS5vbmVgLCBga2V5Lm90aGVyYFxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGtleVxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGNvdW50XG4gICAqIEBwYXJhbSAge1N0cmluZ30gbG9jYWxlXG4gICAqIEByZXR1cm4ge1N0cmluZ30gcGx1cmFsIHN0cmluZyBvciB1bmRlZmluZWRcbiAgICovXG4gIGdldFBsdXJhbFZhbHVlKGtleSwgY291bnQsIGxvY2FsZSA9IHRoaXMubG9jYWxlKSB7XG4gICAgY29uc3Qgc3RyaWN0ID0gQm9vbGVhbih0aGlzLmNvbmZpZy5mYWxsYmFja0xvY2FsZSlcbiAgICBjb25zdCBsb2NhbGVzID0gc3RyaWN0ID8gdGhpcy5nZXRMb2NhbGVDaGFpbihsb2NhbGUpIDogbmV3IFNldChbbG9jYWxlLCAuLi5PYmplY3Qua2V5cyh0aGlzLmxhbmdzKV0pXG5cbiAgICBmb3IgKGNvbnN0IHBsdXJhbExvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICBjb25zdCBsYW5nID0gdGhpcy5sYW5nc1twbHVyYWxMb2NhbGVdXG4gICAgICBpZiAoIWxhbmcpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qgc3VmZml4IG9mIGdldFBsdXJhbFN1ZmZpeGVzKGNvdW50LCBwbHVyYWxMb2NhbGUpKSB7XG4gICAgICAgIGNvbnN0IHBsdXJhbEtleSA9IGAke2tleX0uJHtzdWZmaXh9YFxuICAgICAgICBpZiAoaGFzT3duKGxhbmcsIHBsdXJhbEtleSkgJiYgaXNQcmVzZW50KGxhbmdbcGx1cmFsS2V5XSwgc3RyaWN0KSkge1xuICAgICAgICAgIHJldHVybiBsYW5nW3BsdXJhbEtleV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnQgYSBtaXNzaW5nIGtleSBvciBhcmd1bWVudCB0byB0aGUgb25NaXNzaW5nIGhhbmRsZXJcbiAgICogQHBhcmFtICB7T2JqZWN0fSBpbmZvIHsga2V5LCBsb2NhbGUsIHR5cGUsIGFyZyB9XG4gICAqIEByZXR1cm4ge1N0cmluZ30gcmVwbGFjZW1lbnQgc3RyaW5nIHJldHVybmVkIGJ5IG9uTWlzc2luZyBvciB1bmRlZmluZWRcbiAgICovXG4gIGhhbmRsZU1pc3NpbmcoaW5mbykge1xuICAgIGNvbnN0IHsgb25NaXNzaW5nIH0gPSB0aGlzLmNvbmZpZ1xuICAgIGlmICh0eXBlb2Ygb25NaXNzaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBvbk1pc3NpbmcoaW5mbylcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYSBsYW5ndWFnZSB0aGF0IGhhcyBkZXNpcmVkIGtleVxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IHZhbHVlIGtleVxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IGZvdW5kIHZhbHVlIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0RmFsbGJhY2tWYWx1ZShrZXkpIHtcbiAgICBjb25zdCBmYWxsYmFja0xhbmcgPSBPYmplY3QudmFsdWVzKHRoaXMubGFuZ3MpLmZpbmQobGFuZyA9PiBsYW5nW2tleV0pXG4gICAgcmV0dXJuIGZhbGxiYWNrTGFuZz8uW2tleV1cbiAgfVxuXG4gIC8qKlxuICAgKiBFc2NhcGUgdmFyaWFibGUgc3ludGF4XG4gICAqIEBwYXJhbSAge1N0cmluZ30gc3RyXG4gICAqIEByZXR1cm4ge1N0cmluZ30gICAgIGVzY2FwZWQgc3RyXG4gICAqL1xuICBtYWtlU2FmZShzdHIpIHtcbiAgICBjb25zdCBtYXBPYmogPSB7XG4gICAgICAneyc6IFN0cmluZy5yYXdgXFx7YCxcbiAgICAgICd9JzogU3RyaW5nLnJhd2BcXH1gLFxuICAgICAgJ3wnOiBTdHJpbmcucmF3YFxcfGAsXG4gICAgfVxuXG4gICAgY29uc3QgZXNjYXBlZFN0ciA9IHN0ci5yZXBsYWNlQWxsKC9be318XS9nLCBtYXRjaGVkID0+IG1hcE9ialttYXRjaGVkXSlcblxuICAgIHJldHVybiBuZXcgUmVnRXhwKGVzY2FwZWRTdHIsICdnJylcbiAgfVxuXG4gIC8qKlxuICAgKiBUZW1wb3JhcmlseSBwdXQgYSBzdHJpbmcgaW50byB0aGUgY3VycmVudGx5IGxvYWRlZCBsYW5ndWFnZSwgb3IgdGhlIGdpdmVuIGxvY2FsZVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGtleVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IHN0cmluZ1xuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGxvY2FsZSBvcHRpb25hbCBsb2NhbGUgdG8gd3JpdGUgdG9cbiAgICogQHJldHVybiB7U3RyaW5nfSBzdHJpbmcgaW4gY3VycmVudCBsYW5ndWFnZVxuICAgKi9cbiAgcHV0KGtleSwgc3RyaW5nLCBsb2NhbGUpIHtcbiAgICBsZXQgbGFuZ1xuICAgIGlmIChsb2NhbGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbGFuZyA9IHRoaXMuY3VycmVudCB8fCAodGhpcy5sYW5nc1t0aGlzLmxvY2FsZV0gPz89IHt9KVxuICAgIH0gZWxzZSB7XG4gICAgICBsYW5nID0gdGhpcy5sYW5nc1tsb2NhbGVdID8/PSB7fVxuICAgIH1cbiAgICBsYW5nW2tleV0gPSBzdHJpbmdcblxuICAgIHJldHVybiBzdHJpbmdcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhcmd1bWVudHMgZm9yIHRoZSByZXF1ZXN0ZWQgc3RyaW5nXG4gICAqIEBwYXJhbSAge1N0cmluZ30ga2V5ICB0aGUga2V5IHdlIHVzZSB0byBsb29rdXAgb3VyIHRyYW5zbGF0aW9uXG4gICAqIEBwYXJhbSAge211bHRpfSAgYXJncyAgc3RyaW5nLCBudW1iZXIgb3Igb2JqZWN0IGNvbnRhaW5pbmcgb3VyIGFyZ3VtZW50c1xuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGxvY2FsZSBvcHRpb25hbCBsb2NhbGUsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGxvY2FsZVxuICAgKiBAcmV0dXJuIHtTdHJpbmd9ICAgICAgdXBkYXRlZCBzdHJpbmcgdHJhbnNsYXRpb25cbiAgICovXG4gIGdldChrZXksIGFyZ3MsIGxvY2FsZSA9IHRoaXMubG9jYWxlKSB7XG4gICAgY29uc3Qgc3RyaWN0ID0gQm9vbGVhbih0aGlzLmNvbmZpZy5mYWxsYmFja0xvY2FsZSlcbiAgICBsZXQgdmFsdWUgPSB0aGlzLmdldFZhbHVlKGtleSwgbG9jYWxlKVxuXG4gICAgaWYgKCFpc1ByZXNlbnQodmFsdWUsIHN0cmljdCkpIHtcbiAgICAgIGNvbnN0IGNvdW50ID0gZ2V0Q291bnQoYXJncylcbiAgICAgIHZhbHVlID0gY291bnQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMuZ2V0UGx1cmFsVmFsdWUoa2V5LCBjb3VudCwgbG9jYWxlKVxuICAgIH1cblxuICAgIGlmICghaXNQcmVzZW50KHZhbHVlLCBzdHJpY3QpKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVNaXNzaW5nKHsga2V5LCBsb2NhbGUsIHR5cGU6ICdrZXknIH0pXG4gICAgfVxuXG4gICAgLy8gTm8gcmVwbGFjZW1lbnQgbmVlZGVkIGlmIG5vIGFyZ3MgcHJvdmlkZWRcbiAgICBpZiAoIWFyZ3MgJiYgYXJncyAhPT0gMCkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW5zID0gdmFsdWUubWF0Y2goL1xce1tefV0rP1xcfS9nKVxuXG4gICAgLy8gTm8gdG9rZW5zIHRvIHJlcGxhY2VcbiAgICBpZiAoIXRva2Vucykge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgLy8gT2JqZWN0IGFyZ3M6IHJlcGxhY2UgZWFjaCB0b2tlbiB3aXRoIGNvcnJlc3BvbmRpbmcga2V5XG4gICAgaWYgKHR5cGVvZiBhcmdzID09PSAnb2JqZWN0Jykge1xuICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICAgICAgY29uc3QgdG9rZW5LZXkgPSB0b2tlbi5zbGljZSgxLCAtMSlcbiAgICAgICAgbGV0IHJlcGxhY2VtZW50ID0gYXJnc1t0b2tlbktleV1cbiAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09PSB1bmRlZmluZWQgfHwgcmVwbGFjZW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgICByZXBsYWNlbWVudCA9IHRoaXMuaGFuZGxlTWlzc2luZyh7IGtleSwgbG9jYWxlLCB0eXBlOiAnYXJnJywgYXJnOiB0b2tlbktleSB9KSA/PyAnJ1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSh0aGlzLm1ha2VTYWZlKHRva2VuKSwgcmVwbGFjZW1lbnQpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFByaW1pdGl2ZSBhcmdzOiByZXBsYWNlIGFsbCB0b2tlbnMgd2l0aCBzYW1lIHZhbHVlXG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2VBbGwoL1xce1tefV0rP1xcfS9nLCBhcmdzKVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIExpa2UgZ2V0KCkgYnV0IGFsd2F5cyByZXR1cm5zIGEgc3RyaW5nLCBmYWxsaW5nIGJhY2sgdG8gdGhlIGtleSBpdHNlbGZcbiAgICogQHBhcmFtICB7U3RyaW5nfSBrZXkgIHRoZSBrZXkgd2UgdXNlIHRvIGxvb2t1cCBvdXIgdHJhbnNsYXRpb25cbiAgICogQHBhcmFtICB7bXVsdGl9ICBhcmdzICBzdHJpbmcsIG51bWJlciBvciBvYmplY3QgY29udGFpbmluZyBvdXIgYXJndW1lbnRzXG4gICAqIEBwYXJhbSAge1N0cmluZ30gbG9jYWxlIG9wdGlvbmFsIGxvY2FsZSwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgbG9jYWxlXG4gICAqIEByZXR1cm4ge1N0cmluZ30gdHJhbnNsYXRlZCBzdHJpbmcgb3Iga2V5XG4gICAqL1xuICB0KGtleSwgYXJncywgbG9jYWxlKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldChrZXksIGFyZ3MsIGxvY2FsZSlcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IGtleSA6IHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdHJhbnNsYXRlIGZ1bmN0aW9uIGJvdW5kIHRvIGEgbG9jYWxlXG4gICAqIEBwYXJhbSAge1N0cmluZ30gbG9jYWxlXG4gICAqIEByZXR1cm4ge0Z1bmN0aW9ufSAoa2V5LCBhcmdzKSA9PiBzdHJpbmdcbiAgICovXG4gIGZvckxvY2FsZShsb2NhbGUpIHtcbiAgICByZXR1cm4gKGtleSwgYXJncykgPT4gdGhpcy50KGtleSwgYXJncywgbG9jYWxlKVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBtZXRob2Q6IFByb2Nlc3MgYSBsYW5ndWFnZSBmaWxlIGZyb20gcmF3IHRleHRcbiAgICogQHBhcmFtICB7U3RyaW5nfSByZXNwb25zZVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IHByb2Nlc3NlZCBsYW5ndWFnZVxuICAgKi9cbiAgc3RhdGljIHByb2Nlc3NGaWxlKHJlc3BvbnNlKSB7XG4gICAgLy8gYmxhbmsgbGluZXMgYXJlIGlnbm9yZWQgYnkgZnJvbUZpbGVcbiAgICByZXR1cm4gSTE4Ti5mcm9tRmlsZShyZXNwb25zZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgbWV0aG9kOiBUdXJuIHJhdyB0ZXh0IGZyb20gdGhlIGxhbmd1YWdlIGZpbGVzIGludG8gZmFuY3kgSlNPTlxuICAgKiBTdXBwb3J0cyBgI2AgYW5kIGA7YCBmdWxsLWxpbmUgY29tbWVudHMgYW5kIHRyYWlsaW5nIGBcXGAgbGluZSBjb250aW51YXRpb25cbiAgICogQHBhcmFtICB7U3RyaW5nfSByYXdUZXh0XG4gICAqIEByZXR1cm4ge09iamVjdH0gY29udmVydGVkIGxhbmd1YWdlIGZpbGVcbiAgICovXG4gIHN0YXRpYyBmcm9tRmlsZShyYXdUZXh0KSB7XG4gICAgY29uc3QgbGluZXMgPSBTdHJpbmcocmF3VGV4dCkucmVwbGFjZUFsbCgnXFxyXFxuJywgJ1xcbicpLnNwbGl0KCdcXG4nKVxuICAgIGNvbnN0IGxhbmcgPSB7fVxuICAgIGNvbnN0IHJlZ2V4ID0gL14oLis/KSAqPz0gKj8oW15cXG5dKykvXG4gICAgY29uc3QgcGFyc2VMaW5lID0gbGluZSA9PiB7XG4gICAgICBjb25zdCBtYXRjaGVzID0gcmVnZXguZXhlYyhsaW5lKVxuICAgICAgY29uc3Qga2V5ID0gbWF0Y2hlcz8uWzFdLnRyaW0oKVxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBsYW5nW2tleV0gPSBtYXRjaGVzWzJdLnRyaW0oKVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBjb250aW51ZWQgPSBudWxsXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBsZXQgbG9naWNhbExpbmUgPSBsaW5lXG4gICAgICBpZiAoY29udGludWVkICE9PSBudWxsKSB7XG4gICAgICAgIGxvZ2ljYWxMaW5lID0gY29udGludWVkICsgbGluZS50cmltU3RhcnQoKVxuICAgICAgICBjb250aW51ZWQgPSBudWxsXG4gICAgICB9IGVsc2UgaWYgKC9eXFxzKlsjO10vLnRlc3QobGluZSkpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gYSBzaW5nbGUgdHJhaWxpbmcgYmFja3NsYXNoIGpvaW5zIHRoZSBuZXh0IGxpbmVcbiAgICAgIGlmICgvKF58W15cXFxcXSlcXFxcJC8udGVzdChsb2dpY2FsTGluZSkpIHtcbiAgICAgICAgY29udGludWVkID0gbG9naWNhbExpbmUuc2xpY2UoMCwgLTEpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHBhcnNlTGluZShsb2dpY2FsTGluZSlcbiAgICB9XG5cbiAgICBpZiAoY29udGludWVkICE9PSBudWxsKSB7XG4gICAgICBwYXJzZUxpbmUoY29udGludWVkKVxuICAgIH1cblxuICAgIHJldHVybiBsYW5nXG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIG1ldGhvZDogUGFyc2UgdGhlIGNvbnRlbnRzIG9mIGEgYC5sYW5nYCBmaWxlLCBhbGlhcyBvZiBwcm9jZXNzRmlsZVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IHRleHRcbiAgICogQHJldHVybiB7T2JqZWN0fSBwcm9jZXNzZWQgbGFuZ3VhZ2VcbiAgICovXG4gIHN0YXRpYyBwYXJzZSh0ZXh0KSB7XG4gICAgcmV0dXJuIEkxOE4ucHJvY2Vzc0ZpbGUodGV4dClcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHtJMThOQmFzZX0gc2luZ2xldG9uIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZ2V0SW5zdGFuY2Uob3B0aW9ucykge1xuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIGluc3RhbmNlID0gbmV3IEkxOE5CYXNlKG9wdGlvbnMpXG4gICAgfVxuICAgIHJldHVybiBpbnN0YW5jZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2UgKHVzZWZ1bCBmb3IgdGVzdGluZylcbiAgICovXG4gIHN0YXRpYyByZXNldEluc3RhbmNlKCkge1xuICAgIGluc3RhbmNlID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSByZW1vdGVseSBzdG9yZWQgbGFuZ3VhZ2UgZmlsZVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGxvY2FsZVxuICAgKiBAcGFyYW0gIHtCb29sZWFufSB1c2VDYWNoZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSAgICAgICByZXNvbHZlcyByZXNwb25zZVxuICAgKi9cbiAgYXN5bmMgbG9hZExhbmcobG9jYWxlLCB1c2VDYWNoZSA9IHRydWUpIHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIGxhbmd1YWdlIGlmIGFscmVhZHkgbG9hZGVkXG4gICAgaWYgKHRoaXMubG9hZGVkLmluY2x1ZGVzKGxvY2FsZSkgJiYgdXNlQ2FjaGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmdzW2xvY2FsZV1cbiAgICB9XG4gICAgLy8gRmV0Y2ggYW5kIHByb2Nlc3MgbGFuZ3VhZ2UgZmlsZVxuICAgIGNvbnN0IGxhbmdGaWxlID0gYCR7dGhpcy5jb25maWcubG9jYXRpb259JHtsb2NhbGV9JHt0aGlzLmNvbmZpZy5leHRlbnNpb259YFxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxhbmcgPSBhd2FpdCBmZXRjaERhdGEobGFuZ0ZpbGUpXG4gICAgICBjb25zdCBwcm9jZXNzZWRGaWxlID0gdHlwZW9mIGxhbmcgPT09ICdzdHJpbmcnID8gSTE4TkJhc2UucHJvY2Vzc0ZpbGUobGFuZykgOiBsYW5nXG4gICAgICB0aGlzLmFwcGx5TGFuZ3VhZ2UobG9jYWxlLCBwcm9jZXNzZWRGaWxlKVxuICAgICAgcmV0dXJuIHRoaXMubGFuZ3NbbG9jYWxlXVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUxhbmd1YWdlKGxvY2FsZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYXBwbGllcyBvdmVycmlkZXMgZnJvbSBjb25maWdcbiAgICogQHBhcmFtIHtTdHJpbmd9IGxvY2FsZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbGFuZ1xuICAgKiBAcmV0dXJuIHtPYmplY3R9IG92ZXJyaWRlbiBsYW5ndWFnZVxuICAgKi9cbiAgYXBwbHlMYW5ndWFnZShsb2NhbGUsIGxhbmcgPSB7fSkge1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5jb25maWcub3ZlcnJpZGVbbG9jYWxlXSB8fCB7fVxuICAgIGNvbnN0IGV4aXN0aW5nTGFuZyA9IHRoaXMubGFuZ3NbbG9jYWxlXSB8fCB7fVxuICAgIHRoaXMubGFuZ3NbbG9jYWxlXSA9IHsgLi4uZXhpc3RpbmdMYW5nLCAuLi5sYW5nLCAuLi5vdmVycmlkZSB9XG4gICAgLy8ga2VlcCB0aGUgY3VycmVudCBsYW5ndWFnZSByZWZlcmVuY2UgaW4gc3luY1xuICAgIGlmICh0aGlzLmN1cnJlbnQgJiYgbG9jYWxlID09PSB0aGlzLmxvY2FsZSkge1xuICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5sYW5nc1tsb2NhbGVdXG4gICAgfVxuICAgIHB1c2hVbmlxdWUodGhpcy5sb2FkZWQsIGxvY2FsZSlcbiAgICByZXR1cm4gdGhpcy5sYW5nc1tsb2NhbGVdXG4gIH1cblxuICAvKipcbiAgICogcmV0dXJuIGN1cnJlbnRseSBhdmFpbGFibGUgbGFuZ3VhZ2VzXG4gICAqIEByZXR1cm4ge09iamVjdH0gYWxsIGNvbmZpZ3VyZWQgbGFuZ3VhZ2VzXG4gICAqL1xuICBnZXQgZ2V0TGFuZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmxhbmdzXG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdCB0byBzZXQgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgdG8gdGhlIGxvY2FsIHByb3ZpZGVkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSAgIGxvY2FsZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBsYW5ndWFnZVxuICAgKi9cbiAgYXN5bmMgc2V0Q3VycmVudChsb2NhbGUgPSAnZW4tVVMnKSB7XG4gICAgaWYgKCF0aGlzLmxvYWRlZC5pbmNsdWRlcyhsb2NhbGUpKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRMYW5nKGxvY2FsZSlcbiAgICB9XG5cbiAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZVxuICAgIHRoaXMuY3VycmVudCA9IHRoaXMubGFuZ3NbbG9jYWxlXVxuXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFxuICB9XG59XG5cbi8qKlxuICogUHJveHkgd3JhcHBlciB0aGF0IGVuYWJsZXMgc2luZ2xldG9uIHBhdHRlcm46XG4gKiAtIEkxOE4oKSByZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2VcbiAqIC0gbmV3IEkxOE4oKSBjcmVhdGVzIGEgbmV3IGluc3RhbmNlXG4gKi9cbmV4cG9ydCBjb25zdCBJMThOID0gbmV3IFByb3h5KEkxOE5CYXNlLCB7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBJMThOKCkgaXMgaW52b2tlZCBhcyBhIGZ1bmN0aW9uICh3aXRob3V0IG5ldylcbiAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gICAqL1xuICBhcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpIHtcbiAgICByZXR1cm4gdGFyZ2V0LmdldEluc3RhbmNlKC4uLmFyZ3MpXG4gIH0sXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIG5ldyBJMThOKCkgaXMgaW52b2tlZFxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlXG4gICAqL1xuICBjb25zdHJ1Y3QodGFyZ2V0LCBhcmdzKSB7XG4gICAgcmV0dXJuIG5ldyB0YXJnZXQoLi4uYXJncylcbiAgfSxcblxuICAvKipcbiAgICogUHJveHkgcHJvcGVydHkgYWNjZXNzIHRvIHRoZSBiYXNlIGNsYXNzXG4gICAqL1xuICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgcmV0dXJuIHRhcmdldFtwcm9wXVxuICB9LFxufSlcblxuZXhwb3J0IGRlZmF1bHQgSTE4Ti5nZXRJbnN0YW5jZSgpXG4iXSwibWFwcGluZ3MiOiJBLCtGQUF1QkEsT0FBT08sT0FBTyxDQUFFQyxPQUFRLE1BQU9DLEtBQU0sS0NFNUQsSUFBTUMsRUFBaUIsQ0FDckJDLFVBQVcsUUFFWEMsU0FBVSxlQUVWQyxNQUFPLENBQUMsU0FDUkMsT0FB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
Binary file