@datagrok/eda 1.1.11 → 1.1.13

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/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@datagrok/eda",
3
3
  "friendlyName": "EDA",
4
- "version": "1.1.11",
4
+ "version": "1.1.13",
5
5
  "description": "Exploratory Data Analysis Tools",
6
6
  "dependencies": {
7
- "@datagrok-libraries/ml": "^6.4.1",
7
+ "@datagrok-libraries/ml": "^6.4.5",
8
8
  "@datagrok-libraries/tutorials": "^1.3.6",
9
- "@datagrok-libraries/utils": "^4.1.4",
9
+ "@datagrok-libraries/utils": "^4.1.42",
10
10
  "@datagrok-libraries/math": "^1.0.7",
11
11
  "@keckelt/tsne": "^1.0.2",
12
12
  "cash-dom": "^8.1.1",
package/src/eda-ui.ts CHANGED
@@ -117,7 +117,7 @@ export function loadingScatterPlot(features: DG.ColumnList, xLoadings: Array<DG.
117
117
  export function addPLSvisualization(
118
118
  table: DG.DataFrame, samplesNames: DG.Column, features: DG.ColumnList, predict: DG.Column, plsOutput: any,
119
119
  ): void {
120
- const view = grok.shell.getTableView(table.name);
120
+ const view = (table.id !== null) ? grok.shell.getTableView(table.name) : grok.shell.addTableView(table);
121
121
 
122
122
  // 1. Predicted vs Reference scatter plot
123
123
  view.addViewer(predictedVersusReferenceScatterPlot(samplesNames, predict, plsOutput[0]));
@@ -1,6 +1,6 @@
1
1
  import * as DG from 'datagrok-api/dg';
2
2
  import {runTests, tests, TestContext} from '@datagrok-libraries/utils/src/test';
3
-
3
+ import './tests/dim-reduction-tests';
4
4
  export const _package = new DG.Package();
5
5
  export {tests};
6
6
 
package/src/package.ts CHANGED
@@ -18,7 +18,7 @@ import {LINEAR, RBF, POLYNOMIAL, SIGMOID,
18
18
  import {oneWayAnova} from './stat-tools';
19
19
  import {getDbscanWorker} from '@datagrok-libraries/math';
20
20
 
21
- import {DistanceAggregationMethods} from '@datagrok-libraries/ml/src/distance-matrix/types';
21
+ import {DistanceAggregationMethod, DistanceAggregationMethods} from '@datagrok-libraries/ml/src/distance-matrix/types';
22
22
  import {MultiColumnDimReductionEditor} from
23
23
  '@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/multi-column-dim-reduction-editor';
24
24
  import {multiColReduceDimensionality} from
@@ -27,6 +27,8 @@ import {KnownMetrics} from '@datagrok-libraries/ml/src/typed-metrics';
27
27
  import {DimReductionMethods} from '@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/types';
28
28
 
29
29
  import {runKNNImputer} from './missing-values-imputation/ui';
30
+ import {MCLEditor} from '@datagrok-libraries/ml/src/MCL/mcl-editor';
31
+ import {markovCluster} from '@datagrok-libraries/ml/src/MCL/clustering-view';
30
32
 
31
33
  export const _package = new DG.Package();
32
34
 
@@ -65,12 +67,20 @@ export async function dbScan(df: DG.DataFrame, xCol: DG.Column, yCol: DG.Column,
65
67
  //input: int components = 2 {caption: Components} [Number of components.]
66
68
  //input: bool center = false [Indicating whether the variables should be shifted to be zero centered.]
67
69
  //input: bool scale = false [Indicating whether the variables should be scaled to have unit variance.]
68
- //output: dataframe result {action:join(table)}
69
- export async function PCA(table: DG.DataFrame, features: DG.ColumnList, components: number,
70
- center: boolean, scale: boolean): Promise<DG.DataFrame> {
70
+ export async function PCA(table: DG.DataFrame, features: DG.ColumnList, components: number, center: boolean, scale: boolean): Promise<void> {
71
71
  const pcaTable = await computePCA(table, features, components, center, scale);
72
72
  addPrefixToEachColumnName('PCA', pcaTable.columns);
73
- return pcaTable;
73
+
74
+ if (table.id === null) // table is loaded from a local file
75
+ grok.shell.addTableView(pcaTable);
76
+ else {
77
+ const cols = table.columns;
78
+
79
+ for (const col of pcaTable.columns) {
80
+ col.name = cols.getUnusedName(col.name);
81
+ cols.add(col);
82
+ }
83
+ }
74
84
  }
75
85
 
76
86
 
@@ -82,8 +92,9 @@ export async function PCA(table: DG.DataFrame, features: DG.ColumnList, componen
82
92
  //input: string _metric {optional: true}
83
93
  //output: object result
84
94
  export function numberPreprocessingFunction(col: DG.Column, _metric: string) {
95
+ const range = col.stats.max - col.stats.min;
85
96
  const entries = col.toList();
86
- return {entries, options: {}};
97
+ return {entries, options: {range}};
87
98
  }
88
99
 
89
100
  //name: None (string)
@@ -115,6 +126,51 @@ export async function reduceDimensionality(): Promise<void> {
115
126
  }).show();
116
127
  }
117
128
 
129
+ //name: GetMCLEditor
130
+ //tags: editor
131
+ //input: funccall call
132
+ export function GetMCLEditor(call: DG.FuncCall): void {
133
+ try {
134
+ const funcEditor = new MCLEditor();
135
+ ui.dialog('Markov clustering')
136
+ .add(funcEditor.getEditor())
137
+ .onOK(async () => {
138
+ const params = funcEditor.params;
139
+ return call.func.prepare({
140
+ df: params.table, cols: params.columns, metrics: params.distanceMetrics,
141
+ weights: params.weights, aggregationMethod: params.aggreaggregationMethod, preprocessingFuncs: params.preprocessingFunctions,
142
+ preprocessingFuncArgs: params.preprocessingFuncArgs, threshold: params.threshold, maxIterations: params.maxIterations,
143
+ }).call(true);
144
+ }).show();
145
+ } catch (err: any) {
146
+ const errMsg = err instanceof Error ? err.message : err.toString();
147
+ const errStack = err instanceof Error ? err.stack : undefined;
148
+ grok.shell.error(`Get region editor error: ${errMsg}`);
149
+ _package.logger.error(errMsg, undefined, errStack);
150
+ }
151
+ }
152
+
153
+
154
+ //top-menu: ML | Cluster | MCL...
155
+ //name: MCL
156
+ //description: Markov clustering (MCL) is an unsupervised clustering algorithm for graphs based on simulation of stochastic flow.
157
+ //input: dataframe df
158
+ //input: list<column> cols
159
+ //input: list<string> metrics
160
+ //input: list<double> weights
161
+ //input: string aggregationMethod
162
+ //input: list<func> preprocessingFuncs
163
+ //input: object preprocessingFuncArgs
164
+ //input: int threshold = 80
165
+ //input: int maxIterations = 10
166
+ //editor: EDA: GetMCLEditor
167
+ export async function MCL(df: DG.DataFrame, cols: DG.Column[], metrics: KnownMetrics[],
168
+ weights: number[], aggregationMethod: DistanceAggregationMethod, preprocessingFuncs: (DG.Func | null | undefined)[],
169
+ preprocessingFuncArgs: any[], threshold: number = 80, maxIterations: number = 10) {
170
+ return await markovCluster(df, cols, metrics, weights,
171
+ aggregationMethod, preprocessingFuncs, preprocessingFuncArgs, threshold, maxIterations);
172
+ }
173
+
118
174
  //top-menu: ML | Analyze | Multivariate Analysis...
119
175
  //name: Multivariate Analysis (PLS)
120
176
  //description: Multidimensional data analysis using partial least squares (PLS) regression. It reduces the predictors to a smaller set of uncorrelated components and performs least squares regression on them.
@@ -349,6 +405,6 @@ export function anova(table: DG.DataFrame, factor: DG.Column, feature: DG.Column
349
405
  //top-menu: ML | Missing Values Imputation ...
350
406
  //name: KNN impute
351
407
  //desription: Missing values imputation using the k-nearest neighbors method
352
- export function kNNImputation() {
353
- runKNNImputer();
408
+ export function kNNImputation() {
409
+ runKNNImputer();
354
410
  }
@@ -0,0 +1,99 @@
1
+ import * as grok from 'datagrok-api/grok';
2
+ import * as ui from 'datagrok-api/ui';
3
+ import * as DG from 'datagrok-api/dg';
4
+ import {_package} from '../package-test';
5
+
6
+ // tests for dimensionality reduction
7
+
8
+ import {category, expect, test} from '@datagrok-libraries/utils/src/test';
9
+ import {DimReductionMethods} from '@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/types';
10
+ import {KnownMetrics, NumberMetricsNames, StringMetricsNames} from '@datagrok-libraries/ml/src/typed-metrics';
11
+ import {multiColReduceDimensionality}
12
+ from '@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/reduce-dimensionality';
13
+
14
+ const DEMOG_COLNAMES = {
15
+ SUBJ: 'subj',
16
+ STUDY: 'study',
17
+ SITE: 'site',
18
+ AGE: 'age',
19
+ SEX: 'sex',
20
+ RACE: 'race',
21
+ DISEASE: 'disease',
22
+ WEIGHT: 'weight',
23
+ HEIGHT: 'height',
24
+ } as const;
25
+ category('Dimensionality reduction: UMAP', () => {
26
+ test('Numeric column', async () => {
27
+ await testDimensionalityReductionUI(
28
+ [DEMOG_COLNAMES.AGE], DimReductionMethods.UMAP, [NumberMetricsNames.Difference]);
29
+ }, {timeout: 30000});
30
+
31
+ test('String column', async () => {
32
+ await testDimensionalityReductionUI(
33
+ [DEMOG_COLNAMES.SEX], DimReductionMethods.UMAP, [StringMetricsNames.Onehot]);
34
+ }, {timeout: 30000});
35
+
36
+ test('Numeric and string columns', async () => {
37
+ await testDimensionalityReductionUI(
38
+ [DEMOG_COLNAMES.SEX, DEMOG_COLNAMES.AGE], DimReductionMethods.UMAP,
39
+ [StringMetricsNames.Onehot, NumberMetricsNames.Difference]);
40
+ });
41
+
42
+ test('All demog columns', async () => {
43
+ const allDemogCols = grok.data.demo.demog(10).columns.toList()
44
+ .filter((col) => Object.values(DEMOG_COLNAMES).includes(col.name as any)); ;
45
+ const distFuncs = allDemogCols.map((col) => col.type === DG.COLUMN_TYPE.STRING ?
46
+ StringMetricsNames.Onehot : NumberMetricsNames.Difference);
47
+ const colNames = allDemogCols.map((col) => col.name);
48
+ await testDimensionalityReductionUI( colNames, DimReductionMethods.UMAP, distFuncs);
49
+ });
50
+ });
51
+
52
+ category('Dimensionality reduction: T-SNE', () => {
53
+ test('Numeric column', async () => {
54
+ await testDimensionalityReductionUI(
55
+ [DEMOG_COLNAMES.AGE], DimReductionMethods.T_SNE, [NumberMetricsNames.Difference]);
56
+ }, {timeout: 30000});
57
+
58
+ test('String column', async () => {
59
+ await testDimensionalityReductionUI(
60
+ [DEMOG_COLNAMES.SEX], DimReductionMethods.T_SNE, [StringMetricsNames.Onehot]);
61
+ }, {timeout: 30000});
62
+
63
+ test('Numeric and string columns', async () => {
64
+ await testDimensionalityReductionUI(
65
+ [DEMOG_COLNAMES.SEX, DEMOG_COLNAMES.AGE], DimReductionMethods.T_SNE,
66
+ [StringMetricsNames.Onehot, NumberMetricsNames.Difference]);
67
+ });
68
+
69
+ test('All demog columns', async () => {
70
+ const allDemogCols = grok.data.demo.demog(10).columns.toList()
71
+ .filter((col) => Object.values(DEMOG_COLNAMES).includes(col.name as any));
72
+ const distFuncs = allDemogCols.map((col) => col.type === DG.COLUMN_TYPE.STRING ?
73
+ StringMetricsNames.Onehot : NumberMetricsNames.Difference);
74
+ const colNames = allDemogCols.map((col) => col.name);
75
+ await testDimensionalityReductionUI(colNames, DimReductionMethods.T_SNE, distFuncs);
76
+ });
77
+ });
78
+
79
+ async function testDimensionalityReductionUI(
80
+ columns: string[], methodName: DimReductionMethods, metrics: KnownMetrics[],
81
+ ) {
82
+ const df = grok.data.demo.demog(100);
83
+ const _tv = grok.shell.addTableView(df);
84
+ const dimRedResult = await multiColReduceDimensionality(
85
+ df, columns.map((c) => df.col(c)!), methodName, metrics,
86
+ columns.map(() => 1), columns.map(() => undefined),
87
+ 'EUCLIDEAN', true, true, {preprocessingFuncArgs: columns.map(() => ({}))});
88
+ expect(!!dimRedResult, true, 'No scatterplot returned');
89
+ const addedEmbeddingsCols = df.columns.names().filter((c) => c.toLowerCase().startsWith('embed'));
90
+ expect(addedEmbeddingsCols.length, 2, 'Wrong number of embeddings added');
91
+ const clusterColName = df.columns.names().find((c) => c.toLowerCase().startsWith('cluster'));
92
+ expect(!!clusterColName, true, 'No cluster column added');
93
+ for (const embedColName of addedEmbeddingsCols) {
94
+ const c = df.col(embedColName)!;
95
+ expect(new Array(c.length).fill(null).every((_, i) => !c.isNone(i) && !isNaN(c.get(i))), true,
96
+ 'Embedding column has null-ish values');
97
+ }
98
+ await new Promise((resolve) => setTimeout(resolve, 500));
99
+ }
package/dist/100.js DELETED
@@ -1,2 +0,0 @@
1
- var eda;(()=>{"use strict";var e,r,t={7100:(e,r,t)=>{var a;!function(e){e.EUCLIDEAN="EUCLIDEAN",e.MANHATTAN="MANHATTAN"}(a||(a={}));const n=e=>null==e;var o=t(6361),i=t(9657);onmessage=e=>{const{values:r,fnNames:t,startRow:s,startCol:c,chunckSize:l,opts:u,weights:p,aggregationMethod:f}=e.data,h={};try{let e=s,g=c,v=0,d=0,m=Number.MIN_VALUE;const w=function(e,r){return e===a.MANHATTAN?e=>e.reduce(((e,t,a)=>e+t*r[a]),0):e=>{const t=e.reduce(((e,t,a)=>e+(t*r[a])**2),0);return Math.sqrt(t)}}(f,p);r.forEach(((e,a)=>{if((0,o.sQ)(t[a]))for(let t=0;t<e.length;++t)n(e[t])||(r[a][t]=new i.Z(r[a][t]._data,r[a][t]._length))}));const b=new Array(t.length).fill(null).map(((e,r)=>new o.UH(t[r]).getMeasure(u[r]))),A=new Float32Array(l);for(;v<l;){const t=b.map(((t,a)=>n(r[a][e])||n(r[a][g])?1:t(r[a][e],r[a][g]))),a=1===t.length?t[0]:w(t);A[v]=a,a<d&&(d=a),a>m&&(m=a),v++,g++,g===r[0].length&&(e++,g=e+1)}h.distanceMatrixData=A,h.min=d,h.max=m}catch(e){h.error=e}postMessage(h)}}},a={};function n(e){var r=a[e];if(void 0!==r)return r.exports;var o=a[e]={exports:{}};return t[e](o,o.exports,n),o.exports}n.m=t,n.x=()=>{var e=n.O(void 0,[483,361],(()=>n(7100)));return n.O(e)},e=[],n.O=(r,t,a,o)=>{if(!t){var i=1/0;for(u=0;u<e.length;u++){for(var[t,a,o]=e[u],s=!0,c=0;c<t.length;c++)(!1&o||i>=o)&&Object.keys(n.O).every((e=>n.O[e](t[c])))?t.splice(c--,1):(s=!1,o<i&&(i=o));if(s){e.splice(u--,1);var l=a();void 0!==l&&(r=l)}}return r}o=o||0;for(var u=e.length;u>0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[t,a,o]},n.d=(e,r)=>{for(var t in r)n.o(r,t)&&!n.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce(((r,t)=>(n.f[t](e,r),r)),[])),n.u=e=>e+".js",n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),(()=>{var e;n.g.importScripts&&(e=n.g.location+"");var r=n.g.document;if(!e&&r&&(r.currentScript&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var a=t.length-1;a>-1&&!e;)e=t[a--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=e})(),(()=>{var e={100:1};n.f.i=(r,t)=>{e[r]||importScripts(n.p+n.u(r))};var r=self.webpackChunkeda=self.webpackChunkeda||[],t=r.push.bind(r);r.push=r=>{var[a,o,i]=r;for(var s in o)n.o(o,s)&&(n.m[s]=o[s]);for(i&&i(n);a.length;)e[a.pop()]=1;t(r)}})(),r=n.x,n.x=()=>Promise.all([n.e(483),n.e(361)]).then(r);var o=n.x();eda=o})();
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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LEVBQW9CNEIsRUFBRXhFLEVBQUksQ0FBQ3lFLEVBQVNHLEtBRS9CdUIsRUFBZ0IxQixJQUVsQmdCLGNBQWM3QyxFQUFvQnNELEVBQUl0RCxFQUFvQmlDLEVBQUVKLEdBRTlELEVBR0QsSUFBSTJCLEVBQXFCQyxLQUFzQixnQkFBSUEsS0FBc0IsaUJBQUssR0FDMUVDLEVBQTZCRixFQUFtQkcsS0FBS0MsS0FBS0osR0FDOURBLEVBQW1CRyxLQXZCQ3hHLElBQ25CLElBQUt3RCxFQUFVa0QsRUFBYUMsR0FBVzNHLEVBQ3ZDLElBQUksSUFBSThDLEtBQVk0RCxFQUNoQjdELEVBQW9Cd0IsRUFBRXFDLEVBQWE1RCxLQUNyQ0QsRUFBb0JPLEVBQUVOLEdBQVk0RCxFQUFZNUQsSUFJaEQsSUFERzZELEdBQVNBLEVBQVE5RCxHQUNkVyxFQUFTakMsUUFDZDZFLEVBQWdCNUMsRUFBU29ELE9BQVMsRUFDbkNMLEVBQTJCdkcsRUFBSyxDLEtYbkI3QmQsRUFBTzJELEVBQW9CeEQsRUFDL0J3RCxFQUFvQnhELEVBQUksSUFDaEJzRixRQUFRQyxJQUFJLENBQ2xCL0IsRUFBb0JKLEVBQUUsS0FDdEJJLEVBQW9CSixFQUFFLE9BQ3BCb0UsS0FBSzNILEdZSlQsSUFBSW1FLEVBQXNCUixFQUFvQnhELEkiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9lZGEvd2VicGFjay9ydW50aW1lL2NodW5rIGxvYWRlZCIsIndlYnBhY2s6Ly9lZGEvd2VicGFjay9ydW50aW1lL3N0YXJ0dXAgY2h1bmsgZGVwZW5kZW5jaWVzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21sL3NyYy9kaXN0YW5jZS1tYXRyaXgvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vZWRhLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWwvc3JjL2Rpc3RhbmNlLW1hdHJpeC91dGlscy5qcyIsIndlYnBhY2s6Ly9lZGEvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tbC9zcmMvZGlzdGFuY2UtbWF0cml4L2Rpc3RhbmNlLW1hdHJpeC13b3JrZXIuanMiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2VkYS93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9lbnN1cmUgY2h1bmsiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9nZXQgamF2YXNjcmlwdCBjaHVuayBmaWxlbmFtZSIsIndlYnBhY2s6Ly9lZGEvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9lZGEvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9lZGEvd2VicGFjay9ydW50aW1lL3B1YmxpY1BhdGgiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9pbXBvcnRTY3JpcHRzIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZGVmZXJyZWQgPSBbXTtcbl9fd2VicGFja19yZXF1aXJlX18uTyA9IChyZXN1bHQsIGNodW5rSWRzLCBmbiwgcHJpb3JpdHkpID0+IHtcblx0aWYoY2h1bmtJZHMpIHtcblx0XHRwcmlvcml0eSA9IHByaW9yaXR5IHx8IDA7XG5cdFx0Zm9yKHZhciBpID0gZGVmZXJyZWQubGVuZ3RoOyBpID4gMCAmJiBkZWZlcnJlZFtpIC0gMV1bMl0gPiBwcmlvcml0eTsgaS0tKSBkZWZlcnJlZFtpXSA9IGRlZmVycmVkW2kgLSAxXTtcblx0XHRkZWZlcnJlZFtpXSA9IFtjaHVua0lkcywgZm4sIHByaW9yaXR5XTtcblx0XHRyZXR1cm47XG5cdH1cblx0dmFyIG5vdEZ1bGZpbGxlZCA9IEluZmluaXR5O1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGRlZmVycmVkLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIFtjaHVua0lkcywgZm4sIHByaW9yaXR5XSA9IGRlZmVycmVkW2ldO1xuXHRcdHZhciBmdWxmaWxsZWQgPSB0cnVlO1xuXHRcdGZvciAodmFyIGogPSAwOyBqIDwgY2h1bmtJZHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdGlmICgocHJpb3JpdHkgJiAxID09PSAwIHx8IG5vdEZ1bGZpbGxlZCA+PSBwcmlvcml0eSkgJiYgT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5PKS5ldmVyeSgoa2V5KSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXy5PW2tleV0oY2h1bmtJZHNbal0pKSkpIHtcblx0XHRcdFx0Y2h1bmtJZHMuc3BsaWNlKGotLSwgMSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmdWxmaWxsZWQgPSBmYWxzZTtcblx0XHRcdFx0aWYocHJpb3JpdHkgPCBub3RGdWxmaWxsZWQpIG5vdEZ1bGZpbGxlZCA9IHByaW9yaXR5O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZihmdWxmaWxsZWQpIHtcblx0XHRcdGRlZmVycmVkLnNwbGljZShpLS0sIDEpXG5cdFx0XHR2YXIgciA9IGZuKCk7XG5cdFx0XHRpZiAociAhPT0gdW5kZWZpbmVkKSByZXN1bHQgPSByO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufTsiLCJ2YXIgbmV4dCA9IF9fd2VicGFja19yZXF1aXJlX18ueDtcbl9fd2VicGFja19yZXF1aXJlX18ueCA9ICgpID0+IHtcblx0cmV0dXJuIFByb21pc2UuYWxsKFtcblx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmUoNDgzKSxcblx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmUoMzYxKVxuXHRdKS50aGVuKG5leHQpO1xufTsiLCJleHBvcnQgdmFyIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzO1xuKGZ1bmN0aW9uIChEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcykge1xuICAgIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzW1wiRVVDTElERUFOXCJdID0gXCJFVUNMSURFQU5cIjtcbiAgICBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kc1tcIk1BTkhBVFRBTlwiXSA9IFwiTUFOSEFUVEFOXCI7XG59KShEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcyB8fCAoRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMgPSB7fSkpO1xuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pZEhsd1pYTXVhbk1pTENKemIzVnlZMlZTYjI5MElqb2lJaXdpYzI5MWNtTmxjeUk2V3lKMGVYQmxjeTUwY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFTeE5RVUZOTEVOQlFVNHNTVUZCV1N3d1FrRkhWRHRCUVVoSUxGZEJRVmtzTUVKQlFUQkNPMGxCUTJ4RExIRkVRVUYxUWl4RFFVRkJPMGxCUTNaQ0xIRkVRVUYxUWl4RFFVRkJPMEZCUTNwQ0xFTkJRVU1zUlVGSVV5d3dRa0ZCTUVJc1MwRkJNVUlzTUVKQlFUQkNMRkZCUjI1RE8wRkJRVUVzUTBGQlF5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbVY0Y0c5eWRDQmxiblZ0SUVScGMzUmhibU5sUVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlJ6SUh0Y2JpQWdJQ0JGVlVOTVNVUkZRVTRnUFNBblJWVkRURWxFUlVGT0p5eGNiaUFnSUNCTlFVNUlRVlJVUVU0Z1BTQW5UVUZPU0VGVVZFRk9KeXhjYmlBZ2ZUdGNibHh1Wlhod2IzSjBJSFI1Y0dVZ1JHbHpkR0Z1WTJWQloyZHlaV2RoZEdsdmJrMWxkR2h2WkNBOUlHdGxlVzltSUhSNWNHVnZaaUJFYVhOMFlXNWpaVUZuWjNKbFoyRjBhVzl1VFdWMGFHOWtjenRjYmlKZGZRPT0iLCJpbXBvcnQgeyBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcyB9IGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0IGNvbnN0IGlzTmlsID0gKHgpID0+IHggPT09IG51bGwgfHwgeCA9PT0gdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIGluc2VydFNtYWxsZXIoZGlzdGFuY2VzQXIsIGluZGV4ZXMsIG51bSwgaW5kZXgpIHtcbiAgICBpZiAobnVtID4gZGlzdGFuY2VzQXJbZGlzdGFuY2VzQXIubGVuZ3RoIC0gMV0pXG4gICAgICAgIHJldHVybjtcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpc3RhbmNlc0FyLmZpbmRJbmRleCgodikgPT4gbnVtIDwgdik7XG4gICAgZGlzdGFuY2VzQXIucG9wKCk7XG4gICAgZGlzdGFuY2VzQXIuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBudW0pO1xuICAgIGluZGV4ZXMucG9wKCk7XG4gICAgaW5kZXhlcy5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGluZGV4KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRMYXJnZXIoZGlzdGFuY2VzQXIsIGluZGV4ZXMsIG51bSwgaW5kZXgpIHtcbiAgICBpZiAobnVtIDwgZGlzdGFuY2VzQXJbZGlzdGFuY2VzQXIubGVuZ3RoIC0gMV0pXG4gICAgICAgIHJldHVybjtcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpc3RhbmNlc0FyLmZpbmRJbmRleCgodikgPT4gbnVtID4gdik7XG4gICAgZGlzdGFuY2VzQXIucG9wKCk7XG4gICAgZGlzdGFuY2VzQXIuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBudW0pO1xuICAgIGluZGV4ZXMucG9wKCk7XG4gICAgaW5kZXhlcy5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGluZGV4KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRBZ2dyZWdhdGlvbkZ1bmN0aW9uKGFnZ3JlZ2F0aW9uTWV0aG9kLCB3ZWlnaHRzKSB7XG4gICAgc3dpdGNoIChhZ2dyZWdhdGlvbk1ldGhvZCkge1xuICAgICAgICBjYXNlIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLk1BTkhBVFRBTjpcbiAgICAgICAgICAgIHJldHVybiAodnMpID0+IHZzLnJlZHVjZSgoYWNjLCB2YWwsIGlkeCkgPT4gYWNjICsgdmFsICogd2VpZ2h0c1tpZHhdLCAwKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiAodnMpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBldWNsaWRlYW5cbiAgICAgICAgICAgICAgICBjb25zdCBzdW0gPSB2cy5yZWR1Y2UoKGFjYywgdmFsLCBpZHgpID0+IGFjYyArICh2YWwgKiB3ZWlnaHRzW2lkeF0pICoqIDIsIDApO1xuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnNxcnQoc3VtKTtcbiAgICAgICAgICAgIH07XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pZFhScGJITXVhbk1pTENKemIzVnlZMlZTYjI5MElqb2lJaXdpYzI5MWNtTmxjeUk2V3lKMWRHbHNjeTUwY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFTeFBRVUZQTEVWQlFUUkNMREJDUVVFd1FpeEZRVUZETEUxQlFVMHNVMEZCVXl4RFFVRkRPMEZCUlRsRkxFMUJRVTBzUTBGQlF5eE5RVUZOTEV0QlFVc3NSMEZCUnl4RFFVRkRMRU5CUVUwc1JVRkJSU3hGUVVGRkxFTkJRVU1zUTBGQlF5eExRVUZMTEVsQlFVa3NTVUZCU1N4RFFVRkRMRXRCUVVzc1UwRkJVeXhEUVVGRE8wRkJSUzlFTEUxQlFVMHNWVUZCVlN4aFFVRmhMRU5CUVVNc1YwRkJjVUlzUlVGQlJTeFBRVUZwUWl4RlFVRkZMRWRCUVZjc1JVRkJSU3hMUVVGaE8wbEJRMmhITEVsQlFVa3NSMEZCUnl4SFFVRkhMRmRCUVZjc1EwRkJReXhYUVVGWExFTkJRVU1zVFVGQlRTeEhRVUZETEVOQlFVTXNRMEZCUXp0UlFVTjZReXhQUVVGUE8wbEJSVlFzVFVGQlRTeFhRVUZYTEVkQlFVY3NWMEZCVnl4RFFVRkRMRk5CUVZNc1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGTEVOQlFVTXNSMEZCUnl4SFFVRkhMRU5CUVVNc1EwRkJReXhEUVVGRE8wbEJRekZFTEZkQlFWY3NRMEZCUXl4SFFVRkhMRVZCUVVVc1EwRkJRenRKUVVOc1FpeFhRVUZYTEVOQlFVTXNUVUZCVFN4RFFVRkRMRmRCUVZjc1JVRkJSU3hEUVVGRExFVkJRVVVzUjBGQlJ5eERRVUZETEVOQlFVTTdTVUZEZUVNc1QwRkJUeXhEUVVGRExFZEJRVWNzUlVGQlJTeERRVUZETzBsQlEyUXNUMEZCVHl4RFFVRkRMRTFCUVUwc1EwRkJReXhYUVVGWExFVkJRVVVzUTBGQlF5eEZRVUZGTEV0QlFVc3NRMEZCUXl4RFFVRkRPMEZCUTNoRExFTkJRVU03UVVGRlJDeE5RVUZOTEZWQlFWVXNXVUZCV1N4RFFVRkRMRmRCUVhGQ0xFVkJRVVVzVDBGQmFVSXNSVUZCUlN4SFFVRlhMRVZCUVVVc1MwRkJZVHRKUVVNdlJpeEpRVUZKTEVkQlFVY3NSMEZCUnl4WFFVRlhMRU5CUVVNc1YwRkJWeXhEUVVGRExFMUJRVTBzUjBGQlF5eERRVUZETEVOQlFVTTdVVUZEZWtNc1QwRkJUenRKUVVWVUxFMUJRVTBzVjBGQlZ5eEhRVUZITEZkQlFWY3NRMEZCUXl4VFFVRlRMRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVVzUlVGQlJTeERRVUZETEVkQlFVY3NSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVNeFJDeFhRVUZYTEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNN1NVRkRiRUlzVjBGQlZ5eERRVUZETEUxQlFVMHNRMEZCUXl4WFFVRlhMRVZCUVVVc1EwRkJReXhGUVVGRkxFZEJRVWNzUTBGQlF5eERRVUZETzBsQlEzaERMRTlCUVU4c1EwRkJReXhIUVVGSExFVkJRVVVzUTBGQlF6dEpRVU5rTEU5QlFVOHNRMEZCUXl4TlFVRk5MRU5CUVVNc1YwRkJWeXhGUVVGRkxFTkJRVU1zUlVGQlJTeExRVUZMTEVOQlFVTXNRMEZCUXp0QlFVTjRReXhEUVVGRE8wRkJSVVFzVFVGQlRTeFZRVUZWTEhOQ1FVRnpRaXhEUVVOd1F5eHBRa0ZCTkVNc1JVRkJSU3hQUVVGcFFqdEpRVVV2UkN4UlFVRlJMR2xDUVVGcFFpeEZRVUZGTzFGQlEzcENMRXRCUVVzc01FSkJRVEJDTEVOQlFVTXNVMEZCVXp0WlFVTjJReXhQUVVGUExFTkJRVU1zUlVGQldTeEZRVUZGTEVWQlFVVXNRMEZCUXl4RlFVRkZMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUjBGQlJ5eEZRVUZGTEVkQlFVY3NSVUZCUlN4SFFVRkhMRVZCUVVVc1JVRkJSU3hEUVVGRExFZEJRVWNzUjBGQlJ5eEhRVUZITEVkQlFVY3NUMEZCVHl4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETzFGQlEzSkdPMWxCUTBVc1QwRkJUeXhEUVVGRExFVkJRVmtzUlVGQlJTeEZRVUZGTzJkQ1FVTjBRaXhaUVVGWk8yZENRVU5hTEUxQlFVMHNSMEZCUnl4SFFVRkhMRVZCUVVVc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eEhRVUZITEVWQlFVVXNSMEZCUnl4RlFVRkZMRWRCUVVjc1JVRkJSU3hGUVVGRkxFTkJRVU1zUjBGQlJ5eEhRVUZITEVOQlFVTXNSMEZCUnl4SFFVRkhMRTlCUVU4c1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJRenRuUWtGRE4wVXNUMEZCVHl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETzFsQlEzaENMRU5CUVVNc1EwRkJRenRMUVVOTU8wRkJRMGdzUTBGQlF5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbWx0Y0c5eWRDQjdSR2x6ZEdGdVkyVkJaMmR5WldkaGRHbHZiazFsZEdodlpDd2dSR2x6ZEdGdVkyVkJaMmR5WldkaGRHbHZiazFsZEdodlpITjlJR1p5YjIwZ0p5NHZkSGx3WlhNbk8xeHVYRzVsZUhCdmNuUWdZMjl1YzNRZ2FYTk9hV3dnUFNBb2VEb2dZVzU1S1NBOVBpQjRJRDA5UFNCdWRXeHNJSHg4SUhnZ1BUMDlJSFZ1WkdWbWFXNWxaRHRjYmx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdsdWMyVnlkRk50WVd4c1pYSW9aR2x6ZEdGdVkyVnpRWEk2SUc1MWJXSmxjbHRkTENCcGJtUmxlR1Z6T2lCdWRXMWlaWEpiWFN3Z2JuVnRPaUJ1ZFcxaVpYSXNJR2x1WkdWNE9pQnVkVzFpWlhJcElIdGNiaUFnYVdZZ0tHNTFiU0ErSUdScGMzUmhibU5sYzBGeVcyUnBjM1JoYm1ObGMwRnlMbXhsYm1kMGFDMHhYU2xjYmlBZ0lDQnlaWFIxY200N1hHNWNiaUFnWTI5dWMzUWdibVYzVUc5emFYUnBiMjRnUFNCa2FYTjBZVzVqWlhOQmNpNW1hVzVrU1c1a1pYZ29LSFlwSUQwK0lHNTFiU0E4SUhZcE8xeHVJQ0JrYVhOMFlXNWpaWE5CY2k1d2IzQW9LVHRjYmlBZ1pHbHpkR0Z1WTJWelFYSXVjM0JzYVdObEtHNWxkMUJ2YzJsMGFXOXVMQ0F3TENCdWRXMHBPMXh1SUNCcGJtUmxlR1Z6TG5CdmNDZ3BPMXh1SUNCcGJtUmxlR1Z6TG5Od2JHbGpaU2h1WlhkUWIzTnBkR2x2Yml3Z01Dd2dhVzVrWlhncE8xeHVmVnh1WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnYVc1elpYSjBUR0Z5WjJWeUtHUnBjM1JoYm1ObGMwRnlPaUJ1ZFcxaVpYSmJYU3dnYVc1a1pYaGxjem9nYm5WdFltVnlXMTBzSUc1MWJUb2diblZ0WW1WeUxDQnBibVJsZURvZ2JuVnRZbVZ5S1NCN1hHNGdJR2xtSUNodWRXMGdQQ0JrYVhOMFlXNWpaWE5CY2x0a2FYTjBZVzVqWlhOQmNpNXNaVzVuZEdndE1WMHBYRzRnSUNBZ2NtVjBkWEp1TzF4dVhHNGdJR052Ym5OMElHNWxkMUJ2YzJsMGFXOXVJRDBnWkdsemRHRnVZMlZ6UVhJdVptbHVaRWx1WkdWNEtDaDJLU0E5UGlCdWRXMGdQaUIyS1R0Y2JpQWdaR2x6ZEdGdVkyVnpRWEl1Y0c5d0tDazdYRzRnSUdScGMzUmhibU5sYzBGeUxuTndiR2xqWlNodVpYZFFiM05wZEdsdmJpd2dNQ3dnYm5WdEtUdGNiaUFnYVc1a1pYaGxjeTV3YjNBb0tUdGNiaUFnYVc1a1pYaGxjeTV6Y0d4cFkyVW9ibVYzVUc5emFYUnBiMjRzSURBc0lHbHVaR1Y0S1R0Y2JuMWNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR2RsZEVGblozSmxaMkYwYVc5dVJuVnVZM1JwYjI0b1hHNGdJR0ZuWjNKbFoyRjBhVzl1VFdWMGFHOWtPaUJFYVhOMFlXNWpaVUZuWjNKbFoyRjBhVzl1VFdWMGFHOWtMQ0IzWldsbmFIUnpPaUJ1ZFcxaVpYSmJYVnh1S1RvZ0tIWmhiSFZsY3pvZ2JuVnRZbVZ5VzEwcElEMCtJRzUxYldKbGNpQjdYRzRnSUhOM2FYUmphQ0FvWVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlFwSUh0Y2JpQWdJQ0JqWVhObElFUnBjM1JoYm1ObFFXZG5jbVZuWVhScGIyNU5aWFJvYjJSekxrMUJUa2hCVkZSQlRqcGNiaUFnSUNBZ0lISmxkSFZ5YmlBb2RuTTZJRzUxYldKbGNsdGRLU0E5UGlCMmN5NXlaV1IxWTJVb0tHRmpZeXdnZG1Gc0xDQnBaSGdwSUQwK0lHRmpZeUFySUhaaGJDQXFJSGRsYVdkb2RITmJhV1I0WFN3Z01DazdYRzRnSUNBZ1pHVm1ZWFZzZERwY2JpQWdJQ0FnSUhKbGRIVnliaUFvZG5NNklHNTFiV0psY2x0ZEtTQTlQaUI3WEc0Z0lDQWdJQ0FnSUM4dklHVjFZMnhwWkdWaGJseHVJQ0FnSUNBZ0lDQmpiMjV6ZENCemRXMGdQU0IyY3k1eVpXUjFZMlVvS0dGall5d2dkbUZzTENCcFpIZ3BJRDArSUdGall5QXJJQ2gyWVd3Z0tpQjNaV2xuYUhSelcybGtlRjBwSUNvcUlESXNJREFwTzF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnVFdGMGFDNXpjWEowS0hOMWJTazdYRzRnSUNBZ0lDQjlPMXh1SUNCOVhHNTlYRzRpWFgwPSIsImltcG9ydCB7IGdldEFnZ3JlZ2F0aW9uRnVuY3Rpb24sIGlzTmlsIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBNZWFzdXJlLCBpc0JpdEFycmF5TWV0cmljIH0gZnJvbSAnLi4vdHlwZWQtbWV0cmljcyc7XG5pbXBvcnQgQml0QXJyYXkgZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvYml0LWFycmF5Jztcbm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xuICAgIGNvbnN0IHsgdmFsdWVzLCBmbk5hbWVzLCBzdGFydFJvdywgc3RhcnRDb2wsIGNodW5ja1NpemUsIG9wdHMsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kIH0gPSBldmVudC5kYXRhO1xuICAgIGNvbnN0IGRhdGEgPSB7fTtcbiAgICB0cnkge1xuICAgICAgICAvLyBpZiAoc3RhcnRSb3cgIT0gLTEpXG4gICAgICAgIC8vICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciBpbiBkaXN0YW5jZSBtYXRyaXggd29ya2VyJyk7IC8vIFRPRE86IHJlbW92ZSB0aGlzIGxpbmVcbiAgICAgICAgbGV0IGkgPSBzdGFydFJvdztcbiAgICAgICAgbGV0IGogPSBzdGFydENvbDtcbiAgICAgICAgbGV0IGNudCA9IDA7XG4gICAgICAgIGxldCBsbWluID0gMDtcbiAgICAgICAgbGV0IGxtYXggPSBOdW1iZXIuTUlOX1ZBTFVFO1xuICAgICAgICBjb25zdCBhZ2dyZWdhdGUgPSBnZXRBZ2dyZWdhdGlvbkZ1bmN0aW9uKGFnZ3JlZ2F0aW9uTWV0aG9kLCB3ZWlnaHRzKTtcbiAgICAgICAgdmFsdWVzLmZvckVhY2goKHYsIGNvbElkeCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzQml0QXJyYXlNZXRyaWMoZm5OYW1lc1tjb2xJZHhdKSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG1pID0gMDsgbWkgPCB2Lmxlbmd0aDsgKyttaSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOaWwodlttaV0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlc1tjb2xJZHhdW21pXSA9IG5ldyBCaXRBcnJheSh2YWx1ZXNbY29sSWR4XVttaV0uX2RhdGEsIHZhbHVlc1tjb2xJZHhdW21pXS5fbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkaXN0YW5jZUZucyA9IG5ldyBBcnJheShmbk5hbWVzLmxlbmd0aClcbiAgICAgICAgICAgIC5maWxsKG51bGwpXG4gICAgICAgICAgICAubWFwKChfLCBkaSkgPT4gbmV3IE1lYXN1cmUoZm5OYW1lc1tkaV0pLmdldE1lYXN1cmUob3B0c1tkaV0pKTtcbiAgICAgICAgY29uc3QgcmV0VmFsID0gbmV3IEZsb2F0MzJBcnJheShjaHVuY2tTaXplKTtcbiAgICAgICAgd2hpbGUgKGNudCA8IGNodW5ja1NpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlVmFsdWVzID0gZGlzdGFuY2VGbnMubWFwKChmbiwgaWR4KSA9PiAhaXNOaWwodmFsdWVzW2lkeF1baV0pICYmICFpc05pbCh2YWx1ZXNbaWR4XVtqXSkgP1xuICAgICAgICAgICAgICAgIGZuKHZhbHVlc1tpZHhdW2ldLCB2YWx1ZXNbaWR4XVtqXSkgOiAxKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGlzdGFuY2VWYWx1ZXMubGVuZ3RoID09PSAxID8gZGlzdGFuY2VWYWx1ZXNbMF0gOiBhZ2dyZWdhdGUoZGlzdGFuY2VWYWx1ZXMpO1xuICAgICAgICAgICAgcmV0VmFsW2NudF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA8IGxtaW4pXG4gICAgICAgICAgICAgICAgbG1pbiA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKHZhbHVlID4gbG1heClcbiAgICAgICAgICAgICAgICBsbWF4ID0gdmFsdWU7XG4gICAgICAgICAgICBjbnQrKztcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgIGlmIChqID09PSB2YWx1ZXNbMF0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIGogPSBpICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkYXRhLmRpc3RhbmNlTWF0cml4RGF0YSA9IHJldFZhbDtcbiAgICAgICAgZGF0YS5taW4gPSBsbWluO1xuICAgICAgICBkYXRhLm1heCA9IGxtYXg7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGRhdGEuZXJyb3IgPSBlO1xuICAgIH1cbiAgICBwb3N0TWVzc2FnZShkYXRhKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2laR2x6ZEdGdVkyVXRiV0YwY21sNExYZHZjbXRsY2k1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWeklqcGJJbVJwYzNSaGJtTmxMVzFoZEhKcGVDMTNiM0pyWlhJdWRITWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklrRkJRVUVzVDBGQlR5eEZRVUZETEhOQ1FVRnpRaXhGUVVGRkxFdEJRVXNzUlVGQlF5eE5RVUZOTEZOQlFWTXNRMEZCUXp0QlFVTjBSQ3hQUVVGUExFVkJRV1VzVDBGQlR5eEZRVUZGTEdkQ1FVRm5RaXhGUVVGRExFMUJRVTBzYTBKQlFXdENMRU5CUVVNN1FVRkRla1VzVDBGQlR5eFJRVUZSTEUxQlFVMHNlVU5CUVhsRExFTkJRVU03UVVGSEwwUXNVMEZCVXl4SFFVRkhMRU5CUVVNc1MwRkJTeXhGUVVGRkxFVkJRVVU3U1VGRGNFSXNUVUZCVFN4RlFVRkRMRTFCUVUwc1JVRkJSU3hQUVVGUExFVkJRVVVzVVVGQlVTeEZRVUZGTEZGQlFWRXNSVUZCUlN4VlFVRlZMRVZCUVVVc1NVRkJTU3hGUVVGRkxFOUJRVThzUlVGQlJTeHBRa0ZCYVVJc1JVRkJReXhIUVVkeVJpeExRVUZMTEVOQlFVTXNTVUZCU1N4RFFVRkRPMGxCUTJZc1RVRkJUU3hKUVVGSkxFZEJRV3RHTEVWQlFVVXNRMEZCUXp0SlFVTXZSaXhKUVVGSk8xRkJRMFlzYzBKQlFYTkNPMUZCUTNSQ0xHdEdRVUZyUmp0UlFVTnNSaXhKUVVGSkxFTkJRVU1zUjBGQlJ5eFJRVUZSTEVOQlFVTTdVVUZEYWtJc1NVRkJTU3hEUVVGRExFZEJRVWNzVVVGQlVTeERRVUZETzFGQlEycENMRWxCUVVrc1IwRkJSeXhIUVVGSExFTkJRVU1zUTBGQlF6dFJRVU5hTEVsQlFVa3NTVUZCU1N4SFFVRkhMRU5CUVVNc1EwRkJRenRSUVVOaUxFbEJRVWtzU1VGQlNTeEhRVUZITEUxQlFVMHNRMEZCUXl4VFFVRlRMRU5CUVVNN1VVRkROVUlzVFVGQlRTeFRRVUZUTEVkQlFVY3NjMEpCUVhOQ0xFTkJRVU1zYVVKQlFXbENMRVZCUVVVc1QwRkJUeXhEUVVGRExFTkJRVU03VVVGRGNrVXNUVUZCVFN4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeE5RVUZOTEVWQlFVVXNSVUZCUlR0WlFVTXpRaXhKUVVGSkxHZENRVUZuUWl4RFFVRkRMRTlCUVU4c1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eEZRVUZGTzJkQ1FVTnlReXhMUVVGTExFbEJRVWtzUlVGQlJTeEhRVUZITEVOQlFVTXNSVUZCUlN4RlFVRkZMRWRCUVVjc1EwRkJReXhEUVVGRExFMUJRVTBzUlVGQlJTeEZRVUZGTEVWQlFVVXNSVUZCUlR0dlFrRkRjRU1zU1VGQlNTeExRVUZMTEVOQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRE8zZENRVUZGTEZOQlFWTTdiMEpCUXpOQ0xFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhKUVVGSkxGRkJRVkVzUTBGQlF5eE5RVUZOTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1JVRkJSU3hEUVVGRExFTkJRVU1zUzBGQlN5eEZRVUZGTEUxQlFVMHNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXp0cFFrRkRla1k3WVVGRFJqdFJRVU5JTEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUTBnc1RVRkJUU3hYUVVGWExFZEJRVWNzU1VGQlNTeExRVUZMTEVOQlFVTXNUMEZCVHl4RFFVRkRMRTFCUVUwc1EwRkJRenRoUVVNeFF5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRPMkZCUTFZc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVWQlFVVXNSVUZCUlN4RlFVRkZMRU5CUVVNc1NVRkJTU3hQUVVGUExFTkJRVU1zVDBGQlR5eERRVUZETEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1ZVRkJWU3hEUVVGRExFbEJRVWtzUTBGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1VVRkRha1VzVFVGQlRTeE5RVUZOTEVkQlFVY3NTVUZCU1N4WlFVRlpMRU5CUVVNc1ZVRkJWU3hEUVVGRExFTkJRVU03VVVGRE5VTXNUMEZCVHl4SFFVRkhMRWRCUVVjc1ZVRkJWU3hGUVVGRk8xbEJRM1pDTEUxQlFVMHNZMEZCWXl4SFFVRkhMRmRCUVZjc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eEZRVUZGTEVWQlFVVXNSMEZCUnl4RlFVRkZMRVZCUVVVc1EwRkJReXhEUVVGRExFdEJRVXNzUTBGQlF5eE5RVUZOTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4TlFVRk5MRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMmRDUVVOd1J5eEZRVUZGTEVOQlFVTXNUVUZCVFN4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEUxQlFVMHNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRaUVVNeFF5eE5RVUZOTEV0QlFVc3NSMEZCUnl4alFVRmpMRU5CUVVNc1RVRkJUU3hMUVVGTExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNZMEZCWXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eFRRVUZUTEVOQlFVTXNZMEZCWXl4RFFVRkRMRU5CUVVNN1dVRkRNVVlzVFVGQlRTeERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRXRCUVVzc1EwRkJRenRaUVVOd1FpeEpRVUZKTEV0QlFVc3NSMEZCUnl4SlFVRkpPMmRDUVVOa0xFbEJRVWtzUjBGQlJ5eExRVUZMTEVOQlFVTTdXVUZEWml4SlFVRkpMRXRCUVVzc1IwRkJSeXhKUVVGSk8yZENRVU5rTEVsQlFVa3NSMEZCUnl4TFFVRkxMRU5CUVVNN1dVRkRaaXhIUVVGSExFVkJRVVVzUTBGQlF6dFpRVU5PTEVOQlFVTXNSVUZCUlN4RFFVRkRPMWxCUTBvc1NVRkJTU3hEUVVGRExFdEJRVXNzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRTFCUVUwc1JVRkJSVHRuUWtGRE1VSXNRMEZCUXl4RlFVRkZMRU5CUVVNN1owSkJRMG9zUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN1lVRkRXRHRUUVVOR08xRkJRMFFzU1VGQlNTeERRVUZETEd0Q1FVRnJRaXhIUVVGSExFMUJRVTBzUTBGQlF6dFJRVU5xUXl4SlFVRkpMRU5CUVVNc1IwRkJSeXhIUVVGSExFbEJRVWtzUTBGQlF6dFJRVU5vUWl4SlFVRkpMRU5CUVVNc1IwRkJSeXhIUVVGSExFbEJRVWtzUTBGQlF6dExRVU5xUWp0SlFVRkRMRTlCUVU4c1EwRkJReXhGUVVGRk8xRkJRMVlzU1VGQlNTeERRVUZETEV0QlFVc3NSMEZCUnl4RFFVRkRMRU5CUVVNN1MwRkRhRUk3U1VGRFJDeFhRVUZYTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNN1FVRkRjRUlzUTBGQlF5eERRVUZESWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaWFXMXdiM0owSUh0blpYUkJaMmR5WldkaGRHbHZia1oxYm1OMGFXOXVMQ0JwYzA1cGJIMGdabkp2YlNBbkxpOTFkR2xzY3ljN1hHNXBiWEJ2Y25RZ2UwdHViM2R1VFdWMGNtbGpjeXdnVFdWaGMzVnlaU3dnYVhOQ2FYUkJjbkpoZVUxbGRISnBZMzBnWm5KdmJTQW5MaTR2ZEhsd1pXUXRiV1YwY21samN5YzdYRzVwYlhCdmNuUWdRbWwwUVhKeVlYa2dabkp2YlNBblFHUmhkR0ZuY205ckxXeHBZbkpoY21sbGN5OTFkR2xzY3k5emNtTXZZbWwwTFdGeWNtRjVKenRjYm1sdGNHOXlkQ0I3UkdsemRHRnVZMlZCWjJkeVpXZGhkR2x2YmsxbGRHaHZaSDBnWm5KdmJTQW5MaTkwZVhCbGN5YzdYRzVjYm05dWJXVnpjMkZuWlNBOUlDaGxkbVZ1ZENrZ1BUNGdlMXh1SUNCamIyNXpkQ0I3ZG1Gc2RXVnpMQ0JtYms1aGJXVnpMQ0J6ZEdGeWRGSnZkeXdnYzNSaGNuUkRiMndzSUdOb2RXNWphMU5wZW1Vc0lHOXdkSE1zSUhkbGFXZG9kSE1zSUdGblozSmxaMkYwYVc5dVRXVjBhRzlrZlRvZ2UxeHVJQ0FnSUhaaGJIVmxjem9nWVc1NVcxMWJYU3dnWm01T1lXMWxjem9nUzI1dmQyNU5aWFJ5YVdOelcxMHNJSE4wWVhKMFVtOTNPaUJ1ZFcxaVpYSXNJSE4wWVhKMFEyOXNPaUJ1ZFcxaVpYSXNJR05vZFc1amExTnBlbVU2SUc1MWJXSmxjaXhjYmlBZ0lDQnZjSFJ6T2lCN1cxODZJSE4wY21sdVoxMDZJR0Z1ZVgxYlhTd2dkMlZwWjJoMGN6b2diblZ0WW1WeVcxMHNJR0ZuWjNKbFoyRjBhVzl1VFdWMGFHOWtPaUJFYVhOMFlXNWpaVUZuWjNKbFoyRjBhVzl1VFdWMGFHOWtMRnh1SUNCOUlEMGdaWFpsYm5RdVpHRjBZVHRjYmlBZ1kyOXVjM1FnWkdGMFlUb2dleUJsY25KdmNqODZJR0Z1ZVN3Z1pHbHpkR0Z1WTJWTllYUnlhWGhFWVhSaFB6b2dSbXh2WVhRek1rRnljbUY1TENCdGFXNC9PaUJ1ZFcxaVpYSXNJRzFoZUQ4NklHNTFiV0psY24wZ1BTQjdmVHRjYmlBZ2RISjVJSHRjYmlBZ0lDQXZMeUJwWmlBb2MzUmhjblJTYjNjZ0lUMGdMVEVwWEc0Z0lDQWdMeThnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvSjBWeWNtOXlJR2x1SUdScGMzUmhibU5sSUcxaGRISnBlQ0IzYjNKclpYSW5LVHNnTHk4Z1ZFOUVUem9nY21WdGIzWmxJSFJvYVhNZ2JHbHVaVnh1SUNBZ0lHeGxkQ0JwSUQwZ2MzUmhjblJTYjNjN1hHNGdJQ0FnYkdWMElHb2dQU0J6ZEdGeWRFTnZiRHRjYmlBZ0lDQnNaWFFnWTI1MElEMGdNRHRjYmlBZ0lDQnNaWFFnYkcxcGJpQTlJREE3WEc0Z0lDQWdiR1YwSUd4dFlYZ2dQU0JPZFcxaVpYSXVUVWxPWDFaQlRGVkZPMXh1SUNBZ0lHTnZibk4wSUdGblozSmxaMkYwWlNBOUlHZGxkRUZuWjNKbFoyRjBhVzl1Um5WdVkzUnBiMjRvWVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlFzSUhkbGFXZG9kSE1wTzF4dUlDQWdJSFpoYkhWbGN5NW1iM0pGWVdOb0tDaDJMQ0JqYjJ4SlpIZ3BJRDArSUh0Y2JpQWdJQ0FnSUdsbUlDaHBjMEpwZEVGeWNtRjVUV1YwY21saktHWnVUbUZ0WlhOYlkyOXNTV1I0WFNrcElIdGNiaUFnSUNBZ0lDQWdabTl5SUNoc1pYUWdiV2tnUFNBd095QnRhU0E4SUhZdWJHVnVaM1JvT3lBcksyMXBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLR2x6VG1sc0tIWmJiV2xkS1NrZ1kyOXVkR2x1ZFdVN1hHNGdJQ0FnSUNBZ0lDQWdkbUZzZFdWelcyTnZiRWxrZUYxYmJXbGRJRDBnYm1WM0lFSnBkRUZ5Y21GNUtIWmhiSFZsYzF0amIyeEpaSGhkVzIxcFhTNWZaR0YwWVN3Z2RtRnNkV1Z6VzJOdmJFbGtlRjFiYldsZExsOXNaVzVuZEdncE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZTazdYRzRnSUNBZ1kyOXVjM1FnWkdsemRHRnVZMlZHYm5NZ1BTQnVaWGNnUVhKeVlYa29abTVPWVcxbGN5NXNaVzVuZEdncFhHNGdJQ0FnSUNBdVptbHNiQ2h1ZFd4c0tWeHVJQ0FnSUNBZ0xtMWhjQ2dvWHl3Z1pHa3BJRDArSUc1bGR5Qk5aV0Z6ZFhKbEtHWnVUbUZ0WlhOYlpHbGRLUzVuWlhSTlpXRnpkWEpsS0c5d2RITmJaR2xkS1NrN1hHNGdJQ0FnWTI5dWMzUWdjbVYwVm1Gc0lEMGdibVYzSUVac2IyRjBNekpCY25KaGVTaGphSFZ1WTJ0VGFYcGxLVHRjYmlBZ0lDQjNhR2xzWlNBb1kyNTBJRHdnWTJoMWJtTnJVMmw2WlNrZ2UxeHVJQ0FnSUNBZ1kyOXVjM1FnWkdsemRHRnVZMlZXWVd4MVpYTWdQU0JrYVhOMFlXNWpaVVp1Y3k1dFlYQW9LR1p1TENCcFpIZ3BJRDArSUNGcGMwNXBiQ2gyWVd4MVpYTmJhV1I0WFZ0cFhTa2dKaVlnSVdselRtbHNLSFpoYkhWbGMxdHBaSGhkVzJwZEtTQS9YRzRnSUNBZ0lDQWdJR1p1S0haaGJIVmxjMXRwWkhoZFcybGRMQ0IyWVd4MVpYTmJhV1I0WFZ0cVhTa2dPaUF4S1R0Y2JpQWdJQ0FnSUdOdmJuTjBJSFpoYkhWbElEMGdaR2x6ZEdGdVkyVldZV3gxWlhNdWJHVnVaM1JvSUQwOVBTQXhJRDhnWkdsemRHRnVZMlZXWVd4MVpYTmJNRjBnT2lCaFoyZHlaV2RoZEdVb1pHbHpkR0Z1WTJWV1lXeDFaWE1wTzF4dUlDQWdJQ0FnY21WMFZtRnNXMk51ZEYwZ1BTQjJZV3gxWlR0Y2JpQWdJQ0FnSUdsbUlDaDJZV3gxWlNBOElHeHRhVzRwWEc0Z0lDQWdJQ0FnSUd4dGFXNGdQU0IyWVd4MVpUdGNiaUFnSUNBZ0lHbG1JQ2gyWVd4MVpTQStJR3h0WVhncFhHNGdJQ0FnSUNBZ0lHeHRZWGdnUFNCMllXeDFaVHRjYmlBZ0lDQWdJR051ZENzck8xeHVJQ0FnSUNBZ2Fpc3JPMXh1SUNBZ0lDQWdhV1lnS0dvZ1BUMDlJSFpoYkhWbGMxc3dYUzVzWlc1bmRHZ3BJSHRjYmlBZ0lDQWdJQ0FnYVNzck8xeHVJQ0FnSUNBZ0lDQnFJRDBnYVNBcklERTdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0FnSUdSaGRHRXVaR2x6ZEdGdVkyVk5ZWFJ5YVhoRVlYUmhJRDBnY21WMFZtRnNPMXh1SUNBZ0lHUmhkR0V1YldsdUlEMGdiRzFwYmp0Y2JpQWdJQ0JrWVhSaExtMWhlQ0E5SUd4dFlYZzdYRzRnSUgwZ1kyRjBZMmdnS0dVcElIdGNiaUFnSUNCa1lYUmhMbVZ5Y205eUlEMGdaVHRjYmlBZ2ZWeHVJQ0J3YjNOMFRXVnpjMkZuWlNoa1lYUmhLVHRjYm4wN1hHNGlYWDA9IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4vLyB0aGUgc3RhcnR1cCBmdW5jdGlvblxuX193ZWJwYWNrX3JlcXVpcmVfXy54ID0gKCkgPT4ge1xuXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcblx0Ly8gVGhpcyBlbnRyeSBtb2R1bGUgZGVwZW5kcyBvbiBvdGhlciBsb2FkZWQgY2h1bmtzIGFuZCBleGVjdXRpb24gbmVlZCB0byBiZSBkZWxheWVkXG5cdHZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXy5PKHVuZGVmaW5lZCwgWzQ4MywzNjFdLCAoKSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXyg3MTAwKSkpXG5cdF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fLk8oX193ZWJwYWNrX2V4cG9ydHNfXyk7XG5cdHJldHVybiBfX3dlYnBhY2tfZXhwb3J0c19fO1xufTtcblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5mID0ge307XG4vLyBUaGlzIGZpbGUgY29udGFpbnMgb25seSB0aGUgZW50cnkgY2h1bmsuXG4vLyBUaGUgY2h1bmsgbG9hZGluZyBmdW5jdGlvbiBmb3IgYWRkaXRpb25hbCBjaHVua3Ncbl9fd2VicGFja19yZXF1aXJlX18uZSA9IChjaHVua0lkKSA9PiB7XG5cdHJldHVybiBQcm9taXNlLmFsbChPYmplY3Qua2V5cyhfX3dlYnBhY2tfcmVxdWlyZV9fLmYpLnJlZHVjZSgocHJvbWlzZXMsIGtleSkgPT4ge1xuXHRcdF9fd2VicGFja19yZXF1aXJlX18uZltrZXldKGNodW5rSWQsIHByb21pc2VzKTtcblx0XHRyZXR1cm4gcHJvbWlzZXM7XG5cdH0sIFtdKSk7XG59OyIsIi8vIFRoaXMgZnVuY3Rpb24gYWxsb3cgdG8gcmVmZXJlbmNlIGFzeW5jIGNodW5rcyBhbmQgc2libGluZyBjaHVua3MgZm9yIHRoZSBlbnRyeXBvaW50XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnUgPSAoY2h1bmtJZCkgPT4ge1xuXHQvLyByZXR1cm4gdXJsIGZvciBmaWxlbmFtZXMgYmFzZWQgb24gdGVtcGxhdGVcblx0cmV0dXJuIFwiXCIgKyBjaHVua0lkICsgXCIuanNcIjtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwidmFyIHNjcmlwdFVybDtcbmlmIChfX3dlYnBhY2tfcmVxdWlyZV9fLmcuaW1wb3J0U2NyaXB0cykgc2NyaXB0VXJsID0gX193ZWJwYWNrX3JlcXVpcmVfXy5nLmxvY2F0aW9uICsgXCJcIjtcbnZhciBkb2N1bWVudCA9IF9fd2VicGFja19yZXF1aXJlX18uZy5kb2N1bWVudDtcbmlmICghc2NyaXB0VXJsICYmIGRvY3VtZW50KSB7XG5cdGlmIChkb2N1bWVudC5jdXJyZW50U2NyaXB0KVxuXHRcdHNjcmlwdFVybCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjO1xuXHRpZiAoIXNjcmlwdFVybCkge1xuXHRcdHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIik7XG5cdFx0aWYoc2NyaXB0cy5sZW5ndGgpIHtcblx0XHRcdHZhciBpID0gc2NyaXB0cy5sZW5ndGggLSAxO1xuXHRcdFx0d2hpbGUgKGkgPiAtMSAmJiAhc2NyaXB0VXJsKSBzY3JpcHRVcmwgPSBzY3JpcHRzW2ktLV0uc3JjO1xuXHRcdH1cblx0fVxufVxuLy8gV2hlbiBzdXBwb3J0aW5nIGJyb3dzZXJzIHdoZXJlIGFuIGF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQucHVibGljUGF0aCBtYW51YWxseSB2aWEgY29uZmlndXJhdGlvblxuLy8gb3IgcGFzcyBhbiBlbXB0eSBzdHJpbmcgKFwiXCIpIGFuZCBzZXQgdGhlIF9fd2VicGFja19wdWJsaWNfcGF0aF9fIHZhcmlhYmxlIGZyb20geW91ciBjb2RlIHRvIHVzZSB5b3VyIG93biBsb2dpYy5cbmlmICghc2NyaXB0VXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJBdXRvbWF0aWMgcHVibGljUGF0aCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbnNjcmlwdFVybCA9IHNjcmlwdFVybC5yZXBsYWNlKC8jLiokLywgXCJcIikucmVwbGFjZSgvXFw/LiokLywgXCJcIikucmVwbGFjZSgvXFwvW15cXC9dKyQvLCBcIi9cIik7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBzY3JpcHRVcmw7IiwiLy8gbm8gYmFzZVVSSVxuXG4vLyBvYmplY3QgdG8gc3RvcmUgbG9hZGVkIGNodW5rc1xuLy8gXCIxXCIgbWVhbnMgXCJhbHJlYWR5IGxvYWRlZFwiXG52YXIgaW5zdGFsbGVkQ2h1bmtzID0ge1xuXHQxMDA6IDFcbn07XG5cbi8vIGltcG9ydFNjcmlwdHMgY2h1bmsgbG9hZGluZ1xudmFyIGluc3RhbGxDaHVuayA9IChkYXRhKSA9PiB7XG5cdHZhciBbY2h1bmtJZHMsIG1vcmVNb2R1bGVzLCBydW50aW1lXSA9IGRhdGE7XG5cdGZvcih2YXIgbW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8obW9yZU1vZHVsZXMsIG1vZHVsZUlkKSkge1xuXHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tW21vZHVsZUlkXSA9IG1vcmVNb2R1bGVzW21vZHVsZUlkXTtcblx0XHR9XG5cdH1cblx0aWYocnVudGltZSkgcnVudGltZShfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblx0d2hpbGUoY2h1bmtJZHMubGVuZ3RoKVxuXHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkcy5wb3AoKV0gPSAxO1xuXHRwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbihkYXRhKTtcbn07XG5fX3dlYnBhY2tfcmVxdWlyZV9fLmYuaSA9IChjaHVua0lkLCBwcm9taXNlcykgPT4ge1xuXHQvLyBcIjFcIiBpcyB0aGUgc2lnbmFsIGZvciBcImFscmVhZHkgbG9hZGVkXCJcblx0aWYoIWluc3RhbGxlZENodW5rc1tjaHVua0lkXSkge1xuXHRcdGlmKHRydWUpIHsgLy8gYWxsIGNodW5rcyBoYXZlIEpTXG5cdFx0XHRpbXBvcnRTY3JpcHRzKF9fd2VicGFja19yZXF1aXJlX18ucCArIF9fd2VicGFja19yZXF1aXJlX18udShjaHVua0lkKSk7XG5cdFx0fVxuXHR9XG59O1xuXG52YXIgY2h1bmtMb2FkaW5nR2xvYmFsID0gc2VsZltcIndlYnBhY2tDaHVua2VkYVwiXSA9IHNlbGZbXCJ3ZWJwYWNrQ2h1bmtlZGFcIl0gfHwgW107XG52YXIgcGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24gPSBjaHVua0xvYWRpbmdHbG9iYWwucHVzaC5iaW5kKGNodW5rTG9hZGluZ0dsb2JhbCk7XG5jaHVua0xvYWRpbmdHbG9iYWwucHVzaCA9IGluc3RhbGxDaHVuaztcblxuLy8gbm8gSE1SXG5cbi8vIG5vIEhNUiBtYW5pZmVzdCIsIi8vIHJ1biBzdGFydHVwXG52YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18ueCgpO1xuIl0sIm5hbWVzIjpbImRlZmVycmVkIiwibmV4dCIsIkRpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzIiwiaXNOaWwiLCJ4Iiwib25tZXNzYWdlIiwiZXZlbnQiLCJ2YWx1ZXMiLCJmbk5hbWVzIiwic3RhcnRSb3ciLCJzdGFydENvbCIsImNodW5ja1NpemUiLCJvcHRzIiwid2VpZ2h0cyIsImFnZ3JlZ2F0aW9uTWV0aG9kIiwiZGF0YSIsImkiLCJqIiwiY250IiwibG1pbiIsImxtYXgiLCJOdW1iZXIiLCJNSU5fVkFMVUUiLCJhZ2dyZWdhdGUiLCJNQU5IQVRUQU4iLCJ2cyIsInJlZHVjZSIsImFjYyIsInZhbCIsImlkeCIsInN1bSIsIk1hdGgiLCJzcXJ0IiwiZ2V0QWdncmVnYXRpb25GdW5jdGlvbiIsImZvckVhY2giLCJ2IiwiY29sSWR4IiwibWkiLCJsZW5ndGgiLCJfZGF0YSIsIl9sZW5ndGgiLCJkaXN0YW5jZUZucyIsIkFycmF5IiwiZmlsbCIsIm1hcCIsIl8iLCJkaSIsImdldE1lYXN1cmUiLCJyZXRWYWwiLCJGbG9hdDMyQXJyYXkiLCJkaXN0YW5jZVZhbHVlcyIsImZuIiwidmFsdWUiLCJkaXN0YW5jZU1hdHJpeERhdGEiLCJtaW4iLCJtYXgiLCJlIiwiZXJyb3IiLCJwb3N0TWVzc2FnZSIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsInVuZGVmaW5lZCIsImV4cG9ydHMiLCJtb2R1bGUiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwibSIsIl9fd2VicGFja19leHBvcnRzX18iLCJPIiwicmVzdWx0IiwiY2h1bmtJZHMiLCJwcmlvcml0eSIsIm5vdEZ1bGZpbGxlZCIsIkluZmluaXR5IiwiZnVsZmlsbGVkIiwiT2JqZWN0Iiwia2V5cyIsImV2ZXJ5Iiwia2V5Iiwic3BsaWNlIiwiciIsImQiLCJkZWZpbml0aW9uIiwibyIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsImYiLCJjaHVua0lkIiwiUHJvbWlzZSIsImFsbCIsInByb21pc2VzIiwidSIsImciLCJnbG9iYWxUaGlzIiwidGhpcyIsIkZ1bmN0aW9uIiwid2luZG93Iiwib2JqIiwicHJvcCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInNjcmlwdFVybCIsImltcG9ydFNjcmlwdHMiLCJsb2NhdGlvbiIsImRvY3VtZW50IiwiY3VycmVudFNjcmlwdCIsInNyYyIsInNjcmlwdHMiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsIkVycm9yIiwicmVwbGFjZSIsInAiLCJpbnN0YWxsZWRDaHVua3MiLCJjaHVua0xvYWRpbmdHbG9iYWwiLCJzZWxmIiwicGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24iLCJwdXNoIiwiYmluZCIsIm1vcmVNb2R1bGVzIiwicnVudGltZSIsInBvcCIsInRoZW4iXSwic291cmNlUm9vdCI6IiJ9
package/dist/118.js DELETED
@@ -1,2 +0,0 @@
1
- var eda;(()=>{"use strict";var e,r,t={7118:(e,r,t)=>{var o,a;(a=o||(o={})).EUCLIDEAN="EUCLIDEAN",a.MANHATTAN="MANHATTAN";const n=e=>null==e;var s=t(6361),l=t(9657);onmessage=async e=>{const{values:r,startIdx:t,endIdx:o,sampleLength:a,fnName:i,opts:c}=e.data;try{let e=new Float32Array(a);const p=o-t;if((0,s.sQ)(i))for(let e=0;e<r.length;++e)n(r[e])||(r[e]=new l.Z(r[e]._data,r[e]._length));let f=0;const h=Math.floor(p/a),u=new s.UH(i).getMeasure(c),g=r.length-2-Math.floor(Math.sqrt(-8*t+4*r.length*(r.length-1)-7)/2-.5),v=t-r.length*g+Math.floor((g+1)*(g+2)/2);let d=g,b=v,m=0;for(;f<p&&m<a;){const t=n(r[d])||n(r[b])?1:u(r[d],r[b]);for(e[m]=t,m++,f+=h,b+=h;b>=r.length&&f<p;)d++,b=d+1+(b-r.length)}m<a&&(e=e.slice(0,m)),postMessage({distance:e})}catch(e){postMessage({error:e})}}}},o={};function a(e){var r=o[e];if(void 0!==r)return r.exports;var n=o[e]={exports:{}};return t[e](n,n.exports,a),n.exports}a.m=t,a.x=()=>{var e=a.O(void 0,[483,361],(()=>a(7118)));return a.O(e)},e=[],a.O=(r,t,o,n)=>{if(!t){var s=1/0;for(p=0;p<e.length;p++){for(var[t,o,n]=e[p],l=!0,i=0;i<t.length;i++)(!1&n||s>=n)&&Object.keys(a.O).every((e=>a.O[e](t[i])))?t.splice(i--,1):(l=!1,n<s&&(s=n));if(l){e.splice(p--,1);var c=o();void 0!==c&&(r=c)}}return r}n=n||0;for(var p=e.length;p>0&&e[p-1][2]>n;p--)e[p]=e[p-1];e[p]=[t,o,n]},a.d=(e,r)=>{for(var t in r)a.o(r,t)&&!a.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((r,t)=>(a.f[t](e,r),r)),[])),a.u=e=>e+".js",a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var r=a.g.document;if(!e&&r&&(r.currentScript&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var o=t.length-1;o>-1&&!e;)e=t[o--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})(),(()=>{var e={118:1};a.f.i=(r,t)=>{e[r]||importScripts(a.p+a.u(r))};var r=self.webpackChunkeda=self.webpackChunkeda||[],t=r.push.bind(r);r.push=r=>{var[o,n,s]=r;for(var l in n)a.o(n,l)&&(a.m[l]=n[l]);for(s&&s(a);o.length;)e[o.pop()]=1;t(r)}})(),r=a.x,a.x=()=>Promise.all([a.e(483),a.e(361)]).then(r);var n=a.x();eda=n})();
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE4LmpzIiwibWFwcGluZ3MiOiIrQkFBSUEsRUNBQUMsRSxrQkNBRyxJQUFJLEVBQ0FDLEtBR1IsSUFBK0IsRUFBNkIsQ0FBQyxJQUZ0QixVQUFJLFlBQzFDQSxFQUFzQyxVQUFJLFlDRnZDLE1BQU1DLEVBQVNDLEdBQU1BLFEsd0JDRTVCQyxVQUFZQyxNQUFPQyxJQUNmLE1BQU0sT0FBRUMsRUFBTSxTQUFFQyxFQUFRLE9BQUVDLEVBQU0sYUFBRUMsRUFBWSxPQUFFQyxFQUFNLEtBQUVDLEdBQVNOLEVBQU1PLEtBQ3ZFLElBR0ksSUFBSUMsRUFBWSxJQUFJQyxhQUFhTCxHQUNqQyxNQUFNTSxFQUFZUCxFQUFTRCxFQUMzQixJQUFJLFFBQWlCRyxHQUNqQixJQUFLLElBQUlNLEVBQUksRUFBR0EsRUFBSVYsRUFBT1csU0FBVUQsRUFDN0JmLEVBQU1LLEVBQU9VLE1BRWpCVixFQUFPVSxHQUFLLElBQUksSUFBU1YsRUFBT1UsR0FBR0UsTUFBT1osRUFBT1UsR0FBR0csVUFHNUQsSUFBSUMsRUFBTSxFQUNWLE1BQU1DLEVBQVlDLEtBQUtDLE1BQU1SLEVBQVlOLEdBQ25DZSxFQUFhLElBQUksS0FBUWQsR0FBUWUsV0FBV2QsR0FDNUNlLEVBQVdwQixFQUFPVyxPQUFTLEVBQUlLLEtBQUtDLE1BQU1ELEtBQUtLLE1BQU0sRUFBSXBCLEVBQVcsRUFBSUQsRUFBT1csUUFBVVgsRUFBT1csT0FBUyxHQUFLLEdBQUssRUFBSSxJQUN2SFcsRUFBV3JCLEVBQVdELEVBQU9XLE9BQVNTLEVBQVdKLEtBQUtDLE9BQU9HLEVBQVcsSUFBTUEsRUFBVyxHQUFLLEdBQ3BHLElBQUlHLEVBQUtILEVBQ0xJLEVBQUtGLEVBQ0xHLEVBQXVCLEVBQzNCLEtBQU9YLEVBQU1MLEdBQWFnQixFQUF1QnRCLEdBQWMsQ0FFM0QsTUFBTXVCLEVBQVMvQixFQUFNSyxFQUFPdUIsS0FBUzVCLEVBQU1LLEVBQU93QixJQUNULEVBQXJDTixFQUFXbEIsRUFBT3VCLEdBQUt2QixFQUFPd0IsSUFNbEMsSUFMQWpCLEVBQVVrQixHQUF3QkMsRUFDbENELElBRUFYLEdBQU9DLEVBQ1BTLEdBQU1ULEVBQ0NTLEdBQU14QixFQUFPVyxRQUFVRyxFQUFNTCxHQUNoQ2MsSUFDQUMsRUFBS0QsRUFBSyxHQUFLQyxFQUFLeEIsRUFBT1csT0FFbkMsQ0FDSWMsRUFBdUJ0QixJQUN2QkksRUFBWUEsRUFBVW9CLE1BQU0sRUFBR0YsSUFFbkNHLFlBQVksQ0FBRUMsU0FBVXRCLEdBQzVCLENBQ0EsTUFBT3VCLEdBQ0hGLFlBQVksQ0FBRUcsTUFBT0QsR0FDekIsRSxHQzdDQUUsRUFBMkIsQ0FBQyxFQUdoQyxTQUFTQyxFQUFvQkMsR0FFNUIsSUFBSUMsRUFBZUgsRUFBeUJFLEdBQzVDLFFBQXFCRSxJQUFqQkQsRUFDSCxPQUFPQSxFQUFhRSxRQUdyQixJQUFJQyxFQUFTTixFQUF5QkUsR0FBWSxDQUdqREcsUUFBUyxDQUFDLEdBT1gsT0FIQUUsRUFBb0JMLEdBQVVJLEVBQVFBLEVBQU9ELFFBQVNKLEdBRy9DSyxFQUFPRCxPQUNmLENBR0FKLEVBQW9CTyxFQUFJRCxFQUd4Qk4sRUFBb0JyQyxFQUFJLEtBR3ZCLElBQUk2QyxFQUFzQlIsRUFBb0JTLE9BQUVOLEVBQVcsQ0FBQyxJQUFJLE1BQU0sSUFBT0gsRUFBb0IsUUFFakcsT0FEc0JBLEVBQW9CUyxFQUFFRCxFQUNsQixFTGpDdkJqRCxFQUFXLEdBQ2Z5QyxFQUFvQlMsRUFBSSxDQUFDQyxFQUFRQyxFQUFVQyxFQUFJQyxLQUM5QyxJQUFHRixFQUFILENBTUEsSUFBSUcsRUFBZUMsSUFDbkIsSUFBU3RDLEVBQUksRUFBR0EsRUFBSWxCLEVBQVNtQixPQUFRRCxJQUFLLENBR3pDLElBRkEsSUFBS2tDLEVBQVVDLEVBQUlDLEdBQVl0RCxFQUFTa0IsR0FDcEN1QyxHQUFZLEVBQ1BDLEVBQUksRUFBR0EsRUFBSU4sRUFBU2pDLE9BQVF1QyxNQUNwQixFQUFYSixHQUFzQkMsR0FBZ0JELElBQWFLLE9BQU9DLEtBQUtuQixFQUFvQlMsR0FBR1csT0FBT0MsR0FBU3JCLEVBQW9CUyxFQUFFWSxHQUFLVixFQUFTTSxNQUM5SU4sRUFBU1csT0FBT0wsSUFBSyxJQUVyQkQsR0FBWSxFQUNUSCxFQUFXQyxJQUFjQSxFQUFlRCxJQUc3QyxHQUFHRyxFQUFXLENBQ2J6RCxFQUFTK0QsT0FBTzdDLElBQUssR0FDckIsSUFBSThDLEVBQUlYLFNBQ0VULElBQU5vQixJQUFpQmIsRUFBU2EsRUFDL0IsQ0FDRCxDQUNBLE9BQU9iLENBbkJQLENBSkNHLEVBQVdBLEdBQVksRUFDdkIsSUFBSSxJQUFJcEMsRUFBSWxCLEVBQVNtQixPQUFRRCxFQUFJLEdBQUtsQixFQUFTa0IsRUFBSSxHQUFHLEdBQUtvQyxFQUFVcEMsSUFBS2xCLEVBQVNrQixHQUFLbEIsRUFBU2tCLEVBQUksR0FDckdsQixFQUFTa0IsR0FBSyxDQUFDa0MsRUFBVUMsRUFBSUMsRUFxQmpCLEVNekJkYixFQUFvQndCLEVBQUksQ0FBQ3BCLEVBQVNxQixLQUNqQyxJQUFJLElBQUlKLEtBQU9JLEVBQ1h6QixFQUFvQjBCLEVBQUVELEVBQVlKLEtBQVNyQixFQUFvQjBCLEVBQUV0QixFQUFTaUIsSUFDNUVILE9BQU9TLGVBQWV2QixFQUFTaUIsRUFBSyxDQUFFTyxZQUFZLEVBQU1DLElBQUtKLEVBQVdKLElBRTFFLEVDTkRyQixFQUFvQjhCLEVBQUksQ0FBQyxFQUd6QjlCLEVBQW9CSCxFQUFLa0MsR0FDakJDLFFBQVFDLElBQUlmLE9BQU9DLEtBQUtuQixFQUFvQjhCLEdBQUdJLFFBQU8sQ0FBQ0MsRUFBVWQsS0FDdkVyQixFQUFvQjhCLEVBQUVULEdBQUtVLEVBQVNJLEdBQzdCQSxJQUNMLEtDTkpuQyxFQUFvQm9DLEVBQUtMLEdBRVpBLEVBQVUsTUNIdkIvQixFQUFvQnFDLEVBQUksV0FDdkIsR0FBMEIsaUJBQWZDLFdBQXlCLE9BQU9BLFdBQzNDLElBQ0MsT0FBT0MsTUFBUSxJQUFJQyxTQUFTLGNBQWIsRUFDaEIsQ0FBRSxNQUFPM0MsR0FDUixHQUFzQixpQkFBWDRDLE9BQXFCLE9BQU9BLE1BQ3hDLENBQ0EsQ0FQdUIsR0NBeEJ6QyxFQUFvQjBCLEVBQUksQ0FBQ2dCLEVBQUtDLElBQVV6QixPQUFPMEIsVUFBVUMsZUFBZUMsS0FBS0osRUFBS0MsRyxNQ0FsRixJQUFJSSxFQUNBL0MsRUFBb0JxQyxFQUFFVyxnQkFBZUQsRUFBWS9DLEVBQW9CcUMsRUFBRVksU0FBVyxJQUN0RixJQUFJQyxFQUFXbEQsRUFBb0JxQyxFQUFFYSxTQUNyQyxJQUFLSCxHQUFhRyxJQUNiQSxFQUFTQyxnQkFDWkosRUFBWUcsRUFBU0MsY0FBY0MsTUFDL0JMLEdBQVcsQ0FDZixJQUFJTSxFQUFVSCxFQUFTSSxxQkFBcUIsVUFDNUMsR0FBR0QsRUFBUTNFLE9BRVYsSUFEQSxJQUFJRCxFQUFJNEUsRUFBUTNFLE9BQVMsRUFDbEJELEdBQUssSUFBTXNFLEdBQVdBLEVBQVlNLEVBQVE1RSxLQUFLMkUsR0FFeEQsQ0FJRCxJQUFLTCxFQUFXLE1BQU0sSUFBSVEsTUFBTSx5REFDaENSLEVBQVlBLEVBQVVTLFFBQVEsT0FBUSxJQUFJQSxRQUFRLFFBQVMsSUFBSUEsUUFBUSxZQUFhLEtBQ3BGeEQsRUFBb0J5RCxFQUFJVixDLFdDZHhCLElBQUlXLEVBQWtCLENBQ3JCLElBQUssR0FnQk4xRCxFQUFvQjhCLEVBQUVyRCxFQUFJLENBQUNzRCxFQUFTSSxLQUUvQnVCLEVBQWdCM0IsSUFFbEJpQixjQUFjaEQsRUFBb0J5RCxFQUFJekQsRUFBb0JvQyxFQUFFTCxHQUU5RCxFQUdELElBQUk0QixFQUFxQkMsS0FBc0IsZ0JBQUlBLEtBQXNCLGlCQUFLLEdBQzFFQyxFQUE2QkYsRUFBbUJHLEtBQUtDLEtBQUtKLEdBQzlEQSxFQUFtQkcsS0F2QkN6RixJQUNuQixJQUFLc0MsRUFBVXFELEVBQWFDLEdBQVc1RixFQUN2QyxJQUFJLElBQUk0QixLQUFZK0QsRUFDaEJoRSxFQUFvQjBCLEVBQUVzQyxFQUFhL0QsS0FDckNELEVBQW9CTyxFQUFFTixHQUFZK0QsRUFBWS9ELElBSWhELElBREdnRSxHQUFTQSxFQUFRakUsR0FDZFcsRUFBU2pDLFFBQ2RnRixFQUFnQi9DLEVBQVN1RCxPQUFTLEVBQ25DTCxFQUEyQnhGLEVBQUssQyxLWG5CN0JiLEVBQU93QyxFQUFvQnJDLEVBQy9CcUMsRUFBb0JyQyxFQUFJLElBQ2hCcUUsUUFBUUMsSUFBSSxDQUNsQmpDLEVBQW9CSCxFQUFFLEtBQ3RCRyxFQUFvQkgsRUFBRSxPQUNwQnNFLEtBQUszRyxHWUpULElBQUlnRCxFQUFzQlIsRUFBb0JyQyxJIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9jaHVuayBsb2FkZWQiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9zdGFydHVwIGNodW5rIGRlcGVuZGVuY2llcyIsIndlYnBhY2s6Ly9lZGEvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tbC9zcmMvZGlzdGFuY2UtbWF0cml4L3R5cGVzLmpzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21sL3NyYy9kaXN0YW5jZS1tYXRyaXgvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vZWRhLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWwvc3JjL2Rpc3RhbmNlLW1hdHJpeC9zcGFyc2UtbWF0cml4LXRocmVzaG9sZC13b3JrZXIuanMiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2VkYS93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9lbnN1cmUgY2h1bmsiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9nZXQgamF2YXNjcmlwdCBjaHVuayBmaWxlbmFtZSIsIndlYnBhY2s6Ly9lZGEvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9lZGEvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9lZGEvd2VicGFjay9ydW50aW1lL3B1YmxpY1BhdGgiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9pbXBvcnRTY3JpcHRzIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZGVmZXJyZWQgPSBbXTtcbl9fd2VicGFja19yZXF1aXJlX18uTyA9IChyZXN1bHQsIGNodW5rSWRzLCBmbiwgcHJpb3JpdHkpID0+IHtcblx0aWYoY2h1bmtJZHMpIHtcblx0XHRwcmlvcml0eSA9IHByaW9yaXR5IHx8IDA7XG5cdFx0Zm9yKHZhciBpID0gZGVmZXJyZWQubGVuZ3RoOyBpID4gMCAmJiBkZWZlcnJlZFtpIC0gMV1bMl0gPiBwcmlvcml0eTsgaS0tKSBkZWZlcnJlZFtpXSA9IGRlZmVycmVkW2kgLSAxXTtcblx0XHRkZWZlcnJlZFtpXSA9IFtjaHVua0lkcywgZm4sIHByaW9yaXR5XTtcblx0XHRyZXR1cm47XG5cdH1cblx0dmFyIG5vdEZ1bGZpbGxlZCA9IEluZmluaXR5O1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGRlZmVycmVkLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIFtjaHVua0lkcywgZm4sIHByaW9yaXR5XSA9IGRlZmVycmVkW2ldO1xuXHRcdHZhciBmdWxmaWxsZWQgPSB0cnVlO1xuXHRcdGZvciAodmFyIGogPSAwOyBqIDwgY2h1bmtJZHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdGlmICgocHJpb3JpdHkgJiAxID09PSAwIHx8IG5vdEZ1bGZpbGxlZCA+PSBwcmlvcml0eSkgJiYgT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5PKS5ldmVyeSgoa2V5KSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXy5PW2tleV0oY2h1bmtJZHNbal0pKSkpIHtcblx0XHRcdFx0Y2h1bmtJZHMuc3BsaWNlKGotLSwgMSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmdWxmaWxsZWQgPSBmYWxzZTtcblx0XHRcdFx0aWYocHJpb3JpdHkgPCBub3RGdWxmaWxsZWQpIG5vdEZ1bGZpbGxlZCA9IHByaW9yaXR5O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZihmdWxmaWxsZWQpIHtcblx0XHRcdGRlZmVycmVkLnNwbGljZShpLS0sIDEpXG5cdFx0XHR2YXIgciA9IGZuKCk7XG5cdFx0XHRpZiAociAhPT0gdW5kZWZpbmVkKSByZXN1bHQgPSByO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufTsiLCJ2YXIgbmV4dCA9IF9fd2VicGFja19yZXF1aXJlX18ueDtcbl9fd2VicGFja19yZXF1aXJlX18ueCA9ICgpID0+IHtcblx0cmV0dXJuIFByb21pc2UuYWxsKFtcblx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmUoNDgzKSxcblx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmUoMzYxKVxuXHRdKS50aGVuKG5leHQpO1xufTsiLCJleHBvcnQgdmFyIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzO1xuKGZ1bmN0aW9uIChEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcykge1xuICAgIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzW1wiRVVDTElERUFOXCJdID0gXCJFVUNMSURFQU5cIjtcbiAgICBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kc1tcIk1BTkhBVFRBTlwiXSA9IFwiTUFOSEFUVEFOXCI7XG59KShEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcyB8fCAoRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMgPSB7fSkpO1xuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pZEhsd1pYTXVhbk1pTENKemIzVnlZMlZTYjI5MElqb2lJaXdpYzI5MWNtTmxjeUk2V3lKMGVYQmxjeTUwY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFTeE5RVUZOTEVOQlFVNHNTVUZCV1N3d1FrRkhWRHRCUVVoSUxGZEJRVmtzTUVKQlFUQkNPMGxCUTJ4RExIRkVRVUYxUWl4RFFVRkJPMGxCUTNaQ0xIRkVRVUYxUWl4RFFVRkJPMEZCUTNwQ0xFTkJRVU1zUlVGSVV5d3dRa0ZCTUVJc1MwRkJNVUlzTUVKQlFUQkNMRkZCUjI1RE8wRkJRVUVzUTBGQlF5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbVY0Y0c5eWRDQmxiblZ0SUVScGMzUmhibU5sUVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlJ6SUh0Y2JpQWdJQ0JGVlVOTVNVUkZRVTRnUFNBblJWVkRURWxFUlVGT0p5eGNiaUFnSUNCTlFVNUlRVlJVUVU0Z1BTQW5UVUZPU0VGVVZFRk9KeXhjYmlBZ2ZUdGNibHh1Wlhod2IzSjBJSFI1Y0dVZ1JHbHpkR0Z1WTJWQloyZHlaV2RoZEdsdmJrMWxkR2h2WkNBOUlHdGxlVzltSUhSNWNHVnZaaUJFYVhOMFlXNWpaVUZuWjNKbFoyRjBhVzl1VFdWMGFHOWtjenRjYmlKZGZRPT0iLCJpbXBvcnQgeyBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcyB9IGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0IGNvbnN0IGlzTmlsID0gKHgpID0+IHggPT09IG51bGwgfHwgeCA9PT0gdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIGluc2VydFNtYWxsZXIoZGlzdGFuY2VzQXIsIGluZGV4ZXMsIG51bSwgaW5kZXgpIHtcbiAgICBpZiAobnVtID4gZGlzdGFuY2VzQXJbZGlzdGFuY2VzQXIubGVuZ3RoIC0gMV0pXG4gICAgICAgIHJldHVybjtcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpc3RhbmNlc0FyLmZpbmRJbmRleCgodikgPT4gbnVtIDwgdik7XG4gICAgZGlzdGFuY2VzQXIucG9wKCk7XG4gICAgZGlzdGFuY2VzQXIuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBudW0pO1xuICAgIGluZGV4ZXMucG9wKCk7XG4gICAgaW5kZXhlcy5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGluZGV4KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRMYXJnZXIoZGlzdGFuY2VzQXIsIGluZGV4ZXMsIG51bSwgaW5kZXgpIHtcbiAgICBpZiAobnVtIDwgZGlzdGFuY2VzQXJbZGlzdGFuY2VzQXIubGVuZ3RoIC0gMV0pXG4gICAgICAgIHJldHVybjtcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpc3RhbmNlc0FyLmZpbmRJbmRleCgodikgPT4gbnVtID4gdik7XG4gICAgZGlzdGFuY2VzQXIucG9wKCk7XG4gICAgZGlzdGFuY2VzQXIuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBudW0pO1xuICAgIGluZGV4ZXMucG9wKCk7XG4gICAgaW5kZXhlcy5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGluZGV4KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRBZ2dyZWdhdGlvbkZ1bmN0aW9uKGFnZ3JlZ2F0aW9uTWV0aG9kLCB3ZWlnaHRzKSB7XG4gICAgc3dpdGNoIChhZ2dyZWdhdGlvbk1ldGhvZCkge1xuICAgICAgICBjYXNlIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLk1BTkhBVFRBTjpcbiAgICAgICAgICAgIHJldHVybiAodnMpID0+IHZzLnJlZHVjZSgoYWNjLCB2YWwsIGlkeCkgPT4gYWNjICsgdmFsICogd2VpZ2h0c1tpZHhdLCAwKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiAodnMpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBldWNsaWRlYW5cbiAgICAgICAgICAgICAgICBjb25zdCBzdW0gPSB2cy5yZWR1Y2UoKGFjYywgdmFsLCBpZHgpID0+IGFjYyArICh2YWwgKiB3ZWlnaHRzW2lkeF0pICoqIDIsIDApO1xuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnNxcnQoc3VtKTtcbiAgICAgICAgICAgIH07XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pZFhScGJITXVhbk1pTENKemIzVnlZMlZTYjI5MElqb2lJaXdpYzI5MWNtTmxjeUk2V3lKMWRHbHNjeTUwY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFTeFBRVUZQTEVWQlFUUkNMREJDUVVFd1FpeEZRVUZETEUxQlFVMHNVMEZCVXl4RFFVRkRPMEZCUlRsRkxFMUJRVTBzUTBGQlF5eE5RVUZOTEV0QlFVc3NSMEZCUnl4RFFVRkRMRU5CUVUwc1JVRkJSU3hGUVVGRkxFTkJRVU1zUTBGQlF5eExRVUZMTEVsQlFVa3NTVUZCU1N4RFFVRkRMRXRCUVVzc1UwRkJVeXhEUVVGRE8wRkJSUzlFTEUxQlFVMHNWVUZCVlN4aFFVRmhMRU5CUVVNc1YwRkJjVUlzUlVGQlJTeFBRVUZwUWl4RlFVRkZMRWRCUVZjc1JVRkJSU3hMUVVGaE8wbEJRMmhITEVsQlFVa3NSMEZCUnl4SFFVRkhMRmRCUVZjc1EwRkJReXhYUVVGWExFTkJRVU1zVFVGQlRTeEhRVUZETEVOQlFVTXNRMEZCUXp0UlFVTjZReXhQUVVGUE8wbEJSVlFzVFVGQlRTeFhRVUZYTEVkQlFVY3NWMEZCVnl4RFFVRkRMRk5CUVZNc1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGTEVOQlFVTXNSMEZCUnl4SFFVRkhMRU5CUVVNc1EwRkJReXhEUVVGRE8wbEJRekZFTEZkQlFWY3NRMEZCUXl4SFFVRkhMRVZCUVVVc1EwRkJRenRKUVVOc1FpeFhRVUZYTEVOQlFVTXNUVUZCVFN4RFFVRkRMRmRCUVZjc1JVRkJSU3hEUVVGRExFVkJRVVVzUjBGQlJ5eERRVUZETEVOQlFVTTdTVUZEZUVNc1QwRkJUeXhEUVVGRExFZEJRVWNzUlVGQlJTeERRVUZETzBsQlEyUXNUMEZCVHl4RFFVRkRMRTFCUVUwc1EwRkJReXhYUVVGWExFVkJRVVVzUTBGQlF5eEZRVUZGTEV0QlFVc3NRMEZCUXl4RFFVRkRPMEZCUTNoRExFTkJRVU03UVVGRlJDeE5RVUZOTEZWQlFWVXNXVUZCV1N4RFFVRkRMRmRCUVhGQ0xFVkJRVVVzVDBGQmFVSXNSVUZCUlN4SFFVRlhMRVZCUVVVc1MwRkJZVHRKUVVNdlJpeEpRVUZKTEVkQlFVY3NSMEZCUnl4WFFVRlhMRU5CUVVNc1YwRkJWeXhEUVVGRExFMUJRVTBzUjBGQlF5eERRVUZETEVOQlFVTTdVVUZEZWtNc1QwRkJUenRKUVVWVUxFMUJRVTBzVjBGQlZ5eEhRVUZITEZkQlFWY3NRMEZCUXl4VFFVRlRMRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVVzUlVGQlJTeERRVUZETEVkQlFVY3NSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVNeFJDeFhRVUZYTEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNN1NVRkRiRUlzVjBGQlZ5eERRVUZETEUxQlFVMHNRMEZCUXl4WFFVRlhMRVZCUVVVc1EwRkJReXhGUVVGRkxFZEJRVWNzUTBGQlF5eERRVUZETzBsQlEzaERMRTlCUVU4c1EwRkJReXhIUVVGSExFVkJRVVVzUTBGQlF6dEpRVU5rTEU5QlFVOHNRMEZCUXl4TlFVRk5MRU5CUVVNc1YwRkJWeXhGUVVGRkxFTkJRVU1zUlVGQlJTeExRVUZMTEVOQlFVTXNRMEZCUXp0QlFVTjRReXhEUVVGRE8wRkJSVVFzVFVGQlRTeFZRVUZWTEhOQ1FVRnpRaXhEUVVOd1F5eHBRa0ZCTkVNc1JVRkJSU3hQUVVGcFFqdEpRVVV2UkN4UlFVRlJMR2xDUVVGcFFpeEZRVUZGTzFGQlEzcENMRXRCUVVzc01FSkJRVEJDTEVOQlFVTXNVMEZCVXp0WlFVTjJReXhQUVVGUExFTkJRVU1zUlVGQldTeEZRVUZGTEVWQlFVVXNRMEZCUXl4RlFVRkZMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUjBGQlJ5eEZRVUZGTEVkQlFVY3NSVUZCUlN4SFFVRkhMRVZCUVVVc1JVRkJSU3hEUVVGRExFZEJRVWNzUjBGQlJ5eEhRVUZITEVkQlFVY3NUMEZCVHl4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETzFGQlEzSkdPMWxCUTBVc1QwRkJUeXhEUVVGRExFVkJRVmtzUlVGQlJTeEZRVUZGTzJkQ1FVTjBRaXhaUVVGWk8yZENRVU5hTEUxQlFVMHNSMEZCUnl4SFFVRkhMRVZCUVVVc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eEhRVUZITEVWQlFVVXNSMEZCUnl4RlFVRkZMRWRCUVVjc1JVRkJSU3hGUVVGRkxFTkJRVU1zUjBGQlJ5eEhRVUZITEVOQlFVTXNSMEZCUnl4SFFVRkhMRTlCUVU4c1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJRenRuUWtGRE4wVXNUMEZCVHl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETzFsQlEzaENMRU5CUVVNc1EwRkJRenRMUVVOTU8wRkJRMGdzUTBGQlF5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbWx0Y0c5eWRDQjdSR2x6ZEdGdVkyVkJaMmR5WldkaGRHbHZiazFsZEdodlpDd2dSR2x6ZEdGdVkyVkJaMmR5WldkaGRHbHZiazFsZEdodlpITjlJR1p5YjIwZ0p5NHZkSGx3WlhNbk8xeHVYRzVsZUhCdmNuUWdZMjl1YzNRZ2FYTk9hV3dnUFNBb2VEb2dZVzU1S1NBOVBpQjRJRDA5UFNCdWRXeHNJSHg4SUhnZ1BUMDlJSFZ1WkdWbWFXNWxaRHRjYmx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdsdWMyVnlkRk50WVd4c1pYSW9aR2x6ZEdGdVkyVnpRWEk2SUc1MWJXSmxjbHRkTENCcGJtUmxlR1Z6T2lCdWRXMWlaWEpiWFN3Z2JuVnRPaUJ1ZFcxaVpYSXNJR2x1WkdWNE9pQnVkVzFpWlhJcElIdGNiaUFnYVdZZ0tHNTFiU0ErSUdScGMzUmhibU5sYzBGeVcyUnBjM1JoYm1ObGMwRnlMbXhsYm1kMGFDMHhYU2xjYmlBZ0lDQnlaWFIxY200N1hHNWNiaUFnWTI5dWMzUWdibVYzVUc5emFYUnBiMjRnUFNCa2FYTjBZVzVqWlhOQmNpNW1hVzVrU1c1a1pYZ29LSFlwSUQwK0lHNTFiU0E4SUhZcE8xeHVJQ0JrYVhOMFlXNWpaWE5CY2k1d2IzQW9LVHRjYmlBZ1pHbHpkR0Z1WTJWelFYSXVjM0JzYVdObEtHNWxkMUJ2YzJsMGFXOXVMQ0F3TENCdWRXMHBPMXh1SUNCcGJtUmxlR1Z6TG5CdmNDZ3BPMXh1SUNCcGJtUmxlR1Z6TG5Od2JHbGpaU2h1WlhkUWIzTnBkR2x2Yml3Z01Dd2dhVzVrWlhncE8xeHVmVnh1WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnYVc1elpYSjBUR0Z5WjJWeUtHUnBjM1JoYm1ObGMwRnlPaUJ1ZFcxaVpYSmJYU3dnYVc1a1pYaGxjem9nYm5WdFltVnlXMTBzSUc1MWJUb2diblZ0WW1WeUxDQnBibVJsZURvZ2JuVnRZbVZ5S1NCN1hHNGdJR2xtSUNodWRXMGdQQ0JrYVhOMFlXNWpaWE5CY2x0a2FYTjBZVzVqWlhOQmNpNXNaVzVuZEdndE1WMHBYRzRnSUNBZ2NtVjBkWEp1TzF4dVhHNGdJR052Ym5OMElHNWxkMUJ2YzJsMGFXOXVJRDBnWkdsemRHRnVZMlZ6UVhJdVptbHVaRWx1WkdWNEtDaDJLU0E5UGlCdWRXMGdQaUIyS1R0Y2JpQWdaR2x6ZEdGdVkyVnpRWEl1Y0c5d0tDazdYRzRnSUdScGMzUmhibU5sYzBGeUxuTndiR2xqWlNodVpYZFFiM05wZEdsdmJpd2dNQ3dnYm5WdEtUdGNiaUFnYVc1a1pYaGxjeTV3YjNBb0tUdGNiaUFnYVc1a1pYaGxjeTV6Y0d4cFkyVW9ibVYzVUc5emFYUnBiMjRzSURBc0lHbHVaR1Y0S1R0Y2JuMWNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR2RsZEVGblozSmxaMkYwYVc5dVJuVnVZM1JwYjI0b1hHNGdJR0ZuWjNKbFoyRjBhVzl1VFdWMGFHOWtPaUJFYVhOMFlXNWpaVUZuWjNKbFoyRjBhVzl1VFdWMGFHOWtMQ0IzWldsbmFIUnpPaUJ1ZFcxaVpYSmJYVnh1S1RvZ0tIWmhiSFZsY3pvZ2JuVnRZbVZ5VzEwcElEMCtJRzUxYldKbGNpQjdYRzRnSUhOM2FYUmphQ0FvWVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlFwSUh0Y2JpQWdJQ0JqWVhObElFUnBjM1JoYm1ObFFXZG5jbVZuWVhScGIyNU5aWFJvYjJSekxrMUJUa2hCVkZSQlRqcGNiaUFnSUNBZ0lISmxkSFZ5YmlBb2RuTTZJRzUxYldKbGNsdGRLU0E5UGlCMmN5NXlaV1IxWTJVb0tHRmpZeXdnZG1Gc0xDQnBaSGdwSUQwK0lHRmpZeUFySUhaaGJDQXFJSGRsYVdkb2RITmJhV1I0WFN3Z01DazdYRzRnSUNBZ1pHVm1ZWFZzZERwY2JpQWdJQ0FnSUhKbGRIVnliaUFvZG5NNklHNTFiV0psY2x0ZEtTQTlQaUI3WEc0Z0lDQWdJQ0FnSUM4dklHVjFZMnhwWkdWaGJseHVJQ0FnSUNBZ0lDQmpiMjV6ZENCemRXMGdQU0IyY3k1eVpXUjFZMlVvS0dGall5d2dkbUZzTENCcFpIZ3BJRDArSUdGall5QXJJQ2gyWVd3Z0tpQjNaV2xuYUhSelcybGtlRjBwSUNvcUlESXNJREFwTzF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnVFdGMGFDNXpjWEowS0hOMWJTazdYRzRnSUNBZ0lDQjlPMXh1SUNCOVhHNTlYRzRpWFgwPSIsImltcG9ydCB7IGlzTmlsIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBNZWFzdXJlLCBpc0JpdEFycmF5TWV0cmljIH0gZnJvbSAnLi4vdHlwZWQtbWV0cmljcyc7XG5pbXBvcnQgQml0QXJyYXkgZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvYml0LWFycmF5Jztcbm9ubWVzc2FnZSA9IGFzeW5jIChldmVudCkgPT4ge1xuICAgIGNvbnN0IHsgdmFsdWVzLCBzdGFydElkeCwgZW5kSWR4LCBzYW1wbGVMZW5ndGgsIGZuTmFtZSwgb3B0cyB9ID0gZXZlbnQuZGF0YTtcbiAgICB0cnkge1xuICAgICAgICAvLyBpZiAoc3RhcnRJZHggIT0gLTEpXG4gICAgICAgIC8vICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciBpbiBzcGFyc2UgdGhyZXNob2xkIHdvcmtlcicpOyAvLyBUT0RPOiByZW1vdmUgdGhpcyBsaW5lXG4gICAgICAgIGxldCBkaXN0YW5jZXMgPSBuZXcgRmxvYXQzMkFycmF5KHNhbXBsZUxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IGVuZElkeCAtIHN0YXJ0SWR4O1xuICAgICAgICBpZiAoaXNCaXRBcnJheU1ldHJpYyhmbk5hbWUpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmIChpc05pbCh2YWx1ZXNbaV0pKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBuZXcgQml0QXJyYXkodmFsdWVzW2ldLl9kYXRhLCB2YWx1ZXNbaV0uX2xlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNudCA9IDA7XG4gICAgICAgIGNvbnN0IGluY3JlbWVudCA9IE1hdGguZmxvb3IoY2h1bmtTaXplIC8gc2FtcGxlTGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2VGbiA9IG5ldyBNZWFzdXJlKGZuTmFtZSkuZ2V0TWVhc3VyZShvcHRzKTtcbiAgICAgICAgY29uc3Qgc3RhcnRSb3cgPSB2YWx1ZXMubGVuZ3RoIC0gMiAtIE1hdGguZmxvb3IoTWF0aC5zcXJ0KC04ICogc3RhcnRJZHggKyA0ICogdmFsdWVzLmxlbmd0aCAqICh2YWx1ZXMubGVuZ3RoIC0gMSkgLSA3KSAvIDIgLSAwLjUpO1xuICAgICAgICBjb25zdCBzdGFydENvbCA9IHN0YXJ0SWR4IC0gdmFsdWVzLmxlbmd0aCAqIHN0YXJ0Um93ICsgTWF0aC5mbG9vcigoc3RhcnRSb3cgKyAxKSAqIChzdGFydFJvdyArIDIpIC8gMik7XG4gICAgICAgIGxldCBtaSA9IHN0YXJ0Um93O1xuICAgICAgICBsZXQgbWogPSBzdGFydENvbDtcbiAgICAgICAgbGV0IGRpc3RhbmNlQXJyYXlDb3VudGVyID0gMDtcbiAgICAgICAgd2hpbGUgKGNudCA8IGNodW5rU2l6ZSAmJiBkaXN0YW5jZUFycmF5Q291bnRlciA8IHNhbXBsZUxlbmd0aCkge1xuICAgICAgICAgICAgLy9jb25zdCB2YWx1ZSA9IHNlcTFMaXN0W21pXSAmJiBzZXExTGlzdFttal0gPyBoYW1taW5nKHNlcTFMaXN0W21pXSwgc2VxMUxpc3RbbWpdKSA6IDA7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9ICFpc05pbCh2YWx1ZXNbbWldKSAmJiAhaXNOaWwodmFsdWVzW21qXSkgP1xuICAgICAgICAgICAgICAgIGRpc3RhbmNlRm4odmFsdWVzW21pXSwgdmFsdWVzW21qXSkgOiAxO1xuICAgICAgICAgICAgZGlzdGFuY2VzW2Rpc3RhbmNlQXJyYXlDb3VudGVyXSA9IHZhbHVlO1xuICAgICAgICAgICAgZGlzdGFuY2VBcnJheUNvdW50ZXIrKztcbiAgICAgICAgICAgIC8vIGNvbnN0IGN1cnJlbnRJbmNyZW1lbnQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBpbmNyZW1lbnQpICsgMVxuICAgICAgICAgICAgY250ICs9IGluY3JlbWVudDtcbiAgICAgICAgICAgIG1qICs9IGluY3JlbWVudDtcbiAgICAgICAgICAgIHdoaWxlIChtaiA+PSB2YWx1ZXMubGVuZ3RoICYmIGNudCA8IGNodW5rU2l6ZSkge1xuICAgICAgICAgICAgICAgIG1pKys7XG4gICAgICAgICAgICAgICAgbWogPSBtaSArIDEgKyAobWogLSB2YWx1ZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzdGFuY2VBcnJheUNvdW50ZXIgPCBzYW1wbGVMZW5ndGgpIHtcbiAgICAgICAgICAgIGRpc3RhbmNlcyA9IGRpc3RhbmNlcy5zbGljZSgwLCBkaXN0YW5jZUFycmF5Q291bnRlcik7XG4gICAgICAgIH1cbiAgICAgICAgcG9zdE1lc3NhZ2UoeyBkaXN0YW5jZTogZGlzdGFuY2VzIH0pO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBwb3N0TWVzc2FnZSh7IGVycm9yOiBlIH0pO1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2ljM0JoY25ObExXMWhkSEpwZUMxMGFISmxjMmh2YkdRdGQyOXlhMlZ5TG1weklpd2ljMjkxY21ObFVtOXZkQ0k2SWlJc0luTnZkWEpqWlhNaU9sc2ljM0JoY25ObExXMWhkSEpwZUMxMGFISmxjMmh2YkdRdGQyOXlhMlZ5TG5SeklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lKQlFVRkJMRTlCUVU4c1JVRkJReXhMUVVGTExFVkJRVU1zVFVGQlRTeFRRVUZUTEVOQlFVTTdRVUZET1VJc1QwRkJUeXhGUVVGbExFOUJRVThzUlVGQlJTeG5Ra0ZCWjBJc1JVRkJReXhOUVVGTkxHdENRVUZyUWl4RFFVRkRPMEZCUTNwRkxFOUJRVThzVVVGQlVTeE5RVUZOTEhsRFFVRjVReXhEUVVGRE8wRkJReTlFTEZOQlFWTXNSMEZCUnl4TFFVRkxMRVZCUVVVc1MwRkJTeXhGUVVGRkxFVkJRVVU3U1VGRE1VSXNUVUZCVFN4RlFVRkRMRTFCUVUwc1JVRkJSU3hSUVVGUkxFVkJRVVVzVFVGQlRTeEZRVUZGTEZsQlFWa3NSVUZCUlN4TlFVRk5MRVZCUVVVc1NVRkJTU3hGUVVGRExFZEJRMmxFTEV0QlFVc3NRMEZCUXl4SlFVRkpMRU5CUVVNN1NVRkRlRWdzU1VGQlNUdFJRVU5HTEhOQ1FVRnpRanRSUVVOMFFpeHRSa0ZCYlVZN1VVRkRia1lzU1VGQlNTeFRRVUZUTEVkQlFXbENMRWxCUVVrc1dVRkJXU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETzFGQlF6ZEVMRTFCUVUwc1UwRkJVeXhIUVVGSExFMUJRVTBzUjBGQlJ5eFJRVUZSTEVOQlFVTTdVVUZGY0VNc1NVRkJTU3huUWtGQlowSXNRMEZCUXl4TlFVRk5MRU5CUVVNc1JVRkJSVHRaUVVNMVFpeExRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzVFVGQlRTeERRVUZETEUxQlFVMHNSVUZCUlN4RlFVRkZMRU5CUVVNc1JVRkJSVHRuUWtGRGRFTXNTVUZCU1N4TFFVRkxMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzI5Q1FVRkZMRk5CUVZNN1owSkJReTlDTEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhKUVVGSkxGRkJRVkVzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1MwRkJTeXhGUVVGRkxFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJRenRoUVVNNVJEdFRRVU5HTzFGQlEwUXNTVUZCU1N4SFFVRkhMRWRCUVVjc1EwRkJReXhEUVVGRE8xRkJRMW9zVFVGQlRTeFRRVUZUTEVkQlFVY3NTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhUUVVGVExFZEJRVWNzV1VGQldTeERRVUZETEVOQlFVTTdVVUZEZGtRc1RVRkJUU3hWUVVGVkxFZEJRVWNzU1VGQlNTeFBRVUZQTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1ZVRkJWU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETzFGQlEzaEVMRTFCUVUwc1VVRkJVU3hIUVVGSExFMUJRVTBzUTBGQlF5eE5RVUZOTEVkQlFVY3NRMEZCUXl4SFFVRkhMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRemRETEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzVVVGQlVTeEhRVUZITEVOQlFVTXNSMEZCUnl4TlFVRk5MRU5CUVVNc1RVRkJUU3hIUVVGSExFTkJRVU1zVFVGQlRTeERRVUZETEUxQlFVMHNSMEZCUnl4RFFVRkRMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NSMEZCUnl4RFFVRkRMRU5CUVVNN1VVRkRjRVlzVFVGQlRTeFJRVUZSTEVkQlFVY3NVVUZCVVN4SFFVRkhMRTFCUVUwc1EwRkJReXhOUVVGTkxFZEJRVWNzVVVGQlVTeEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhSUVVGUkxFZEJRVWNzUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4UlFVRlJMRWRCUVVjc1EwRkJReXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEZGtjc1NVRkJTU3hGUVVGRkxFZEJRVWNzVVVGQlVTeERRVUZETzFGQlEyeENMRWxCUVVrc1JVRkJSU3hIUVVGSExGRkJRVkVzUTBGQlF6dFJRVU5zUWl4SlFVRkpMRzlDUVVGdlFpeEhRVUZITEVOQlFVTXNRMEZCUXp0UlFVTTNRaXhQUVVGUExFZEJRVWNzUjBGQlJ5eFRRVUZUTEVsQlFVa3NiMEpCUVc5Q0xFZEJRVWNzV1VGQldTeEZRVUZGTzFsQlF6ZEVMSFZHUVVGMVJqdFpRVU4yUml4TlFVRk5MRXRCUVVzc1IwRkJSeXhEUVVGRExFdEJRVXNzUTBGQlF5eE5RVUZOTEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eE5RVUZOTEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8yZENRVU4wUkN4VlFVRlZMRU5CUVVNc1RVRkJUU3hEUVVGRExFVkJRVVVzUTBGQlF5eEZRVUZGTEUxQlFVMHNRMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdXVUZGZWtNc1UwRkJVeXhEUVVGRExHOUNRVUZ2UWl4RFFVRkRMRWRCUVVjc1MwRkJTeXhEUVVGRE8xbEJRM2hETEc5Q1FVRnZRaXhGUVVGRkxFTkJRVU03V1VGRGRrSXNjVVZCUVhGRk8xbEJRM0pGTEVkQlFVY3NTVUZCUlN4VFFVRlRMRU5CUVVNN1dVRkRaaXhGUVVGRkxFbEJRVVVzVTBGQlV5eERRVUZETzFsQlEyUXNUMEZCVHl4RlFVRkZMRWxCUVVrc1RVRkJUU3hEUVVGRExFMUJRVTBzU1VGQlNTeEhRVUZITEVkQlFVY3NVMEZCVXl4RlFVRkZPMmRDUVVNM1F5eEZRVUZGTEVWQlFVVXNRMEZCUXp0blFrRkRUQ3hGUVVGRkxFZEJRVWNzUlVGQlJTeEhRVUZITEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1IwRkJSeXhOUVVGTkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdZVUZEY0VNN1UwRkRSanRSUVVWRUxFbEJRVWtzYjBKQlFXOUNMRWRCUVVjc1dVRkJXU3hGUVVGRk8xbEJRM1pETEZOQlFWTXNSMEZCUnl4VFFVRlRMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUlVGQlJTeHZRa0ZCYjBJc1EwRkJReXhEUVVGRE8xTkJRM1JFTzFGQlEwUXNWMEZCVnl4RFFVRkRMRVZCUVVNc1VVRkJVU3hGUVVGRkxGTkJRVk1zUlVGQlF5eERRVUZETEVOQlFVTTdTMEZEY0VNN1NVRkJReXhQUVVGUExFTkJRVU1zUlVGQlJUdFJRVU5XTEZkQlFWY3NRMEZCUXl4RlFVRkRMRXRCUVVzc1JVRkJSU3hEUVVGRExFVkJRVU1zUTBGQlF5eERRVUZETzB0QlEzcENPMEZCUTBnc1EwRkJReXhEUVVGRElpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lhVzF3YjNKMElIdHBjMDVwYkgwZ1puSnZiU0FuTGk5MWRHbHNjeWM3WEc1cGJYQnZjblFnZTB0dWIzZHVUV1YwY21samN5d2dUV1ZoYzNWeVpTd2dhWE5DYVhSQmNuSmhlVTFsZEhKcFkzMGdabkp2YlNBbkxpNHZkSGx3WldRdGJXVjBjbWxqY3ljN1hHNXBiWEJ2Y25RZ1FtbDBRWEp5WVhrZ1puSnZiU0FuUUdSaGRHRm5jbTlyTFd4cFluSmhjbWxsY3k5MWRHbHNjeTl6Y21NdlltbDBMV0Z5Y21GNUp6dGNibTl1YldWemMyRm5aU0E5SUdGemVXNWpJQ2hsZG1WdWRDa2dQVDRnZTF4dUlDQmpiMjV6ZENCN2RtRnNkV1Z6TENCemRHRnlkRWxrZUN3Z1pXNWtTV1I0TENCellXMXdiR1ZNWlc1bmRHZ3NJR1p1VG1GdFpTd2diM0IwYzMwNlhHNGdJQ0FnZTNaaGJIVmxjem9nWVc1NVcxMHNJSE4wWVhKMFNXUjRPaUJ1ZFcxaVpYSXNJR1Z1WkVsa2VEb2diblZ0WW1WeUxDQnpZVzF3YkdWTVpXNW5kR2c2SUc1MWJXSmxjaXdnWm01T1lXMWxPaUJMYm05M2JrMWxkSEpwWTNNc0lHOXdkSE02SUdGdWVYMGdQU0JsZG1WdWRDNWtZWFJoTzF4dUlDQjBjbmtnZTF4dUlDQWdJQzh2SUdsbUlDaHpkR0Z5ZEVsa2VDQWhQU0F0TVNsY2JpQWdJQ0F2THlBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2lnblJYSnliM0lnYVc0Z2MzQmhjbk5sSUhSb2NtVnphRzlzWkNCM2IzSnJaWEluS1RzZ0x5OGdWRTlFVHpvZ2NtVnRiM1psSUhSb2FYTWdiR2x1WlZ4dUlDQWdJR3hsZENCa2FYTjBZVzVqWlhNNklFWnNiMkYwTXpKQmNuSmhlU0E5SUc1bGR5QkdiRzloZERNeVFYSnlZWGtvYzJGdGNHeGxUR1Z1WjNSb0tUdGNiaUFnSUNCamIyNXpkQ0JqYUhWdWExTnBlbVVnUFNCbGJtUkpaSGdnTFNCemRHRnlkRWxrZUR0Y2JseHVJQ0FnSUdsbUlDaHBjMEpwZEVGeWNtRjVUV1YwY21saktHWnVUbUZ0WlNrcElIdGNiaUFnSUNBZ0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dkbUZzZFdWekxteGxibWQwYURzZ0t5dHBLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaHBjMDVwYkNoMllXeDFaWE5iYVYwcEtTQmpiMjUwYVc1MVpUdGNiaUFnSUNBZ0lDQWdkbUZzZFdWelcybGRJRDBnYm1WM0lFSnBkRUZ5Y21GNUtIWmhiSFZsYzF0cFhTNWZaR0YwWVN3Z2RtRnNkV1Z6VzJsZExsOXNaVzVuZEdncE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdJQ0JzWlhRZ1kyNTBJRDBnTUR0Y2JpQWdJQ0JqYjI1emRDQnBibU55WlcxbGJuUWdQU0JOWVhSb0xtWnNiMjl5S0dOb2RXNXJVMmw2WlNBdklITmhiWEJzWlV4bGJtZDBhQ2s3WEc0Z0lDQWdZMjl1YzNRZ1pHbHpkR0Z1WTJWR2JpQTlJRzVsZHlCTlpXRnpkWEpsS0dadVRtRnRaU2t1WjJWMFRXVmhjM1Z5WlNodmNIUnpLVHRjYmlBZ0lDQmpiMjV6ZENCemRHRnlkRkp2ZHlBOUlIWmhiSFZsY3k1c1pXNW5kR2dnTFNBeUlDMGdUV0YwYUM1bWJHOXZjaWhjYmlBZ0lDQWdJRTFoZEdndWMzRnlkQ2d0T0NBcUlITjBZWEowU1dSNElDc2dOQ0FxSUhaaGJIVmxjeTVzWlc1bmRHZ2dLaUFvZG1Gc2RXVnpMbXhsYm1kMGFDQXRJREVwSUMwZ055a2dMeUF5SUMwZ01DNDFLVHRjYmlBZ0lDQmpiMjV6ZENCemRHRnlkRU52YkNBOUlITjBZWEowU1dSNElDMGdkbUZzZFdWekxteGxibWQwYUNBcUlITjBZWEowVW05M0lDc2dUV0YwYUM1bWJHOXZjaWdvYzNSaGNuUlNiM2NnS3lBeEtTQXFJQ2h6ZEdGeWRGSnZkeUFySURJcElDOGdNaWs3WEc0Z0lDQWdiR1YwSUcxcElEMGdjM1JoY25SU2IzYzdYRzRnSUNBZ2JHVjBJRzFxSUQwZ2MzUmhjblJEYjJ3N1hHNGdJQ0FnYkdWMElHUnBjM1JoYm1ObFFYSnlZWGxEYjNWdWRHVnlJRDBnTUR0Y2JpQWdJQ0IzYUdsc1pTQW9ZMjUwSUR3Z1kyaDFibXRUYVhwbElDWW1JR1JwYzNSaGJtTmxRWEp5WVhsRGIzVnVkR1Z5SUR3Z2MyRnRjR3hsVEdWdVozUm9LU0I3WEc0Z0lDQWdJQ0F2TDJOdmJuTjBJSFpoYkhWbElEMGdjMlZ4TVV4cGMzUmJiV2xkSUNZbUlITmxjVEZNYVhOMFcyMXFYU0EvSUdoaGJXMXBibWNvYzJWeE1VeHBjM1JiYldsZExDQnpaWEV4VEdsemRGdHRhbDBwSURvZ01EdGNiaUFnSUNBZ0lHTnZibk4wSUhaaGJIVmxJRDBnSVdselRtbHNLSFpoYkhWbGMxdHRhVjBwSUNZbUlDRnBjMDVwYkNoMllXeDFaWE5iYldwZEtTQS9YRzRnSUNBZ0lDQWdJR1JwYzNSaGJtTmxSbTRvZG1Gc2RXVnpXMjFwWFN3Z2RtRnNkV1Z6VzIxcVhTa2dPaUF4TzF4dVhHNGdJQ0FnSUNCa2FYTjBZVzVqWlhOYlpHbHpkR0Z1WTJWQmNuSmhlVU52ZFc1MFpYSmRJRDBnZG1Gc2RXVTdYRzRnSUNBZ0lDQmthWE4wWVc1alpVRnljbUY1UTI5MWJuUmxjaXNyTzF4dUlDQWdJQ0FnTHk4Z1kyOXVjM1FnWTNWeWNtVnVkRWx1WTNKbGJXVnVkQ0E5SUUxaGRHZ3VabXh2YjNJb1RXRjBhQzV5WVc1a2IyMG9LU0FxSUdsdVkzSmxiV1Z1ZENrZ0t5QXhYRzRnSUNBZ0lDQmpiblFyUFdsdVkzSmxiV1Z1ZER0Y2JpQWdJQ0FnSUcxcUt6MXBibU55WlcxbGJuUTdYRzRnSUNBZ0lDQjNhR2xzWlNBb2JXb2dQajBnZG1Gc2RXVnpMbXhsYm1kMGFDQW1KaUJqYm5RZ1BDQmphSFZ1YTFOcGVtVXBJSHRjYmlBZ0lDQWdJQ0FnYldrckt6dGNiaUFnSUNBZ0lDQWdiV29nUFNCdGFTQXJJREVnS3lBb2JXb2dMU0IyWVd4MVpYTXViR1Z1WjNSb0tUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNCcFppQW9aR2x6ZEdGdVkyVkJjbkpoZVVOdmRXNTBaWElnUENCellXMXdiR1ZNWlc1bmRHZ3BJSHRjYmlBZ0lDQWdJR1JwYzNSaGJtTmxjeUE5SUdScGMzUmhibU5sY3k1emJHbGpaU2d3TENCa2FYTjBZVzVqWlVGeWNtRjVRMjkxYm5SbGNpazdYRzRnSUNBZ2ZWeHVJQ0FnSUhCdmMzUk5aWE56WVdkbEtIdGthWE4wWVc1alpUb2daR2x6ZEdGdVkyVnpmU2s3WEc0Z0lIMGdZMkYwWTJnZ0tHVXBJSHRjYmlBZ0lDQndiM04wVFdWemMyRm5aU2g3WlhKeWIzSTZJR1Y5S1R0Y2JpQWdmVnh1ZlRzaVhYMD0iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbl9fd2VicGFja19yZXF1aXJlX18ubSA9IF9fd2VicGFja19tb2R1bGVzX187XG5cbi8vIHRoZSBzdGFydHVwIGZ1bmN0aW9uXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnggPSAoKSA9PiB7XG5cdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuXHQvLyBUaGlzIGVudHJ5IG1vZHVsZSBkZXBlbmRzIG9uIG90aGVyIGxvYWRlZCBjaHVua3MgYW5kIGV4ZWN1dGlvbiBuZWVkIHRvIGJlIGRlbGF5ZWRcblx0dmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fLk8odW5kZWZpbmVkLCBbNDgzLDM2MV0sICgpID0+IChfX3dlYnBhY2tfcmVxdWlyZV9fKDcxMTgpKSlcblx0X193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18uTyhfX3dlYnBhY2tfZXhwb3J0c19fKTtcblx0cmV0dXJuIF9fd2VicGFja19leHBvcnRzX187XG59O1xuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmYgPSB7fTtcbi8vIFRoaXMgZmlsZSBjb250YWlucyBvbmx5IHRoZSBlbnRyeSBjaHVuay5cbi8vIFRoZSBjaHVuayBsb2FkaW5nIGZ1bmN0aW9uIGZvciBhZGRpdGlvbmFsIGNodW5rc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5lID0gKGNodW5rSWQpID0+IHtcblx0cmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKF9fd2VicGFja19yZXF1aXJlX18uZikucmVkdWNlKChwcm9taXNlcywga2V5KSA9PiB7XG5cdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5mW2tleV0oY2h1bmtJZCwgcHJvbWlzZXMpO1xuXHRcdHJldHVybiBwcm9taXNlcztcblx0fSwgW10pKTtcbn07IiwiLy8gVGhpcyBmdW5jdGlvbiBhbGxvdyB0byByZWZlcmVuY2UgYXN5bmMgY2h1bmtzIGFuZCBzaWJsaW5nIGNodW5rcyBmb3IgdGhlIGVudHJ5cG9pbnRcbl9fd2VicGFja19yZXF1aXJlX18udSA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gXCJcIiArIGNodW5rSWQgKyBcIi5qc1wiO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCJ2YXIgc2NyaXB0VXJsO1xuaWYgKF9fd2VicGFja19yZXF1aXJlX18uZy5pbXBvcnRTY3JpcHRzKSBzY3JpcHRVcmwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLmcubG9jYXRpb24gKyBcIlwiO1xudmFyIGRvY3VtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5nLmRvY3VtZW50O1xuaWYgKCFzY3JpcHRVcmwgJiYgZG9jdW1lbnQpIHtcblx0aWYgKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQpXG5cdFx0c2NyaXB0VXJsID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM7XG5cdGlmICghc2NyaXB0VXJsKSB7XG5cdFx0dmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNjcmlwdFwiKTtcblx0XHRpZihzY3JpcHRzLmxlbmd0aCkge1xuXHRcdFx0dmFyIGkgPSBzY3JpcHRzLmxlbmd0aCAtIDE7XG5cdFx0XHR3aGlsZSAoaSA+IC0xICYmICFzY3JpcHRVcmwpIHNjcmlwdFVybCA9IHNjcmlwdHNbaS0tXS5zcmM7XG5cdFx0fVxuXHR9XG59XG4vLyBXaGVuIHN1cHBvcnRpbmcgYnJvd3NlcnMgd2hlcmUgYW4gYXV0b21hdGljIHB1YmxpY1BhdGggaXMgbm90IHN1cHBvcnRlZCB5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dC5wdWJsaWNQYXRoIG1hbnVhbGx5IHZpYSBjb25maWd1cmF0aW9uXG4vLyBvciBwYXNzIGFuIGVtcHR5IHN0cmluZyAoXCJcIikgYW5kIHNldCB0aGUgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gdmFyaWFibGUgZnJvbSB5b3VyIGNvZGUgdG8gdXNlIHlvdXIgb3duIGxvZ2ljLlxuaWYgKCFzY3JpcHRVcmwpIHRocm93IG5ldyBFcnJvcihcIkF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyXCIpO1xuc2NyaXB0VXJsID0gc2NyaXB0VXJsLnJlcGxhY2UoLyMuKiQvLCBcIlwiKS5yZXBsYWNlKC9cXD8uKiQvLCBcIlwiKS5yZXBsYWNlKC9cXC9bXlxcL10rJC8sIFwiL1wiKTtcbl9fd2VicGFja19yZXF1aXJlX18ucCA9IHNjcmlwdFVybDsiLCIvLyBubyBiYXNlVVJJXG5cbi8vIG9iamVjdCB0byBzdG9yZSBsb2FkZWQgY2h1bmtzXG4vLyBcIjFcIiBtZWFucyBcImFscmVhZHkgbG9hZGVkXCJcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdDExODogMVxufTtcblxuLy8gaW1wb3J0U2NyaXB0cyBjaHVuayBsb2FkaW5nXG52YXIgaW5zdGFsbENodW5rID0gKGRhdGEpID0+IHtcblx0dmFyIFtjaHVua0lkcywgbW9yZU1vZHVsZXMsIHJ1bnRpbWVdID0gZGF0YTtcblx0Zm9yKHZhciBtb2R1bGVJZCBpbiBtb3JlTW9kdWxlcykge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG5cdFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLm1bbW9kdWxlSWRdID0gbW9yZU1vZHVsZXNbbW9kdWxlSWRdO1xuXHRcdH1cblx0fVxuXHRpZihydW50aW1lKSBydW50aW1lKF9fd2VicGFja19yZXF1aXJlX18pO1xuXHR3aGlsZShjaHVua0lkcy5sZW5ndGgpXG5cdFx0aW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRzLnBvcCgpXSA9IDE7XG5cdHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKGRhdGEpO1xufTtcbl9fd2VicGFja19yZXF1aXJlX18uZi5pID0gKGNodW5rSWQsIHByb21pc2VzKSA9PiB7XG5cdC8vIFwiMVwiIGlzIHRoZSBzaWduYWwgZm9yIFwiYWxyZWFkeSBsb2FkZWRcIlxuXHRpZighaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdKSB7XG5cdFx0aWYodHJ1ZSkgeyAvLyBhbGwgY2h1bmtzIGhhdmUgSlNcblx0XHRcdGltcG9ydFNjcmlwdHMoX193ZWJwYWNrX3JlcXVpcmVfXy5wICsgX193ZWJwYWNrX3JlcXVpcmVfXy51KGNodW5rSWQpKTtcblx0XHR9XG5cdH1cbn07XG5cbnZhciBjaHVua0xvYWRpbmdHbG9iYWwgPSBzZWxmW1wid2VicGFja0NodW5rZWRhXCJdID0gc2VsZltcIndlYnBhY2tDaHVua2VkYVwiXSB8fCBbXTtcbnZhciBwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbiA9IGNodW5rTG9hZGluZ0dsb2JhbC5wdXNoLmJpbmQoY2h1bmtMb2FkaW5nR2xvYmFsKTtcbmNodW5rTG9hZGluZ0dsb2JhbC5wdXNoID0gaW5zdGFsbENodW5rO1xuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0IiwiLy8gcnVuIHN0YXJ0dXBcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXy54KCk7XG4iXSwibmFtZXMiOlsiZGVmZXJyZWQiLCJuZXh0IiwiRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMiLCJpc05pbCIsIngiLCJvbm1lc3NhZ2UiLCJhc3luYyIsImV2ZW50IiwidmFsdWVzIiwic3RhcnRJZHgiLCJlbmRJZHgiLCJzYW1wbGVMZW5ndGgiLCJmbk5hbWUiLCJvcHRzIiwiZGF0YSIsImRpc3RhbmNlcyIsIkZsb2F0MzJBcnJheSIsImNodW5rU2l6ZSIsImkiLCJsZW5ndGgiLCJfZGF0YSIsIl9sZW5ndGgiLCJjbnQiLCJpbmNyZW1lbnQiLCJNYXRoIiwiZmxvb3IiLCJkaXN0YW5jZUZuIiwiZ2V0TWVhc3VyZSIsInN0YXJ0Um93Iiwic3FydCIsInN0YXJ0Q29sIiwibWkiLCJtaiIsImRpc3RhbmNlQXJyYXlDb3VudGVyIiwidmFsdWUiLCJzbGljZSIsInBvc3RNZXNzYWdlIiwiZGlzdGFuY2UiLCJlIiwiZXJyb3IiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJ1bmRlZmluZWQiLCJleHBvcnRzIiwibW9kdWxlIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsIm0iLCJfX3dlYnBhY2tfZXhwb3J0c19fIiwiTyIsInJlc3VsdCIsImNodW5rSWRzIiwiZm4iLCJwcmlvcml0eSIsIm5vdEZ1bGZpbGxlZCIsIkluZmluaXR5IiwiZnVsZmlsbGVkIiwiaiIsIk9iamVjdCIsImtleXMiLCJldmVyeSIsImtleSIsInNwbGljZSIsInIiLCJkIiwiZGVmaW5pdGlvbiIsIm8iLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJmIiwiY2h1bmtJZCIsIlByb21pc2UiLCJhbGwiLCJyZWR1Y2UiLCJwcm9taXNlcyIsInUiLCJnIiwiZ2xvYmFsVGhpcyIsInRoaXMiLCJGdW5jdGlvbiIsIndpbmRvdyIsIm9iaiIsInByb3AiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJzY3JpcHRVcmwiLCJpbXBvcnRTY3JpcHRzIiwibG9jYXRpb24iLCJkb2N1bWVudCIsImN1cnJlbnRTY3JpcHQiLCJzcmMiLCJzY3JpcHRzIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJFcnJvciIsInJlcGxhY2UiLCJwIiwiaW5zdGFsbGVkQ2h1bmtzIiwiY2h1bmtMb2FkaW5nR2xvYmFsIiwic2VsZiIsInBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uIiwicHVzaCIsImJpbmQiLCJtb3JlTW9kdWxlcyIsInJ1bnRpbWUiLCJwb3AiLCJ0aGVuIl0sInNvdXJjZVJvb3QiOiIifQ==